aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDDuarte <dnpd.dd@gmail.com>2014-09-01 20:03:01 +0100
committerDDuarte <dnpd.dd@gmail.com>2014-09-01 20:03:01 +0100
commita896a7554f7a2c41d0225564896d7d2db61ec800 (patch)
tree43b77e6748187cfdbfa174fe0dbacbfdd894e353 /src
parentc19fcec81486493cf997f1266bfc3e1713d12051 (diff)
Core/Quests: Implement CMSG_QUEST_NPC_QUERY and SMSG_QUEST_NPC_QUERY_RESPONSE
Plot twist: We don't know what these packets do (but they are used)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Handlers/QueryHandler.cpp39
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rw-r--r--src/server/game/Server/WorldSession.h1
3 files changed, 42 insertions, 2 deletions
diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp
index fb160c2bc41..cf75fa1e3c9 100644
--- a/src/server/game/Handlers/QueryHandler.cpp
+++ b/src/server/game/Handlers/QueryHandler.cpp
@@ -419,6 +419,45 @@ 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 (int i = 0; i < count; ++i)
+ {
+ uint32 questId;
+ recvData >> questId;
+
+ /// @todo verify if we should only send completed quests questgivers
+ if (_player->GetQuestStatus(questId) == QUEST_STATUS_COMPLETE)
+ {
+ 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 + count * 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;
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 99cfba89537..f653b1ec9d4 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -434,7 +434,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER(CMSG_QUESTGIVER_STATUS_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestgiverStatusQueryOpcode);
DEFINE_OPCODE_HANDLER(CMSG_QUESTLOG_REMOVE_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestLogRemoveQuest );
DEFINE_OPCODE_HANDLER(CMSG_QUEST_CONFIRM_ACCEPT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestConfirmAccept );
- DEFINE_OPCODE_HANDLER(CMSG_QUEST_NPC_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER(CMSG_QUEST_NPC_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestNPCQuery );
DEFINE_OPCODE_HANDLER(CMSG_QUEST_POI_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestPOIQuery );
DEFINE_OPCODE_HANDLER(CMSG_QUEST_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestQueryOpcode );
DEFINE_OPCODE_HANDLER(CMSG_RANDOMIZE_CHAR_NAME, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRandomizeCharNameOpcode );
@@ -1114,7 +1114,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER(SMSG_QUESTUPDATE_FAILEDTIMER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_QUEST_CONFIRM_ACCEPT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_QUEST_FORCE_REMOVE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- DEFINE_OPCODE_HANDLER(SMSG_QUEST_NPC_QUERY_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
+ DEFINE_OPCODE_HANDLER(SMSG_QUEST_NPC_QUERY_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_QUEST_POI_QUERY_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_QUEST_QUERY_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_RAID_GROUP_ONLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index f7269ae977c..40119124490 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -963,6 +963,7 @@ class WorldSession
void HandleWorldStateUITimerUpdate(WorldPacket& recvData);
void HandleReadyForAccountDataTimes(WorldPacket& recvData);
void HandleQueryQuestsCompleted(WorldPacket& recvData);
+ void HandleQuestNPCQuery(WorldPacket& recvData);
void HandleQuestPOIQuery(WorldPacket& recvData);
void HandleEjectPassenger(WorldPacket& data);
void HandleEnterPlayerVehicle(WorldPacket& data);