aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/ItemHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers/ItemHandler.cpp')
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp179
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)