Esempio n. 1
0
        public static bool Handle(Models.Entities.Player player, Models.Packets.Trade.TradePacket packet)
        {
            if (!player.Trade.Trading)
            {
                return(true);
            }

            if (!player.Trade.WindowOpen)
            {
                return(true);
            }

            Models.Items.Item item;
            if (player.Inventory.TryGetItem(packet.TargetClientId, out item))
            {
                if (!item.Discardable)
                {
                    player.SendSystemMessage("NO_PERMISSION_ITEM");
                    return(true);
                }

                if ((player.Trade.Partner.Inventory.Count + player.Trade.Items.Count) >= 40)
                {
                    player.SendSystemMessage("TARGET_FULL_INVENTORY");
                    return(true);
                }

                player.Trade.Items.Add(item);
                item.UpdateClient(player.Trade.Partner, Enums.ItemUpdateAction.Trade);
            }

            return(true);
        }
Esempio n. 2
0
        public static bool Handle(Models.Entities.Player player, Models.Packets.Trade.TradePacket packet)
        {
            if (player.Trade.Trading && player.Trade.Partner == null)
            {
                player.SendSystemMessage("SELF_ALREADY_TRADE");
                return(true);
            }
            else if (player.Trade.Trading)
            {
                if (!player.Trade.Requesting)
                {
                    packet.Action         = Enums.TradeAction.ShowTable;
                    packet.TargetClientId = player.Trade.Partner.ClientId;
                    player.ClientSocket.Send(packet);

                    packet.TargetClientId = player.ClientId;
                    player.Trade.Partner.ClientSocket.Send(packet);

                    player.Trade.WindowOpen = true;
                    player.Trade.Partner.Trade.WindowOpen = true;
                }

                return(true);
            }

            Models.Maps.IMapObject obj;
            if (player.GetFromScreen(packet.TargetClientId, out obj))
            {
                var target = obj as Models.Entities.Player;
                if (!target.Trade.Trading)
                {
                    player.Trade.Begin(target);
                    target.Trade.Begin(player);

                    target.Trade.Requesting = false;
                    player.Trade.Requesting = true;

                    packet.TargetClientId = player.ClientId;
                    target.ClientSocket.Send(packet);
                }
                else
                {
                    player.SendSystemMessage("TARGET_ALREADY_TRADE");
                }
            }
            else
            {
                player.ClientSocket.Disconnect(Drivers.Messages.Errors.INVALID_TRADE_TARGET);
            }

            return(true);
        }
Esempio n. 3
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);
        }
        public static bool Handle(Models.Entities.Player player, Models.Packets.Trade.TradePacket packet)
        {
            if (!player.Trade.Trading)
            {
                return(true);
            }

            if (!player.Trade.WindowOpen)
            {
                return(true);
            }

            uint cps = packet.TargetClientId;

            if (cps > player.CPs)
            {
                player.SendSystemMessage("LOW_CPS_TRADE");
                return(true);
            }

            player.Trade.CPs = cps;
            packet.Action    = Enums.TradeAction.ShowConquerPoints;
            player.Trade.Partner.ClientSocket.Send(packet);

            return(true);
        }
Esempio n. 5
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);
        }
Esempio n. 6
0
        public static bool Handle(Models.Entities.Player player, Models.Packets.Trade.TradePacket packet)
        {
            if (!player.Trade.Trading)
            {
                return(true);
            }

            if (!player.Trade.WindowOpen)
            {
                return(true);
            }

            uint money = packet.TargetClientId;

            if (money > player.Money)
            {
                player.SendSystemMessage("LOW_MONEY_TRADE");
                return(true);
            }

            player.Trade.Money = money;
            packet.Action      = Enums.TradeAction.ShowMoney;
            player.Trade.Partner.ClientSocket.Send(packet);

            return(true);
        }
Esempio n. 7
0
        public static bool Handle(Models.Entities.Player player, Models.Packets.Items.WarehousePacket packet)
        {
            if (player.Guild != null && player.Guild.InHouse(player))
            {
                if (player.Inventory.Count >= 40)
                {
                    player.SendSystemMessage("WAREHOUSE_FULL");
                    return(true);
                }

                var item = player.Guild.Warehouse.Pop(packet.ClientId);
                if (item != null)
                {
                    player.Inventory.Add(item);
                }

                player.ClientSocket.Send(packet);
            }
            else
            {
                Collections.Warehouse warehouse;
                if (player.Warehouses.TryGetWarehouse(player.CurrentNpc.ClientId, out warehouse))
                {
                    if (player.Inventory.Count >= 20)
                    {
                        player.SendSystemMessage("WAREHOUSE_FULL");
                        return(true);
                    }

                    var item = warehouse.Pop(packet.ClientId);
                    if (item != null)
                    {
                        player.Inventory.Add(item);
                    }

                    player.ClientSocket.Send(packet);
                }
            }

            return(true);
        }
Esempio n. 8
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);
        }
Esempio n. 9
0
        public static bool HandleCPs(Models.Entities.Player player, Models.Packets.Guilds.GuildPacket packet)
        {
            if (player.Guild != null)
            {
                if (!player.Guild.DonateCPs(player, packet.Data))
                {
                    player.SendSystemMessage("LOW_CPS_DONATE_GUILD");
                }
            }

            return(true);
        }
Esempio n. 10
0
        /// <summary>
        /// Verifies that the composition can be done.
        /// </summary>
        /// <param name="player">The player.</param>
        /// <param name="packet">The packet.</param>
        /// <param name="mainItem">The main item.</param>
        /// <param name="minorItem">The minor item.</param>
        /// <returns>True if the composition can be done, false otherwise.</returns>
        private static bool VerifyComposition(Models.Entities.Player player, Models.Packets.Items.CompositionPacket packet,
                                              out Models.Items.Item mainItem, out Models.Items.Item minorItem)
        {
            mainItem  = null;
            minorItem = null;

            if (!player.Alive)
            {
                return(false);
            }

            if (!player.Inventory.TryGetItem(packet.MainItemClientId, out mainItem))
            {
                player.SendSystemMessage("COMPOSITION_ITEM_NOT_FOUND");
                return(false);
            }

            if (!player.Inventory.TryGetItem(packet.MinorItemClientId, out minorItem))
            {
                player.SendSystemMessage("COMPOSITION_ITEM_NOT_FOUND");
                return(false);
            }

            if (mainItem.IsGarment || mainItem.IsArrow || mainItem.IsBottle || mainItem.IsMountArmor || mainItem.IsMisc)
            {
                player.SendSystemMessage("COMPOSITION_ITEM_INVALID");
                return(false);
            }

            if (mainItem.DbOwnerItem.CurrentDura < mainItem.DbOwnerItem.MaxDura)
            {
                player.SendSystemMessage("COMPOSITION_ITEM_LOW_DURA");
                return(false);
            }

            if (mainItem.DbOwnerItem.Plus >= Data.Constants.GameMode.MaxPlus)
            {
                player.SendSystemMessage("COMPOSITION_ITEM_MAX_PLUS");
                return(false);
            }

            if (minorItem.DbOwnerItem.Plus == 0)
            {
                player.SendSystemMessage("COMPOSITION_MINOR_ITEM_NO_PLUS");
                return(false);
            }

            if (minorItem.DbOwnerItem.Plus < mainItem.DbOwnerItem.Plus)
            {
                player.SendSystemMessage("COMPOSITION_MINOR_ITEM_LOW_PLUS");
                return(false);
            }

            return(true);
        }
Esempio n. 11
0
        public static bool Handle(Models.Entities.Player player, Models.Packets.Items.WarehousePacket packet)
        {
            if (player.Guild != null && player.Guild.InHouse(player))
            {
                if (player.Guild.Warehouse.Count >= 20)
                {
                    player.SendSystemMessage("WAREHOUSE_FULL");
                    return(true);
                }

                var item = player.Inventory.Pop(packet.ClientId);
                if (item != null)
                {
                    player.AddActionLog("AddGuildWarehouseItem", item.DbItem.Id);
                    player.Guild.Warehouse.Add(item, player);
                }
            }
            else
            {
                Collections.Warehouse warehouse;
                if (player.Warehouses.TryGetWarehouse(player.CurrentNpc.ClientId, out warehouse))
                {
                    if (warehouse.Count >= 20)
                    {
                        player.SendSystemMessage("WAREHOUSE_FULL");
                        return(true);
                    }

                    var item = player.Inventory.Pop(packet.ClientId);
                    if (item != null)
                    {
                        player.AddActionLog("AddWarehouseItem", item.DbItem.Id + " :" + warehouse.Id);
                        warehouse.Add(item);
                    }
                }
            }

            return(true);
        }
Esempio n. 12
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);
        }
Esempio n. 13
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);
        }
Esempio n. 14
0
        public static bool HandlePacket(Models.Entities.Player player, Models.Packets.Items.GroundItemPacket packet)
        {
            if (packet.Action == Enums.GroundItemAction.Pickup && player.Map != null)
            {
                Models.Maps.IMapObject mapObject;
                if (player.GetFromScreen(packet.ClientId, out mapObject))
                {
                    var item = mapObject as Models.Items.Item;

                    if (item != null && Tools.RangeTools.GetDistanceU(player.X, player.Y, item.X, item.Y) < 2)
                    {
                        if (!item.PlayerDrop && DateTime.UtcNow < item.DropTime.AddMilliseconds(Data.Constants.Time.DropTimeShare) &&
                            item.DropClientId != player.ClientId)
                        {
                            player.SendSystemMessage("NOT_OWNER_ITEM");
                        }
                        else
                        {
                            Task.Run(async() => await item
                                     .ResetLocationAsync(true, () =>
                            {
                                if (item.DropMoney > 0)
                                {
                                    player.AddActionLog("PickUpMoney", item.DropMoney);
                                    player.Money += item.DropMoney;
                                }
                                else
                                {
                                    player.AddActionLog("PickUpItem", item.DbItem.Id);
                                    player.Inventory.Add(item);
                                }
                            }, (e) =>
                            {
                                player.ClientSocket.LastException = e;
                                player.ClientSocket.Disconnect(Drivers.Messages.Errors.FATAL_ERROR_TITLE);
                            }));
                        }
                    }
                }

                return(true);
            }

            return(false);
        }
Esempio n. 15
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);
        }
Esempio n. 16
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);
        }
Esempio n. 17
0
        public static bool Handle(Models.Entities.Player player, Models.Packets.Trade.TradePacket packet)
        {
            if (!player.Trade.Trading)
            {
                return(true);
            }

            if (!player.Trade.WindowOpen)
            {
                return(true);
            }

            if (!player.Trade.Accepted && !player.Trade.PartnerAccepted)
            {
                player.Trade.Accepted = true;
                player.Trade.Partner.Trade.Accepted = true;
                packet.TargetClientId = player.ClientId;
                player.Trade.Partner.ClientSocket.Send(packet);
            }
            else if (player.Trade.Accepted && player.Trade.Partner.Trade.Accepted)
            {
                bool tradeSuccess = true;

                foreach (var item in player.Trade.Items)
                {
                    if (!player.Inventory.Contains(item.ClientId))
                    {
                        tradeSuccess = false;
                    }
                }

                foreach (var item in player.Trade.PartnerItems)
                {
                    if (!player.Trade.Partner.Inventory.Contains(item.ClientId))
                    {
                        tradeSuccess = false;
                    }
                }

                if (player.Money < player.Trade.Money)
                {
                    tradeSuccess = false;
                }
                if (player.Trade.Partner.Money < player.Trade.PartnerMoney)
                {
                    tradeSuccess = false;
                }

                if (player.CPs < player.Trade.CPs)
                {
                    tradeSuccess = false;
                }
                if (player.Trade.Partner.CPs < player.Trade.PartnerCPs)
                {
                    tradeSuccess = false;
                }

                if (tradeSuccess)
                {
                    foreach (var item in player.Trade.Items)
                    {
                        player.AddActionLog("TradeItem", string.Format("{0} -> {1} : {2}", player.DbPlayer.Id, player.Trade.Partner.DbPlayer.Id, item.DbItem.Id));

                        var removedItem = player.Inventory.Pop(item.ClientId);
                        if (removedItem != null)
                        {
                            player.Trade.Partner.Inventory.Add(removedItem);
                        }
                    }

                    foreach (var item in player.Trade.PartnerItems)
                    {
                        player.AddActionLog("TradeItem", string.Format("{0} -> {1} : {2}", player.Trade.Partner.DbPlayer.Id, player.DbPlayer.Id, item.DbItem.Id));

                        var removedItem = player.Trade.Partner.Inventory.Pop(item.ClientId);
                        if (removedItem != null)
                        {
                            player.Inventory.Add(item);
                        }
                    }

                    if (player.Money >= player.Trade.Money)
                    {
                        player.AddActionLog("TradeMoney", player.Trade.Money);
                        player.Money -= player.Trade.Money;
                        player.Trade.Partner.Money += player.Trade.Money;
                    }

                    if (player.Trade.Partner.Money >= player.Trade.PartnerMoney)
                    {
                        player.AddActionLog("TradePartnerMoney", player.Trade.PartnerMoney);
                        player.Trade.Partner.Money -= player.Trade.PartnerMoney;
                        player.Money += player.Trade.PartnerMoney;
                    }

                    if (player.CPs >= player.Trade.CPs)
                    {
                        player.AddActionLog("TradeCPs", player.Trade.CPs);
                        player.CPs -= player.Trade.CPs;
                        player.Trade.Partner.CPs += player.Trade.CPs;
                    }

                    if (player.Trade.Partner.CPs >= player.Trade.PartnerCPs)
                    {
                        player.AddActionLog("TradePartnerCPs", player.Trade.PartnerCPs);
                        player.Trade.Partner.CPs -= player.Trade.PartnerCPs;
                        player.CPs += player.Trade.PartnerCPs;
                    }

                    var partner = player.Trade.Partner;

                    partner.Trade.Reset();
                    player.Trade.Reset();

                    packet.Action         = Enums.TradeAction.HideTable;
                    packet.TargetClientId = partner.ClientId;
                    player.ClientSocket.Send(packet);
                    packet.TargetClientId = player.ClientId;
                    partner.ClientSocket.Send(packet);

                    player.SendSystemMessage("TRADE_SUCCESS");
                    partner.SendSystemMessage("TRADE_SUCCESS");
                }
                else
                {
                    var partner = player.Trade.Partner;

                    partner.Trade.Reset();
                    player.Trade.Reset();

                    packet.Action         = Enums.TradeAction.HideTable;
                    packet.TargetClientId = partner.ClientId;
                    player.ClientSocket.Send(packet);
                    packet.TargetClientId = player.ClientId;
                    partner.ClientSocket.Send(packet);

                    player.SendSystemMessage("TRADE_FAIL");
                    partner.SendSystemMessage("TRADE_FAIL");
                }
            }

            return(true);
        }
Esempio n. 18
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);
        }
Esempio n. 19
0
        /// <summary>
        /// Adds an item to the warehouse.
        /// </summary>
        /// <param name="item">The item to add.</param>
        /// <returns>True if the item was added, false otherwise.</returns>
        public bool Add(Models.Items.Item item, Models.Entities.Player player, bool silentAdd = false)
        {
            if (_items.Count >= 20)
            {
                if (player != null)
                {
                    player.SendSystemMessage("WAREHOUSE_FULL");
                }

                return(false);
            }

            if (_items.TryAdd(item.ClientId, item))
            {
                if (item.DbOwnerItem == null)
                {
                    item.DbOwnerItem = new Database.Models.DbOwnerItem
                    {
                        PlayerId   = Guild.DbGuild.Id,
                        ItemId     = (uint)item.DbItem.Id,
                        LocationId = Id
                    };
                    item.DbOwnerItem.MaxDura     = item.DbItem.Amount;
                    item.DbOwnerItem.CurrentDura = item.DbOwnerItem.MaxDura;
                    item.Gem1 = Enums.Gem.NoSocket;
                    item.Gem2 = Enums.Gem.NoSocket;
                    item.DbOwnerItem.OwnedBy.AddItem(Guild.DbGuild.Name);

                    if (!item.DbOwnerItem.Create(Database.Models.DbOwnerItem.GuildWarehouse))
                    {
                        return(false);
                    }
                }
                else if (item.DbOwnerItem.Id == 0)
                {
                    item.DbOwnerItem.PlayerId   = Guild.DbGuild.Id;
                    item.DbOwnerItem.LocationId = Id;
                    item.DbOwnerItem.OwnedBy.AddItem(Guild.DbGuild.Name);

                    if (!item.DbOwnerItem.Create(Database.Models.DbOwnerItem.GuildWarehouse))
                    {
                        return(false);
                    }
                }
                else
                {
                    item.DbOwnerItem.PlayerId   = Guild.DbGuild.Id;
                    item.DbOwnerItem.LocationId = Id;
                    item.DbOwnerItem.OwnedBy.AddItem(Guild.DbGuild.Name);

                    if (!item.DbOwnerItem.Update(Database.Models.DbOwnerItem.GuildWarehouse))
                    {
                        return(false);
                    }
                }

                if (!silentAdd && player != null)
                {
                    player.ClientSocket.Send(new Models.Packets.Items.WarehousePacket
                    {
                        WarehouseId = Id,
                        Item        = item
                    });
                }
                return(true);
            }

            return(false);
        }