diff options
author | Shauren <shauren.trinity@gmail.com> | 2015-05-01 00:20:41 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2015-05-01 00:20:41 +0200 |
commit | 1b5f6d44f0fa4858c653c3f6ba1c273603ce68ba (patch) | |
tree | fab3bccf59f2ddaf465c09647790497a38268dd9 | |
parent | e0746e49b3194fc26137cf93d140a2d2521668ee (diff) |
Core/PacketIO: Updated and enabled CMSG_ITEM_TEXT_QUERY, SMSG_QUERY_ITEM_TEXT_RESPONSE, CMSG_CANCEL_TEMP_ENCHANTMENT
-rw-r--r-- | src/server/game/Entities/Item/ItemTemplate.h | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 70 | ||||
-rw-r--r-- | src/server/game/Handlers/QueryHandler.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ItemPackets.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ItemPackets.h | 10 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QueryPackets.cpp | 24 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QueryPackets.h | 27 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 7 |
9 files changed, 96 insertions, 74 deletions
diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index 47523872151..9e45c3f5734 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -168,7 +168,7 @@ enum ItemProtoFlags enum ItemFieldFlags { ITEM_FLAG_SOULBOUND = 0x00000001, // Item is soulbound and cannot be traded <<-- - ITEM_FLAG_UNK1 = 0x00000002, // ? + ITEM_FLAG_TRANSLATED = 0x00000002, // Item text will not read as garbage when player does not know the language ITEM_FLAG_UNLOCKED = 0x00000004, // Item had lock but can be opened now ITEM_FLAG_WRAPPED = 0x00000008, // Item is wrapped and contains another item ITEM_FLAG_UNK2 = 0x00000010, // ? diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 9e282582b7d..67d8c27acd8 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -494,38 +494,6 @@ void WorldSession::HandleBuybackItem(WorldPackets::Item::BuyBackItem& packet) _player->SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, 0, 0); } -void WorldSession::HandleBuyItemInSlotOpcode(WorldPacket& recvData) -{ - ObjectGuid vendorguid, bagguid; - uint32 item, slot, count; - uint8 bagslot; - - recvData >> vendorguid >> item >> slot >> bagguid >> bagslot >> count; - - // client expects count starting at 1, and we send vendorslot+1 to client already - if (slot > 0) - --slot; - else - return; // cheating - - uint8 bag = NULL_BAG; // init for case invalid bagGUID - Item* bagItem = NULL; - // find bag slot by bag guid - if (bagguid == _player->GetGUID()) - bag = INVENTORY_SLOT_BAG_0; - else - bagItem = _player->GetItemByGuid(bagguid); - - if (bagItem && bagItem->IsBag()) - bag = bagItem->GetSlot(); - - // bag not found, cheating? - if (bag == NULL_BAG) - return; - - GetPlayer()->BuyItemFromVendorSlot(vendorguid, slot, item, count, bag, bagslot); -} - void WorldSession::HandleBuyItemOpcode(WorldPackets::Item::BuyItem& packet) { // client expects count starting at 1, and we send vendorslot+1 to client already @@ -1094,17 +1062,13 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recvData) itemTarget->SendUpdateSockets(); } -void WorldSession::HandleCancelTempEnchantmentOpcode(WorldPacket& recvData) +void WorldSession::HandleCancelTempEnchantmentOpcode(WorldPackets::Item::CancelTempEnchantment& cancelTempEnchantment) { - uint32 slot; - - recvData >> slot; - // apply only to equipped item - if (!Player::IsEquipmentPos(INVENTORY_SLOT_BAG_0, slot)) + if (!Player::IsEquipmentPos(INVENTORY_SLOT_BAG_0, cancelTempEnchantment.Slot)) return; - Item* item = GetPlayer()->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); + Item* item = GetPlayer()->GetItemByPos(INVENTORY_SLOT_BAG_0, cancelTempEnchantment.Slot); if (!item) return; @@ -1149,34 +1113,6 @@ void WorldSession::HandleItemRefund(WorldPacket &recvData) GetPlayer()->RefundItem(item); } -/** - * Handles the packet sent by the client when requesting information about item text. - * - * This function is called when player clicks on item which has some flag set - */ -void WorldSession::HandleItemTextQuery(WorldPacket& recvData ) -{ - ObjectGuid itemGuid; - recvData >> itemGuid; - - TC_LOG_DEBUG("network", "CMSG_ITEM_TEXT_QUERY %s", itemGuid.ToString().c_str()); - - WorldPacket data(SMSG_QUERY_ITEM_TEXT_RESPONSE, 14); // guess size - - if (Item* item = _player->GetItemByGuid(itemGuid)) - { - data << uint8(0); // has text - data << itemGuid; // item guid - data << item->GetText(); - } - else - { - data << uint8(1); // no text - } - - SendPacket(&data); -} - void WorldSession::HandleTransmogrifyItems(WorldPacket& recvData) { Player* player = GetPlayer(); diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index e92fdab9409..eec80888559 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -414,3 +414,22 @@ void WorldSession::HandleDBQueryBulk(WorldPackets::Query::DBQueryBulk& packet) SendPacket(response.Write()); } } + +/** +* Handles the packet sent by the client when requesting information about item text. +* +* This function is called when player clicks on item which has some flag set +*/ +void WorldSession::HandleItemTextQuery(WorldPackets::Query::ItemTextQuery& itemTextQuery) +{ + WorldPackets::Query::QueryItemTextResponse queryItemTextResponse; + queryItemTextResponse.Id = itemTextQuery.Id; + + if (Item* item = _player->GetItemByGuid(itemTextQuery.Id)) + { + queryItemTextResponse.Valid = true; + queryItemTextResponse.Item.Text = item->GetText(); + } + + SendPacket(queryItemTextResponse.Write()); +} diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index 3feea2cdc98..a4da605ca08 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -369,3 +369,8 @@ void WorldPackets::Item::WrapItem::Read() { _worldPacket >> Inv; } + +void WorldPackets::Item::CancelTempEnchantment::Read() +{ + _worldPacket >> Slot; +} diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index d37df357513..7b0b9e41e4b 100644 --- a/src/server/game/Server/Packets/ItemPackets.h +++ b/src/server/game/Server/Packets/ItemPackets.h @@ -353,6 +353,16 @@ namespace WorldPackets InvUpdate Inv; }; + class CancelTempEnchantment final : public ClientPacket + { + public: + CancelTempEnchantment(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_TEMP_ENCHANTMENT, std::move(packet)) { } + + void Read() override; + + int32 Slot = 0; + }; + ByteBuffer& operator>>(ByteBuffer& data, InvUpdate& invUpdate); } } diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index 4322ef3458b..f7806a9e588 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -465,3 +465,27 @@ WorldPacket const* WorldPackets::Query::QueryPetNameResponse::Write() return &_worldPacket; } + +void WorldPackets::Query::ItemTextQuery::Read() +{ + _worldPacket >> Id; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Query::ItemTextCache const& itemTextCache) +{ + data.WriteBits(itemTextCache.Text.length(), 13); + data.FlushBits(); + + data.WriteString(itemTextCache.Text); + + return data; +} + +WorldPacket const* WorldPackets::Query::QueryItemTextResponse::Write() +{ + _worldPacket.WriteBit(Valid); + _worldPacket << Id; + _worldPacket << Item; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index a5d7e5de8c4..88bf5a887f6 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -418,6 +418,33 @@ namespace WorldPackets uint32 Timestamp = 0; std::string Name; }; + + class ItemTextQuery final : public ClientPacket + { + public: + ItemTextQuery(WorldPacket&& packet) : ClientPacket(CMSG_ITEM_TEXT_QUERY, std::move(packet)) { } + + void Read() override; + + ObjectGuid Id; + }; + + struct ItemTextCache + { + std::string Text; + }; + + class QueryItemTextResponse final : public ServerPacket + { + public: + QueryItemTextResponse() : ServerPacket(SMSG_QUERY_ITEM_TEXT_RESPONSE) { } + + WorldPacket const* Write() override; + + ObjectGuid Id; + bool Valid = false; + ItemTextCache Item; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 2886b079c93..7ee3ea46fea 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -249,7 +249,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CANCEL_MOUNT_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::CancelMountAura, &WorldSession::HandleCancelMountAuraOpcode); DEFINE_HANDLER(CMSG_CANCEL_QUEUED_SPELL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_TEMP_ENCHANTMENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelTempEnchantmentOpcode); + DEFINE_HANDLER(CMSG_CANCEL_TEMP_ENCHANTMENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::CancelTempEnchantment, &WorldSession::HandleCancelTempEnchantmentOpcode); DEFINE_HANDLER(CMSG_CANCEL_TRADE, STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, PROCESS_THREADUNSAFE, WorldPackets::Trade::CancelTrade, &WorldSession::HandleCancelTradeOpcode); DEFINE_HANDLER(CMSG_CAN_DUEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Duel::CanDuel, &WorldSession::HandleCanDuel); DEFINE_HANDLER(CMSG_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Spells::CastSpell, &WorldSession::HandleCastSpellOpcode); @@ -462,7 +462,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_INSPECT_PVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Inspect::InspectPVPRequest, &WorldSession::HandleInspectPVP); DEFINE_OPCODE_HANDLER_OLD(CMSG_INSTANCE_LOCK_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleInstanceLockResponse); DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_PURCHASE_REFUND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemRefund ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_TEXT_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemTextQuery ); + DEFINE_HANDLER(CMSG_ITEM_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::ItemTextQuery, &WorldSession::HandleItemTextQuery); DEFINE_HANDLER(CMSG_JOIN_PET_BATTLE_QUEUE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_JOIN_RATED_BATTLEGROUND, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_KEEP_ALIVE, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); @@ -1504,7 +1504,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GAME_OBJECT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GUILD_INFO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_ITEM_TEXT_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_ITEM_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_NPC_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PAGE_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PETITION_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 631f87aeb11..e9a59d91fd6 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -282,6 +282,7 @@ namespace WorldPackets class SwapInvItem; class SwapItem; class WrapItem; + class CancelTempEnchantment; } namespace Loot @@ -375,6 +376,7 @@ namespace WorldPackets class QueryPetName; class QuestPOIQuery; class QueryQuestCompletionNPCs; + class ItemTextQuery; } namespace Quest @@ -1179,7 +1181,7 @@ class WorldSession void HandleMailMarkAsRead(WorldPackets::Mail::MailMarkAsRead& packet); void HandleMailReturnToSender(WorldPackets::Mail::MailReturnToSender& packet); void HandleMailDelete(WorldPackets::Mail::MailDelete& packet); - void HandleItemTextQuery(WorldPacket& recvData); + void HandleItemTextQuery(WorldPackets::Query::ItemTextQuery& itemTextQuery); void HandleMailCreateTextItem(WorldPackets::Mail::MailCreateTextItem& packet); void HandleQueryNextMailTime(WorldPackets::Mail::MailQueryNextMailTime& packet); void HandleCancelChanneling(WorldPacket& recvData); @@ -1190,7 +1192,6 @@ class WorldSession void HandleDestroyItemOpcode(WorldPackets::Item::DestroyItem& destroyItem); void HandleAutoEquipItemOpcode(WorldPackets::Item::AutoEquipItem& autoEquipItem); void HandleSellItemOpcode(WorldPackets::Item::SellItem& packet); - void HandleBuyItemInSlotOpcode(WorldPacket& recvPacket); void HandleBuyItemOpcode(WorldPackets::Item::BuyItem& packet); void HandleListInventoryOpcode(WorldPackets::NPC::Hello& packet); void HandleAutoStoreBagItemOpcode(WorldPackets::Item::AutoStoreBagItem& packet); @@ -1374,7 +1375,7 @@ class WorldSession // Socket gem void HandleSocketOpcode(WorldPacket& recvData); - void HandleCancelTempEnchantmentOpcode(WorldPacket& recvData); + void HandleCancelTempEnchantmentOpcode(WorldPackets::Item::CancelTempEnchantment& cancelTempEnchantment); void HandleGetItemPurchaseData(WorldPackets::Item::GetItemPurchaseData& packet); void HandleItemRefund(WorldPacket& recvData); |