Exemplo n.º 1
0
        /// <summary>
        /// Handles a request to move an item within the inventory.
        /// This covers moving items within the backpack, from equipment
        /// slot to backpack and from backpack to equipment slot
        /// </summary>
        public void HandleInventoryRequestMoveMessage(InventoryRequestMoveMessage request)
        {
            // TODO Normal inventory movement does not require setting of inv loc msg! Just Tick. /fasbat
            Item item = GetItem(request.ItemID);

            if (item == null)
            {
                return;
            }
            // Request to equip item from backpack
            if (request.Location.EquipmentSlot != 0 && request.Location.EquipmentSlot != (int)EquipmentSlotId.Stash)
            {
                var sourceGrid = (item.InvLoc.EquipmentSlot == 0 ? _inventoryGrid :
                                  item.InvLoc.EquipmentSlot == (int)EquipmentSlotId.Stash ? _stashGrid : null);

                System.Diagnostics.Debug.Assert((sourceGrid != null && sourceGrid.Contains(request.ItemID)) || _equipment.IsItemEquipped(request.ItemID), "Request to equip unknown item");

                int targetEquipSlot = request.Location.EquipmentSlot;

                if (IsValidEquipmentRequest(item, targetEquipSlot))
                {
                    Item oldEquipItem = _equipment.GetEquipment(targetEquipSlot);

                    // check if equipment slot is empty
                    if (oldEquipItem == null)
                    {
                        // determine if item is in backpack or switching item from position with target originally empty
                        if (sourceGrid != null)
                        {
                            sourceGrid.RemoveItem(item);
                        }
                        else
                        {
                            _equipment.UnequipItem(item);
                        }

                        _equipment.EquipItem(item, targetEquipSlot);
                        AcceptMoveRequest(item);
                    }
                    else
                    {
                        // check if item is already equipped at another equipmentslot
                        if (_equipment.IsItemEquipped(item))
                        {
                            // switch both items
                            if (!IsValidEquipmentRequest(oldEquipItem, item.EquipmentSlot))
                            {
                                return;
                            }

                            int oldEquipmentSlot = _equipment.UnequipItem(item);
                            _equipment.EquipItem(item, targetEquipSlot);
                            _equipment.EquipItem(oldEquipItem, oldEquipmentSlot);
                        }
                        else
                        {
                            // Get original location
                            int x = item.InventoryLocation.X;
                            int y = item.InventoryLocation.Y;
                            // equip item and place other item in the backpack
                            sourceGrid.RemoveItem(item);
                            _equipment.UnequipItem(oldEquipItem);
                            sourceGrid.AddItem(oldEquipItem, y, x);
                            _equipment.EquipItem(item, targetEquipSlot);
                        }
                        AcceptMoveRequest(item);
                        AcceptMoveRequest(oldEquipItem);
                    }

                    SendVisualInventory(this._owner);
                }
            }
            // Request to move an item (from backpack or equipmentslot)
            else
            {
                if (request.Location.EquipmentSlot == 0)
                {
                    // check if not unsocketting rune
                    for (int i = 0; i < _skillSocketRunes.Length; i++)
                    {
                        if (_skillSocketRunes[i] == request.ItemID)
                        {
                            if (_inventoryGrid.FreeSpace(item, request.Location.Row, request.Location.Column))
                            {
                                RemoveRune(i);
                                _inventoryGrid.AddItem(item, request.Location.Row, request.Location.Column);
                                if (item.InvLoc.EquipmentSlot != request.Location.EquipmentSlot)
                                {
                                    AcceptMoveRequest(item);
                                }
                            }
                            return;
                        }
                    }
                }

                var destGrid = (request.Location.EquipmentSlot == 0 ? _inventoryGrid : _stashGrid);

                if (destGrid.FreeSpace(item, request.Location.Row, request.Location.Column))
                {
                    if (_equipment.IsItemEquipped(item))
                    {
                        _equipment.UnequipItem(item); // Unequip the item
                        SendVisualInventory(this._owner);
                    }
                    else
                    {
                        var sourceGrid = (item.InvLoc.EquipmentSlot == 0 ? _inventoryGrid : _stashGrid);
                        sourceGrid.RemoveItem(item);
                    }
                    destGrid.AddItem(item, request.Location.Row, request.Location.Column);
                    if (item.InvLoc.EquipmentSlot != request.Location.EquipmentSlot)
                    {
                        AcceptMoveRequest(item);
                    }
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Handles a request to move an item within the inventory.
        /// This covers moving items within the backpack, from equipment
        /// slot to backpack and from backpack to equipment slot
        /// </summary>
        public void OnInventoryRequestMoveMessage(InventoryRequestMoveMessage request)
        {
            InventoryWindowsID sourceWindow = InventoryWindowsID.PlayerInventory;

            InventoryItem inv_item;

            if (!this.Contains(request.ItemID))
            {
                if (this._equipment.ItemsEquiped.ContainsKey(request.ItemID))
                {
                    inv_item = (InventoryItem)this._equipment.ItemsEquiped[request.ItemID];
                }
                else
                {
                    if (this.Vault.Contains(request.ItemID))
                    {
                        sourceWindow = InventoryWindowsID.Vault;
                        inv_item     = (InventoryItem)this.Vault.Items[request.ItemID];
                    }
                    else
                    {
                        Logging.LogManager.DefaultLogger.Error("Trying to move an item that is not in inventory or equipment!");
                        return;
                    }
                }
            }
            else
            {
                inv_item = (InventoryItem)this.Items[request.ItemID];
            }

            EquipmentSlotId sourceEquip = inv_item.EquipmentSlot;
            EquipmentSlotId destEquip   = (EquipmentSlotId)request.EquipmentSlot;

            if (sourceWindow == InventoryWindowsID.PlayerInventory)
            {
                if ((sourceEquip == EquipmentSlotId.Inventory) && (destEquip == EquipmentSlotId.Inventory))
                {
                    //inventory to inventory
                    if (!this.Contains(inv_item.DynamicID))
                    {
                        Logging.LogManager.DefaultLogger.Error("Trying to move an item that is not in inventory");
                        return;
                    }

                    if (!this.canPutitemThere_checking_self_item(inv_item, request.Row, request.Column))
                    {
                        Logging.LogManager.DefaultLogger.Error("Trying to put an item on a ocupped place (saltea el cliente check?)");
                        return;
                    }

                    if (!this.removeItem(inv_item))
                    {
                        Logging.LogManager.DefaultLogger.Error("could not remove item!, inventory to inventory operation");
                        return;
                    }

                    InventorySlot _slot = new InventorySlot(request.Row, request.Column);
                    if (!this.addItemAtPosition(inv_item, _slot))
                    {
                        Logging.LogManager.DefaultLogger.Error("could not add item at position, from");
                        return;
                    }
                    this.sendAcceptMoveRequest(inv_item, sourceWindow, InventoryWindowsID.PlayerInventory);
                    //this.sendVisualInventory(this._owner);
                }

                if ((sourceEquip == EquipmentSlotId.Inventory) && (destEquip != EquipmentSlotId.Inventory))
                {
                    //inventory to equipment!
                    if (!this.Contains(inv_item.DynamicID))
                    {
                        Logging.LogManager.DefaultLogger.Error("Trying to move an item from inventory to equipment but it is not in the inventory!");
                        return;
                    }

                    if (!this._equipment.IsSlotEmpty(destEquip))
                    {
                        Logging.LogManager.DefaultLogger.Error("Trying to move an item from inventory to equipment but equipment is occupied!");
                        return;
                    }

                    if (!this.removeItem(inv_item))
                    {
                        Logging.LogManager.DefaultLogger.Error("could not remove item!, inventory to equipment operation");
                        return;
                    }

                    this._equipment.EquipItem(inv_item, destEquip);
                    this.sendAcceptMoveRequest(inv_item, sourceWindow, InventoryWindowsID.PlayerInventory);
                    this.broadcastVisualEquipment();
                }

                if ((sourceEquip != EquipmentSlotId.Inventory) && (destEquip == EquipmentSlotId.Inventory))
                {
                    //equipment to inventory!

                    if (!this._equipment.IsItemEquipped(inv_item))
                    {
                        Logging.LogManager.DefaultLogger.Error("Trying to unequip an item (equipment to inventory) that is not in equipment");
                    }

                    if (!this.canPutitemThere_checking_self_item(inv_item, request.Row, request.Column))
                    {
                        Logging.LogManager.DefaultLogger.Error("Trying to put an item on a ocupped place (saltea el cliente check?)");
                        return;
                    }

                    this._equipment.UnequipItem(inv_item);

                    InventorySlot _slot = new InventorySlot(request.Row, request.Column);
                    if (!this.addItemAtPosition(inv_item, _slot))
                    {
                        Logging.LogManager.DefaultLogger.Error("could not add item at position, from");
                        return;
                    }
                    this.sendAcceptMoveRequest(inv_item, sourceWindow, InventoryWindowsID.PlayerInventory);
                    this.broadcastVisualEquipment();
                }

                if ((sourceEquip != EquipmentSlotId.Inventory) && (destEquip != EquipmentSlotId.Inventory))
                {
                    //equipment to equipment!
                }
            }

            if (sourceWindow == InventoryWindowsID.Vault)
            {
                //Vault to inventory
                if (!this.Vault.Contains(inv_item.DynamicID))
                {
                    Logging.LogManager.DefaultLogger.Error("Trying to move an item that is not in Vault!");
                    return;
                }

                if (!this.canPutitemThere_checking_self_item(inv_item, request.Row, request.Column))
                {
                    Logging.LogManager.DefaultLogger.Error("Trying to put an item on a ocupped place (saltea el cliente check?)");
                    return;
                }

                if (!this.Vault.removeItem(inv_item))
                {
                    Logging.LogManager.DefaultLogger.Error("could not remove item!, vault to inventory operation");
                    return;
                }

                InventorySlot _slot = new InventorySlot(request.Row, request.Column);
                if (!this.addItemAtPosition(inv_item, _slot))
                {
                    Logging.LogManager.DefaultLogger.Error("could not add item at position, from");
                    return;
                }
                this.sendAcceptMoveRequest(inv_item, sourceWindow, InventoryWindowsID.PlayerInventory);
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Handles a request to move an item within the inventory.
        /// This covers moving items within the backpack, from equipment
        /// slot to backpack and from backpack to equipment slot
        /// </summary>
        public void OnInventoryRequestMoveMessage(InventoryRequestMoveMessage request)
        {
            InventoryItem      inv_item;
            InventoryWindowsID sourceWindow;

            if (!this.Contains(request.ItemID))
            {
                if (!(this.Owner as Player).Inventory.Contains(request.ItemID))
                {
                    Logging.LogManager.DefaultLogger.Error("[Vault] Trying to move an item that is not in vault or inventory!");
                    return;
                }
                else
                {
                    inv_item     = (InventoryItem)(this.Owner as Player).Inventory.Items[request.ItemID];
                    sourceWindow = InventoryWindowsID.PlayerInventory;
                }
            }
            else
            {
                inv_item     = (InventoryItem)this.Items[request.ItemID];
                sourceWindow = InventoryWindowsID.Vault;
            }


            if (sourceWindow == InventoryWindowsID.Vault)
            {
                //inventory to inventory
                if (!this.Contains(inv_item.DynamicID))
                {
                    Logging.LogManager.DefaultLogger.Error("Trying to move an item that is not in vault");
                    return;
                }

                if (!this.canPutitemThere_checking_self_item(inv_item, request.Row, request.Column))
                {
                    Logging.LogManager.DefaultLogger.Error("Trying to put an item on a ocupped place (saltea el cliente check?)");
                    return;
                }

                if (!this.removeItem(inv_item))
                {
                    Logging.LogManager.DefaultLogger.Error("could not remove item!, vault to vault operation");
                    return;
                }

                InventorySlot _slot = new InventorySlot(request.Row, request.Column);
                if (!this.addItemAtPosition(inv_item, _slot))
                {
                    Logging.LogManager.DefaultLogger.Error("could not add item at position, from vault to vault!");
                    return;
                }
                this.sendAcceptMoveRequest(inv_item, sourceWindow, InventoryWindowsID.Vault);
            }

            if (sourceWindow == InventoryWindowsID.PlayerInventory)
            {
                PlayerInventory player_inventory = this.Owner.Inventory;
                //inventory to inventory
                if (!player_inventory.Contains(inv_item.DynamicID))
                {
                    Logging.LogManager.DefaultLogger.Error("Trying to move an item that is not in playerInventory!");
                    return;
                }

                if (!this.canPutitemThere_checking_self_item(inv_item, request.Row, request.Column))
                {
                    Logging.LogManager.DefaultLogger.Error("Trying to put an item on a ocupped place (saltea el cliente check?)");
                    return;
                }

                //this is different, remove from inventory!

                if (!player_inventory.removeItem(inv_item))
                {
                    Logging.LogManager.DefaultLogger.Error("could not remove item!, playerinventory to vault operation");
                    return;
                }

                InventorySlot _slot = new InventorySlot(request.Row, request.Column);
                if (!this.addItemAtPosition(inv_item, _slot))
                {
                    Logging.LogManager.DefaultLogger.Error("could not add item at position, from playerinventory to vault!");
                    return;
                }
                this.sendAcceptMoveRequest(inv_item, sourceWindow, InventoryWindowsID.Vault);
            }
        }
Exemplo n.º 4
0
        public void Consume(GameClient client, GameMessage message)
        {
            switch (message.opcodes)
            {
            case Opcodes.InventoryRequestMoveMessage:
            {
                InventoryRequestMoveMessage msg         = (InventoryRequestMoveMessage)message;
                InventoryWindowsID          dest_window = (InventoryWindowsID)msg.inventoryWindowId;
                if (dest_window == InventoryWindowsID.Vault)
                {
                    this.Vault.OnInventoryRequestMoveMessage(msg);
                }

                if (dest_window == InventoryWindowsID.PlayerInventory)
                {
                    this.OnInventoryRequestMoveMessage(msg);
                }

                break;
            }

            case Opcodes.InventoryRequestBuyItemMessage:
            {
                InventoryRequestBuyItemMessage msg = (InventoryRequestBuyItemMessage)message;
                if (!this.Owner.IsShopOpened)
                {
                    Logging.LogManager.DefaultLogger.Error("Trying to buy but shop is not opened!");
                    break;
                }

                if (!this.Owner.OpenedNPC.ShopInventory.Contains(msg.ItemId))
                {
                    Logging.LogManager.DefaultLogger.Error("Trying to buy an item that is not in the SHOP!");
                    break;
                }

                InventoryItem shop_item = (InventoryItem)this.Owner.OpenedNPC.ShopInventory.Items[msg.ItemId];
                if (!this.hasFreeSpace(shop_item))
                {
                    Logging.LogManager.DefaultLogger.Error("could not buy the item, inventory has not enough space!");
                    return;
                }

                InventoryItem new_item = new InventoryItem(shop_item.SNOId);
                new_item.FillData(shop_item);
                //fill new_item specific data from shop_item, this would be like cloning shop_item!

                InventorySlot slot = this.findSlotForItem(new_item);
                if (!this.canPutitemThere_checking_self_item(new_item, slot.R, slot.C))
                {
                    Logging.LogManager.DefaultLogger.Error("could not put item there!");
                    return;
                }
                if (!this.addItemAtPosition(new_item, slot))
                {
                    Logging.LogManager.DefaultLogger.Error("could not add item at position, buying item error!");
                    return;
                }

                CreateInventoryItemMessage create_item_msg = new CreateInventoryItemMessage();

                create_item_msg.InventorySlot      = slot;
                create_item_msg.inventoryWindowsId = (int)InventoryWindowsID.PlayerInventory;
                create_item_msg.SNO    = new_item.SNOId;
                create_item_msg.ItemID = new_item.DynamicID;

                this.Owner.GameClient.SendMessage(create_item_msg);
                new_item.Attributes.BroadcastAllAttributestoPlayer(this.Owner);

                break;
            }

            case Opcodes.InventoryRequestSellItemMessage:
            {
                InventoryRequestSellItemMessage msg = (InventoryRequestSellItemMessage)message;

                InventoryItem inv_item;
                if (!this.Contains(msg.ItemId))
                {
                    Logging.LogManager.DefaultLogger.Error("Trying to SELL an item that is not in inventory!");
                    break;
                }
                else
                {
                    inv_item = (InventoryItem)this.Items[msg.ItemId];
                }


                if (!this.removeItem(inv_item))
                {
                    Logging.LogManager.DefaultLogger.Error("could not remove item!, sell item operation");
                    return;
                }

                DestroyInventoryItemMessage destroy_msg = new DestroyInventoryItemMessage();
                destroy_msg.inventoryWindowId = (int)InventoryWindowsID.PlayerInventory;
                destroy_msg.InventorySlot     = inv_item.InventorySlot;
                destroy_msg.ItemID            = inv_item.DynamicID;
                this.Owner.GameClient.SendMessage(destroy_msg);

                break;
            }

            case Opcodes.InventoryRequestQuickMoveMessage:
            {
                HandleInventoryRequestQuickMoveMessage(message as InventoryRequestQuickMoveMessage);
                break;
            }

            case Opcodes.InventoryDropItemMessage:
            {
                OnInventoryDropItemMessage(message as InventoryDropItemMessage);
                break;
            }

            case Opcodes.InventoryRequestJewelUse:
            {
                InventoryRequestJewelUse msg = (InventoryRequestJewelUse)message;
                Logging.LogManager.DefaultLogger.Trace("Item Blessed!, id ", msg.destItemId);

                InventoryItem source_jewel = (InventoryItem)this.Items[msg.sourceJewelId];
                InventoryItem dest_item    = (InventoryItem)this.Items[msg.destItemId];

                DestroyInventoryItemMessage response = new DestroyInventoryItemMessage();
                response.InventorySlot     = source_jewel.InventorySlot;
                response.inventoryWindowId = (int)InventoryWindowsID.PlayerInventory;
                response.ItemID            = source_jewel.DynamicID;
                response.SNO = source_jewel.SNOId;
                this.Owner.GameClient.SendMessage(response);

                this.removeItem(source_jewel);

                break;
            }

            case Opcodes.InventoryCloseWindowMessage:
            {
                InventoryCloseWindowMessage msg = (InventoryCloseWindowMessage)message;

                if (msg.windowId == InventoryWindowsID.Vault)
                {
                    Player player = (this.Owner as Player);
                    player.Busy          = false;
                    player.IsVaultOpened = false;

                    InventoryShowWindowMessage hide_vault_msg = new InventoryShowWindowMessage();
                    hide_vault_msg.windowId = InventoryWindowsID.Vault;
                    hide_vault_msg.visible  = false;
                    player.GameClient.SendMessage(hide_vault_msg);

                    InventoryShowWindowMessage hide_invent_msg = new InventoryShowWindowMessage();
                    hide_invent_msg.windowId = InventoryWindowsID.PlayerInventory;
                    hide_invent_msg.visible  = false;
                    player.GameClient.SendMessage(hide_invent_msg);
                }

                if (msg.windowId == InventoryWindowsID._SHOP)
                {
                    Player player = (this.Owner as Player);
                    player.Busy         = false;
                    player.IsShopOpened = false;

                    InventoryShowWindowMessage hide_shop_msg = new InventoryShowWindowMessage();
                    hide_shop_msg.windowId = InventoryWindowsID._SHOP;
                    hide_shop_msg.visible  = false;
                    player.GameClient.SendMessage(hide_shop_msg);

                    InventoryShowWindowMessage hide_invent_msg = new InventoryShowWindowMessage();
                    hide_invent_msg.windowId = InventoryWindowsID.PlayerInventory;
                    hide_invent_msg.visible  = false;
                    player.GameClient.SendMessage(hide_invent_msg);
                }

                if (msg.windowId == InventoryWindowsID.PlayerInventory)
                {
                    Player player = (this.Owner as Player);
                    player.Busy = false;


                    if (player.IsShopOpened)
                    {
                        player.IsShopOpened = false;
                        InventoryShowWindowMessage hide_shop_msg = new InventoryShowWindowMessage();
                        hide_shop_msg.windowId = InventoryWindowsID._SHOP;
                        hide_shop_msg.visible  = false;
                        player.GameClient.SendMessage(hide_shop_msg);
                    }

                    if (player.IsVaultOpened)
                    {
                        player.IsVaultOpened = false;
                        InventoryShowWindowMessage hide_shop_msg = new InventoryShowWindowMessage();
                        hide_shop_msg.windowId = InventoryWindowsID.Vault;
                        hide_shop_msg.visible  = false;
                        player.GameClient.SendMessage(hide_shop_msg);
                    }

                    InventoryShowWindowMessage hide_invent_msg = new InventoryShowWindowMessage();
                    hide_invent_msg.windowId = InventoryWindowsID.PlayerInventory;
                    hide_invent_msg.visible  = false;
                    player.GameClient.SendMessage(hide_invent_msg);
                }

                break;
            }
            }
        }