From 504d1126251f5f6c91cc97307e89e696c34deacb Mon Sep 17 00:00:00 2001 From: Kelsi Date: Sat, 28 Mar 2026 14:36:14 -0700 Subject: [PATCH] fix: gossip/vendor windows not closing when opening mailbox/trainer/taxi Domain handlers were setting `owner_.gossipWindowOpen = false` directly on GameHandler's stale member, but isGossipWindowOpen() delegates to QuestHandler's copy. The gossip window stayed open because the delegating getter never saw the close. Fix: use owner_.closeGossip() / owner_.closeVendor() which properly delegate to QuestHandler/InventoryHandler to close the canonical state. Affected: InventoryHandler (3 sites: mail, trainer, bank opening), MovementHandler (1 site: taxi opening), QuestHandler (2 sites: gossip opening closes vendor). --- src/game/inventory_handler.cpp | 6 +++--- src/game/movement_handler.cpp | 2 +- src/game/quest_handler.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/game/inventory_handler.cpp b/src/game/inventory_handler.cpp index a7602b5d..336d9069 100644 --- a/src/game/inventory_handler.cpp +++ b/src/game/inventory_handler.cpp @@ -1289,7 +1289,7 @@ void InventoryHandler::useItemById(uint32_t itemId) { void InventoryHandler::handleListInventory(network::Packet& packet) { if (!ListInventoryParser::parse(packet, currentVendorItems_)) return; vendorWindowOpen_ = true; - owner_.gossipWindowOpen = false; + owner_.closeGossip(); if (owner_.addonEventCallback_) owner_.addonEventCallback_("MERCHANT_SHOW", {}); // Auto-sell grey items @@ -1394,7 +1394,7 @@ void InventoryHandler::handleTrainerList(network::Packet& packet) { const bool isClassic = isClassicLikeExpansion(); if (!TrainerListParser::parse(packet, currentTrainerList_, isClassic)) return; trainerWindowOpen_ = true; - owner_.gossipWindowOpen = false; + owner_.closeGossip(); if (owner_.addonEventCallback_) owner_.addonEventCallback_("TRAINER_SHOW", {}); LOG_INFO("Trainer list: ", currentTrainerList_.spells.size(), " spells"); @@ -1897,7 +1897,7 @@ void InventoryHandler::handleAuctionHello(network::Packet& packet) { auctionHouseId_ = houseId; auctionOpen_ = true; auctionActiveTab_ = 0; - owner_.gossipWindowOpen = false; + owner_.closeGossip(); if (owner_.addonEventCallback_) owner_.addonEventCallback_("AUCTION_HOUSE_SHOW", {}); } diff --git a/src/game/movement_handler.cpp b/src/game/movement_handler.cpp index 3d4bf900..873d289a 100644 --- a/src/game/movement_handler.cpp +++ b/src/game/movement_handler.cpp @@ -2114,7 +2114,7 @@ void MovementHandler::handleShowTaxiNodes(network::Packet& packet) { currentTaxiData_ = data; taxiNpcGuid_ = data.npcGuid; taxiWindowOpen_ = true; - owner_.gossipWindowOpen = false; + owner_.closeGossip(); buildTaxiCostMap(); auto it = taxiNodes_.find(data.nearestNode); if (it != taxiNodes_.end()) { diff --git a/src/game/quest_handler.cpp b/src/game/quest_handler.cpp index ab4d5e90..4b0d3226 100644 --- a/src/game/quest_handler.cpp +++ b/src/game/quest_handler.cpp @@ -1508,7 +1508,7 @@ void QuestHandler::handleGossipMessage(network::Packet& packet) { if (questDetailsOpen_) return; // Don't reopen gossip while viewing quest gossipWindowOpen_ = true; if (owner_.addonEventCallback_) owner_.addonEventCallback_("GOSSIP_SHOW", {}); - owner_.vendorWindowOpen = false; // Close vendor if gossip opens + owner_.closeVendor(); // Close vendor if gossip opens // Update known quest-log entries based on gossip quests. bool hasAvailableQuest = false; @@ -1612,7 +1612,7 @@ void QuestHandler::handleQuestgiverQuestList(network::Packet& packet) { currentGossip_ = std::move(data); gossipWindowOpen_ = true; if (owner_.addonEventCallback_) owner_.addonEventCallback_("GOSSIP_SHOW", {}); - owner_.vendorWindowOpen = false; + owner_.closeVendor(); bool hasAvailableQuest = false; bool hasRewardQuest = false;