Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
                    }
                }
            }
        }