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
Closed
fix(movement alert): in-combat countdown, and the Skull Bash lockout when the window is secret#1370dfrisone wants to merge 3 commits into
dfrisone wants to merge 3 commits into
Conversation
…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.
Owner
|
manual fix |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Cause
Two failures, both from a value being unreadable in combat.
C_Spell.GetSpellCooldownDuration's second argument isignoreGCDand 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,
IsLockoutWindowclassifies 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_CurveUtilstep curve against the total: 0 below the threshold, 1 above, compared in C and fed toSetAlpha, 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.