/// <summary> /// Adds a map object to the screen of another map object. /// </summary> /// <param name="obj">The map object to add.</param> /// <param name="player">The player associated to the owner map object, if any.</param> /// <param name="spawnPacket">The spawn packet of the owner map object.</param> /// <param name="packet">A packet to send to the map object if it's a client.</param> private void AddToScreen(IMapObject obj, Models.Entities.Player player, byte[] spawnPacket, byte[] packet, Enums.UpdateScreenFlags flags, bool spawnToOwner) { if (obj is Models.Entities.Player) { var objPlayer = (Models.Entities.Player)obj; if (!objPlayer.LoggedIn) { return; } objPlayer.ClientSocket.Send(spawnPacket); if (packet != null) { if (flags != Enums.UpdateScreenFlags.DeadPlayers || flags == Enums.UpdateScreenFlags.DeadPlayers && !objPlayer.Alive) { objPlayer.ClientSocket.Send(packet); } } } if (player != null && spawnToOwner) { player.ClientSocket.Send(obj.GetSpawnPacket()); } (obj as MapObjectController)._screenObjects.TryAdd(MapObject.ClientId, MapObject); _screenObjects.TryAdd(obj.ClientId, obj); }
/// <summary> /// Updates the screen for a map object. /// </summary> /// <param name="clear">Set to true if the screen should be cleared before the update.</param> /// <param name="packet">A packet to send to clients within the screen.</param> /// <param name="flags">Flags determining the type of update.</param> public void UpdateScreen(bool clear, byte[] packet = null, Enums.UpdateScreenFlags flags = Enums.UpdateScreenFlags.None) { if (!_despawned) { if (!MapObject.CanUpdateScreen || MapObject.Map == null) { return; } } else { _despawned = false; } if (clear) { ClearScreen(); } var removePacket = MapObject.GetRemoveSpawnPacket(); var spawnPacket = MapObject.GetSpawnPacket(); var player = (MapObject as Models.Entities.Player); foreach (var obj in _screenObjects.Values) { if (obj.Map == null || MapObject.Map == null || obj.MapId != MapObject.MapId || !InRange(obj)) { RemoveFromScreen(obj, player, removePacket); } else { if (flags == Enums.UpdateScreenFlags.Idle) { obj.Idle = false; } if (packet != null) { var objPlayer = obj as Models.Entities.Player; if (objPlayer != null) { var match = objPlayer.Battle as Models.Arena.ArenaBattle; if (match != null && player != null) { if (match.Watchers.ContainsKey(player.ClientId)) { continue; } } if (flags != Enums.UpdateScreenFlags.DeadPlayers || flags == Enums.UpdateScreenFlags.DeadPlayers && !objPlayer.Alive) { objPlayer.ClientSocket.Send(packet); } } } } } if (MapObject.Map != null) { foreach (var obj in MapObject.Map.MapObjects.Values .Where(x => x.ClientId != MapObject.ClientId && !_screenObjects.ContainsKey(x.ClientId) && InRange(x))) { if (flags == Enums.UpdateScreenFlags.Idle) { obj.Idle = false; } if (player != null) { var match = player.Battle as Models.Arena.ArenaBattle; bool spawnToOwner = true; byte[] sendPacket = packet; if (match != null) { if (match.Watchers.ContainsKey(obj.ClientId)) { spawnToOwner = false; } } else { var objPlayer = obj as Models.Entities.Player; if (objPlayer != null) { match = objPlayer.Battle as Models.Arena.ArenaBattle; if (match != null) { if (match.Watchers.ContainsKey(player.ClientId)) { sendPacket = null; spawnPacket = null; } } } } AddToScreen(obj, player, spawnPacket, sendPacket, flags, spawnToOwner); } else { AddToScreen(obj, player, spawnPacket, packet, flags, true); } } } }