aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp29
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp139
-rw-r--r--src/server/game/Server/Packets/ItemPackets.cpp64
-rw-r--r--src/server/game/Server/Packets/ItemPackets.h68
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp11
-rw-r--r--src/server/game/Server/WorldSession.h19
6 files changed, 214 insertions, 116 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index e10d4a6262e..5d6822d3159 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -13088,29 +13088,16 @@ void Player::RemoveItemFromBuyBackSlot(uint32 slot, bool del)
void Player::SendEquipError(InventoryResult msg, Item* pItem, Item* pItem2, uint32 itemid)
{
TC_LOG_DEBUG("network", "WORLD: Sent SMSG_INVENTORY_CHANGE_FAILURE (%u)", msg);
- WorldPacket data(SMSG_INVENTORY_CHANGE_FAILURE, (msg == EQUIP_ERR_CANT_EQUIP_LEVEL_I ? 22 : 18));
- data << uint8(msg);
- //if (msg != EQUIP_ERR_OK)
- {
- data << (pItem ? pItem->GetGUID() : ObjectGuid::Empty);
- data << (pItem2 ? pItem2->GetGUID() : ObjectGuid::Empty);
- data << uint8(0); // bag type subclass, used with EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM and EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2
+ WorldPackets::Item::EquipError error;
+ error.msg = msg;
+ error.itemGUID1 = pItem ? pItem->GetGUID() : ObjectGuid::Empty;
+ error.itemGUID2 = pItem2 ? pItem2->GetGUID() : ObjectGuid::Empty;
- switch (msg)
- {
- case EQUIP_ERR_CANT_EQUIP_LEVEL_I:
- case EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW:
- {
- ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid);
- data << uint32(proto ? proto->GetRequiredLevel() : 0);
- break;
- }
- default:
- break;
- }
- }
- GetSession()->SendPacket(&data);
+ ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid);
+ error.level = uint32(proto ? proto->GetRequiredLevel() : 0);
+
+ GetSession()->SendPacket(error.Write());
}
void Player::SendBuyError(BuyResult msg, Creature* creature, uint32 item, uint32 /*param*/)
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index b892cb67e29..229d724974e 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -32,98 +32,84 @@
#include "ItemPackets.h"
#include <vector>
-void WorldSession::HandleSplitItemOpcode(WorldPacket& recvData)
+void WorldSession::HandleSplitItemOpcode(WorldPackets::Item::SplitItem& splitItem)
{
- uint32 itemCount = recvData.ReadBits(2);
-
- if (itemCount)
+ if (splitItem.itemCount)
{
- TC_LOG_ERROR("network", "WORLD: HandleSplitItemOpcode - Invalid itemCount (%u)", itemCount);
+ TC_LOG_ERROR("network", "WORLD: HandleSplitItemOpcode - Invalid itemCount (%u)", splitItem.itemCount);
return;
}
- //TC_LOG_DEBUG("network", "WORLD: CMSG_SPLIT_ITEM");
- uint8 srcbag, srcslot, dstbag, dstslot;
- uint32 count;
- recvData >> srcbag >> srcslot >> dstbag >> dstslot >> count;
- TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u, dstbag = %u, dstslot = %u, count = %u", srcbag, srcslot, dstbag, dstslot, count);
+ //TC_LOG_DEBUG("network", "WORLD: CMSG_SPLIT_ITEM");
+
+ 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 = ((srcbag << 8) | srcslot);
- uint16 dst = ((dstbag << 8) | dstslot);
+ uint16 src = ((splitItem.srcbag << 8) | splitItem.srcslot);
+ uint16 dst = ((splitItem.dstbag << 8) | splitItem.dstslot);
if (src == dst)
return;
- if (count == 0)
+ if (splitItem.count == 0)
return; //check count - if zero it's fake packet
- if (!_player->IsValidPos(srcbag, srcslot, true))
+ if (!_player->IsValidPos(splitItem.srcbag, splitItem.srcslot, true))
{
_player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL);
return;
}
- if (!_player->IsValidPos(dstbag, dstslot, false)) // can be autostore pos
+ if (!_player->IsValidPos(splitItem.dstbag, splitItem.dstslot, false)) // can be autostore pos
{
_player->SendEquipError(EQUIP_ERR_WRONG_SLOT, NULL, NULL);
return;
}
- _player->SplitItem(src, dst, count);
+ _player->SplitItem(src, dst, splitItem.count);
}
-void WorldSession::HandleSwapInvItemOpcode(WorldPacket& recvData)
+void WorldSession::HandleSwapInvItemOpcode(WorldPackets::Item::SwapInvItem& swapInvItem)
{
- uint32 itemCount = recvData.ReadBits(2);
-
- if (itemCount != 2)
+ if (swapInvItem.itemCount != 2)
{
- TC_LOG_ERROR("network", "WORLD: HandleSwapInvItemOpcode - Invalid itemCount (%u)", itemCount);
+ TC_LOG_ERROR("network", "WORLD: HandleSwapInvItemOpcode - Invalid itemCount (%u)", swapInvItem.itemCount);
return;
}
- for (uint32 i = 0; i < itemCount; ++i)
- {
- recvData.read_skip<uint8>(); // bag
- recvData.read_skip<uint8>(); // slot
- }
-
//TC_LOG_DEBUG("network", "WORLD: CMSG_SWAP_INV_ITEM");
- uint8 srcslot, dstslot;
-
- recvData >> dstslot >> srcslot;
- TC_LOG_DEBUG("network", "STORAGE: receive srcslot = %u, dstslot = %u", srcslot, dstslot);
+
+ TC_LOG_DEBUG("network", "STORAGE: receive srcslot = %u, dstslot = %u", swapInvItem.srcslot, swapInvItem.dstslot);
// prevent attempt swap same item to current position generated by client at special checting sequence
- if (srcslot == dstslot)
+ if (swapInvItem.srcslot == swapInvItem.dstslot)
return;
- if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, srcslot, true))
+ if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, swapInvItem.srcslot, true))
{
_player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL);
return;
}
- if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, dstslot, true))
+ if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, swapInvItem.dstslot, true))
{
_player->SendEquipError(EQUIP_ERR_WRONG_SLOT, NULL, NULL);
return;
}
- if (_player->IsBankPos(INVENTORY_SLOT_BAG_0, srcslot) && !CanUseBank())
+ if (_player->IsBankPos(INVENTORY_SLOT_BAG_0, swapInvItem.srcslot) && !CanUseBank())
{
TC_LOG_DEBUG("network", "WORLD: 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, dstslot) && !CanUseBank())
+ if (_player->IsBankPos(INVENTORY_SLOT_BAG_0, swapInvItem.dstslot) && !CanUseBank())
{
TC_LOG_DEBUG("network", "WORLD: 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) | srcslot);
- uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | dstslot);
+ uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | swapInvItem.srcslot);
+ uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | swapInvItem.dstslot);
_player->SwapItem(src, dst);
}
@@ -147,54 +133,44 @@ void WorldSession::HandleAutoEquipItemSlotOpcode(WorldPacket& recvData)
_player->SwapItem(item->GetPos(), dstpos);
}
-void WorldSession::HandleSwapItem(WorldPacket& recvData)
+void WorldSession::HandleSwapItem(WorldPackets::Item::SwapItem& swapItem)
{
- uint32 itemCount = recvData.ReadBits(2);
-
- if (itemCount != 2)
+ if (swapItem.itemCount != 2)
{
- TC_LOG_ERROR("network", "WORLD: HandleSwapItem - Invalid itemCount (%u)", itemCount);
+ TC_LOG_ERROR("network", "WORLD: HandleSwapItem - Invalid itemCount (%u)", swapItem.itemCount);
return;
}
- for (uint32 i = 0; i < itemCount; ++i)
- {
- recvData.read_skip<uint8>();
- recvData.read_skip<uint8>();
- }
-
//TC_LOG_DEBUG("network", "WORLD: CMSG_SWAP_ITEM");
- uint8 dstbag, dstslot, srcbag, srcslot;
- recvData >> dstbag >> srcbag >> dstslot >> srcslot;
- TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u, dstbag = %u, dstslot = %u", srcbag, srcslot, dstbag, dstslot);
+ TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u, dstbag = %u, dstslot = %u", swapItem.srcbag, swapItem.srcslot, swapItem.dstbag, swapItem.dstslot);
- uint16 src = ((srcbag << 8) | srcslot);
- uint16 dst = ((dstbag << 8) | dstslot);
+ uint16 src = ((swapItem.srcbag << 8) | swapItem.srcslot);
+ uint16 dst = ((swapItem.dstbag << 8) | swapItem.dstslot);
// prevent attempt swap same item to current position generated by client at special checting sequence
if (src == dst)
return;
- if (!_player->IsValidPos(srcbag, srcslot, true))
+ if (!_player->IsValidPos(swapItem.srcbag, swapItem.srcslot, true))
{
_player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL);
return;
}
- if (!_player->IsValidPos(dstbag, dstslot, true))
+ if (!_player->IsValidPos(swapItem.dstbag, swapItem.dstslot, true))
{
_player->SendEquipError(EQUIP_ERR_WRONG_SLOT, NULL, NULL);
return;
}
- if (_player->IsBankPos(srcbag, srcslot) && !CanUseBank())
+ if (_player->IsBankPos(swapItem.srcbag, swapItem.srcslot) && !CanUseBank())
{
TC_LOG_DEBUG("network", "WORLD: HandleSwapItem - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str());
return;
}
- if (_player->IsBankPos(dstbag, dstslot) && !CanUseBank())
+ if (_player->IsBankPos(swapItem.dstbag, swapItem.dstslot) && !CanUseBank())
{
TC_LOG_DEBUG("network", "WORLD: HandleSwapItem - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str());
return;
@@ -203,23 +179,19 @@ void WorldSession::HandleSwapItem(WorldPacket& recvData)
_player->SwapItem(src, dst);
}
-void WorldSession::HandleAutoEquipItemOpcode(WorldPacket& recvData)
+void WorldSession::HandleAutoEquipItemOpcode(WorldPackets::Item::AutoEquipItem& autoEquipItem)
{
- uint32 itemCount = recvData.ReadBits(2);
-
- if (itemCount != 1)
+ if (autoEquipItem.itemCount != 1)
{
- TC_LOG_ERROR("network", "WORLD: HandleAutoEquipItemOpcode - Invalid itemCount (%u)", itemCount);
+ TC_LOG_ERROR("network", "WORLD: HandleAutoEquipItemOpcode - Invalid itemCount (%u)", autoEquipItem.itemCount);
return;
}
//TC_LOG_DEBUG("network", "WORLD: CMSG_AUTOEQUIP_ITEM");
- uint8 srcbag, srcslot, slotA, slotB;
-
- recvData >> srcbag >> srcslot >> slotA >> slotB;
- TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u", srcbag, srcslot);
+
+ TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u", autoEquipItem.srcbag, autoEquipItem.srcslot);
- Item* pSrcItem = _player->GetItemByPos(srcbag, srcslot);
+ Item* pSrcItem = _player->GetItemByPos(autoEquipItem.srcbag, autoEquipItem.srcslot);
if (!pSrcItem)
return; // only at cheat
@@ -238,7 +210,7 @@ void WorldSession::HandleAutoEquipItemOpcode(WorldPacket& recvData)
Item* pDstItem = _player->GetItemByPos(dest);
if (!pDstItem) // empty slot, simple case
{
- _player->RemoveItem(srcbag, srcslot, true);
+ _player->RemoveItem(autoEquipItem.srcbag, autoEquipItem.srcslot, true);
_player->EquipItem(dest, pSrcItem, true);
_player->AutoUnequipOffhandIfNeed();
}
@@ -259,23 +231,23 @@ void WorldSession::HandleAutoEquipItemOpcode(WorldPacket& recvData)
uint16 eSrc = 0;
if (_player->IsInventoryPos(src))
{
- msg = _player->CanStoreItem(srcbag, srcslot, sSrc, pDstItem, true);
+ msg = _player->CanStoreItem(autoEquipItem.srcbag, autoEquipItem.srcslot, sSrc, pDstItem, true);
if (msg != EQUIP_ERR_OK)
- msg = _player->CanStoreItem(srcbag, NULL_SLOT, sSrc, pDstItem, true);
+ msg = _player->CanStoreItem(autoEquipItem.srcbag, NULL_SLOT, sSrc, pDstItem, true);
if (msg != EQUIP_ERR_OK)
msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, sSrc, pDstItem, true);
}
else if (_player->IsBankPos(src))
{
- msg = _player->CanBankItem(srcbag, srcslot, sSrc, pDstItem, true);
+ msg = _player->CanBankItem(autoEquipItem.srcbag, autoEquipItem.srcslot, sSrc, pDstItem, true);
if (msg != EQUIP_ERR_OK)
- msg = _player->CanBankItem(srcbag, NULL_SLOT, sSrc, pDstItem, true);
+ msg = _player->CanBankItem(autoEquipItem.srcbag, NULL_SLOT, sSrc, pDstItem, true);
if (msg != EQUIP_ERR_OK)
msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, sSrc, pDstItem, true);
}
else if (_player->IsEquipmentPos(src))
{
- msg = _player->CanEquipItem(srcslot, eSrc, pDstItem, true);
+ msg = _player->CanEquipItem(autoEquipItem.srcslot, eSrc, pDstItem, true);
if (msg == EQUIP_ERR_OK)
msg = _player->CanUnequipItem(eSrc, true);
}
@@ -288,7 +260,7 @@ void WorldSession::HandleAutoEquipItemOpcode(WorldPacket& recvData)
// now do moves, remove...
_player->RemoveItem(dstbag, dstslot, false);
- _player->RemoveItem(srcbag, srcslot, false);
+ _player->RemoveItem(autoEquipItem.srcbag, autoEquipItem.srcslot, false);
// add to dest
_player->EquipItem(dest, pSrcItem, true);
@@ -305,16 +277,13 @@ void WorldSession::HandleAutoEquipItemOpcode(WorldPacket& recvData)
}
}
-void WorldSession::HandleDestroyItemOpcode(WorldPacket& recvData)
+void WorldSession::HandleDestroyItemOpcode(WorldPackets::Item::DestroyItem& destroyItem)
{
//TC_LOG_DEBUG("network", "WORLD: CMSG_DESTROY_ITEM");
- uint8 bag, slot;
- uint32 count;
- recvData >> count >> bag >> slot;
- TC_LOG_DEBUG("network", "STORAGE: receive bag = %u, slot = %u, count = %u", bag, slot, count);
+ TC_LOG_DEBUG("network", "STORAGE: receive bag = %u, slot = %u, count = %u", destroyItem.bag, destroyItem.slot, destroyItem.count);
- uint16 pos = (bag << 8) | slot;
+ uint16 pos = (destroyItem.bag << 8) | destroyItem.slot;
// prevent drop unequipable items (in combat, for example) and non-empty bags
if (_player->IsEquipmentPos(pos) || _player->IsBagPos(pos))
@@ -327,7 +296,7 @@ void WorldSession::HandleDestroyItemOpcode(WorldPacket& recvData)
}
}
- Item* pItem = _player->GetItemByPos(bag, slot);
+ Item* pItem = _player->GetItemByPos(destroyItem.bag, destroyItem.slot);
if (!pItem)
{
_player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL);
@@ -340,13 +309,13 @@ void WorldSession::HandleDestroyItemOpcode(WorldPacket& recvData)
return;
}
- if (count)
+ if (destroyItem.count)
{
- uint32 i_count = count;
+ uint32 i_count = destroyItem.count;
_player->DestroyItemCount(pItem, i_count, true);
}
else
- _player->DestroyItem(bag, slot, true);
+ _player->DestroyItem(destroyItem.bag, destroyItem.slot, true);
}
void WorldSession::HandleReadItem(WorldPacket& recvData)
diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp
index 924a9eec352..50ffe46260b 100644
--- a/src/server/game/Server/Packets/ItemPackets.cpp
+++ b/src/server/game/Server/Packets/ItemPackets.cpp
@@ -57,3 +57,67 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const&
return data;
}
+
+WorldPacket const* WorldPackets::Item::EquipError::Write()
+{
+ _worldPacket << uint8(msg);
+ _worldPacket << itemGUID1;
+ _worldPacket << itemGUID2;
+ _worldPacket << uint8(0); // bag type subclass, used with EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM and EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2
+
+ switch (msg)
+ {
+ case EQUIP_ERR_CANT_EQUIP_LEVEL_I:
+ case EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW:
+ {
+ _worldPacket << level;
+ break;
+ }
+ default:
+ break;
+ }
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Item::SplitItem::Read()
+{
+ itemCount = _worldPacket.ReadBits(2);
+ _worldPacket >> srcbag >> srcslot >> dstbag >> dstslot >> count;
+}
+
+void WorldPackets::Item::SwapInvItem::Read()
+{
+ itemCount = _worldPacket.ReadBits(2);
+ for (uint32 i = 0; i < itemCount; ++i)
+ {
+ _worldPacket.read_skip<uint8>(); // bag
+ _worldPacket.read_skip<uint8>(); // slot
+ }
+ _worldPacket >> dstslot >> srcslot;
+}
+
+void WorldPackets::Item::SwapItem::Read()
+{
+ itemCount = _worldPacket.ReadBits(2);
+ for (uint32 i = 0; i < itemCount; ++i)
+ {
+ _worldPacket.read_skip<uint8>(); // bag
+ _worldPacket.read_skip<uint8>(); // slot
+ }
+ _worldPacket >> dstbag >> srcbag >> dstslot >> srcslot;
+}
+
+void WorldPackets::Item::AutoEquipItem::Read()
+{
+ itemCount = _worldPacket.ReadBits(2);
+
+ _worldPacket >> srcbag >> srcslot;
+ _worldPacket.read_skip<uint8>();
+ _worldPacket.read_skip<uint8>();
+}
+
+void WorldPackets::Item::DestroyItem::Read()
+{
+ _worldPacket >> count >> bag >> slot;
+} \ No newline at end of file
diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h
index 72e2a02fbe2..cac80fa2b18 100644
--- a/src/server/game/Server/Packets/ItemPackets.h
+++ b/src/server/game/Server/Packets/ItemPackets.h
@@ -49,6 +49,74 @@ namespace WorldPackets
Optional<ItemBonusInstanceData> ItemBonus;
std::vector<int32> Modifications;
};
+
+ class EquipError final : public ServerPacket
+ {
+ public:
+ EquipError() : ServerPacket(SMSG_INVENTORY_CHANGE_FAILURE, 22) { }
+
+ WorldPacket const* Write() override;
+
+ InventoryResult msg;
+ ObjectGuid itemGUID1;
+ ObjectGuid itemGUID2;
+ uint32 level;
+ };
+
+ class SplitItem final : public ClientPacket
+ {
+ public:
+ SplitItem(WorldPacket&& packet) : ClientPacket(CMSG_SPLIT_ITEM, std::move(packet)) { }
+
+ void Read() override;
+
+ uint8 srcbag, srcslot, dstbag, dstslot;
+ uint32 itemCount, count;
+ };
+
+ class SwapInvItem final : public ClientPacket
+ {
+ public:
+ SwapInvItem(WorldPacket&& packet) : ClientPacket(CMSG_SWAP_INV_ITEM, std::move(packet)) { }
+
+ void Read() override;
+
+ uint32 itemCount;
+ uint8 srcslot, dstslot;
+ };
+
+ class SwapItem final : public ClientPacket
+ {
+ public:
+ SwapItem(WorldPacket&& packet) : ClientPacket(CMSG_SWAP_ITEM, std::move(packet)) { }
+
+ void Read() override;
+
+ uint32 itemCount;
+ uint8 dstbag, dstslot, srcbag, srcslot;
+ };
+
+ class AutoEquipItem final : public ClientPacket
+ {
+ public:
+ AutoEquipItem(WorldPacket&& packet) : ClientPacket(CMSG_AUTOEQUIP_ITEM, std::move(packet)) { }
+
+ void Read() override;
+
+ uint32 itemCount;
+ uint8 srcbag, srcslot;
+ };
+
+ class DestroyItem final : public ClientPacket
+ {
+ public:
+ DestroyItem(WorldPacket&& packet) : ClientPacket(CMSG_DESTROY_ITEM, std::move(packet)) { }
+
+ void Read() override;
+
+ uint32 count;
+ uint8 bag, slot;
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 818911d3827..b3c486b6e78 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -32,6 +32,7 @@
#include "Packets/QuestPackets.h"
#include "Packets/TalentPackets.h"
#include "Packets/TradePackets.h"
+#include "Packets/ItemPackets.h"
template<class PacketClass, void(WorldSession::*HandlerFunction)(PacketClass&)>
class PacketHandler : public ClientOpcodeHandler
@@ -165,7 +166,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTH_CONTINUED_SESSION, STATUS_NEVER, PROCESS_THREADUNSAFE, &WorldSession::Handle_EarlyProccess );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTH_SESSION, STATUS_NEVER, PROCESS_THREADUNSAFE, &WorldSession::Handle_EarlyProccess );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOBANK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoBankItemOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOEQUIP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoEquipItemOpcode );
+ DEFINE_HANDLER(CMSG_AUTOEQUIP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoEquipItem, &WorldSession::HandleAutoEquipItemOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOEQUIP_ITEM_SLOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoEquipItemSlotOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_BAG_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBagItemOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_BANK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBankItemOpcode );
@@ -282,7 +283,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_DEL_IGNORE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleDelIgnoreOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DEL_MUTE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DEL_VOICE_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_DESTROY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDestroyItemOpcode );
+ DEFINE_HANDLER(CMSG_DESTROY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::DestroyItem, &WorldSession::HandleDestroyItemOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_DISMISS_CONTROLLED_VEHICLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleDismissControlledVehicle );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DISMISS_CRITTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleDismissCritter );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DUEL_ACCEPTED, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleDuelAcceptedOpcode );
@@ -620,7 +621,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_SOCKET_GEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSocketOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SPELLCLICK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSpellClick );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SPIRIT_HEALER_ACTIVATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSpiritHealerActivateOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_SPLIT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSplitItemOpcode );
+ DEFINE_HANDLER(CMSG_SPLIT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SplitItem, &WorldSession::HandleSplitItemOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_STANDSTATECHANGE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleStandStateChangeOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_STOP_DANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SUBMIT_BUG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -629,8 +630,8 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_SUMMON_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSummonResponseOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SUSPEND_COMMS_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SUSPEND_TOKEN_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_SWAP_INV_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSwapInvItemOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_SWAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSwapItem );
+ DEFINE_HANDLER(CMSG_SWAP_INV_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapInvItem, &WorldSession::HandleSwapInvItemOpcode);
+ DEFINE_HANDLER(CMSG_SWAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapItem, &WorldSession::HandleSwapItem);
DEFINE_OPCODE_HANDLER_OLD(CMSG_SYNC_DANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_TAXINODE_STATUS_QUERY, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiNodeStatusQueryOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_TAXIQUERYAVAILABLENODES, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiQueryAvailableNodes );
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 8153eea7f82..52f1c76555a 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -189,6 +189,15 @@ namespace WorldPackets
class QuestGiverStatusQuery;
class QuestGiverStatusMultipleQuery;
}
+
+ namespace Item
+ {
+ class SplitItem;
+ class SwapInvItem;
+ class SwapItem;
+ class AutoEquipItem;
+ class DestroyItem;
+ }
}
enum AccountDataType
@@ -848,10 +857,10 @@ class WorldSession
void HandleCancelChanneling(WorldPacket& recvData);
void SendItemPageInfo(ItemTemplate* itemProto);
- void HandleSplitItemOpcode(WorldPacket& recvPacket);
- void HandleSwapInvItemOpcode(WorldPacket& recvPacket);
- void HandleDestroyItemOpcode(WorldPacket& recvPacket);
- void HandleAutoEquipItemOpcode(WorldPacket& recvPacket);
+ void HandleSplitItemOpcode(WorldPackets::Item::SplitItem& splitItem);
+ void HandleSwapInvItemOpcode(WorldPackets::Item::SwapInvItem& swapInvItem);
+ void HandleDestroyItemOpcode(WorldPackets::Item::DestroyItem& destroyItem);
+ void HandleAutoEquipItemOpcode(WorldPackets::Item::AutoEquipItem& autoEquipItem);
void HandleSellItemOpcode(WorldPacket& recvPacket);
void HandleBuyItemInSlotOpcode(WorldPacket& recvPacket);
void HandleBuyItemOpcode(WorldPacket& recvPacket);
@@ -859,7 +868,7 @@ class WorldSession
void HandleAutoStoreBagItemOpcode(WorldPacket& recvPacket);
void HandleReadItem(WorldPacket& recvPacket);
void HandleAutoEquipItemSlotOpcode(WorldPacket& recvPacket);
- void HandleSwapItem(WorldPacket& recvPacket);
+ void HandleSwapItem(WorldPackets::Item::SwapItem& swapItem);
void HandleBuybackItem(WorldPacket& recvPacket);
void HandleAutoBankItemOpcode(WorldPacket& recvPacket);
void HandleAutoStoreBankItemOpcode(WorldPacket& recvPacket);