LazyGrip logoLazyGrip.net
Sign inSign up

Building sequences

The best way to understand how to build a GRIP-EMS sequence is to read one that works and understand why it is built the way it is. This section dissects a real Guardian Druid Mythic+ sequence step by step, then covers the patterns and decisions that apply across every spec.

The sequence: Elune's Chosen M+ V7.1

AuthorSlowdogSpecGuardian DruidHero talentElune's ChosenContentMythic+Step functionSequentialResetOn combatSteps30Validated+13 Pit, +13 Darkflame Cleft, +13 Seat of the Triumvirate, +14 Ara-Kara, +14 Skyreach

Talent string

CgGA8cL7tpvige+kkmGM9zUPWDAAAAAAAAAAAgZmZmFzMjZWmZxMmZZZgZzMGNRmZWmZmZmlZmBAAAAAgZmNDYZbmBjZZAM1MLzyMzMAA2wMAWMGGYWssBYmZmNA

This sequence runs 30 steps in a Sequential loop with resetOnCombat enabled, meaning it fires the opener every pull and loops through the rotation continuously from there. At 150ms intervals on Razer hardware this produces Thrash at roughly 47% of total damage done, Ironfur uptime in the 91 to 97% range, and zero deaths across the validated keys.

Two modifiers run throughout the entire sequence. Shift fires Frenzied Regeneration on demand without breaking the loop. Ctrl fires Ironfur manually when you need it outside the automatic cycling. Every step except the two MOONSPAM steps and steps 15 and 30 carries both modifier lines so they are always available regardless of where you are in the rotation.

Step by step breakdown

The sequence has a clear internal structure once you see it: an opener block, then a repeating loop built around Thrash and Mangle with Ironfur cycling at fixed intervals, Lunar Beam weaved at positions 5, 12, 19, and 26, and MOONSPAM at positions 8 and 22 handling Moonfire delivery and Barkskin as a reset gate.

1

Opener: target acquisition, auto-attack, Bear Form

/targetenemy [noharm][dead] /startattack /cast [noform:1, nochanneling] Bear Form; [mod:shift] Frenzied Regeneration; [mod:ctrl] Ironfur

The opener does three things in one step. /targetenemy [noharm][dead] acquires a target if you do not have one or if your current target is dead, which is essential at the start of a pull when you are tabbing through packs. /startattack gets auto attacks rolling immediately. The Bear Form line shifts you in if you are not already in form, using [noform:1] as the guard so it does not waste a GCD when you are already a bear.

resetOnCombat means this step fires every time you enter a new pull. Steps 2 through 30 are the loop. Step 1 is only ever the opener and not part of the repeating rotation.

2

Thrash

/cast [noform:1, nochanneling] Bear Form; [mod:shift] Frenzied Regeneration; [mod:ctrl] Ironfur /cast [nomod:shift, nomod:ctrl, combat] Thrash

Thrash fires first because it is the highest priority ability for Guardian damage and healing. It needs to land as early as possible in the pull and needs to refresh frequently throughout the loop. The [combat] guard on every combat spell in the sequence prevents the sequence from attempting Thrash out of combat during a pre-pull buffer and wasting the step. The [nomod:shift, nomod:ctrl] pair on the combat spells is what makes the modifier system work. Without those guards, pressing Shift for Frenzied Regeneration would also attempt to fire Thrash on the same step.

3

Incarnation + Mangle

/cast [noform:1, nochanneling] Bear Form; [mod:shift] Frenzied Regeneration; [mod:ctrl] Ironfur /cast [combat] Incarnation: Guardian of Ursoc /cast [nomod:shift, nomod:ctrl, combat] Mangle

Step 3 is the cooldown step. Incarnation fires immediately on the third press of the key, early enough to catch the initial Thrash tick buff and late enough that Bear Form is guaranteed from step 1. Notice that Incarnation uses [combat] only and not [nomod:shift, nomod:ctrl, combat]. This is intentional. Incarnation fires regardless of what modifier you are holding because you never want to accidentally skip it by holding Shift for a Frenzied Regen at the wrong moment. Mangle follows as the filler if Incarnation is on cooldown or already active.

4

Thrash

/cast [noform:1, nochanneling] Bear Form; [mod:shift] Frenzied Regeneration; [mod:ctrl] Ironfur /cast [nomod:shift, nomod:ctrl, combat] Thrash

Thrash again. The pattern throughout this sequence is Thrash, Mangle, Thrash, Mangle with Ironfur and MOONSPAM interspersed at calculated intervals. Thrash appears 11 times across the 30-step loop, which is what produces the 47% damage done figure in logs.

5

Lunar Beam + Mangle

/cast [noform:1, nochanneling] Bear Form; [mod:shift] Frenzied Regeneration; [mod:ctrl] Ironfur /cast [known:Lunar Beam, combat] Lunar Beam /cast [nomod:shift, nomod:ctrl, combat] Mangle

The first Lunar Beam weave. [known:Lunar Beam] is the conditional that makes this build-agnostic. If the talent is not taken, the line silently skips and Mangle fires instead. Lunar Beam appears at steps 5, 12, 19, and 26, which spaces it at roughly every 7 steps through the loop to align with its cooldown.

7

Ironfur (in-sequence)

/cast [noform:1, nochanneling] Bear Form; [mod:shift] Frenzied Regeneration; [mod:ctrl] Ironfur /cast [nomod:shift, nomod:ctrl, combat] Ironfur

The first in-sequence Ironfur cast. Ironfur appears at steps 7, 14, 21, and 28, every 7 steps, intentionally aligned with its duration so the buff refreshes before it falls off. This is what produces the 91 to 97% uptime in logs. The math only works if the sequence actually reaches these steps at the right pace, which is why loop length and a steady click rate matter so much for tank rotations specifically.

8

MOONSPAM: Moonfire delivery and Barkskin

/castsequence [nomod, nochanneling] Moonfire, Barkskin /cast Ironfur

This is the most important step in the sequence and the one that confuses people most when they first read it. MOONSPAM is a named WoW macro referenced by GRIP-EMS as a macro step, not a regular action step. The /castsequence fires Moonfire on the first pass, then Barkskin the next time this step is reached at step 22, then resets to Moonfire again. Barkskin's roughly 60 second cooldown means it fires naturally at roughly the right frequency when paired this way without needing any cooldown tracking.

The reason this lives in a WoW macro rather than directly in a GRIP-EMS step is castsequence state. WoW's castsequence tracks its internal position, meaning which spell in the sequence comes next, inside the macro itself. That state persists correctly only when the castsequence lives in a named WoW macro. If you copy the /castsequence line directly into a GRIP-EMS action step, the state resets on every keypress and Moonfire fires every time instead of alternating with Barkskin. The WoW macro reference is what preserves the Moonfire, Barkskin alternation across the full 30-step loop.

The [nomod, nochanneling] conditionals on the castsequence line are both necessary. [nochanneling] prevents the step from interrupting an active channel. [nomod] prevents the castsequence from firing when you are holding Shift or Ctrl for Frenzied Regeneration or Ironfur, so modifier presses on this step do not accidentally advance the castsequence position. The bare /cast Ironfur on the second line fires unconditionally as an extra Ironfur attempt since Ironfur is off-GCD and costs nothing to attempt.

To use this sequence you need to create the MOONSPAM macro first in WoW's regular macro editor containing exactly these two lines:

/castsequence [nomod, nochanneling] Moonfire, Barkskin /cast Ironfur

Then in GRIP-EMS, click Add at the bottom of the steps list, select Macro from the dropdown, and pick MOONSPAM from the dialog that appears. It will show as [M] MOONSPAM in your sequence list. The name must match exactly, including capitalisation.

Steps 9 through 30: the loop continues

Steps 9 through 30 repeat the same pattern established in steps 2 through 8: Thrash and Mangle alternating, Ironfur at steps 14, 21, and 28, Lunar Beam weaved at steps 12, 19, and 26, MOONSPAM at step 22, and a bare Ironfur at steps 15 and 30 without the nomod guards so it fires regardless of modifier state. Step 30 ends the loop and resets to step 2 on the next press.

The KeyPress field and what it is for

GRIP-EMS has a KeyPress field that fires on every single keypress regardless of where the sequence is in its step list. It is not a step in the rotation. It is a persistent header that runs before every step fires.

Modifier handling belongs here and only here. If you put [mod:shift] lines inside individual steps instead of in KeyPress, every step has to carry that conditional which eats into the 255-character step limit and reduces CPM across all abilities. Putting modifiers in KeyPress means a single line handles the modifier for every press and your steps stay clean.

There is a meaningful secondary benefit. When modifiers live in KeyPress, the Rotation Preview panel in the GRIP-EMS editor can display your actual spell names instead of showing only the raw conditional text. If your sequence preview shows /cast [mod:shift] instead of the spell name, the modifier is in the steps rather than in KeyPress.

Do not put combat spells in KeyPress. Anything in KeyPress fires on every single keypress including before combat, during movement, and any other context where you press the key. Modifiers and channel-stop lines belong there. Rotation spells belong in steps.

The reset=target castsequence pattern

Some abilities should fire once on each new target rather than on a timer or as a rotation step. Hunter's Mark is the canonical example. You want it to apply when you engage a target, reapply when you switch targets, and not spam continuously on every keypress.

The correct pattern for this in GRIP-EMS is a castsequence with a target reset, placed in a step near the top of the loop:

/castsequence [nochanneling,exists] reset=target Hunter's Mark, null

This fires Hunter's Mark on the first press after you acquire a target, then advances the castsequence to null, which is a no-op. The sequence stays on null for every subsequent press against that target, so Hunter's Mark does not repeat. When you switch targets the castsequence resets to Hunter's Mark and fires again on the first press.

The [exists] conditional prevents the line from attempting to fire when you have no target. The [nochanneling] prevents it from interrupting a channel. Both guards are necessary for the pattern to work cleanly in M+ where target switching is frequent.

The same pattern works for any ability you want to fire once per target: Faerie Fire, Misdirection to a specific target, any debuff that should land on engage and reapply on target change. Swap Hunter's Mark for the ability name and the behavior is identical.

Do not put Hunter's Mark in KeyPress. KeyPress fires on every keypress, so Hunter's Mark would attempt to cast continuously. The reset=target castsequence is the correct approach.

Hierarchical actions: when to use the node editor instead

Everything in this guide so far writes conditional logic directly into macro text, using bracket conditionals like [mod:shift] and [nomod:shift, nomod:ctrl, combat] right inside each step. That is a deliberate choice. It keeps you in full control of exactly what compiles and exactly how many of your 255 characters it costs, and it is the pattern the Elune's Chosen example above uses throughout. But it is not the only way GRIP-EMS lets you build conditional logic, and for some patterns it is not the right tool.

Beyond the flat step list, GRIP-EMS has a hierarchical action tree with a visual node editor. Five node types are available: Action, which is a single macro step and the leaf of the tree; Loop, which repeats its children a set number of times or indefinitely; Repeat, which runs its children N times and then moves on; Conditional, which evaluates a Lua condition before running its children; and If, ElseIf, and Else, which give you proper branching with multiple condition paths instead of chaining bracket conditionals by hand.

An If node compiles a True branch and a False branch into a single chunk of macro conditional text, the same kind of output you have been reading throughout this page, except the editor builds it for you from whatever you put in each branch. If your True branch is empty, the compiler does not emit a clumsy empty-clause-with-semicolon-fallthrough. It automatically applies De Morgan negation and emits the shorter negated form instead, the same way [noindoors] reads cleaner than an empty bracket followed by a semicolon. A path indicator badge next to the Cond box tells you which compile path the node took, Single line, Two-line split, Per-step, or Optimised fall-through, and the Compiled Output preview pane shows you the literal macrotext the engine will actually run. That preview is the real value here: it lets you verify exactly what is going to fire before you save, which is easy to get wrong reading raw bracket syntax by eye once a branch has more than one action in it.

That last point is the actual reason to reach for the node editor instead of hand-written brackets. A single toggle, like the Shift modifier pattern used throughout the Guardian Druid sequence above, is faster to write and easier to scan as a flat inline conditional, which is why this guide teaches it that way. But once a branch needs more than one action, an opener that casts two or three different spells depending on whether you are indoors, mounted, or in a specific stance, hand-chaining semicolons gets error-prone fast and a single mistake silently breaks the branch. The visual tree keeps each branch's actions grouped and editable on their own, and the Compiled Output preview catches mistakes before they reach your action bar instead of after.

If you are building something more involved than a single modifier toggle, multiple actions per branch, nested conditions, or logic you keep getting wrong reading it back as bracket text, switch to the node editor for that part of the sequence rather than fighting it in raw macro syntax. The two approaches compile to the same kind of macro conditional output underneath, so you are not choosing a worse system, just a different editing surface for more complex logic.

Charged and empower spells: why they break automated sequencing

Charged spells and empower spells, Evoker's Fire Breath and Upheaval being the clearest examples, behave differently from a normal cast and that difference is what causes automated sequences to hitch, freeze, or feel wrong even when every step looks correct on paper.

A normal spell either casts or it does not. A charged or empower spell has stages: holding the button charges it up, and releasing early locks in whatever charge level you have reached so far. Mechanically each charge level is treated as a different spell, and moving between them stops the previous cast rather than smoothly continuing it. When that stop happens automatically instead of on your own release, it costs a hitch, roughly a full GCD of dead time, before anything can be cast again. This is not a bug in GRIP-EMS. It is the same behavior press and hold casting has always had with charged spells, and automating the press does not remove it.

If you let press and hold run its full charge without ever cutting it off early, there is no hitch. The problem only shows up when a sequence cancels the charge partway through, which is exactly what happens if you try to time charge level via pause steps or spam intervals instead of holding to completion.

Two approaches have actually worked for players sequencing these spells, and one approach that sounds reasonable does not.

Works: a dedicated first-priority guard step

Add a step near the top of the loop, before your main rotation logic, that only fires while the spell is actively channeling:

/cast [channeling:Upheaval] Upheaval /cast [channeling:Fire Breath] Fire Breath

This keeps re-issuing the cast on every keypress for as long as the spell is already channeling, which is what lets it run to completion instead of getting cut off by whatever the next step in the loop would otherwise fire. It is not a perfect fix. Whether WoW correctly recognises the empower as channeling versus treating it as its own separate cast state is inconsistent, so expect to still feel it as slightly wonky rather than seamless.

Works: fully separate sequences per charge spell, on separate keys

Rather than folding a charged spell into your main rotation sequence, give it its own standalone sequence bound to its own key, for example Upheaval on Alt+0, Fire Breath on Shift+0, with your main rotation on 0. You manually decide when to reach for the charged spell and hold through its full charge, while the base rotation sequence keeps running independently on its own key. This is more deliberate play than a single fire-and-forget button, but it is the only approach that avoids the automated-cancel hitch entirely, since nothing is ever cutting the charge off early.

Does not work well: timing partial charge levels via pause steps

It is possible to count how many presses at a given click rate correspond to a specific charge level and build pause steps to try to land there deliberately, so the sequence releases the spell at, say, charge 2 instead of running it to completion. In practice this needs an impractical number of precisely-timed presses, does not survive a mid-combat reset since the sequence has no way to know which pause block it left off on if a fight interrupts it, and the next attempt ends up re-entering the pause sequence at the wrong position, causing a delay before the tap actually registers followed by having to work back through the pause blocks again. Treat this as a known dead end rather than something to debug further.

None of this is Evoker specific in principle, it applies to any spell WoW treats as charged or empowered, but Evoker is currently the class where it comes up. If you are building a sequence around Aug Evoker's Ebon Might upkeep or a Devastation opener that leans on Fire Breath or Upheaval, plan for one of the two working approaches above rather than assuming a normal cast-step pattern will behave the same way it does for every other ability in your kit.

The decisions that matter

Why Sequential and not Priority

Priority would always try Thrash first on every keypress, which sounds efficient but produces a different problem. Mangle, Ironfur, and Lunar Beam would only fire when Thrash is on cooldown, which means your Ironfur uptime becomes dependent on Thrash cooldown math rather than the structured cycling the sequence enforces. Sequential gives you predictable step positions and predictable uptime.

Why [combat] on every spell

Without [combat] guards, spam-pressing the key before a pull would advance the sequence through multiple steps before combat starts, meaning you would enter the fight at step 4 or 5 instead of step 1. The opener only fires correctly if the sequence is at step 1 when the first combat spell lands.

Why Thrash at 11 of 30 steps

Thrash is both the primary damage source and the primary self-healing source for Guardian Druid running Soul of the Forest. More Thrash means more healing. The sequence is built around maximizing Thrash frequency while still fitting Ironfur cycling and the mandatory cooldowns. 11 steps out of 30 is the result of that tradeoff after log validation.

Why Ironfur every 7 steps

Ironfur's base duration is 7 seconds and the sequence runs at roughly one step per GCD at 150ms. Placing Ironfur at every 7th step means a new Ironfur cast lands approximately when the previous one expires. This is the mechanism behind the 91 to 97% uptime. If you remove Ironfur steps or change their spacing, uptime drops and it shows immediately in logs.