diff options
author | Vincent-Michael <Vincent_Michael@gmx.de> | 2014-09-02 19:46:56 +0200 |
---|---|---|
committer | Vincent-Michael <Vincent_Michael@gmx.de> | 2014-09-02 19:46:56 +0200 |
commit | e449159265531d9fe6b8be602350a6e16f0fdf37 (patch) | |
tree | 12430eea62b57461f571b60a5e03563cc507f0bd /src/server/game/Handlers/QueryHandler.cpp | |
parent | 8a97243728fbbd8c7541b921f72b2762bffeb79a (diff) | |
parent | 09867a10c9c8593ede7641996e6c0ea353f6a51d (diff) |
Merge branch '4.3.4' of github.com:TrinityCore/TrinityCore into 4.3.4
Diffstat (limited to 'src/server/game/Handlers/QueryHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/QueryHandler.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index fb160c2bc41..e6c94250262 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -419,6 +419,47 @@ void WorldSession::HandleCorpseMapPositionQuery(WorldPacket& recvData) SendPacket(&data); } +void WorldSession::HandleQuestNPCQuery(WorldPacket& recvData) +{ + uint32 count = recvData.ReadBits(24); + std::map<uint32, std::vector<uint32>> quests; + + for (uint32 i = 0; i < count; ++i) + { + uint32 questId; + recvData >> questId; + + if (!sObjectMgr->GetQuestTemplate(questId)) + { + TC_LOG_DEBUG("network", "WORLD: Unknown quest %u in CMSG_QUEST_NPC_QUERY by player %u", questId, m_GUIDLow); + continue; + } + + auto creatures = sObjectMgr->GetCreatureQuestInvolvedRelationReverseBounds(questId); + for (auto it = creatures.first; it != creatures.second; ++it) + quests[questId].push_back(it->second); + + 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_NPC_QUERY_RESPONSE, 3 + quests.size() * 14); + data.WriteBits(quests.size(), 23); + + 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); + } + + SendPacket(&data); +} + void WorldSession::HandleQuestPOIQuery(WorldPacket& recvData) { uint32 count; |