Skip to content

API changelog

What changed in the public plugin API, per EMS release. This is not the EMS changelog — the addon ships plenty that never touches your plugin, and that noise is exactly what makes a full changelog useless for this. Everything below either adds something you can call, changes what an existing call returns, or fixes a case where a call misbehaved.

Newest first. A release that isn't listed didn't change the API surface.

One release API_VERSION won't tell you about

From EMS 2.4.0, API_VERSION bumps on any addition to the surface, so RequireVersion is a real gate again. One release predates that rule and is still in the wild: EMS 2.3.7 added GetAuthoredSteps while the contract stayed at 3, on the older "breaking changes only" policy. So RequireVersion(3) answers yes on 2.3.0 and on 2.3.9 alike, and the capability list can't separate them either — stepdata predates the method.

If you support 2.3.7, feature-detect the specific thing you need:

if API.GetAuthoredSteps then
    -- 2.3.7 or newer
end

Reading a key the API doesn't have returns nil rather than raising, so the check is safe on any build.

EMS 2.4.12 — 2026-09-03

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

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. The resolved version is screened now, and three keys move with it on a corrupt sequence: stepFunction and activeVersionIndex are nil, and activeStepCount is 0. activeVersionIndex is the one to look at if you were relying on it, because it used to name the corrupt version's position rather than raising. 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

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 idGetAuthoredSteps 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

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.

EMS 2.3.7 — 2026-07-11

Added

  • API:GetAuthoredSteps(name) — the active version's per-step spell data in authored base order, as { index, spellID, spellName, icon }. This is the order the user wrote, before the step function expands it and before interleave copies land. Use it when you want per-spell frequency or the base order; keep using GetSequenceSteps for anything that has to line up with the live step.

Changed

  • SEQUENCE_STEP_ADVANCED now reports the expanded numSteps. It previously fired the authored count while the button cycled the expanded array, so a 4-step Priority sequence advanced through steps 1..10 while the event told you numSteps = 4. It now fires 10, and numSteps matches #GetSequenceSteps(name) for the same sequence.

    This one can break a working plugin

    If you drew a progress readout from this payload, it was wrong before and is right now — no change needed. But if you compensated for the old mismatch (recomputing the real count yourself, or scaling the step index against it), that workaround now double-counts. Drop the compensation. Sequential and Random sequences are unaffected: expanded and authored are the same array there, so those never disagreed.

  • GetSequenceList()[i].stepCount now sits in the execution domain for dormant sequences too. A registered-but-not-activated sequence reported the compiled count while #GetSequenceSteps(name) reported the expanded one — the same 4-vs-10 split, reachable through GetSequenceList because it iterates dormant entries. stepCount now always equals #GetSequenceSteps(name) and is a valid denominator for currentStep, which is what the data reference always claimed.

EMS 2.3.4 — 2026-07-03

Added

  • GetSequenceInfo gained five metadata fields: help, helplink, changelog, talentString, and url. All scalar copies, all nil when the author didn't set them. talentString carries a sequence's talent loadout string, which survives import, save, re-export, and duplication — so a plugin can offer "load this build" next to a rotation without asking the user to paste anything.

EMS 2.3.1 — 2026-06-30

Fixed

  • GetSequenceList() and SEQUENCE_STEP_ADVANCED no longer error on a version with no steps. Three accessors checked that the version table existed but not that its steps field did, so an empty version raised attempt to get length of a nil value on the length operator. They short-circuit to 0 now.

EMS 2.3.0 — 2026-06-30

Added

Getting notified

New entries here are posted to the plugin-dev channel on Discord when they ship, so you don't have to poll this page.

If you'd rather not sit in Discord, watch the docs repoWatch → Custom → Releases. Every API change here gets a matching release, and GitHub will mail you.

Something missing?

If a release changed behaviour your plugin depends on and it isn't written down here, that's a bug in this page — open an issue and it gets added.