예제 #1
0
        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);
            }
        }
예제 #2
0
 public void DespawnEntity(IEntity entity)
 {
     entity.Despawned = true;
     PendingDespawns.Add(entity);
 }