From 28c755040f18d128941677ddc3d60d4cf70beee9 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Mon, 9 Mar 2026 15:32:11 -0700 Subject: [PATCH] Request completed quests on world entry and expose via public API - Send CMSG_QUERY_QUESTS_COMPLETED on initial world entry so completedQuests_ is populated from the server response - Clear completedQuests_ on world entry to avoid stale data across sessions - Add isQuestCompleted(questId) and getCompletedQuests() public accessors to allow UI layers to filter NPC quest offers by completion state --- include/game/game_handler.hpp | 4 ++++ src/game/game_handler.cpp | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/include/game/game_handler.hpp b/include/game/game_handler.hpp index ad404b95..dc92abfc 100644 --- a/include/game/game_handler.hpp +++ b/include/game/game_handler.hpp @@ -508,6 +508,10 @@ public: const std::vector& getPlayerAuras() const { return playerAuras; } const std::vector& getTargetAuras() const { return targetAuras; } + // Completed quests (populated from SMSG_QUERY_QUESTS_COMPLETED_RESPONSE) + bool isQuestCompleted(uint32_t questId) const { return completedQuests_.count(questId) > 0; } + const std::unordered_set& getCompletedQuests() const { return completedQuests_; } + // NPC death callback (for animations) using NpcDeathCallback = std::function; void setNpcDeathCallback(NpcDeathCallback cb) { npcDeathCallback_ = std::move(cb); } diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index 2a833627..214d438b 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -5238,7 +5238,15 @@ void GameHandler::handleLoginVerifyWorld(network::Packet& packet) { pendingQuestQueryIds_.clear(); pendingLoginQuestResync_ = true; pendingLoginQuestResyncTimeout_ = 10.0f; + completedQuests_.clear(); LOG_INFO("Queued quest log resync for login (from server quest slots)"); + + // Request completed quest IDs from server (populates completedQuests_ when response arrives) + if (socket) { + network::Packet cqcPkt(wireOpcode(Opcode::CMSG_QUERY_QUESTS_COMPLETED)); + socket->send(cqcPkt); + LOG_INFO("Sent CMSG_QUERY_QUESTS_COMPLETED"); + } } }