Skip to content

fix(movement alert): in-combat countdown, and the Skull Bash lockout when the window is secret - #1370

Closed
dfrisone wants to merge 3 commits into
EllesmereGaming:mainfrom
dfrisone:movement-alert-combat-timer
Closed

fix(movement alert): in-combat countdown, and the Skull Bash lockout when the window is secret#1370
dfrisone wants to merge 3 commits into
EllesmereGaming:mainfrom
dfrisone:movement-alert-combat-timer

Conversation

@dfrisone

Copy link
Copy Markdown
Contributor

Cause

Two failures, both from a value being unreadable in combat.

C_Spell.GetSpellCooldownDuration's second argument is ignoreGCD and it defaults to false, so while a global cooldown is running it describes the GCD rather than the spell's own cooldown. A GCD-length total is rejected downstream, leaving no duration object, and that object is the only thing that can draw a number the client keeps secret. Out of combat no GCD runs, which is why the timer appeared the moment the fight ended.

Separately, IsLockoutWindow classifies a cross-ability lockout by magnitude against the ability's own base cooldown, but it cannot run at all when the window is secret, so the ~2s Skull Bash lockout was alerted as a real Wild Charge cooldown.

Fix

Ask for the real cooldown, and fall back to the other duration API so a spell cached with the wrong charge flag still gets an object. For the secret case, evaluate a C_CurveUtil step curve against the total: 0 below the threshold, 1 above, compared in C and fed to SetAlpha, never read. Same technique the charge visibility path already uses. Base resolution is shared between both classifiers so they cannot disagree.

Test

Verified in game: Skull Bash as an opener and mid-dungeon no longer alerts, a real Wild Charge cooldown still shows, Death's Advance shows its in-combat countdown again, and decimals render with Show Decimal on.

…sh lockout guard

Two failures that both come down to a value being unreadable in combat.

The countdown: GetSpellCooldownDuration's second argument is ignoreGCD and it
defaults to false, so while a global cooldown is running it describes the GCD
rather than the spell's own cooldown. A GCD-length total is rejected downstream,
which leaves no duration object, and the object is the only thing that can draw
a number the client keeps secret. Out of combat no GCD runs, which is why the
timer appeared the moment the fight ended. Ask for the real cooldown, and fall
back to the other duration API so a spell cached with the wrong charge flag
still gets an object.

The lockout: IsLockoutWindow classifies by magnitude against the ability's own
base cooldown, but that base is learned from live cooldown reads, which are
secret in instanced content. An entry first cached there carries no base, so the
classifier could not run and a ~2s cross-ability lockout was alerted as a real
cooldown again. Fall back to static spell data, which stays readable.
The magnitude test only ever ran on readable values. When the window is secret
IsLockoutWindow refuses it and the duration-object branch has no classifier at
all, so the lockout reached the display anyway -- and now with a number on it,
since asking for the real cooldown produced the duration object that was missing
before. Evaluate a step curve against the total instead: 0 below the threshold,
1 above, compared in C and fed straight to SetAlpha, never read. Same technique
the charge visibility path already uses.

Base resolution is shared between the two classifiers so they cannot disagree,
and both stay gated on the ability's own cooldown being the longer of the two.
@EllesmereGaming

Copy link
Copy Markdown
Owner

manual fix

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