Skip to content

Releases

EMS 2.4.22 (2026-11-01)

Choose a tag to compare

@github-actions github-actions released this 01 Nov 14:34
772388c

Added

  • API:GetSequenceInfo(name) returns keybinds, a fresh array of every key bound to the sequence, as a sequence can now hold more than one. The active loadout's keys come first, then the spec's, each group sorted. The array is empty when no key is bound. keybind stays, and is its first entry.

Changed

  • API_VERSION is now 5. RequireVersion(5) is the gate for keybinds. No existing call changed.

EMS 2.4.21 (2026-10-17)

Choose a tag to compare

@github-actions github-actions released this 17 Oct 22:38
d9f7147

Changed

  • handle:CreateSequence(name, data) refuses a name whose action buttons would overlap another sequence's, and a name EMS keeps for its own frames. A modifier variant's button adds _v and a number, so Acme Burst v2 is refused while Acme Burst exists, and Acme Burst! clashes with Acme Burst. A name you already own isn't checked again.
  • handle:EnsureSequenceMacro(name) answers false and a reason for a sequence with no button because another sequence or frame uses its button name.
  • SEQUENCE_UPDATED also fires when a variable rename rewrites a sequence, and when Auto-refresh macro-reference steps updates a step.
  • API:GetSequenceInfo(name) hands back the sequence's own fields in the types the data reference lists, because EMS now checks them when a sequence is imported, registered, edited or loaded. version is a string, a number or nil, normally the string "1".
  • The event catalog now says when each sequence event fires. A rebuild fires SEQUENCE_DELETED, then SEQUENCE_CREATED, for a sequence that still exists.

Fixed

  • handle:CreateSequence refuses a name whose saved sequence isn't yours before EMS restores the saved sequences at the first PLAYER_ENTERING_WORLD. Called from PLAYER_LOGIN, it used to replace the player's saved sequence with yours.
  • handle:EnsureSequenceMacro(name) remakes the macro the player deleted by hand, where it used to answer false with macro creation failed.
  • API:GetSequenceMacroIndex(name) and EnsureSequenceMacro find the macro by its body, so deleting another macro can't leave them on the wrong slot.
  • API:GetSequenceInfo(name) lists a variable used only in a modifier variant, Key Press or Key Release in variableDeps. Its createdAt is a number for a sequence your plugin made, stamped when you send none.

EMS 2.4.12 (2026-09-03)

Choose a tag to compare

@github-actions github-actions released this 05 Sep 22:28
ebb67eb

Fixed

  • API:GetSequenceInfo(name) reports activeVersionIndex again for a sequence that has a live version. 2.4.11 moved the type screen for the active version onto the engine's accessor, but this function kept hand-rolling its own position loop against the value it had screened locally. Once the two stopped agreeing, the field came back nil for exactly the sequence whose in-game badge was showing V2 live. The position now comes from the engine, which reads the unscreened element deliberately: an array position stays knowable even when the element at it is malformed. Nothing else in the returned table changed. A nil check you added around activeVersionIndex after 2.4.11 is still correct and still worth keeping — a version that genuinely does not resolve returns nil here, as it always has.

EMS 2.4.11 (2026-09-02)

Choose a tag to compare

@github-actions github-actions released this 02 Sep 23:00
d6431a4

Fixed

  • API:GetSequenceInfo(name) stopped raising on a sequence whose active version is not a table, and stopped reporting a step count for one whose steps field is not a table either. The old code read stepFunction off whatever the version resolved to, so a number or a boolean there threw inside your call. A string steps field failed more quietly: the length operator ran on the string, so a sequence holding "abcd" came back with an activeStepCount of 4. Both keys are screened now. activeVersion is nil unless the stored version really is a table, and activeStepCount is 0 unless steps really is one. A sequence with well formed data is unaffected, so this only ever changes a case that used to throw or hand back a count nothing authored.

EMS 2.4.0 (2026-08-14)

Choose a tag to compare

@github-actions github-actions released this 15 Aug 19:01
c779233

Added

  • API:GetActiveSequence() — the name of the sequence EMS most recently drove, or nil when none has been driven this session. A read-only string with no setter. It saves you mirroring SEQUENCE_STEP_ADVANCED into your own variable just to answer "which sequence?". Read the name literally: it is most recently driven, not currently running. The value is never cleared when a sequence stops, and hold-mode activation writes it just as a secure-button click does — so a non-nil result tells you what ran last, not that anything is running now. For live start/stop, stay on SEQUENCE_STEP_ADVANCED.
  • authoredsteps capability id — GetAuthoredSteps now has an id of its own. It previously sat under stepdata, which predates it and therefore couldn't detect it.

Changed

  • API_VERSION is now 4, and the bump rule changed. The contract used to say it bumped only on a breaking change; in practice v2 and v3 both bumped on purely additive growth, and 2.3.7's GetAuthoredSteps was the one addition that didn't. The rule now matches the practice: any addition to the surface bumps API_VERSION. Nothing about an existing call changed, so no plugin needs edits — this makes RequireVersion(4) a reliable gate for everything listed above, and leaves 2.3.7 as the single build where a presence check is still the only option.

EMS 2.3.15 (2026-07-29)

Choose a tag to compare

@github-actions github-actions released this 15 Aug 19:01
c779233

Fixed

  • API:GetSequenceInfo(name) stopped raising on a sequence whose stored versions field is not a table. The old code handed that value straight to ipairs, so the error surfaced inside your call instead of the function returning something you could check. A non-table now reads as an empty list: the call returns normally, with versionCount and contextVersionCount both 0 and activeVersionIndex left nil. A sequence with well formed data is unaffected, so this only ever changes a case that used to throw.