using GameServer.Systems.Notify; using Protocol; namespace GameServer.Systems.Entity; internal class EntitySystem { private readonly List _entities; private readonly IGameActionListener _listener; public EntitySystem(IGameActionListener listener) { _entities = []; _listener = listener; } public IEnumerable EnumerateEntities() { return _entities; } public void Add(IEnumerable entities) { foreach (EntityBase entity in entities) { if (_entities.Any(e => e.Id == entity.Id)) throw new InvalidOperationException($"EntitySystem::Create - entity with id {entity.Id} already exists"); _entities.Add(entity); } _ = _listener.OnEntitiesAdded(entities); } public void Destroy(IEnumerable entities) { foreach (EntityBase entity in entities) _ = _entities.Remove(entity); _ = _listener.OnEntitiesRemoved(entities); } public void Activate(EntityBase entity) { entity.Activate(); } public TEntity? Get(long id) where TEntity : EntityBase { return _entities.SingleOrDefault(e => e.Id == id) as TEntity; } public IEnumerable Pb => _entities.Select(e => e.Pb); }