Пример #1
0
        public static bool HandleDrawMoney(Models.Entities.Player player, Models.Packets.Items.ItemActionPacket packet)
        {
            if (player.Guild != null && player.Guild.InHouse(player))
            {
                if (player.Guild.DbGuild.WHMoney < packet.Data1)
                {
                    return(true);
                }

                player.Guild.DbGuild.WHMoney -= packet.Data1;
                player.Guild.DbGuild.Update();
            }
            else
            {
                if (player.WarehouseMoney < packet.Data1)
                {
                    return(true);
                }

                player.WarehouseMoney -= packet.Data1;
            }

            player.Money += packet.Data1;
            return(true);
        }
Пример #2
0
        public static bool HandleSell(Models.Entities.Player player, Models.Packets.Items.ItemActionPacket packet)
        {
            Models.Misc.Shop shop;
            if (Collections.ShopCollection.TryGetShop(packet.ClientId, out shop))
            {
                var npc = shop.Npc;
                if (npc != null && Tools.RangeTools.ValidDistance(npc.X, npc.Y, player.X, player.Y))
                {
                    Models.Items.Item item;
                    if (player.Inventory.TryGetItem(packet.Data1, out item))
                    {
                        if (!item.Discardable)
                        {
                            player.SendSystemMessage("NO_PERMISSION_ITEM");
                            return(true);
                        }

                        player.AddActionLog("Sell", item.DbOwnerItem.Id);
                        uint giveback = (uint)(item.DbOwnerItem.CurrentDura > 0 ? (item.DbItem.Price / 3) : 0);
                        if (player.Inventory.Remove(item.ClientId))
                        {
                            player.Money += giveback;
                        }
                    }
                }
            }

            return(true);
        }
Пример #3
0
        /// <summary>
        /// Unmasks an equipment.
        /// </summary>
        /// <param name="position">The position.</param>
        /// <returns>True if the unmask was done successfully.</returns>
        public bool Unmask(Enums.ItemPosition position)
        {
            Models.Items.Item removedItem;
            var success = _maskedEquipments.TryRemove(position, out removedItem);

            Models.Items.Item equipment;
            if (success)
            {
                Player.ClientSocket.Send(new Models.Packets.Items.ItemActionPacket
                {
                    Player   = this.Player,
                    ClientId = removedItem.ClientId,
                    Action   = Enums.ItemAction.Unequip,
                    Data1Low = (ushort)position
                });
                var itempacket = new Models.Packets.Items.ItemActionPacket();
                itempacket.Action   = Enums.ItemAction.Remove;
                itempacket.ClientId = removedItem.ClientId;

                Player.ClientSocket.Send(itempacket);

                if (_equipments.TryGetValue(position, out equipment))
                {
                    Equip(equipment, position, false, true);
                }
            }

            return(success);
        }
Пример #4
0
        public static bool Handle(Models.Entities.Player player, Models.Packets.Items.ItemActionPacket packet)
        {
            if (!player.Alive)
            {
                return(true);
            }

            Models.Items.Item upgradeItem;
            Models.Items.Item meteor;

            if (!player.Inventory.TryGetItem(packet.ClientId, out upgradeItem) ||
                !player.Inventory.TryGetItem(packet.Data1, out meteor) ||
                (meteor.DbItem.Id != 1088001 && meteor.DbItem.Id != 1088002))
            {
                player.SendSystemMessage("UPLEVEL_ITEM_NOT_FOUND_OR_NO_METEORS");
                return(true);
            }

            if (upgradeItem.DbOwnerItem.CurrentDura < upgradeItem.DbOwnerItem.MaxDura)
            {
                player.SendSystemMessage("UPLEVEL_ITEM_LOW_DURA");
                return(true);
            }

            if (upgradeItem.IsGarment || upgradeItem.IsArrow || upgradeItem.IsBottle || upgradeItem.IsMountArmor || upgradeItem.IsMisc)
            {
                player.SendSystemMessage("UPLEVEL_ITEM_INVALID");
                return(true);
            }

            if (upgradeItem.DbItem.Level >= 120)
            {
                player.SendSystemMessage("UPLEVEL_ITEM_MAX_LEVEL");
                return(true);
            }

            if (player.Inventory.Remove(packet.Data1))
            {
                int extraChance = Math.Max(0, (80 - upgradeItem.DbItem.Level));
                int chance      = Math.Min(90, Data.Constants.Chances.UpgradeLevelChance + extraChance);

                player.AddActionLog("ItemUpLevel", upgradeItem.DbOwnerItem.Id);
                if (upgradeItem.UpgradeLevel(player) && Tools.CalculationTools.ChanceSuccess(chance))
                {
                    upgradeItem.UpgradeSockets(player);

                    player.SendSystemMessage("UPLEVEL_SUCCESS");
                }
                else
                {
                    player.SendSystemMessage("UPLEVEL_FAIL");
                }
            }

            return(true);
        }
Пример #5
0
        public static bool Handle(Models.Entities.Player player, Models.Packets.Items.ItemActionPacket packet)
        {
            if (!player.Alive)
            {
                return(true);
            }

            Models.Items.Item upgradeItem;
            Models.Items.Item dragonBall;

            if (!player.Inventory.TryGetItem(packet.ClientId, out upgradeItem) ||
                !player.Inventory.TryGetItem(packet.Data1, out dragonBall) ||
                dragonBall.DbItem.Id != 1088000)
            {
                player.SendSystemMessage("IMPROVE_ITEM_NOT_FOUND_OR_NO_DRAGONBALLS");
                return(true);
            }

            if (upgradeItem.DbOwnerItem.CurrentDura < upgradeItem.DbOwnerItem.MaxDura)
            {
                player.SendSystemMessage("IMPROVE_ITEM_LOW_DURA");
                return(true);
            }

            if (upgradeItem.IsGarment || upgradeItem.IsArrow || upgradeItem.IsBottle || upgradeItem.IsMountArmor || upgradeItem.IsMisc)
            {
                player.SendSystemMessage("IMPROVE_ITEM_INVALID");
                return(true);
            }

            if (upgradeItem.Quality == Enums.ItemQuality.Super)
            {
                player.SendSystemMessage("IMPROVE_ITEM_IS_SUPER");
                return(true);
            }

            int extraChance = Math.Max(0, (80 - ((int)upgradeItem.Quality) * 10));
            int chance      = Math.Min(90, Data.Constants.Chances.UpgradeQualityChance + extraChance);

            player.AddActionLog("Improve", upgradeItem.DbOwnerItem.Id);
            if (player.Inventory.Remove(packet.Data1) && Tools.CalculationTools.ChanceSuccess(chance))
            {
                upgradeItem.UpgradeQuality(player);
                upgradeItem.UpgradeSockets(player);

                player.SendSystemMessage("IMPROVE_SUCCESS");
            }
            else
            {
                player.SendSystemMessage("IMPROVE_FAIL");
            }

            return(true);
        }
Пример #6
0
        public static bool HandleBuy(Models.Entities.Player player, Models.Packets.Items.ItemActionPacket packet)
        {
            if (player.Inventory.Count == 40)
            {
                player.SendSystemMessage("INVENTORY_FULL");
                return(true);
            }

            Models.Misc.Shop shop;
            if (Collections.ShopCollection.TryGetShop(packet.ClientId, out shop))
            {
                var npc = shop.Npc;
                if (shop.ShopType != Enums.ShopType.Money || npc != null && Tools.RangeTools.ValidDistance(npc.X, npc.Y, player.X, player.Y))
                {
                    uint itemId = packet.Data1;
                    if (!shop.Items.Contains(itemId))
                    {
                        return(false);
                    }

                    uint amount = packet.Data2;

                    int above = (int)((player.Inventory.Count + amount) - 40);
                    if (above > 0)
                    {
                        amount -= (uint)above;
                    }

                    if ((player.Inventory.Count + amount) > 40)
                    {
                        player.SendSystemMessage("INVENTORY_NO_SPACE");
                        return(true);
                    }

                    switch (shop.ShopType)
                    {
                    case Enums.ShopType.Money:
                        return(HandleBuy(player, itemId, amount, true));

                    case Enums.ShopType.CPs:
                        return(HandleBuy(player, itemId, amount, false));

                    default:
                        return(true);
                    }
                }
            }

            return(false);
        }
Пример #7
0
        public static bool Handle(Models.Entities.Player player, Models.Packets.Items.ItemActionPacket packet)
        {
            if (!player.Alive)
            {
                return(true);
            }

            if (player.Battle != null)
            {
                return(true);
            }

            player.Equipments.Unequip((Enums.ItemPosition)packet.Data1);

            return(true);
        }
Пример #8
0
        /// <summary>
        /// Pops an item from the inventory.
        /// </summary>
        /// <param name="id">The client id of the item to pop.</param>
        /// <returns>The popped item.</returns>
        public Models.Items.Item Pop(uint id)
        {
            Models.Items.Item removedItem;
            if (_items.TryRemove(id, out removedItem))
            {
                if (removedItem.DbOwnerItem.Delete(Database.Models.DbOwnerItem.Inventories))
                {
                    removedItem.DbOwnerItem.Id = 0;

                    var itempacket = new Models.Packets.Items.ItemActionPacket();
                    itempacket.Action   = Enums.ItemAction.Remove;
                    itempacket.ClientId = id;
                    Player.ClientSocket.Send(itempacket);
                }
            }

            return(removedItem);
        }
Пример #9
0
        public static bool HandleRepairAll(Models.Entities.Player player, Models.Packets.Items.ItemActionPacket packet)
        {
            var  repairItems = player.Equipments.GetAll();
            uint repairPrice = 0;

            // Gets the price for the repair ...
            foreach (var item in repairItems)
            {
                if (item.DbOwnerItem.CurrentDura > 0)
                {
                    repairPrice += item.RepairPrice;
                }
            }

            if (player.Money < repairPrice)
            {
                // Necessary, because the client automatically sets the durability to max durability without server-side validation.
                foreach (var item in repairItems)
                {
                    item.UpdateClient(player, Enums.ItemUpdateAction.Update);
                }

                player.SendSystemMessage("REPAIR_ALL_NOT_ENOUGH_MONEY");
                return(true);
            }

            player.AddActionLog("RepairAll");
            player.Money -= repairPrice;

            foreach (var repairItem in repairItems)
            {
                if (repairItem.DbOwnerItem.CurrentDura >= 0)
                {
                    repairItem.DbOwnerItem.CurrentDura = repairItem.DbOwnerItem.MaxDura;
                    repairItem.UpdateDatabase();
                }

                repairItem.UpdateClient(player, Enums.ItemUpdateAction.Update);
            }

            return(true);
        }
Пример #10
0
        public static bool HandleRepair(Models.Entities.Player player, Models.Packets.Items.ItemActionPacket packet)
        {
            Models.Items.Item repairItem;
            if (player.Inventory.TryGetItem(packet.ClientId, out repairItem))
            {
                if (repairItem.DbOwnerItem.CurrentDura <= 0)
                {
                    int meteorAmount;
                    if (!player.Inventory.ContainsById(1088001, out meteorAmount) || meteorAmount < 5)
                    {
                        player.SendSystemMessage("REPAIR_NOT_ENOUGH_METEORS");
                        return(true);
                    }

                    if (!player.Inventory.RemoveByCount(1088001, 5))
                    {
                        player.SendSystemMessage("REPAIR_NOT_ENOUGH_METEORS");
                        return(true);
                    }
                }
                else
                {
                    uint repairPrice = repairItem.RepairPrice;

                    if (player.Money < repairPrice)
                    {
                        player.SendSystemMessage("REPAIR_NOT_ENOUGH_MONEY");
                        return(true);
                    }

                    player.Money -= repairPrice;
                }

                player.AddActionLog("Repair", repairItem.DbOwnerItem.Id);
                repairItem.DbOwnerItem.CurrentDura = repairItem.DbOwnerItem.MaxDura;
                repairItem.UpdateDatabase();
                repairItem.UpdateClient(player, Enums.ItemUpdateAction.Update);
            }

            return(true);
        }
Пример #11
0
        public static bool HandleQueryMoneySaved(Models.Entities.Player player, Models.Packets.Items.ItemActionPacket packet)
        {
            if (player.Guild != null && player.Guild.InHouse(player))
            {
                packet.Data1 = player.Guild.DbGuild.WHMoney;
                player.ClientSocket.Send(packet);

                // ????
                player.UpdateClient(Enums.UpdateClientType.WarehouseMoney, packet.Data1);
            }
            else
            {
                packet.Data1 = player.WarehouseMoney;
                player.ClientSocket.Send(packet);

                // ????
                player.WarehouseMoney = player.WarehouseMoney;
            }

            return(true);
        }
Пример #12
0
        public static bool Handle(Models.Entities.Player player, Models.Packets.Items.ItemActionPacket packet)
        {
            if (!player.Alive)
            {
                return(true);
            }

            if (player.Battle != null)
            {
                return(true);
            }

            var location = player.Map.GetValidItemCoordinate(player.X, player.Y);

            if (location.Valid)
            {
                Models.Items.Item item = player.Inventory.Find(i => i.ClientId == packet.ClientId);
                if (item != null && item.Discardable)
                {
                    player.AddActionLog("ItemDrop", item.DbOwnerItem.Id);

                    if (player.Inventory.Remove(item.ClientId))
                    {
                        item.Drop(player.MapId, location.X, location.Y, true, player.ClientId);
                    }
                }
                else
                {
                    Database.Dal.Accounts.Ban(
                        player.DbPlayer.Account, Drivers.Messages.INVALID_DROP_ITEM,
                        Database.Models.DbAccount.BanRangeType.Perm);
                    player.ClientSocket.Disconnect(Drivers.Messages.INVALID_DROP_ITEM);
                    return(false);
                }
            }

            return(true);
        }
Пример #13
0
        public static bool Handle(Models.Entities.Player player, Models.Packets.Items.ItemActionPacket packet)
        {
            var arenaBattle = player.Battle as Controllers.Arena.ArenaBattleController;

            if (player.Battle != null && !(player.Battle is Controllers.Arena.ArenaBattleController))
            {
                return(true);
            }

            Models.Items.Item item;
            if (!player.Inventory.TryGetItem(packet.ClientId, out item))
            {
                Database.Dal.Accounts.Ban(
                    player.DbPlayer.Account, Drivers.Messages.INVALID_USE_ITEM,
                    Database.Models.DbAccount.BanRangeType.Perm);
                player.ClientSocket.Disconnect(Drivers.Messages.INVALID_USE_ITEM);
                return(false);
            }

            if (item.IsMisc)
            {
                player.AddActionLog("ItemUsage", item.DbItem.Id);
                if (!Collections.ItemScriptCollection.Invoke(player, item.DbItem.Id))
                {
                    player.SendFormattedSystemMessage("ITEM_USAGE_NOT_FOUND", true, item.DbItem.Name, item.DbItem.Id);
                }
            }
            else
            {
                var position = (Enums.ItemPosition)packet.Data1;
                if (position != Enums.ItemPosition.Inventory)
                {
                    player.Equipments.Equip(item, position, true);
                }
            }

            return(true);
        }
Пример #14
0
        /// <summary>
        /// Unmasks all masked equipments.
        /// </summary>
        public void UnmaskAll()
        {
            foreach (var maskedEquip in _maskedEquipments.Values)
            {
                Player.ClientSocket.Send(new Models.Packets.Items.ItemActionPacket
                {
                    Player   = this.Player,
                    ClientId = maskedEquip.ClientId,
                    Action   = Enums.ItemAction.Unequip,
                    Data1Low = (ushort)maskedEquip.Position
                });
                var itempacket = new Models.Packets.Items.ItemActionPacket();
                itempacket.Action   = Enums.ItemAction.Remove;
                itempacket.ClientId = maskedEquip.ClientId;

                Player.ClientSocket.Send(itempacket);
            }

            _maskedEquipments.Clear();
            foreach (var equip in _equipments.Values.ToArray())
            {
                Equip(equip, equip.Position, false, true);
            }
        }
Пример #15
0
        public static bool Handle(Models.Entities.Player player, Models.Packets.Items.ItemActionPacket packet)
        {
            if (!player.Alive)
            {
                return(true);
            }

            if (player.MapId != 1036 || !Tools.RangeTools.ValidDistance(320, 229, player.X, player.Y))
            {
                return(true);
            }

            Models.Items.Item blessItem;
            if (!player.Inventory.TryGetItem(packet.ClientId, out blessItem))
            {
                player.SendSystemMessage("BLESS_ITEM_NOT_FOUND");
                return(true);
            }

            if (blessItem.DbOwnerItem.CurrentDura < blessItem.DbOwnerItem.MaxDura)
            {
                player.SendSystemMessage("BLESS_ITEM_LOW_DURA");
                return(true);
            }

            if (blessItem.IsGarment || blessItem.IsArrow || blessItem.IsBottle || blessItem.IsMountArmor || blessItem.IsMisc ||
                blessItem.IsFan || blessItem.IsTower)
            {
                player.SendSystemMessage("BLESS_ITEM_INVALID");
                return(true);
            }

            int  requiredTortoiseGems = 5;
            byte setBless             = 1;

            switch (blessItem.DbOwnerItem.Bless)
            {
            case 0:
                requiredTortoiseGems = 5;
                break;

            default:
                requiredTortoiseGems = blessItem.DbOwnerItem.Bless;
                setBless             = (byte)(requiredTortoiseGems + 2);
                break;
            }

            if (setBless > 7)
            {
                player.SendSystemMessage("BLESS_ITEM_MAX_BLESS");
                return(true);
            }

            int tortoiseAmount;

            if (!player.Inventory.ContainsById(700073, out tortoiseAmount) || tortoiseAmount < requiredTortoiseGems)
            {
                player.SendSystemMessage("BLESS_NOT_ENOUGH_TORTOISE_GEMS");
                return(true);
            }

            player.AddActionLog("BlessItem", blessItem.DbOwnerItem.Id);
            if (player.Inventory.RemoveByCount(700073, requiredTortoiseGems))
            {
                blessItem.DbOwnerItem.Bless = setBless;
                blessItem.DbOwnerItem.Update();
                blessItem.UpdateClient(player, Enums.ItemUpdateAction.Update);
                player.ClientSocket.Send(packet);
            }

            return(true);
        }
Пример #16
0
 public static bool Handle(Models.Entities.Player player, Models.Packets.Items.ItemActionPacket packet)
 {
     player.ClientSocket.Send(packet);
     return(true);
 }