mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-22 18:15:31 +01:00
Core/PacketIO: Updated & enabled CMSG_QUERY_QUEST_COMPLETION_NPCS / SMSG_QUEST_COMPLETION_NPC_RESPONSE
This commit is contained in:
@@ -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
|
||||
questCompletionNPC.NPCs.push_back(it->second | 0x80000000); // GO mask
|
||||
|
||||
response.QuestCompletionNPCs.push_back(questCompletionNPC);
|
||||
}
|
||||
|
||||
WorldPacket data(SMSG_QUEST_COMPLETION_NPC_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);
|
||||
SendPacket(response.Write());
|
||||
}
|
||||
|
||||
void WorldSession::HandleQuestPOIQuery(WorldPackets::Query::QuestPOIQuery& packet)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user