diff options
author | Meji <alvaro.megias@outlook.com> | 2024-10-18 16:43:12 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-18 16:43:12 +0200 |
commit | 4936094379a3558022d63f7520cd0d988d718daf (patch) | |
tree | fbc56c0df64fa581f339ce66287db567b58cdda1 | |
parent | ecb5539292b45dabcbf7187edc546973be038a68 (diff) |
Core/PacketIO: Added empty implementation for treasure picker opcodes (#30351)
* Temporary workaround to display quest details at questgiver
Co-authored-by: Shauren <shauren.trinity@gmail.com>
-rw-r--r-- | src/server/game/Handlers/QueryHandler.cpp | 15 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QueryPackets.cpp | 80 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QueryPackets.h | 57 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 2 |
5 files changed, 157 insertions, 3 deletions
diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index 9355cbfcf9a..bf7a935d825 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -334,3 +334,18 @@ void WorldSession::HandleQueryRealmName(WorldPackets::Query::QueryRealmName& que SendPacket(realmQueryResponse.Write()); } + +void WorldSession::HandleQueryTreasurePicker(WorldPackets::Query::QueryTreasurePicker const& queryTreasurePicker) +{ + Quest const* questInfo = sObjectMgr->GetQuestTemplate(queryTreasurePicker.QuestID); + if (!questInfo) + return; + + WorldPackets::Query::TreasurePickerResponse treasurePickerResponse; + treasurePickerResponse.QuestID = queryTreasurePicker.QuestID; + treasurePickerResponse.TreasurePickerID = queryTreasurePicker.TreasurePickerID; + + // TODO: Missing treasure picker implementation + + _player->SendDirectMessage(treasurePickerResponse.Write()); +} diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index 3e1f6aefd51..99a03a3c9ca 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -519,4 +519,84 @@ WorldPacket const* RealmQueryResponse::Write() return &_worldPacket; } + +void QueryTreasurePicker::Read() +{ + _worldPacket >> QuestID; + _worldPacket >> TreasurePickerID; +} + +ByteBuffer& operator<<(ByteBuffer& data, TreasurePickItem const& treasurePickItem) +{ + data << treasurePickItem.Item; + data << uint32(treasurePickItem.Quantity); + data << OptionalInit(treasurePickItem.ContextFlags); + data.FlushBits(); + + if (treasurePickItem.ContextFlags) + data << As<int32>(*treasurePickItem.ContextFlags); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, TreasurePickCurrency const& treasurePickCurrency) +{ + data << uint32(treasurePickCurrency.CurrencyID); + data << uint32(treasurePickCurrency.Quantity); + data << OptionalInit(treasurePickCurrency.ContextFlags); + data.FlushBits(); + + if (treasurePickCurrency.ContextFlags) + data << As<int32>(*treasurePickCurrency.ContextFlags); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, TreasurePickerBonus const& treasurePickerBonus) +{ + data << uint32(treasurePickerBonus.Items.size()); + data << uint32(treasurePickerBonus.Currencies.size()); + data << uint64(treasurePickerBonus.Money); + data << Bits<1>(treasurePickerBonus.Unknown); + data.FlushBits(); + + for (TreasurePickItem const& treasurePickerItem : treasurePickerBonus.Items) + data << treasurePickerItem; + + for (TreasurePickCurrency const& treasurePickCurrency : treasurePickerBonus.Currencies) + data << treasurePickCurrency; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, TreasurePickerPick const& treasurePickerPick) +{ + data << uint32(treasurePickerPick.Items.size()); + data << uint32(treasurePickerPick.Currencies.size()); + data << uint64(treasurePickerPick.Money); + data << uint32(treasurePickerPick.Bonuses.size()); + data << int32(treasurePickerPick.Flags); + data << Bits<1>(treasurePickerPick.IsChoice); + data.FlushBits(); + + for (TreasurePickCurrency const& treasurePickCurrency : treasurePickerPick.Currencies) + data << treasurePickCurrency; + + for (TreasurePickItem const& treasurePickItem : treasurePickerPick.Items) + data << treasurePickItem; + + for (TreasurePickerBonus const& treasurePickerBonus : treasurePickerPick.Bonuses) + data << treasurePickerBonus; + + return data; +} + +WorldPacket const* TreasurePickerResponse::Write() +{ + _worldPacket << uint32(QuestID); + _worldPacket << uint32(TreasurePickerID); + _worldPacket << Pick; + + return &_worldPacket; +} } diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index d551566f883..ec8eeb85b1f 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -20,10 +20,12 @@ #include "Packet.h" #include "AuthenticationPackets.h" +#include "ItemPacketsCommon.h" #include "NPCHandler.h" #include "ObjectGuid.h" #include "PacketUtilities.h" #include "Position.h" +#include "QuestDef.h" #include "RaceMask.h" #include "SharedDefines.h" #include "UnitDefines.h" @@ -436,6 +438,61 @@ namespace WorldPackets WorldPackets::Auth::VirtualRealmNameInfo NameInfo; }; + class QueryTreasurePicker final : public ClientPacket + { + public: + QueryTreasurePicker(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_TREASURE_PICKER, std::move(packet)) { } + + void Read() override; + + uint32 QuestID = 0; + uint32 TreasurePickerID = 0; + }; + + struct TreasurePickItem + { + Item::ItemInstance Item; + uint32 Quantity = 0; + Optional<QuestRewardContextFlags> ContextFlags; + }; + + struct TreasurePickCurrency + { + uint32 CurrencyID = 0; + uint32 Quantity = 0; + Optional<QuestRewardContextFlags> ContextFlags; + }; + + struct TreasurePickerBonus + { + std::vector<TreasurePickItem> Items; + std::vector<TreasurePickCurrency> Currencies; + uint64 Money = 0; + bool Unknown = false; + }; + + struct TreasurePickerPick + { + std::vector<TreasurePickItem> Items; + std::vector<TreasurePickCurrency> Currencies; + std::vector<TreasurePickerBonus> Bonuses; + uint64 Money = 0; + int32 Flags = 0; + bool IsChoice = false; + }; + + class TreasurePickerResponse final : public ServerPacket + { + public: + TreasurePickerResponse() : ServerPacket(SMSG_TREASURE_PICKER_RESPONSE) { } + + WorldPacket const* Write() override; + + uint32 QuestID = 0; + uint32 TreasurePickerID = 0; + TreasurePickerPick Pick; + }; + ByteBuffer& operator<<(ByteBuffer& data, PlayerGuidLookupData const& lookupData); } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index a75b439fedb..35b4b046741 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -774,7 +774,7 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_QUERY_REALM_NAME, STATUS_AUTHED, PROCESS_INPLACE, &WorldSession::HandleQueryRealmName); DEFINE_HANDLER(CMSG_QUERY_SCENARIO_POI, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQueryScenarioPOI); DEFINE_HANDLER(CMSG_QUERY_TIME, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQueryTimeOpcode); - DEFINE_HANDLER(CMSG_QUERY_TREASURE_PICKER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_QUERY_TREASURE_PICKER, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQueryTreasurePicker); DEFINE_HANDLER(CMSG_QUERY_VOID_STORAGE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleVoidStorageQuery); DEFINE_HANDLER(CMSG_QUEST_CONFIRM_ACCEPT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestConfirmAccept); DEFINE_HANDLER(CMSG_QUEST_GIVER_ACCEPT_QUEST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestgiverAcceptQuestOpcode); @@ -1263,7 +1263,7 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_RESURRECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_TARGET, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_TREASURE_PICKER_CACHE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_TREASURE_PICKER_CACHE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLOSE_ARTIFACT_FORGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLUB_FINDER_ERROR_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLUB_FINDER_GET_CLUB_POSTING_IDS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -2158,7 +2158,7 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAIT_CONFIG_COMMIT_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_ABORTED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_PENDING, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TREASURE_PICKER_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TREASURE_PICKER_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_CINEMATIC, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TURN_IN_PETITION_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 6d9534fa625..bbe102188e3 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -655,6 +655,7 @@ namespace WorldPackets class QueryQuestCompletionNPCs; class QueryRealmName; class ItemTextQuery; + class QueryTreasurePicker; } namespace Quest @@ -1571,6 +1572,7 @@ class TC_GAME_API WorldSession void HandleRequestWorldQuestUpdate(WorldPackets::Quest::RequestWorldQuestUpdate& packet); void HandlePlayerChoiceResponse(WorldPackets::Quest::ChoiceResponse& choiceResponse); void HandleUiMapQuestLinesRequest(WorldPackets::Quest::UiMapQuestLinesRequest& uiMapQuestLinesRequest); + void HandleQueryTreasurePicker(WorldPackets::Query::QueryTreasurePicker const& queryTreasurePicker); void HandleChatMessageOpcode(WorldPackets::Chat::ChatMessage& chatMessage); void HandleChatMessageWhisperOpcode(WorldPackets::Chat::ChatMessageWhisper& chatMessageWhisper); |