diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Handlers/QueryHandler.cpp | 39 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QueryPackets.cpp | 26 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QueryPackets.h | 26 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 3 |
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); |