fix(quest): Phase 1 compat — guard quest-log-aware frame unload

Prevent premature frame unloading for completed-but-logged quests:
- AvailableQuests: UnloadUndoable() guard on currentQuestlog
- DailyQuests: HandleDailyQuests() guard on currentQuestlog
- QuestieQuest: IsSafeToUnloadQuestFrames() helper + HideQuest() guard
- TooltipHandler: IsQuestFlaggedCompleted gated by currentQuestlog
- TrackerUtils: fallback IsComplete gated by currentQuestlog

Revert: git revert HEAD --no-edit
This commit is contained in:
Xurkon
2026-05-24 00:43:41 -05:00
parent 7863985974
commit 7ea4061959
5 changed files with 26 additions and 7 deletions
+5 -2
View File
@@ -92,7 +92,10 @@ end
function AvailableQuests.UnloadUndoable() function AvailableQuests.UnloadUndoable()
local questId, _ = next(availableQuests) local questId, _ = next(availableQuests)
while questId do while questId do
if (not QuestieDB.IsDoable(questId)) then -- Only unload if the quest is no longer doable AND is not in the live quest log.
-- The currentQuestlog guard prevents removing frames for completed-but-logged quests
-- (e.g. Quest 8325) where IsDoable returns false but the quest is still accepted.
if (not QuestieDB.IsDoable(questId)) and not QuestiePlayer.currentQuestlog[questId] then
QuestieMap:UnloadQuestFrames(questId) QuestieMap:UnloadQuestFrames(questId)
end end
questId, _ = next(availableQuests, questId) questId, _ = next(availableQuests, questId)
@@ -438,7 +441,7 @@ local function StartPeriodicCleanup()
local questId, frameList = next(QuestieMap.questIdFrames) local questId, frameList = next(QuestieMap.questIdFrames)
while questId do while questId do
if completedQuests[questId] then if completedQuests[questId] and not QuestiePlayer.currentQuestlog[questId] then
-- This quest is complete but still has frames on the map -- This quest is complete but still has frames on the map
Questie:Debug(Questie.DEBUG_INFO, "[AvailableQuests] Cleanup: Removing lingering frames for completed quest:", questId) Questie:Debug(Questie.DEBUG_INFO, "[AvailableQuests] Cleanup: Removing lingering frames for completed quest:", questId)
QuestieMap:UnloadQuestFrames(questId) QuestieMap:UnloadQuestFrames(questId)
+2 -1
View File
@@ -110,7 +110,8 @@ function _DailyQuests:HandleDailyQuests(possibleQuestIds, currentQuestId, type)
Questie.db.char.hiddenDailies[type][questId] = nil; Questie.db.char.hiddenDailies[type][questId] = nil;
else else
-- If the quest is not in the questlog remove all frames -- If the quest is not in the questlog remove all frames
if (GetQuestLogIndexByID(questId) == 0) then -- Guard with currentQuestlog to prevent removing frames for completed-but-logged quests
if (GetQuestLogIndexByID(questId) == 0) and not QuestiePlayer.currentQuestlog[questId] then
_DailyQuests:HideDailyQuest(questId); _DailyQuests:HideDailyQuest(questId);
end end
Questie.db.char.hiddenDailies[type][questId] = true; Questie.db.char.hiddenDailies[type][questId] = true;
+15 -2
View File
@@ -453,8 +453,12 @@ end
function QuestieQuest:HideQuest(id) function QuestieQuest:HideQuest(id)
Questie.db.char.hidden[id] = true Questie.db.char.hidden[id] = true
QuestieMap:UnloadQuestFrames(id) -- Only unload frames/tooltips if the quest is NOT in the live quest log.
QuestieTooltips:RemoveQuest(id) -- A completed-but-logged quest (e.g. Quest 8325) must keep its pins even when hidden.
if not QuestiePlayer.currentQuestlog[id] then
QuestieMap:UnloadQuestFrames(id)
QuestieTooltips:RemoveQuest(id)
end
end end
function QuestieQuest:UnhideQuest(id) function QuestieQuest:UnhideQuest(id)
@@ -462,6 +466,15 @@ function QuestieQuest:UnhideQuest(id)
AvailableQuests.CalculateAndDrawAll() AvailableQuests.CalculateAndDrawAll()
end end
--- Returns true when a quest can be safely unloaded from the map/tooltip tracker.
--- Completion is in char.complete AND the quest is not in the live quest log.
--- Prevents Quest 8325 flicker: completed-but-logged quests must keep their pins.
---@param questId number
---@return boolean
function QuestieQuest:IsSafeToUnloadQuestFrames(questId)
return Questie.db.char.complete[questId] and not QuestiePlayer.currentQuestlog[questId]
end
local allianceTournamentMarkerQuests = { [13684] = true, [13685] = true, [13688] = true, [13689] = true, [13690] = true, local allianceTournamentMarkerQuests = { [13684] = true, [13685] = true, [13688] = true, [13689] = true, [13690] = true,
[13593] = true, [13703] = true, [13704] = true, [13705] = true, [13706] = true } [13593] = true, [13703] = true, [13704] = true, [13705] = true, [13706] = true }
local hordeTournamentMarkerQuests = { [13691] = true, [13693] = true, [13694] = true, [13695] = true, [13696] = true, local hordeTournamentMarkerQuests = { [13691] = true, [13693] = true, [13694] = true, [13695] = true, [13696] = true,
+3 -1
View File
@@ -7,6 +7,8 @@ local l10n = QuestieLoader:ImportModule("l10n")
---@type QuestieDB ---@type QuestieDB
local QuestieDB = QuestieLoader:ImportModule("QuestieDB") local QuestieDB = QuestieLoader:ImportModule("QuestieDB")
---@type QuestiePlayer
local QuestiePlayer = QuestieLoader:ImportModule("QuestiePlayer")
--- COMPATIBILITY --- --- COMPATIBILITY ---
local UnitGUID = QuestieCompat.UnitGUID local UnitGUID = QuestieCompat.UnitGUID
@@ -112,7 +114,7 @@ local function _PlayerHasQuest(questId)
end end
-- 2) Turned in / completed -- 2) Turned in / completed
if IsQuestFlaggedCompleted and IsQuestFlaggedCompleted(questId) then if IsQuestFlaggedCompleted and IsQuestFlaggedCompleted(questId) and not QuestiePlayer.currentQuestlog[questId] then
return true return true
end end
+1 -1
View File
@@ -788,7 +788,7 @@ function TrackerUtils:BuildFallbackQuest(questId)
} }
-- IsComplete must be a method (called as quest:IsComplete()) -- IsComplete must be a method (called as quest:IsComplete())
quest.IsComplete = function(self) quest.IsComplete = function(self)
return (isComplete == 1 or (IsQuestFlaggedCompleted and IsQuestFlaggedCompleted(questId))) and 1 or 0 return (isComplete == 1 or (QuestiePlayer.currentQuestlog[questId] and IsQuestFlaggedCompleted and IsQuestFlaggedCompleted(questId))) and 1 or 0
end end
return quest return quest