aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp31
-rw-r--r--src/server/game/Server/Packets/ItemPackets.cpp22
-rw-r--r--src/server/game/Server/Packets/ItemPackets.h33
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp6
-rw-r--r--src/server/game/Server/WorldSession.h3
5 files changed, 76 insertions, 19 deletions
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index 1ec4e134126..335bb9ce48c 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -310,31 +310,32 @@ void WorldSession::HandleDestroyItemOpcode(WorldPackets::Item::DestroyItem& dest
_player->DestroyItem(destroyItem.ContainerId, destroyItem.SlotNum, true);
}
-void WorldSession::HandleReadItem(WorldPacket& recvData)
+void WorldSession::HandleReadItem(WorldPackets::Item::ReadItem& readItem)
{
- uint8 bag, slot;
- recvData >> bag >> slot;
-
- Item* pItem = _player->GetItemByPos(bag, slot);
-
- if (pItem && pItem->GetTemplate()->GetPageText())
+ Item* item = _player->GetItemByPos(readItem.PackSlot, readItem.Slot);
+ if (item && item->GetTemplate()->GetPageText())
{
- WorldPacket data;
-
- InventoryResult msg = _player->CanUseItem(pItem);
+ InventoryResult msg = _player->CanUseItem(item);
if (msg == EQUIP_ERR_OK)
{
- data.Initialize(SMSG_READ_ITEM_RESULT_OK, 8);
+ WorldPackets::Item::ReadItemResultOK packet;
+ packet.Item = item->GetGUID();
+ SendPacket(packet.Write());
+
TC_LOG_INFO("network", "STORAGE: Item page sent");
}
else
{
- data.Initialize(SMSG_READ_ITEM_RESULT_FAILED, 8);
+ /// @todo: 6.x research new values
+ /*WorldPackets::Item::ReadItemResultFailed packet;
+ packet.Item = item->GetGUID();
+ packet.Subcode = ??;
+ packet.Delay = ??;
+ SendPacket(packet.Write());*/
+
TC_LOG_INFO("network", "STORAGE: Unable to read item");
- _player->SendEquipError(msg, pItem, NULL);
+ _player->SendEquipError(msg, item, NULL);
}
- data << pItem->GetGUID();
- SendPacket(&data);
}
else
_player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL);
diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp
index ed1d3e1dda2..10aa2435541 100644
--- a/src/server/game/Server/Packets/ItemPackets.cpp
+++ b/src/server/game/Server/Packets/ItemPackets.cpp
@@ -325,3 +325,25 @@ WorldPacket const* WorldPackets::Item::ItemPushResult::Write()
return &_worldPacket;
}
+
+void WorldPackets::Item::ReadItem::Read()
+{
+ _worldPacket >> PackSlot;
+ _worldPacket >> Slot;
+}
+
+WorldPacket const* WorldPackets::Item::ReadItemResultFailed::Write()
+{
+ _worldPacket << Item;
+ _worldPacket << Delay;
+ _worldPacket.WriteBits(Subcode, 3);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Item::ReadItemResultOK::Write()
+{
+ _worldPacket << Item;
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h
index 538ecd28ffe..9b171317dd9 100644
--- a/src/server/game/Server/Packets/ItemPackets.h
+++ b/src/server/game/Server/Packets/ItemPackets.h
@@ -307,6 +307,39 @@ namespace WorldPackets
bool IsBonusRoll = false;
};
+ class ReadItem final : public ClientPacket
+ {
+ public:
+ ReadItem(WorldPacket&& packet) : ClientPacket(CMSG_READ_ITEM, std::move(packet)) { }
+
+ void Read() override;
+
+ uint8 PackSlot = 0;
+ uint8 Slot = 0;
+ };
+
+ class ReadItemResultFailed final : public ServerPacket
+ {
+ public:
+ ReadItemResultFailed() : ServerPacket(SMSG_READ_ITEM_RESULT_FAILED, 16 + 1 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Item;
+ uint8 Subcode = 0;
+ uint32 Delay = 0;
+ };
+
+ class ReadItemResultOK final : public ServerPacket
+ {
+ public:
+ ReadItemResultOK() : ServerPacket(SMSG_READ_ITEM_RESULT_OK, 16) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Item;
+ };
+
ByteBuffer& operator>>(ByteBuffer& data, InvUpdate& invUpdate);
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index da9bb3d8edb..39db8a46370 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -653,7 +653,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEUED_MESSAGES_END, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_RANDOM_ROLL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::RandomRollClient, &WorldSession::HandleRandomRollOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_READY_CHECK_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_READ_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleReadItem );
+ DEFINE_HANDLER(CMSG_READ_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::ReadItem, &WorldSession::HandleReadItem);
DEFINE_HANDLER(CMSG_RECLAIM_CORPSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::ReclaimCorpse, &WorldSession::HandleReclaimCorpse);
DEFINE_OPCODE_HANDLER_OLD(CMSG_RECRUIT_A_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REDEEM_WOW_TOKEN_CONFIRM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -1542,8 +1542,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_COMPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_STARTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_OK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_OK, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_SPLIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECRUIT_A_FRIEND_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index c087bbcd462..be0fcd026a2 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -260,6 +260,7 @@ namespace WorldPackets
class DestroyItem;
class GetItemPurchaseData;
class RepairItem;
+ class ReadItem;
class SellItem;
class SplitItem;
class SwapInvItem;
@@ -1159,7 +1160,7 @@ class WorldSession
void HandleBuyItemOpcode(WorldPackets::Item::BuyItem& packet);
void HandleListInventoryOpcode(WorldPackets::NPC::Hello& packet);
void HandleAutoStoreBagItemOpcode(WorldPackets::Item::AutoStoreBagItem& packet);
- void HandleReadItem(WorldPacket& recvPacket);
+ void HandleReadItem(WorldPackets::Item::ReadItem& readItem);
void HandleAutoEquipItemSlotOpcode(WorldPackets::Item::AutoEquipItemSlot& autoEquipItemSlot);
void HandleSwapItem(WorldPackets::Item::SwapItem& swapItem);
void HandleBuybackItem(WorldPackets::Item::BuyBackItem& packet);