EMS-Changelog

GRIP-EMS v2.1.1

Released May 15, 2026. 7 entries in the author's notes.

Every entry

The author's own words, complete. Long sections are sorted into areas by LazyGrip.

Fixed

7

Editor no longer fires ADDON_ACTION_BLOCKED when opened during combat. The OnShow hook tried to reset keyboard propagation via SetPropagateKeyboardInput, which is protected during combat lockdown. Guard now skips the call during combat; PLAYER_REGEN_ENABLED still handles the post-combat reset.

#

Sequences edited during combat no longer vanish on next login. The OOCQueue priority for DEACTIVATE was higher than ACTIVATE, so the sequence-rebuild dance ran ACTIVATE first and DEACTIVATE second on combat-end -- the trailing DEACTIVATE wiped both the new SecureActionButton and the SavedVariables entry that ACTIVATE just wrote. Priorities swapped so DEACTIVATE runs first; the rebuild now lands intact. Also fixes the related "I have to /reload to see my edits take effect" pattern when editing during combat.

#

Sequence selection no longer spams LUA_WARNING ("attempt to call a nil value") when a sequence holds legacy table-shaped step data. The StepListView row initializer used the or "" fallback for data.text, which only catches nil; truthy non-strings (e.g. tables from pre-v2.0.3 SV corruption that escaped the original hotfix defenses) reached :gmatch and crashed per visible row. Initializer now applies the same type-check defensive pattern already used by the row's display-text and spell-validator branches.

#

Step row tooltips no longer crash on legacy table-shaped step data. The OnEnter tooltip handler had five more unguarded data.text consumers in the same family as the row initializer fix in d1610b2; the most dangerous one ran a string concatenation on data.text and would have thrown "attempt to concatenate a table value" on hover for the same sequences that triggered the LUA_WARNING burst. All consumers now route through one defensive stepText local at the top of OnEnter.

#

Tempo Advisor no longer throws "attempt to perform arithmetic on local 'haste' (a secret number value)" on WoW 12.0.5. The GetLiveGCD fallback path (which runs when the GCD spell-cooldown query returns duration 0, common during fast sequence spam) used arithmetic on the haste value returned by GetHaste(). WoW 12.0+ tags player-stat values as secret, and arithmetic on a secret value from addon-tainted execution raises a Lua error. Arithmetic now runs inside a pcall; when the secret-tag blocks the math, GetLiveGCD falls back to the no-haste baseline (1500ms, floor-respecting).

#

Spell Queue Window Optimizer and the /gems msadvisor slash command no longer throw the same "secret number value" error as TempoAdvisor on WoW 12.0+. Both carried byte-identical haste-scaled GCD fallback formulas; the SQW site was reachable from a periodic ticker so users with SQW Optimizer enabled would have hit the error at sample-interval cadence even without user interaction. Both now pcall the arithmetic with the same 1500ms baseline fallback as the TempoAdvisor fix.

#

Sequences no longer randomly disappear after some instance transitions. The PLAYER_ENTERING_WORLD handler reran the full bootstrap (sequence restore, macro-stub scan, keybind load) on every fire of that event, including every instance entry. The rebuild dance had a race window where keybinds could end up unbound if the OOCQueue restricted-state flicker did not align with the LoadKeybinds OOC gate. Bootstrap now runs once per addon load (gated on the pre-existing _initialLoadComplete flag); per-instance work like context detection still runs on every fire. Disable+enable still forces a fresh bootstrap.

#

Grab it

Release notes written by Sataana and reproduced here with his permission.