Пример #1
0
        public static bool HandleQueryEquipments(Models.Entities.Player player, Models.Packets.Client.DataExchangePacket packet)
        {
            Models.Entities.Player viewPlayer = Collections.PlayerCollection.GetPlayerByClientId(packet.Data1);
            if (viewPlayer != null)
            {
                player.ClientSocket.Send(viewPlayer.GetSpawnPacket());
                foreach (var item in viewPlayer.Equipments.GetAll())
                {
                    item.ViewItem(viewPlayer, player);
                }

                if (viewPlayer.LoggedIn)
                {
                    viewPlayer.SendFormattedSystemMessage("VIEW_EQUIPMENTS", true, player.Name);
                }

                player.ClientSocket.Send(new Models.Packets.Misc.StringPacket
                {
                    String = viewPlayer.Spouse,
                    Action = Enums.StringAction.QueryMate
                });
            }

            return(true);
        }
Пример #2
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);
        }
Пример #3
0
        public static bool ChangePKMode(Models.Entities.Player player, Models.Packets.Client.DataExchangePacket packet)
        {
            player.PKMode       = (Enums.PKMode)packet.Data1Low;
            player.AttackPacket = null;

            player.ClientSocket.Send(packet);
            return(true);
        }
Пример #4
0
        public static bool ChangeDirection(Models.Entities.Player player, Models.Packets.Client.DataExchangePacket packet)
        {
            player.Direction    = packet.Direction;
            player.AttackPacket = null;

            player.UpdateScreen(false, packet);
            return(true);
        }
Пример #5
0
        public static bool Handle(Models.Entities.Player player, Models.Packets.Client.DataExchangePacket packet)
        {
            if (!player.Alive && DateTime.UtcNow >= player.ReviveTime)
            {
                player.AddActionLog("RevivePacket");
                player.Revive(false);
            }

            return(true);
        }
Пример #6
0
        public static bool HandleQueryPlayer(Models.Entities.Player player, Models.Packets.Client.DataExchangePacket packet)
        {
            Models.Maps.IMapObject obj;
            if (packet.Data1 > 1000000 && player.GetFromScreen(packet.Data1, out obj))
            {
                var objPlayer = (obj as Models.Entities.Player);

                objPlayer.ClientSocket.Send(player.GetSpawnPacket());
                player.ClientSocket.Send(objPlayer.GetSpawnPacket());
            }

            return(true);
        }
Пример #7
0
        public static bool ChangeAction(Models.Entities.Player player, Models.Packets.Client.DataExchangePacket packet)
        {
            var action = (Enums.PlayerAction)packet.Data1Low;

            player.AttackPacket = null;

            if (player.Action != Enums.PlayerAction.Sit || player.Action != Enums.PlayerAction.Lie)
            {
                if (action == Enums.PlayerAction.Sit || action == Enums.PlayerAction.Lie)
                {
                    player.UpdateStamina();
                }
            }

            player.Action = action;

            player.UpdateScreen(false, packet);
            return(true);
        }
Пример #8
0
        public static bool HandleQueryStats(Models.Entities.Player player, Models.Packets.Client.DataExchangePacket packet)
        {
            if (packet.Data1 > 1000000 && packet.Data1 != player.ClientId)
            {
                var queryPlayer = Collections.PlayerCollection.GetPlayerByClientId(packet.Data1);
                if (queryPlayer != null)
                {
                    queryPlayer.UpdateBaseStats();
                    player.ClientSocket.Send(new Models.Packets.Entities.PlayerStatsPacket
                    {
                        Player = queryPlayer
                    });
                }
            }
            else
            {
                player.UpdateBaseStats();
            }

            return(true);
        }
Пример #9
0
        public static bool GetCustomPlayerData(Models.Entities.Player player, Models.Packets.Client.DataExchangePacket packet)
        {
            #region Basic stats
            // To update it client side ...
            player.BoundCPs = player.BoundCPs;

            player.ValidateLoginMap();

            player.UpdateStats();

            player.Stamina = Data.Constants.GameMode.StartStamina;
            #endregion

            #region Status Flags
            if (!string.IsNullOrWhiteSpace(player.DbPlayer.StatusFlag))
            {
                player.StaticStatusFlag = player.DbPlayer.StatusFlag.ToEnum <Enums.StatusFlag>();
            }

            // Idk why, but for some reason you can't update the client any other way with the pk points and status flag ...
            var pkp = player.PKPoints;
            player.PKPoints = 0;
            player.PKPoints = pkp;
            #endregion

            #region Messages
            if (Collections.BroadcastQueue.LastMessage != null)
            {
                player.ClientSocket.Send(Collections.BroadcastQueue.LastMessage);
            }

            foreach (var dbWhisper in Database.Dal.WhisperCache.GetAllByRecipent(player.Name, Drivers.Settings.WorldSettings.Server))
            {
                player.ClientSocket.Send(
                    Controllers.Packets.Message.MessageController.CreateWhisper(string.Concat("[Sent offline]", dbWhisper.Message), dbWhisper.From, dbWhisper.To, dbWhisper.Mesh, player.Mesh)
                    );

                dbWhisper.Delete();
            }
            #endregion

            #region Houses
            var houses = Database.Dal.PlayerHouses.GetAll(player.DbPlayer.Id);
            if (houses.Count > 0)
            {
                bool anyRent = false;

                foreach (var dbPlayerHouse in houses)
                {
                    if (!anyRent && dbPlayerHouse.IsLeasing && dbPlayerHouse.NextRentDate.HasValue &&
                        DateTime.UtcNow >= dbPlayerHouse.NextRentDate.Value)
                    {
                        anyRent = true;
                    }

                    var playerHouse = new Models.Maps.PlayerHouse(player, dbPlayerHouse);
                    player.Houses.Add(playerHouse);

                    if (dbPlayerHouse.Warehouse)
                    {
                        player.Warehouses.CreateWarehouse((uint)(dbPlayerHouse.MapId + 100000));
                        playerHouse.CreateWarehouse();
                    }
                }

                if (anyRent)
                {
                    player.SendSystemMessage("RENT_DUE");
                }
            }
            #endregion

            #region Warehouse
            foreach (var dbOwnerItem in Database.Dal.Warehouses.GetWarehouseItems(player.DbPlayer.Id))
            {
                var item = Collections.ItemCollection.CreateItemById((uint)dbOwnerItem.ItemId);
                item.DbOwnerItem = dbOwnerItem;
                if (!string.IsNullOrWhiteSpace(dbOwnerItem.Color))
                {
                    item.Color = dbOwnerItem.Color.ToEnum <Enums.ItemColor>();
                }
                item.Gem1 = dbOwnerItem.Gem1.ToEnum <Enums.Gem>();
                item.Gem2 = dbOwnerItem.Gem2.ToEnum <Enums.Gem>();

                Collections.Warehouse warehouse;
                if (player.Warehouses.TryGetWarehouse(dbOwnerItem.LocationId.Value, out warehouse))
                {
                    if (!warehouse.Add(item, true))
                    {
                        player.ClientSocket.Disconnect(Drivers.Messages.Errors.FAILED_TO_LOAD_WAREHOUSE);
                        return(false);
                    }
                }
            }
            #endregion

            #region Nobility
            Models.Nobility.NobilityDonation nobility;
            if (Collections.NobilityBoard.TryGetNobility(player.DbPlayer.Id, out nobility))
            {
                nobility.Player = player;
                player.Nobility = nobility;
            }

            player.UpdateClientNobility();
            #endregion

            #region VIP
            byte vipLevel = 0;
            if (player.DbPlayer.DonationPoints >= 6)
            {
                vipLevel = 6;
            }
            else if (player.DbPlayer.DonationPoints > 0)
            {
                vipLevel = (byte)player.DbPlayer.DonationPoints;
            }
            player.VIPLevel = vipLevel;
            #endregion

            #region Arena
            Models.Arena.ArenaInfo arenaInfo;
            if (!Collections.ArenaQualifierCollection.TryGetArenaInfo(player.DbPlayer.Id, out arenaInfo))
            {
                arenaInfo = new Models.Arena.ArenaInfo(null)
                {
                    Player = player
                };

                if (!Collections.ArenaQualifierCollection.TryAddArenaInfo(player.DbPlayer.Id, arenaInfo))
                {
                    player.ClientSocket.Disconnect(Drivers.Messages.Errors.FAILED_TO_INITIALIZE_ARENA_INFO);
                }
            }
            else
            {
                arenaInfo.Player = player;
            }

            player.ArenaInfo = arenaInfo;
            #endregion

            // TODO: Load subclass

            // TODO: Load heaven blessing

            #region Merchant
            player.UpdateClient(Enums.UpdateClientType.Merchant, 255UL);
            #endregion

            Server.FinishLogin.Handle(player);
            return(true);
        }
Пример #10
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);
        }
Пример #11
0
 public static bool HandleQueryFriendEquip(Models.Entities.Player player, Models.Packets.Client.DataExchangePacket packet)
 {
     // TODO: Handle this correct ??
     return(HandleQueryEquipments(player, packet));
 }
Пример #12
0
        public static bool Handle(Models.Entities.Player player, Models.Packets.Client.DataExchangePacket packet)
        {
            player.RemoveStatusFlag(Enums.StatusFlag.Fly);

            return(true);
        }