public void FlushDespawns() { IEntity entity; while (PendingDespawns.Count != 0) { while (!PendingDespawns.TryTake(out entity)) { ; } if (entity is IPhysicsEntity) { PhysicsEngine.RemoveEntity((IPhysicsEntity)entity); } lock ((Server as MultiplayerServer).ClientLock) // TODO: Thread safe way to iterate over client collection { for (int i = 0, ServerClientsCount = Server.Clients.Count; i < ServerClientsCount; i++) { var client = (RemoteClient)Server.Clients[i]; if (client.KnownEntities.Contains(entity) && !client.Disconnected) { client.QueuePacket(new DestroyEntityPacket(entity.EntityID)); client.KnownEntities.Remove(entity); client.Log("Destroying entity {0} ({1})", entity.EntityID, entity.GetType().Name); } } } lock (EntityLock) Entities.Remove(entity); } }
public void DespawnEntity(IEntity entity) { entity.Despawned = true; PendingDespawns.Add(entity); }