Exemplo n.º 1
0
        private bool IsWarpLegit(Player player, EnterGate enterGate)
        {
            if (enterGate == null)
            {
                return(false);
            }

            if (player.SelectedCharacter == null)
            {
                return(false);
            }

            if (enterGate.LevelRequirement > player.Attributes[Stats.Level])
            {
                player.PlayerView.ShowMessage("Your level is too low to enter this map.", MessageType.BlueNormal);
                return(false);
            }

            var currentPosition = player.IsWalking ? player.WalkTarget : player.Position;
            var inaccuracy      = player.GameContext.Configuration.InfoRange;

            if (player.CurrentMap.Definition.EnterGates.Contains(enterGate) &&
                !(this.IsXInRange(currentPosition, enterGate, inaccuracy) &&
                  this.IsYInRange(currentPosition, enterGate, inaccuracy)))
            {
                return(false);
            }

            return(true);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Enters the gate.
        /// </summary>
        /// <param name="player">The player.</param>
        /// <param name="enterGate">The enter gate.</param>
        public void EnterGate(Player player, EnterGate enterGate)
        {
            if (enterGate == null)
            {
                return;
            }

            if (player.SelectedCharacter == null)
            {
                return;
            }

            if (enterGate.LevelRequirement > player.Attributes[Stats.Level])
            {
                player.PlayerView.ShowMessage("Your level is too low to enter this map.", Interfaces.MessageType.BlueNormal);
                return;
            }

            if (player.CurrentMap.Definition.EnterGates.Contains(enterGate) && !(player.X >= enterGate.X1 - INACCURACY &&
                                                                                 player.X <= enterGate.X2 + INACCURACY &&
                                                                                 player.Y >= enterGate.Y1 - INACCURACY &&
                                                                                 player.Y <= enterGate.Y2 + INACCURACY))
            {
                return;
            }

            player.WarpTo(enterGate.TargetGate);
        }
Exemplo n.º 3
0
        /// <inheritdoc/>
        public void HandlePacket(Player player, Span <byte> packet)
        {
            if (packet.Length < EnterGateRequest.Length)
            {
                return;
            }

            EnterGateRequest request = packet;
            var gateNumber           = request.GateNumber;

            if (gateNumber == 0)
            {
                this.teleportAction.TryTeleportWithSkill(player, new Point(request.TeleportTargetX, request.TeleportTargetY));
                return;
            }

            EnterGate gate = player.SelectedCharacter.CurrentMap.EnterGates.FirstOrDefault(g => g.Number == gateNumber);

            if (gate is null)
            {
                player.Logger.LogWarning("Gate {0} not found in current map {1}", gateNumber, player.SelectedCharacter.CurrentMap);
                return;
            }

            this.warpAction.EnterGate(player, gate);
        }
Exemplo n.º 4
0
 /// <summary>
 /// Enters the gate.
 /// </summary>
 /// <param name="player">The player.</param>
 /// <param name="gate">The enter gate.</param>
 public void EnterGate(Player player, EnterGate gate)
 {
     if (this.IsWarpLegit(player, gate))
     {
         player.WarpTo(gate.TargetGate);
     }
     else
     {
         player.ViewPlugIns.GetPlugIn <IMapChangePlugIn>()?.MapChangeFailed();
     }
 }
Exemplo n.º 5
0
 /// <summary>
 /// Enters the gate.
 /// </summary>
 /// <param name="player">The player.</param>
 /// <param name="gate">The enter gate.</param>
 public void EnterGate(Player player, EnterGate gate)
 {
     if (this.IsWarpLegit(player, gate))
     {
         player.WarpTo(gate.TargetGate);
     }
     else
     {
         // TODO: We need to send the correct response.
         // Currently, we just send the regular map change message, but this causes that the
         // player doesn't see objects in its range anymore.
         player.ViewPlugIns.GetPlugIn <IMapChangePlugIn>()?.MapChange();
     }
 }
Exemplo n.º 6
0
        /// <inheritdoc/>
        public override void HandlePacket(Player player, byte[] packet)
        {
            if (packet.Length < 8)
            {
                return;
            }

            ushort    gateNr = NumberConversionExtensions.MakeWord(packet[4], packet[3]);
            EnterGate gate   = player.SelectedCharacter.CurrentMap.EnterGates.FirstOrDefault(g => NumberConversionExtensions.ToUnsigned(g.Number) == gateNr);

            if (gate == null)
            {
                Logger.WarnFormat("Gate {0} not found in current map {1}", gateNr, player.SelectedCharacter.CurrentMap);
                return;
            }

            this.warpAction.EnterGate(player, gate);
        }
Exemplo n.º 7
0
        /// <inheritdoc/>
        public void HandlePacket(Player player, Span <byte> packet)
        {
            if (packet.Length < EnterGateRequest.Length)
            {
                return;
            }

            EnterGateRequest request = packet;
            var       gateNumber     = request.GateNumber;
            EnterGate gate           = player.SelectedCharacter.CurrentMap.EnterGates.FirstOrDefault(g => g.Number == gateNumber);

            if (gate == null)
            {
                player.Logger.LogWarning("Gate {0} not found in current map {1}", gateNumber, player.SelectedCharacter.CurrentMap);
                return;
            }

            this.warpAction.EnterGate(player, gate);
        }
Exemplo n.º 8
0
        /// <inheritdoc/>
        public void HandlePacket(Player player, Span <byte> packet)
        {
            if (packet.Length < 8)
            {
                return;
            }

            EnterGateRequest request = packet;
            var       gateNumber     = request.GateNumber;
            EnterGate gate           = player.SelectedCharacter.CurrentMap.EnterGates.FirstOrDefault(g => NumberConversionExtensions.ToUnsigned(g.Number) == gateNumber);

            if (gate == null)
            {
                Logger.WarnFormat("Gate {0} not found in current map {1}", gateNumber, player.SelectedCharacter.CurrentMap);
                return;
            }

            this.warpAction.EnterGate(player, gate);
        }
Exemplo n.º 9
0
        private bool IsWarpLegit(Player player, EnterGate enterGate)
        {
            if (enterGate is null)
            {
                return(false);
            }

            if (player.SelectedCharacter is null)
            {
                return(false);
            }

            if (enterGate.LevelRequirement > player.Attributes[Stats.Level])
            {
                player.ViewPlugIns.GetPlugIn <IShowMessagePlugIn>()?.ShowMessage("Your level is too low to enter this map.", Interfaces.MessageType.BlueNormal);
                return(false);
            }

            if (enterGate.TargetGate.Map.TryGetRequirementError(player, out var errorMessage))
            {
                player.ViewPlugIns.GetPlugIn <IShowMessagePlugIn>()?.ShowMessage(errorMessage, Interfaces.MessageType.BlueNormal);
                return(false);
            }

            var currentPosition = player.IsWalking ? player.WalkTarget : player.Position;
            var inaccuracy      = player.GameContext.Configuration.InfoRange;

            if (player.CurrentMap.Definition.EnterGates.Contains(enterGate) &&
                !(this.IsXInRange(currentPosition, enterGate, inaccuracy) &&
                  this.IsYInRange(currentPosition, enterGate, inaccuracy)))
            {
                return(false);
            }

            return(true);
        }