SuperSwingTimer v0.2.8
What's new
v0.2.8 - 2026-10-27
Fixed
- Settings panel version label now follows the TOC. The standalone settings studio and the Blizzard Options canvas both hardcoded
v0.2.5, so the v0.2.7 release shipped showing the wrong version in-game. Both titles now readns.GetDisplayVersion(), which resolves the TOC## Versionmetadata with a static fallback. - Removed two unused clock locals left in
HandleSpellcastStop/HandleSpellcastChannelStopby the v0.2.7 cast-identity change. - Blizzard-settings "Minimal Mode" could never be turned on. The canvas checkbox stored the new value and then called
ns.ApplyMinimalMode()with no argument, which coercedniltofalseand wrote that straight back toSuperSwingTimerDB.minimalMode. The setter now passes the value, andApplyMinimalMode()treats a missing argument as "apply the stored setting" so the same mistake cannot invert the toggle again. - Reckoning stack count read the wrong aura fields.
GetReckoningStackCountcalled the rawUnitBuffglobal but destructured it with the addon's normalized 11-value contract, so the "count" receiveddispelNameand the "spellID" received thecanApplyAuraboolean. It now reads throughns.UnitBuff;GetShieldChargeCountwas normalized the same way so one contract is used everywhere. - A granted extra attack could freeze the swing bar for the rest of the fight.
SPELL_EXTRA_ATTACKScredits a suppression counter that is only consumed by the player's next swing event; when that extra swing never surfaced, every later real swing was discarded and the main-hand bar stopped restarting. Credits now expire after a short window and are cleared when the target dies. /sst resetdid not restore every setting. The hand-written reset covered about 69 of the 104DB_DEFAULTSkeys, leaving class-overlay toggles,barBorderSize,showGlowEffects,showPowerBar,showSwingFlashand others untouched. The reset is now derived fromDB_DEFAULTS(deep-copied) and pinsversiontoDB_CURRENT_VERSIONso it cannot rewind the migration ladder.- Entering combat rewrote the saved lock preference.
PLAYER_REGEN_DISABLEDwrotelockBars = trueinto SavedVariables, permanently destroying an unlocked preference chosen with/sst move. Combat now sets a runtime-only lock that releases when the fight ends. - Localized Steady Shot was never matched. Both red-zone paths compared against the literal
"Steady Shot"whilens.STEADY_SHOT_NAMEexisted unused, so a name-only payload on a non-enUS client did not register the shot. Matching now usesns.IsSteadyShotSpell(ID, numeric string, localized name) — additive only; no timing math changed. - Feign Death restarted the ranged cycle instead of cancelling it. Spell 5384 is registered in
RESET_SWING_SPELLS, which was checked before the dedicated Feign Death branch, making that branch unreachable. Feign Death is now checked first. - Non-Hunter classes started a phantom ranged timer after every successful spellcast and on
RESET_SWING_SPELLScasts, pinning the render loop for a bar the class never renders. Both sites now requireclassConfig.ranged. - A Hunter melee ability could restart the Auto Shot cycle. The phantom-ranged-timer fix widened the generic cast-success ranged reset to every class with a ranged slot, so for Hunters any ability that fell through the earlier spell branches — including Raptor Strike — started a fresh ranged timer whenever a cast-start had set
ns.casting. The generic branch now restarts the Hunter ranged cycle only for a recognised Auto Shot payload; the dedicated Auto Shot paths are unchanged, so meleeing cannot restart Auto Shot. Regression tests cover the Raptor Strike cast and both main-hand CLEU branches. - Two GCD durations.
ns.GetGcdDuration()returned a constant while the state machine stored the measured value; it now prefers the measured duration. - Class-setup failures were silent. Only the Shaman initializer failed open; the others discarded the
pcallresult, so a class whose setup threw rendered nothing with no/sst diagtrace. All six now run through one recorder that logs the failure. - Duplicated stop handlers merged.
HandleSpellcastStopandHandleSpellcastChannelStopwere byte-identical and are now one implementation.
Removed
- Duplicate doc blocks on
ns.StartSwing,ns.ApplyParryHasteandns.HandleCLEU; orphaned section banners and a duplicated header inSuperSwingTimer_UI.lua; threeif true thenwrappers in the spell tables; three no-op migration rungs (v21, v23, v24); and the dead ShamanOnUpdaterestore that its own comment described as a no-op.
Tests
- Headless suite expanded from 150 to 166 tests. Every fix above has a regression test that was verified to fail with the fix removed, including a source-level guard that
ClassModsnever calls a rawUnitBuff/UnitAuraagain and the Hunter Raptor Strike / main-hand CLEU ranged-reset guards.
Docs
- Version bumped to v0.2.8 in the TOC, README, MEMORY and the test-harness metadata stub; the TOC test now also asserts the panel version helper matches the TOC.
docs/QA.mdfile count corrected and a version-label check added.
Notes
- No DB schema migration.
DB_DEFAULTS.versionstays 56 andDB_CURRENT_VERSIONstays 66; existingSuperSwingTimerDBprofiles are unchanged. - Timing math unchanged. Auto Shot cycle math, red-zone bounds, Steady Shot grace and GCD math are untouched. The Feign Death, ranged-timer and Steady Shot changes are branch-ordering, spell-matching and restart-gating only; no duration or window calculation changed.
- Behaviour changes to verify in-game: bars now unlock automatically at the end of combat if you had unlocked them; Feign Death cancels the Auto Shot cycle; non-Hunter classes no longer run an invisible ranged timer; a Hunter melee or utility cast no longer starts the Auto Shot cycle.
- Carried from v0.2.7: fresh installs default to locked bars (
lockBars = true); existing profiles keep their stored value. - Pending in-game verification on
classic_era1.15.9 (normal, hardcore and SoD),classic_anniversary2.5.6 andclassic_titan3.80.2.
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include

