Skip to content

Fix: quest objectives stop updating until /reload - #1912

Merged
EllesmereGaming merged 2 commits into
EllesmereGaming:mainfrom
dfrisone:fix/qt-master-header-onshow-taint
Sep 2, 2026
Merged

Fix: quest objectives stop updating until /reload#1912
EllesmereGaming merged 2 commits into
EllesmereGaming:mainfrom
dfrisone:fix/qt-master-header-onshow-taint

Conversation

@dfrisone

@dfrisone dfrisone commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Bug: reported by @shinny on 9.0.7 - quest objective progress randomly stops updating and stays stuck until /reload (a fishing count frozen at 7/13, a summon bar frozen at 7%). The accompanying error is Blizzard_ScenarioObjectiveTracker.lua:187 in LayoutContents, reached from ObjectiveTrackerContainer:Update via DirtiableMixin.

Issue: the "All Objectives" master header is hidden by default, and it was held down by a HookScript("OnShow", ...) that re-hid it whenever Blizzard showed it. ObjectiveTrackerFrameMixin:Update calls self.Header:Show() immediately before it runs the container layout, and because our hook had just hidden the header that Show() fired OnShow on every single pass. Our script therefore executed inside Blizzard's update chain and tainted the rest of it.

Root cause: ScenarioObjectiveTracker is uiOrder 1, so its LayoutContents was the very next thing to run. Line 187 is ShouldShowMawBuffs(), which reads C_UnitAuras.GetAuraDataByIndex("player", 1, "MAW") - flagged RequiresUnitAuraAccess, so it hard-errors under taint. The freeze is permanent because DirtiableMixin's callback is method(self); self.dirty = nil: the throw skips the clear, self.dirty stays true, and MarkDirty only schedules a pass if not self.dirty. Nothing ever queues another one. Taint injected in the tail of a pass cannot do this, since every MarkDirty during a pass is swallowed by that same flag - only code running before the first module lays out matters, and this hook was the only such site.

Fix: suppress the header with alpha instead of fighting Show(), matching ApplyPOISuppression already in the file - SetAlpha(0) plus EnableMouse(false) on the MinimizeButton so an invisible collapse-all is not clickable. The header's shown state has no effect on layout (the container spaces the first module by topModulePadding alone and never reads the header's rect), so this is visually identical with no addon code left in Blizzard's update chain. EnsureAccentDivider now treats an alpha-0 header as not rendered, and _EQT_RefreshAll re-applies the suppression on a profile swap, which the old always-live hook had been covering for free. As a side effect this also removes a latent combat block: Hide() on the tracker's header routed through EditMode's protected path, while SetAlpha is the same combat-safe route HardHide already uses.

The "All Objectives" master header is hidden by default, and it was kept
hidden by an OnShow script that re-hid it every time Blizzard showed it.
ObjectiveTrackerFrameMixin:Update() calls Header:Show() immediately before
the container layout, so that script ran inside the update chain and
tainted the rest of the pass. ScenarioObjectiveTracker lays out first and
its LayoutContents reads player auras via ShouldShowMawBuffs, which hard
errors under taint; the pass unwound before DirtiableMixin cleared
self.dirty, so MarkDirty never scheduled another one and the tracker
stopped updating until /reload.

Suppress the header with alpha instead, the way POI buttons already are.
The header's shown state has no effect on layout, so this is visually
identical, and it puts no addon code in Blizzard's update chain.
The OnShow fight re-read the setting on every Blizzard Header:Show(), so it
self-healed across a profile switch. The alpha suppression is a one-shot, and
_EQT_RefreshAll never called it: switching to a profile that hides the header
left it drawn outside the background (ApplyBackground re-anchors the BG top to
the header's bottom edge), and switching the other way left the collapse-all
button mouse-disabled until /reload.
@EllesmereGaming
EllesmereGaming merged commit 29bdda6 into EllesmereGaming:main Sep 2, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants