ShadowHelper1.0.5.zip
What's new
Core rotation & Next Cast logic
- Guitar Hero–style single highway bar: SWP, VT, Mind Blast, and SWD each ride their own thin sub-lane on one shared bar, positioned by real "need time" (accounts for cast time, not just raw remaining duration).
- "Next Cast" readout shows the single best action to press right now, including Inner Focus, Trinket/Destruction Potion during lust, Dark Rune/Mana Pot/Shadowfiend at configurable mana thresholds, and Fade at a configurable threat threshold.
- Look-ahead collision protection: before recommending anything, the engine checks whether casting it would occupy you long enough that SWP or VT would cross its own deadline in the meantime — if so, the dot force-preempts the original pick, even before it hit its own "green" window. (Example: Mind Blast comes off cooldown while VT has 2s left — VT now correctly jumps the queue instead of falling off mid-MB-cast.)
- VT always wins over SWP in a collision tie — VT's party-wide mana return is worth more than SWP's personal damage.
- Mind Flay clip-awareness: tracks the live channel and only recommends clipping it right after a tick lands (not mid-tick), unless a genuine SWP/VT emergency justifies interrupting immediately. Starting Mind Flay is itself subject to the same collision check as everything else.
- Fade / threat management: recommends Fade once your live threat (via the game's own threat API) crosses a configurable percentage, gated to group/raid only. Treated as a real emergency — can interrupt Mind Flay mid-tick.
- Bar-Queue Colors: the 4 highway lane bars are colored by their rank in the cast order (1st/2nd/3rd/4th up), not just their own individual readiness — fully player-customizable colors.
- Latency-aware timing: the "safe to recast" window for SWP/VT is read live from the game's own connection latency instead of a guessed fixed buffer, since Shadow Priest spells are confirmed hitscan (no travel time).
Rotation & Tracking configuration
- Rotation tab: fully independent, reorderable, toggleable priority list covering Fade, Trinket, Destruction Pot, Inner Focus, Dark Rune, Mana Pot, Shadowfiend, VT, SWP, Mind Blast, SWD, and Mind Flay.
- Trinket/Destruction Pot: independent "While Lusted" / "Recommend when Exhausted" checkboxes (the latter checks the actual post-lust Exhaustion/Sated debuff, not just "lust isn't up").
- Dark Rune, Mana Pot, Shadowfiend, and Fade each get an inline editable trigger threshold (mana % or threat %) directly on their row.
- Per-item enable/disable checkboxes throughout, so unused items (no trinket that raid, no Destro Pot on hand, etc.) can be hidden from both the cooldown row and the recommendation logic.
Buff Watch
- Tracks Shadow Protection, Fortitude, Inner Fire, and Divine Spirit — shown only when actually missing, works in any spec (not gated by Shadowform), toggleable per-buff.
- Lives on its own independent, draggable frame with short acronym labels and a single "Missing" indicator instead of repeating it per icon.
UI & customization
- Split into three independently movable/lockable frames: Next Cast, Cooldowns, and Buff Watch — one shared lock toggle, each remembers its own position.
- Options panel split into General / Tracking / Rotation tabs, centered content throughout.
- Scale, Icon Size, and Bar Width controls; customizable Ready/Soon/Not-yet colors and Bar Queue colors.
- Load In Combat Only (hides Next Cast/Cooldowns outside combat; Buff Watch stays available) and Show Test Frames (forces visibility for repositioning).
- Shadowform gate: the rotation-specific frames disable themselves outside Shadow spec, live-updating on respec.
Bug fixes (client-specific API issues)
- Fixed several silent failures caused by APIs that don't exist on this client (
GetItemInfoInstant,GetItemCooldown) — these were causing cooldown-row items to error out or, worse, silently report "always ready" regardless of actual cooldown state (the root cause behind potions/Dark Rune getting recommended while genuinely on cooldown). - Fixed the Shadowform spec-gate not actually gating anything for non-Shadow specs — root cause traced to a spellbook-scanning check with a fail-open safety net masking the real failure.
- Fixed Mind Blast/SWD flickering unavailable during the GCD sweep.
- Every cooldown/tracking check now runs in its own isolated error boundary, so one broken lookup can't silently blank out unrelated parts of the UI.
Research-based corrections (mechanics verified, not assumed)
- Confirmed items (trinkets, potions, Dark Rune) don't trigger the shared GCD in this era of WoW, unlike spell casts — fixed the collision math that had been overstating how long using one would "block" other casts.
- Confirmed Mind Flay's tick count is haste-independent in TBC (haste only shortens the channel) — corrected an earlier assumption based on a source describing a much later expansion's mechanics.
- Confirmed Destruction Potion and Mana Potion share a cooldown category, while Dark Rune does not.
- Confirmed Fade's real numbers (330 mana, 10s duration, 30s cooldown at max rank) and its actual mechanic (temporary threat suppression, not permanent removal).
Since the last changelog (1.16.3 → 1.20.3)
New: Mind Flay's own highway lane
- A 5th lane, positioned between VT and MB. Unlike the other four, Mind Flay doesn't have a natural countdown - it's binary, so it behaves differently: idle in a customizable blue by default, switching to green the moment it's genuinely the resolved recommendation.
- A proportional fill bar (replacing an earlier discrete-tick-marks attempt that didn't read well in practice) shows how much of the 3-tick channel is actually worth taking before a clip is needed - 2/3 green means take 2 ticks then clip, full green means the whole channel is safe. Extended to compute even before the channel starts, so it's accurate the instant MF becomes the recommendation.
- Bold tick-boundary markers layered above the fill so they stay visible even when the bar is green, after an earlier attempt wasn't visible enough.
- Mind Flay's active/idle colors are fully independent from the general "Ready" note color - an earlier version reused that color directly, which meant a customized Ready color unexpectedly (and confusingly) applied to Mind Flay too.
New: Vampiric Embrace added to the rotation
- Previously only tracked as a standalone cooldown, never recommended. Confirmed via direct TBC spell data before implementing: 1 minute duration on a 10 second cooldown, 2% mana - that ratio makes "keep it up whenever possible" a reasonable default, unlike Trinket/Destro's burst-window timing.
- Gated to skull-marked targets only (reusing the same infrastructure built for Destruction Potion) - normal mobs and dungeon bosses die too fast for its healing-via-damage effect to be worth the GCD.
Next Cast icon overhaul
- Only shows cooldown-type items now (Fade, VE, Trinket, Destro, Dark Rune, Mana Pot, Shadowfiend, Inner Focus) - never a damage-rotation ability, since the highway bars already cover those. Shows blank when nothing but damage abilities are currently queued, instead of defaulting to one.
- Thicker border (4px vs the standard 2px) so it's easier to tell at a glance whether it's actually showing green through the flashing nag effect.
- Icon border color now matches its bar's Bar Queue Colors rank instead of showing its own separate readiness color - the two could previously disagree.
- "Green" is now strict everywhere: a highway bar only ever shows green if it's genuinely the overall top recommendation, never just "soonest among these 4 specifically." If the true top pick is a cooldown, no bar shows green - every rank shifts down a slot instead.
Critical bug fix: addon completely failing to load
- A tester's game showed
/shfalling through to WoW's built-in/shout- meaning the addon's slash commands never registered at all, and nothing in the UI ever appeared. - Root cause, confirmed via a live in-game BugSack error (not guessed): Lua 5.1's hard 60-upvalue-per-function limit. WoW's actual runtime enforces this; the Lua 5.4 compiler used for syntax-checking all session does not, which is why it passed every check right up until it was tested in-game.
UpdateQueue()had grown, across many features added over time, to reference more than 60 outer-scope variables - Lua 5.1 refuses to even compile a function past that point. - Fixed by extracting the two largest self-contained chunks of that function (Mind Flay lane logic, Bar Queue Colors ranking) into their own separate functions, each carrying its own variables independently.
- Verified directly against
luac5.1- installed specifically to test against the same compiler version WoW itself uses - rather than estimated. Bothluac5.4andluac5.1are now checked after every future edit.
This mod has no additional files

