public virtual void LeaveWorld(Entity entity) { if (!(entity is Pet || entity is Portal)) { if (entity is Wall && entity.ObjectDesc != null && entity.ObjectDesc.FullOccupy || entity.ObjectDesc.OccupySquare || entity.ObjectDesc.EnemyOccupySquare) { WmapTile tile = Map[(int)entity.X, (int)entity.Y].Clone(); tile.TileId = Map[(int)entity.X, (int)entity.Y].TileId; tile.ObjType = 0; tile.ObjectDesc = null; Map[(int)entity.X, (int)entity.Y] = tile; } } if (entity is Player) { Player dummy; if (!Players.TryRemove(entity.Id, out dummy)) { Console.WriteLine("Could not remove {0} from world {1}", entity.Name, Name); } PlayersCollision.Remove(entity); } else if (entity is Enemy) { Enemy dummy; Enemies.TryRemove(entity.Id, out dummy); EnemiesCollision.Remove(entity); if (entity.ObjectDesc.Quest) { Quests.TryRemove(entity.Id, out dummy); } } else { var projectile = entity as Projectile; if (projectile != null) { var p = projectile; Projectiles.TryRemove(new Tuple <int, byte>(p.ProjectileOwner.Self.Id, p.ProjectileId), out p); } else if (entity is StaticObject) { StaticObject dummy; StaticObjects.TryRemove(entity.Id, out dummy); if (entity is Decoy) { PlayersCollision.Remove(entity); } else { EnemiesCollision.Remove(entity); } } else if (entity is Pet) { if (entity.IsPet) { Pet dummy2; Pets.TryRemove(entity.Id, out dummy2); PlayersCollision.Remove(entity); } } } entity.Owner = null; entity.Dispose(); }