aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Handlers/QueryHandler.cpp39
-rw-r--r--src/server/game/Server/Packets/QueryPackets.cpp26
-rw-r--r--src/server/game/Server/Packets/QueryPackets.h26
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rw-r--r--src/server/game/Server/WorldSession.h3
5 files changed, 70 insertions, 28 deletions
diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp
index 50848e51510..4f2a7608038 100644
--- a/src/server/game/Handlers/QueryHandler.cpp
+++ b/src/server/game/Handlers/QueryHandler.cpp
@@ -288,45 +288,34 @@ void WorldSession::HandleQueryCorpseTransport(WorldPackets::Query::QueryCorpseTr
SendPacket(response.Write());
}
-void WorldSession::HandleQuestNPCQuery(WorldPacket& recvData)
+void WorldSession::HandleQueryQuestCompletionNPCs(WorldPackets::Query::QueryQuestCompletionNPCs& queryQuestCompletionNPCs)
{
- uint32 count = recvData.ReadBits(24);
- std::map<uint32, std::vector<uint32>> quests;
+ WorldPackets::Query::QuestCompletionNPCResponse response;
- for (uint32 i = 0; i < count; ++i)
+ for (int32& QuestID : queryQuestCompletionNPCs.QuestCompletionNPCs)
{
- uint32 questId;
- recvData >> questId;
+ WorldPackets::Query::QuestCompletionNPC questCompletionNPC;
- if (!sObjectMgr->GetQuestTemplate(questId))
+ if (!sObjectMgr->GetQuestTemplate(QuestID))
{
- TC_LOG_DEBUG("network", "WORLD: Unknown quest %u in CMSG_QUERY_QUEST_COMPLETION_NPCS by %s", questId, _player->GetGUID().ToString().c_str());
+ TC_LOG_DEBUG("network", "WORLD: Unknown quest %u in CMSG_QUERY_QUEST_COMPLETION_NPCS by %s", QuestID, _player->GetGUID().ToString().c_str());
continue;
}
- auto creatures = sObjectMgr->GetCreatureQuestInvolvedRelationReverseBounds(questId);
+ questCompletionNPC.QuestID = QuestID;
+
+ auto creatures = sObjectMgr->GetCreatureQuestInvolvedRelationReverseBounds(QuestID);
for (auto it = creatures.first; it != creatures.second; ++it)
- quests[questId].push_back(it->second);
+ questCompletionNPC.NPCs.push_back(it->second);
- auto gos = sObjectMgr->GetGOQuestInvolvedRelationReverseBounds(questId);
+ auto gos = sObjectMgr->GetGOQuestInvolvedRelationReverseBounds(QuestID);
for (auto it = gos.first; it != gos.second; ++it)
- quests[questId].push_back(it->second | 0x80000000); // GO mask
- }
-
- WorldPacket data(SMSG_QUEST_COMPLETION_NPC_RESPONSE, 3 + quests.size() * 14);
- data.WriteBits(quests.size(), 23);
+ questCompletionNPC.NPCs.push_back(it->second | 0x80000000); // GO mask
- for (auto it = quests.begin(); it != quests.end(); ++it)
- data.WriteBits(it->second.size(), 24);
-
- for (auto it = quests.begin(); it != quests.end(); ++it)
- {
- data << uint32(it->first);
- for (const auto& entry : it->second)
- data << uint32(entry);
+ response.QuestCompletionNPCs.push_back(questCompletionNPC);
}
- SendPacket(&data);
+ SendPacket(response.Write());
}
void WorldSession::HandleQuestPOIQuery(WorldPackets::Query::QuestPOIQuery& packet)
diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp
index fd50b354c4c..59988cbc92e 100644
--- a/src/server/game/Server/Packets/QueryPackets.cpp
+++ b/src/server/game/Server/Packets/QueryPackets.cpp
@@ -407,3 +407,29 @@ WorldPacket const* WorldPackets::Query::QuestPOIQueryResponse::Write()
return &_worldPacket;
}
+
+void WorldPackets::Query::QueryQuestCompletionNPCs::Read()
+{
+ uint32 questCount = 0;
+
+ _worldPacket >> questCount;
+ QuestCompletionNPCs.resize(questCount);
+
+ for (int32& QuestID : QuestCompletionNPCs)
+ _worldPacket >> QuestID;
+}
+
+WorldPacket const* WorldPackets::Query::QuestCompletionNPCResponse::Write()
+{
+ _worldPacket << uint32(QuestCompletionNPCs.size());
+ for (auto& quest : QuestCompletionNPCs)
+ {
+ _worldPacket << int32(quest.QuestID);
+
+ _worldPacket << uint32(quest.NPCs.size());
+ for (int32 const& npc : quest.NPCs)
+ _worldPacket << int32(npc);
+ }
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h
index 2f69ae062dd..8e9613019c8 100644
--- a/src/server/game/Server/Packets/QueryPackets.h
+++ b/src/server/game/Server/Packets/QueryPackets.h
@@ -366,6 +366,32 @@ namespace WorldPackets
std::vector<QuestPOIData> QuestPOIDataStats;
};
+
+ class QueryQuestCompletionNPCs final : public ClientPacket
+ {
+ public:
+ QueryQuestCompletionNPCs(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_QUEST_COMPLETION_NPCS, std::move(packet)) { }
+
+ void Read() override;
+
+ std::vector<int32> QuestCompletionNPCs;
+ };
+
+ struct QuestCompletionNPC
+ {
+ int32 QuestID = 0;
+ std::vector<int32> NPCs;
+ };
+
+ class QuestCompletionNPCResponse final : public ServerPacket
+ {
+ public:
+ QuestCompletionNPCResponse() : ServerPacket(SMSG_QUEST_COMPLETION_NPC_RESPONSE, 4) { }
+
+ WorldPacket const* Write() override;
+
+ std::vector<QuestCompletionNPC> QuestCompletionNPCs;
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index bd9f90b8deb..89e1c17874e 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -632,7 +632,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_QUERY_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::QueryPetition, &WorldSession::HandleQueryPetition);
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_PET_NAME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetNameQuery );
DEFINE_HANDLER(CMSG_QUERY_PLAYER_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryPlayerName, &WorldSession::HandleNameQueryOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_QUEST_COMPLETION_NPCS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestNPCQuery );
+ DEFINE_HANDLER(CMSG_QUERY_QUEST_COMPLETION_NPCS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryQuestCompletionNPCs, &WorldSession::HandleQueryQuestCompletionNPCs);
DEFINE_HANDLER(CMSG_QUERY_QUEST_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QueryQuestInfo, &WorldSession::HandleQuestQueryOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_REALM_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_SCENARIO_POI, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -1511,7 +1511,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PLAYER_NAME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_QUEST_INFO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_COMPLETION_NPC_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_COMPLETION_NPC_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_CONFIRM_ACCEPT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_FORCE_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_INVALID_QUEST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 0b9e24523fe..ea0ec982a47 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -351,6 +351,7 @@ namespace WorldPackets
class QueryCorpseTransport;
class QueryTime;
class QuestPOIQuery;
+ class QueryQuestCompletionNPCs;
}
namespace Quest
@@ -1407,7 +1408,7 @@ class WorldSession
void HandleEquipmentSetDelete(WorldPacket& recvData);
void HandleEquipmentSetUse(WorldPacket& recvData);
void HandleUITimeRequest(WorldPackets::Misc::UITimeRequest& /*request*/);
- void HandleQuestNPCQuery(WorldPacket& recvData);
+ void HandleQueryQuestCompletionNPCs(WorldPackets::Query::QueryQuestCompletionNPCs& queryQuestCompletionNPCs);
void HandleQuestPOIQuery(WorldPackets::Query::QuestPOIQuery& packet);
void HandleUpdateProjectilePosition(WorldPacket& recvPacket);
void HandleUpdateMissileTrajectory(WorldPacket& recvPacket);