Ejemplo n.º 1
0
        public static bool ChangeMap(Models.Entities.Player player, Models.Packets.Client.DataExchangePacket packet)
        {
            if (player.Map.IsDynamic)
            {
                if (player.Houses.Count > 0 && player.Houses.GetAll().Any(house => house.DynamicMapId == player.MapId))
                {
                    player.AddActionLog("LeaveHouse");
                    player.TeleportToLastMap();
                    return(true);
                }

                if (player.Guild.InHouse(player))
                {
                    player.AddActionLog("LeaveGuildHouse");
                    player.TeleportToLastMap();
                    return(true);
                }
            }

            var coordinate = new Models.Maps.Coordinate(packet.Data1Low, packet.Data1High);

            if (Tools.RangeTools.GetDistanceU(player.X, player.Y, coordinate.X, coordinate.Y) <= 5)
            {
                int mapId = player.MapId;

                if (Collections.PortalCollection.Teleport(player, mapId, coordinate.X, coordinate.Y))
                {
                    player.AddActionLog("Portal", string.Format("{0} : {1},{2}", mapId, coordinate.X, coordinate.Y));
                    return(true);
                }
            }

            player.Pullback();
            return(true);
        }
Ejemplo n.º 2
0
        public static bool Handle(Models.Entities.Player player, Models.Packets.Client.DataExchangePacket packet)
        {
            if (!player.Alive && DateTime.UtcNow > player.DeadTime)
            {
                player.ClientSocket.Disconnect(Drivers.Messages.Errors.JUMP_WHILE_DEAD);
                return(false);
            }

            if (packet.ClientId != player.ClientId)
            {
                Database.Dal.Accounts.Ban(
                    player.DbPlayer.Account, Drivers.Messages.JUMP_OTHER_PLAYER,
                    Database.Models.DbAccount.BanRangeType.Perm);
                player.ClientSocket.Disconnect(Drivers.Messages.JUMP_OTHER_PLAYER);
                return(false);
            }

            player.Action       = Enums.PlayerAction.None;
            player.AttackPacket = null;

            ushort newX = packet.Data1Low;
            ushort newY = packet.Data1High;

            if (Tools.RangeTools.GetDistanceU(newX, newY, player.X, player.Y) > 28)
            {
                player.Pullback();
                return(true);
            }

            if (!player.Map.ValidCoord(newX, newY))
            {
                player.Pullback();
                return(false);
            }

            if (player.LastMovementMode == Enums.WalkMode.Jump && DateTime.UtcNow <= player.LastMovementTime.AddMilliseconds(400))
            {
                player.SpeedHackChecks++;
                if (player.SpeedHackChecks >= 3)
                {
                    // speedhack ...
                    if (player.SpeedHackChecks >= 10)
                    {
                        player.ClientSocket.Disconnect(Drivers.Messages.SPEEDHACK);
                        return(false);
                    }

                    player.Pullback();
                    return(true);
                }
            }
            else
            {
                player.SpeedHackChecks = 0;
            }

            if (player.Battle != null)
            {
                if (!player.Battle.EnterArea(player))
                {
                    player.Pullback();
                    return(true);
                }
                else if (!player.Battle.LeaveArea(player))
                {
                    player.Pullback();
                    return(true);
                }
            }

            if (Tools.CalculationTools.ChanceSuccess(Data.Constants.Chances.StaminaOnJump))
            {
                player.Stamina = (byte)Math.Min(100, player.Stamina + 7);
            }

            player.X = newX;
            player.Y = newY;
            player.LastMovementMode = Enums.WalkMode.Jump;
            player.LastMovementTime = DateTime.UtcNow;
            player.ClientSocket.Send(packet);
            player.UpdateScreen(false, packet, Enums.UpdateScreenFlags.Idle);

            return(true);
        }
Ejemplo n.º 3
0
        public static bool HandlePacket(Models.Entities.Player player, Models.Packets.Location.WalkPacket packet)
        {
            if (packet.ClientId != player.ClientId)
            {
                Database.Dal.Accounts.Ban(
                    player.DbPlayer.Account, Drivers.Messages.MOVE_OTHER_PLAYER,
                    Database.Models.DbAccount.BanRangeType.Perm);
                player.ClientSocket.Disconnect(Drivers.Messages.MOVE_OTHER_PLAYER);
                return(false);
            }
            player.Action           = Enums.PlayerAction.None;
            player.AttackPacket     = null;
            player.LastMovementMode = packet.Mode;

            int newX = 0, newY = 0;
            int newDir = 0;

            switch (packet.Mode)
            {
            case Enums.WalkMode.Walk:
            case Enums.WalkMode.Run:
            {
                newDir = (int)packet.Direction % 8;
                newX   = player.X + Data.Constants.Movement.DeltaX[newDir];
                newY   = player.Y + Data.Constants.Movement.DeltaY[newDir];

                if (DateTime.UtcNow < player.LastMovementTime.AddMilliseconds(100))
                {
                    player.SpeedHackChecks++;
                    if (player.SpeedHackChecks >= 3)
                    {
                        // speedhack ...
                        if (player.SpeedHackChecks >= 10)
                        {
                            player.ClientSocket.Disconnect(Drivers.Messages.SPEEDHACK);
                            return(false);
                        }

                        player.Pullback();
                        return(true);
                    }
                }
                else
                {
                    player.SpeedHackChecks = 0;
                }
                break;
            }

            case Enums.WalkMode.Mount:
            {
                newDir = (int)packet.Direction % 24;
                newX   = player.X + Data.Constants.Movement.DeltaMountX[newDir];
                newY   = player.Y + Data.Constants.Movement.DeltaMountY[newDir];

                if (DateTime.UtcNow < player.LastMovementTime.AddMilliseconds(400))
                {
                    player.SpeedHackChecks++;
                    if (player.SpeedHackChecks >= 3)
                    {
                        // speedhack ...
                        if (player.SpeedHackChecks >= 10)
                        {
                            player.ClientSocket.Disconnect(Drivers.Messages.SPEEDHACK);
                            return(false);
                        }

                        player.Pullback();
                        return(true);
                    }
                }
                else
                {
                    player.SpeedHackChecks = 0;
                }
                break;
            }

            default:
                return(false);
            }

            if (player.Map.ValidCoord((ushort)newX, (ushort)newY))
            {
                player.LastMovementTime = DateTime.UtcNow;
                player.X = (ushort)newX;
                player.Y = (ushort)newY;

                player.ClientSocket.Send(packet);
                player.UpdateScreen(false, packet, Enums.UpdateScreenFlags.Idle);

                if (player.Battle != null)
                {
                    if (!player.Battle.EnterArea(player))
                    {
                        player.Pullback();
                    }
                    else if (!player.Battle.LeaveArea(player))
                    {
                        player.Pullback();
                    }
                }

                return(true);
            }

            return(false);
        }