public static void RemoveObject(WorldObject obj) { // Broadcast deletion to nearby players. foreach (Player player in GetVisiblePlayers(obj)) { player.ChannelSend(new DeleteObject(obj)); } // Remove from list and take necessary actions. if (obj.IsPlayer()) { ((IDictionary <long, Player>)PLAYER_OBJECTS).Remove(obj.GetObjectId()); // Store player. obj.AsPlayer().StoreMe(); // Log world access. if (Config.LOG_WORLD) { LogManager.LogWorld("Player [" + obj.AsPlayer().GetName() + "] Account [" + obj.AsPlayer().GetClient().GetAccountName() + "] Left the world."); } } else { ((IDictionary <long, WorldObject>)GAME_OBJECTS).Remove(obj.GetObjectId()); } }
public ObjectInfoRequest(GameClient client, ReceivablePacket packet) { // Read data. long objectId = packet.ReadLong(); // Get the acting player. Player player = client.GetActiveChar(); // Send the information. List <WorldObject> objects = WorldManager.GetVisibleObjects(player); for (int i = 0; i < objects.Count; i++) { WorldObject obj = objects[i]; if (obj.GetObjectId() == objectId) { if (obj.IsPlayer()) { client.ChannelSend(new PlayerInformation(obj.AsPlayer())); } else if (obj.IsNpc()) { client.ChannelSend(new NpcInformation(obj.AsNpc())); } // Send delayed animation update in case object was already moving. Task.Delay(1000).ContinueWith(task => SendAnimationInfo(client, obj)); break; } } }
public void DeleteMe() { // Remove from region. _region.RemoveObject(this); // Broadcast NPC deletion. DeleteObject delete = new DeleteObject(this); List <RegionHolder> regions = _region.GetSurroundingRegions(); for (int i = 0; i < regions.Count; i++) { List <WorldObject> objects = regions[i].GetObjects(); for (int j = 0; j < objects.Count; j++) { WorldObject nearby = objects[j]; if (nearby != null && nearby.IsPlayer()) { nearby.AsPlayer().ChannelSend(delete); } } } // Set region to null. _region = null; }
public static void AddObject(WorldObject obj) { if (obj.IsPlayer()) { Player player = obj.AsPlayer(); if (!PLAYER_OBJECTS.Contains(player)) { lock (PLAYER_OBJECTS) { PLAYER_OBJECTS.Add(player); } lock (ONLINE_CLIENTS) { ONLINE_CLIENTS.Add(player.GetClient()); } // Log world access. if (Config.LOG_WORLD) { LogManager.LogWorld("Player [" + player.GetName() + "] Account [" + player.GetClient().GetAccountName() + "] Entered the world."); } } } }
public static List <Player> GetVisiblePlayers(WorldObject obj) { List <Player> result = new List <Player>(); List <RegionHolder> regions = obj.GetRegion().GetSurroundingRegions(); for (int i = 0; i < regions.Count; i++) { List <WorldObject> objects = regions[i].GetObjects(); for (int j = 0; j < objects.Count; j++) { WorldObject nearby = objects[j]; if (!nearby.IsPlayer()) { continue; } if (nearby.GetObjectId() == obj.GetObjectId()) { continue; } if (obj.CalculateDistance(nearby) < MOVEMENT_BROADCAST_RADIUS) { result.Add(nearby.AsPlayer()); } } } return(result); }
public static void RemoveObject(WorldObject obj) { // Broadcast deletion to nearby players. List <Player> players = GetVisiblePlayers(obj); for (int i = 0; i < players.Count; i++) { players[i].ChannelSend(new DeleteObject(obj)); } // Remove from list and take necessary actions. if (obj.IsPlayer()) { Player player = obj.AsPlayer(); lock (PLAYER_OBJECTS) { PLAYER_OBJECTS.Remove(player); } // Store player. player.StoreMe(); // Log world access. if (Config.LOG_WORLD && player.GetClient().GetActiveChar() != null) { LogManager.LogWorld("Player [" + player.GetName() + "] Account [" + player.GetClient().GetAccountName() + "] Left the world."); } } obj.GetRegion().RemoveObject(obj); }
public void SetLocation(float posX, float posY, float posZ, float heading) { _location.Update(posX, posY, posZ, heading); // When changing location test for appropriate region. RegionHolder testRegion = WorldManager.GetRegion(this); if (!testRegion.Equals(_region)) { if (_region != null) { // Remove this object from the region. _region.RemoveObject(this); // Broadcast change to players left behind when teleporting. if (_isTeleporting) { DeleteObject deleteObject = new DeleteObject(this); List <RegionHolder> regions = _region.GetSurroundingRegions(); for (int i = 0; i < regions.Count; i++) { List <WorldObject> objects = regions[i].GetObjects(); for (int j = 0; j < objects.Count; j++) { WorldObject nearby = objects[j]; if (nearby == this) { continue; } if (nearby.IsPlayer()) { nearby.AsPlayer().ChannelSend(deleteObject); } } } } } // Assign new region. _region = testRegion; _region.AddObject(this); // Send visible NPC information. // TODO: Exclude known NPCs? if (IsPlayer()) { List <WorldObject> objects = WorldManager.GetVisibleObjects(this); for (int i = 0; i < objects.Count; i++) { WorldObject nearby = objects[i]; if (!nearby.IsNpc()) { continue; } AsPlayer().ChannelSend(new NpcInformation(nearby.AsNpc())); } } } }
public static void AddObject(WorldObject obj) { if (obj.IsPlayer()) { if (!PLAYER_OBJECTS.Values.Contains(obj.AsPlayer())) { lock (ONLINE_CLIENTS) { ONLINE_CLIENTS.Add(obj.AsPlayer().GetClient()); } PLAYER_OBJECTS.TryAdd(obj.GetObjectId(), obj.AsPlayer()); // Log world access. if (Config.LOG_WORLD) { LogManager.LogWorld("Player [" + obj.AsPlayer().GetName() + "] Account [" + obj.AsPlayer().GetClient().GetAccountName() + "] Entered the world."); } } } }