aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Handlers/QueryHandler.cpp15
-rw-r--r--src/server/game/Server/Packets/QueryPackets.cpp80
-rw-r--r--src/server/game/Server/Packets/QueryPackets.h57
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp6
-rw-r--r--src/server/game/Server/WorldSession.h2
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);