using GameServer.Systems.Notify; using Protocol; namespace GameServer.Systems.Entity; internal class EntitySystem { private readonly List _entities; private readonly List _dynamicEntityIds; private readonly IGameActionListener _listener; public EntitySystem(IGameActionListener listener) { _entities = []; _dynamicEntityIds = []; _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); if (entity.DynamicId != 0) _dynamicEntityIds.Add(entity.DynamicId); } _ = _listener.OnEntitiesAdded(entities); } public bool HasDynamicEntity(int dynamicId) { return _dynamicEntityIds.Contains(dynamicId); } public void Destroy(IEnumerable entities) { foreach (EntityBase entity in entities) { _ = _entities.Remove(entity); _ = _dynamicEntityIds.Remove(entity.DynamicId); } _ = _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); }