diff options
Diffstat (limited to 'src/server/game/Handlers/ItemHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 179 |
1 files changed, 87 insertions, 92 deletions
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 4bfeed3ef23..b74ed019145 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -30,86 +30,84 @@ #include "DB2Stores.h" #include "NPCPackets.h" #include "ItemPackets.h" -#include <vector> void WorldSession::HandleSplitItemOpcode(WorldPackets::Item::SplitItem& splitItem) { - if (splitItem.itemCount) + if (!splitItem.Inv.Items.empty()) { - TC_LOG_ERROR("network", "WORLD: HandleSplitItemOpcode - Invalid itemCount (%u)", splitItem.itemCount); + TC_LOG_ERROR("network", "HandleSplitItemOpcode - Invalid ItemCount (" SZFMTD ")", splitItem.Inv.Items.size()); return; } - //TC_LOG_DEBUG("network", "WORLD: CMSG_SPLIT_ITEM"); + TC_LOG_DEBUG("network", "HandleSplitItemOpcode: receive FromPackSlot: %u, FromSlot: %u, ToPackSlot: %u, ToSlot: %u, Quantity: %u", + splitItem.FromPackSlot, splitItem.FromSlot, splitItem.ToPackSlot, splitItem.ToSlot, splitItem.Quantity); - TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u, dstbag = %u, dstslot = %u, count = %u", splitItem.srcbag, splitItem.srcslot, splitItem.dstbag, splitItem.dstslot, splitItem.count); - - uint16 src = ((splitItem.srcbag << 8) | splitItem.srcslot); - uint16 dst = ((splitItem.dstbag << 8) | splitItem.dstslot); + uint16 src = ((splitItem.FromPackSlot << 8) | splitItem.FromSlot); + uint16 dst = ((splitItem.ToPackSlot << 8) | splitItem.ToSlot); if (src == dst) return; - if (splitItem.count == 0) - return; //check count - if zero it's fake packet + // check count - if zero it's fake packet + if (!splitItem.Quantity) + return; - if (!_player->IsValidPos(splitItem.srcbag, splitItem.srcslot, true)) + if (!_player->IsValidPos(splitItem.FromPackSlot, splitItem.FromSlot, true)) { - _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); + _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND); return; } - if (!_player->IsValidPos(splitItem.dstbag, splitItem.dstslot, false)) // can be autostore pos + if (!_player->IsValidPos(splitItem.ToPackSlot, splitItem.ToSlot, false)) // can be autostore pos { - _player->SendEquipError(EQUIP_ERR_WRONG_SLOT, NULL, NULL); + _player->SendEquipError(EQUIP_ERR_WRONG_SLOT); return; } - _player->SplitItem(src, dst, splitItem.count); + _player->SplitItem(src, dst, splitItem.Quantity); } void WorldSession::HandleSwapInvItemOpcode(WorldPackets::Item::SwapInvItem& swapInvItem) { - if (swapInvItem.itemCount != 2) + if (swapInvItem.Inv.Items.size() != 2) { - TC_LOG_ERROR("network", "WORLD: HandleSwapInvItemOpcode - Invalid itemCount (%u)", swapInvItem.itemCount); + TC_LOG_ERROR("network", "HandleSwapInvItemOpcode - Invalid itemCount (" SZFMTD ")", swapInvItem.Inv.Items.size()); return; } - //TC_LOG_DEBUG("network", "WORLD: CMSG_SWAP_INV_ITEM"); - - TC_LOG_DEBUG("network", "STORAGE: receive srcslot = %u, dstslot = %u", swapInvItem.srcslot, swapInvItem.dstslot); + TC_LOG_DEBUG("network", "HandleSwapInvItemOpcode: receive Slot1: %u, Slot2: %u", + swapInvItem.Slot1, swapInvItem.Slot2); // prevent attempt swap same item to current position generated by client at special checting sequence - if (swapInvItem.srcslot == swapInvItem.dstslot) + if (swapInvItem.Slot1 == swapInvItem.Slot2) return; - if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, swapInvItem.srcslot, true)) + if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, swapInvItem.Slot1, true)) { - _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); + _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND); return; } - if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, swapInvItem.dstslot, true)) + if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, swapInvItem.Slot2, true)) { - _player->SendEquipError(EQUIP_ERR_WRONG_SLOT, NULL, NULL); + _player->SendEquipError(EQUIP_ERR_WRONG_SLOT); return; } - if (_player->IsBankPos(INVENTORY_SLOT_BAG_0, swapInvItem.srcslot) && !CanUseBank()) + if (_player->IsBankPos(INVENTORY_SLOT_BAG_0, swapInvItem.Slot1) && !CanUseBank()) { - TC_LOG_DEBUG("network", "WORLD: HandleSwapInvItemOpcode - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); + TC_LOG_DEBUG("network", "HandleSwapInvItemOpcode - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); return; } - if (_player->IsBankPos(INVENTORY_SLOT_BAG_0, swapInvItem.dstslot) && !CanUseBank()) + if (_player->IsBankPos(INVENTORY_SLOT_BAG_0, swapInvItem.Slot2) && !CanUseBank()) { - TC_LOG_DEBUG("network", "WORLD: HandleSwapInvItemOpcode - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); + TC_LOG_DEBUG("network", "HandleSwapInvItemOpcode - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); return; } - uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | swapInvItem.srcslot); - uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | swapInvItem.dstslot); + uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | swapInvItem.Slot1); + uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | swapInvItem.Slot2); _player->SwapItem(src, dst); } @@ -135,44 +133,43 @@ void WorldSession::HandleAutoEquipItemSlotOpcode(WorldPacket& recvData) void WorldSession::HandleSwapItem(WorldPackets::Item::SwapItem& swapItem) { - if (swapItem.itemCount != 2) + if (swapItem.Inv.Items.size() != 2) { - TC_LOG_ERROR("network", "WORLD: HandleSwapItem - Invalid itemCount (%u)", swapItem.itemCount); + TC_LOG_ERROR("network", "HandleSwapItem - Invalid itemCount (" SZFMTD ")", swapItem.Inv.Items.size()); return; } - //TC_LOG_DEBUG("network", "WORLD: CMSG_SWAP_ITEM"); - - TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u, dstbag = %u, dstslot = %u", swapItem.srcbag, swapItem.srcslot, swapItem.dstbag, swapItem.dstslot); + TC_LOG_DEBUG("network", "HandleSwapItem: receive ContainerSlotA: %u, SlotA: %u, ContainerSlotB: %u, SlotB: %u", + swapItem.ContainerSlotA, swapItem.SlotA, swapItem.ContainerSlotB, swapItem.SlotB); - uint16 src = ((swapItem.srcbag << 8) | swapItem.srcslot); - uint16 dst = ((swapItem.dstbag << 8) | swapItem.dstslot); + uint16 src = ((swapItem.ContainerSlotA << 8) | swapItem.SlotA); + uint16 dst = ((swapItem.ContainerSlotB << 8) | swapItem.SlotB); // prevent attempt swap same item to current position generated by client at special checting sequence if (src == dst) return; - if (!_player->IsValidPos(swapItem.srcbag, swapItem.srcslot, true)) + if (!_player->IsValidPos(swapItem.ContainerSlotA, swapItem.SlotA, true)) { - _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); + _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND); return; } - if (!_player->IsValidPos(swapItem.dstbag, swapItem.dstslot, true)) + if (!_player->IsValidPos(swapItem.ContainerSlotB, swapItem.SlotB, true)) { - _player->SendEquipError(EQUIP_ERR_WRONG_SLOT, NULL, NULL); + _player->SendEquipError(EQUIP_ERR_WRONG_SLOT); return; } - if (_player->IsBankPos(swapItem.srcbag, swapItem.srcslot) && !CanUseBank()) + if (_player->IsBankPos(swapItem.ContainerSlotA, swapItem.SlotA) && !CanUseBank()) { - TC_LOG_DEBUG("network", "WORLD: HandleSwapItem - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); + TC_LOG_DEBUG("network", "HandleSwapItem - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); return; } - if (_player->IsBankPos(swapItem.dstbag, swapItem.dstslot) && !CanUseBank()) + if (_player->IsBankPos(swapItem.ContainerSlotB, swapItem.SlotB) && !CanUseBank()) { - TC_LOG_DEBUG("network", "WORLD: HandleSwapItem - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); + TC_LOG_DEBUG("network", "HandleSwapItem - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); return; } @@ -181,48 +178,47 @@ void WorldSession::HandleSwapItem(WorldPackets::Item::SwapItem& swapItem) void WorldSession::HandleAutoEquipItemOpcode(WorldPackets::Item::AutoEquipItem& autoEquipItem) { - if (autoEquipItem.itemCount != 1) + if (autoEquipItem.Inv.Items.size() != 1) { - TC_LOG_ERROR("network", "WORLD: HandleAutoEquipItemOpcode - Invalid itemCount (%u)", autoEquipItem.itemCount); + TC_LOG_ERROR("network", "HandleAutoEquipItemOpcode - Invalid itemCount (" SZFMTD ")", autoEquipItem.Inv.Items.size()); return; } - //TC_LOG_DEBUG("network", "WORLD: CMSG_AUTOEQUIP_ITEM"); + TC_LOG_DEBUG("network", "HandleAutoEquipItemOpcode: receive PackSlot: %u, Slot: %u", + autoEquipItem.PackSlot, autoEquipItem.Slot); - TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u", autoEquipItem.srcbag, autoEquipItem.srcslot); - - Item* pSrcItem = _player->GetItemByPos(autoEquipItem.srcbag, autoEquipItem.srcslot); - if (!pSrcItem) - return; // only at cheat + Item* srcItem = _player->GetItemByPos(autoEquipItem.PackSlot, autoEquipItem.Slot); + if (!srcItem) + return; // only at cheat uint16 dest; - InventoryResult msg = _player->CanEquipItem(NULL_SLOT, dest, pSrcItem, !pSrcItem->IsBag()); + InventoryResult msg = _player->CanEquipItem(NULL_SLOT, dest, srcItem, !srcItem->IsBag()); if (msg != EQUIP_ERR_OK) { - _player->SendEquipError(msg, pSrcItem, NULL); + _player->SendEquipError(msg, srcItem); return; } - uint16 src = pSrcItem->GetPos(); - if (dest == src) // prevent equip in same slot, only at cheat + uint16 src = srcItem->GetPos(); + if (dest == src) // prevent equip in same slot, only at cheat return; - Item* pDstItem = _player->GetItemByPos(dest); - if (!pDstItem) // empty slot, simple case + Item* dstItem = _player->GetItemByPos(dest); + if (!dstItem) // empty slot, simple case { - _player->RemoveItem(autoEquipItem.srcbag, autoEquipItem.srcslot, true); - _player->EquipItem(dest, pSrcItem, true); + _player->RemoveItem(autoEquipItem.PackSlot, autoEquipItem.Slot, true); + _player->EquipItem(dest, srcItem, true); _player->AutoUnequipOffhandIfNeed(); } else // have currently equipped item, not simple case { - uint8 dstbag = pDstItem->GetBagSlot(); - uint8 dstslot = pDstItem->GetSlot(); + uint8 dstbag = dstItem->GetBagSlot(); + uint8 dstslot = dstItem->GetSlot(); - msg = _player->CanUnequipItem(dest, !pSrcItem->IsBag()); + msg = _player->CanUnequipItem(dest, !srcItem->IsBag()); if (msg != EQUIP_ERR_OK) { - _player->SendEquipError(msg, pDstItem, NULL); + _player->SendEquipError(msg, dstItem); return; } @@ -231,47 +227,47 @@ void WorldSession::HandleAutoEquipItemOpcode(WorldPackets::Item::AutoEquipItem& uint16 eSrc = 0; if (_player->IsInventoryPos(src)) { - msg = _player->CanStoreItem(autoEquipItem.srcbag, autoEquipItem.srcslot, sSrc, pDstItem, true); + msg = _player->CanStoreItem(autoEquipItem.PackSlot, autoEquipItem.Slot, sSrc, dstItem, true); if (msg != EQUIP_ERR_OK) - msg = _player->CanStoreItem(autoEquipItem.srcbag, NULL_SLOT, sSrc, pDstItem, true); + msg = _player->CanStoreItem(autoEquipItem.PackSlot, NULL_SLOT, sSrc, dstItem, true); if (msg != EQUIP_ERR_OK) - msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, sSrc, pDstItem, true); + msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, sSrc, dstItem, true); } else if (_player->IsBankPos(src)) { - msg = _player->CanBankItem(autoEquipItem.srcbag, autoEquipItem.srcslot, sSrc, pDstItem, true); + msg = _player->CanBankItem(autoEquipItem.PackSlot, autoEquipItem.Slot, sSrc, dstItem, true); if (msg != EQUIP_ERR_OK) - msg = _player->CanBankItem(autoEquipItem.srcbag, NULL_SLOT, sSrc, pDstItem, true); + msg = _player->CanBankItem(autoEquipItem.PackSlot, NULL_SLOT, sSrc, dstItem, true); if (msg != EQUIP_ERR_OK) - msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, sSrc, pDstItem, true); + msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, sSrc, dstItem, true); } else if (_player->IsEquipmentPos(src)) { - msg = _player->CanEquipItem(autoEquipItem.srcslot, eSrc, pDstItem, true); + msg = _player->CanEquipItem(autoEquipItem.Slot, eSrc, dstItem, true); if (msg == EQUIP_ERR_OK) msg = _player->CanUnequipItem(eSrc, true); } if (msg != EQUIP_ERR_OK) { - _player->SendEquipError(msg, pDstItem, pSrcItem); + _player->SendEquipError(msg, dstItem, srcItem); return; } // now do moves, remove... _player->RemoveItem(dstbag, dstslot, false); - _player->RemoveItem(autoEquipItem.srcbag, autoEquipItem.srcslot, false); + _player->RemoveItem(autoEquipItem.PackSlot, autoEquipItem.Slot, false); // add to dest - _player->EquipItem(dest, pSrcItem, true); + _player->EquipItem(dest, srcItem, true); // add to src if (_player->IsInventoryPos(src)) - _player->StoreItem(sSrc, pDstItem, true); + _player->StoreItem(sSrc, dstItem, true); else if (_player->IsBankPos(src)) - _player->BankItem(sSrc, pDstItem, true); + _player->BankItem(sSrc, dstItem, true); else if (_player->IsEquipmentPos(src)) - _player->EquipItem(eSrc, pDstItem, true); + _player->EquipItem(eSrc, dstItem, true); _player->AutoUnequipOffhandIfNeed(); } @@ -279,11 +275,10 @@ void WorldSession::HandleAutoEquipItemOpcode(WorldPackets::Item::AutoEquipItem& void WorldSession::HandleDestroyItemOpcode(WorldPackets::Item::DestroyItem& destroyItem) { - //TC_LOG_DEBUG("network", "WORLD: CMSG_DESTROY_ITEM"); - - TC_LOG_DEBUG("network", "STORAGE: receive bag = %u, slot = %u, count = %u", destroyItem.bag, destroyItem.slot, destroyItem.count); + TC_LOG_DEBUG("network", "HandleDestroyItemOpcode: receive ContainerId: %u, SlotNum: %u, Count: %u", + destroyItem.ContainerId, destroyItem.SlotNum, destroyItem.Count); - uint16 pos = (destroyItem.bag << 8) | destroyItem.slot; + uint16 pos = (destroyItem.ContainerId << 8) | destroyItem.SlotNum; // prevent drop unequipable items (in combat, for example) and non-empty bags if (_player->IsEquipmentPos(pos) || _player->IsBagPos(pos)) @@ -291,31 +286,31 @@ void WorldSession::HandleDestroyItemOpcode(WorldPackets::Item::DestroyItem& dest InventoryResult msg = _player->CanUnequipItem(pos, false); if (msg != EQUIP_ERR_OK) { - _player->SendEquipError(msg, _player->GetItemByPos(pos), NULL); + _player->SendEquipError(msg, _player->GetItemByPos(pos)); return; } } - Item* pItem = _player->GetItemByPos(destroyItem.bag, destroyItem.slot); - if (!pItem) + Item* item = _player->GetItemByPos(destroyItem.ContainerId, destroyItem.SlotNum); + if (!item) { - _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); + _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND); return; } - if (pItem->GetTemplate()->GetFlags() & ITEM_PROTO_FLAG_INDESTRUCTIBLE) + if (item->GetTemplate()->GetFlags() & ITEM_PROTO_FLAG_INDESTRUCTIBLE) { _player->SendEquipError(EQUIP_ERR_DROP_BOUND_ITEM, NULL, NULL); return; } - if (destroyItem.count) + if (destroyItem.Count) { - uint32 i_count = destroyItem.count; - _player->DestroyItemCount(pItem, i_count, true); + uint32 i_count = destroyItem.Count; + _player->DestroyItemCount(item, i_count, true); } else - _player->DestroyItem(destroyItem.bag, destroyItem.slot, true); + _player->DestroyItem(destroyItem.ContainerId, destroyItem.SlotNum, true); } void WorldSession::HandleReadItem(WorldPacket& recvData) |