public void AddEntity(ServerDynamicEntity entity) { // maybe we need to generate new unique entity id if (entity.DynamicEntity.DynamicId == 0) { entity.DynamicEntity.DynamicId = DynamicIdHelper.GetNextUniqueId(); } lock (_dynamicEntities) { if (_dynamicEntities.ContainsKey(entity.DynamicEntity.DynamicId)) { throw new InvalidOperationException("Such entity is already in manager"); } _dynamicEntities.Add(entity.DynamicEntity.DynamicId, entity); } MapArea entityArea = null; // listen all 9 areas and add at center area for (int x = -1; x < 2; x++) { for (int z = -1; z < 2; z++) { var area = GetArea(new Vector3D(entity.DynamicEntity.Position.X + x * MapArea.AreaSize.X, 0, entity.DynamicEntity.Position.Z + z * MapArea.AreaSize.Y)); entity.AddArea(area); if (x == 0 && z == 0) { area.AddEntity(entity); entityArea = area; } area.OnEntityInViewRange(entity); } } entity.CurrentArea = entityArea; OnEntityAdded(new AreaEntityEventArgs { Entity = entity }); }
public void RemoveEntity(ServerDynamicEntity entity) { bool removed; lock (_dynamicEntities) { removed = _dynamicEntities.Remove(entity.DynamicEntity.DynamicId); } if (!removed) { return; } // remove entity from areas for (int x = -1; x < 2; x++) { for (int z = -1; z < 2; z++) { var area = GetArea(new Vector3D(entity.DynamicEntity.Position.X + x * MapArea.AreaSize.X, 0, entity.DynamicEntity.Position.Z + z * MapArea.AreaSize.Y)); if (x == 0 && z == 0) { area.RemoveEntity((int)entity.DynamicEntity.DynamicId); } area.OnEntityOutOfViewRange(entity); entity.RemoveArea(area); } } OnEntityRemoved(new AreaEntityEventArgs { Entity = entity }); }
public bool TryFind(uint entityId, out ServerDynamicEntity entity) { return(_dynamicEntities.TryGetValue(entityId, out entity)); }