Tumblerr’jinWoW Companion
World of Warcraft Classic · 1.12

Macros

Browse what already exists, or build exactly what you need.

Vanilla power-user note: Some advanced 1.12 macros use SuperMacro for helper functions and longer scripts. Native macros are still kept native whenever practical.
Library

Macros

Druid · Feral · Combat

Startattack + Swipe

Makes the bear AoE key also ensure melee auto-attack is running.

/run for z=1,172 do if IsAttackAction(z)then if not IsCurrentAction(z)then UseAction(z);end;end;end;
/cast Swipe
Druid · Restoration · Healing

Mouseover Healing Touch (legacy)

True 1.12-style mouseover healing without permanently changing targets.

/run local c=CastSpellByName s="Healing Touch" if UnitExists("mouseover") and UnitReaction("mouseover","player")>4 then TargetUnit("mouseover") c(s) TargetLastTarget() else c(s) end
Druid · Restoration · Healing

Self Healing Touch

Casts Healing Touch on yourself through the legacy target cursor.

/cast Healing Touch
/script if SpellIsTargeting() then SpellTargetUnit("player") end
Hunter · All · Combat

Hunter's Mark + Pet

Marks your target and sends the pet. The useful pattern here is /script PetAttack(): you can pair that pet command with another opener instead of Hunter's Mark if you prefer.

/cast Hunter's Mark
/script PetAttack()
Hunter · All · Combat

Smart Auto Shot / Melee Start

One button starts melee when close or starts Auto Shot at range without toggling it off.

/script if GetUnitName("target")==nil then TargetNearestEnemy() end
/run if CheckInteractDistance("target",3) and (not PlayerFrame.inCombat) then AttackTarget() elseif not IsAutoRepeatAction(3) then CastSpellByName("Auto Shot") end
Hunter · All · Combat

Wing Clip / Concussive Shot by Range

Uses the appropriate slow based on melee versus ranged distance.

/run if CheckInteractDistance("target",3) then CastSpellByName("Wing Clip") else CastSpellByName("Concussive Shot") end
Hunter · All · Pet

Pet Attack

Sends your active pet at your current target.

/script PetAttack()
Hunter · All · Utility

Feign Death + Pet Follow

Pulls the pet back before Feign Death so the pet is less likely to keep the situation alive.

/script PetFollow()
/cast Feign Death
Hunter · Survival · Control

Scatter Shot + Pet Follow

Stops the pet from immediately breaking your Scatter Shot control.

/script PetFollow()
/cast Scatter Shot
Mage · All · Combat

Stopcast Counterspell

Classic-era emergency Counterspell.

/script SpellStopCasting()
/cast Counterspell
Mage · All · Combat

Wand Shoot - Do Not Toggle Off

Prevents repeated presses from accidentally turning Shoot off.

/run for i=1,120 do if IsAutoRepeatAction(i) then return end end CastSpellByName("Shoot")
Mage · All · Control

Mouseover Polymorph (legacy)

Crowd-controls a hovered unit without giving up the main target.

/run c=CastSpellByName s="Polymorph(Rank 4)" if UnitExists("mouseover") then TargetUnit("mouseover") c(s) TargetLastTarget() else c(s) end
Mage · All · Utility

Self Arcane Intellect

Casts Arcane Intellect and targets yourself if a target cursor appears.

/cast Arcane Intellect
/script if SpellIsTargeting() then SpellTargetUnit("player") end
Paladin · All · Defense

Self Lay on Hands

Fast emergency self-save without changing targets.

/cast Lay on Hands
/script if SpellIsTargeting() then SpellTargetUnit("player") end
Paladin · All · Utility

Bubble Hearth

Casts Divine Shield, then finds and uses your Hearthstone. Because Divine Shield triggers the global cooldown, press/spam the macro again to start the Hearthstone cast. A full 10-second Hearthstone requires the 12-second rank of Divine Shield.

/cast Divine Shield
/run for b=0,4 do for s=1,GetContainerNumSlots(b) do local l=GetContainerItemLink(b,s) if l and strfind(l,"Hearthstone") then UseContainerItem(b,s) end end end
Paladin · Holy · Healing

Mouseover Holy Light (legacy)

Heals the friendly unit under your mouse without permanently changing your target. If there is no valid friendly mouseover, it casts Holy Light normally.

/run local c=CastSpellByName s="Holy Light" if UnitExists("mouseover") and UnitReaction("mouseover","player")>4 then TargetUnit("mouseover") c(s) TargetLastTarget() else c(s) end
Paladin · Holy · Utility

Self Blessing of Protection

Casts Blessing of Protection on yourself through the 1.12 targeting API.

/cast Blessing of Protection
/script if SpellIsTargeting() then SpellTargetUnit("player") end
Priest · All · Healing

Self Power Word: Shield

Targets the player if Power Word: Shield opens a spell target cursor.

/cast Power Word: Shield
/script if SpellIsTargeting() then SpellTargetUnit("player") end
Priest · All · Utility

Mouseover Dispel Magic (legacy)

Lets a healer dispel a friendly mouseover while keeping the enemy/tank targeted.

/run local c=CastSpellByName s="Dispel Magic" if UnitExists("mouseover") and UnitReaction("mouseover","player")>4 then TargetUnit("mouseover") c(s) TargetLastTarget() else c(s) end
Priest · Holy · Healing

Mouseover Flash Heal (legacy)

Useful 1.12 healing behavior that the current library does not provide cleanly.

/run local c=CastSpellByName s="Flash Heal" if UnitExists("mouseover") and UnitReaction("mouseover","player")>4 then TargetUnit("mouseover") c(s) TargetLastTarget() else c(s) end
Priest · Shadow · Combat

Stopcast Silence

Stops your current cast before using Silence.

/script SpellStopCasting()
/cast Silence
Rogue · All · Combat

Stopcast Kick

Stops your current cast/channel and attempts Kick.

/script SpellStopCasting()
/cast Kick
Rogue · All · Defense

Vanish Emergency Fallback (advanced)

Uses Vanish when ready and an emergency potion when Vanish is unavailable.

/run local VANISH_ID=GetSpellId("Vanish") if GetSpellCooldown(VANISH_ID,BOOKTYPE_SPELL)==0 then CastSpellByName("Vanish") else UseItem("Limited Invulnerability Potion") end
Rogue · All · Utility

Coat Both Weapons with Poison

SuperMacro version under the normal 255-character limit. Replace Instant Poison VI with the poison you carry. First press coats main hand; second press coats off hand. Be idle and unmounted while applying poison. Requires SuperMacro for FindItem().

/run b,s=FindItem("Instant Poison VI")if s then UseContainerItem(b,s)PickupInventoryItem(tmpPoisonSide and 17 or 16)ReplaceEnchant()ClearCursor()tmpPoisonSide=not tmpPoisonSide end
Rogue · Combat · Combat

Startattack + Sinister Strike

Starts melee auto-attack and then uses Sinister Strike. That matters when you are energy-starved or the ability cannot fire yet: your white swings still begin instead of the key doing nothing.

/run for z=1,172 do if IsAttackAction(z)then if not IsCurrentAction(z)then UseAction(z);end;end;end;
/cast Sinister Strike
Shaman · All · Combat

Emergency Earth Shock

Stops a cast before Earth Shock, the old-school interrupt button.

/script SpellStopCasting()
/cast Earth Shock
Shaman · All · Combat

Rank 1 Earth Shock unless Clearcasting

Uses cheap Rank 1 for interrupt duty, but spends the clearcasting proc on max rank.

/run local i,x=1,0 while UnitBuff("player",i) do if UnitBuff("player",i)=="Interface\Icons\Spell_Shadow_ManaBurn" then x=1 end i=i+1 end if x==1 then CastSpellByName("Earth Shock")else CastSpellByName("Earth Shock(Rank 1)")end
Shaman · All · Utility

Three-Totem Cycle

Cycles common group totems through one button on successive presses.

/run s={"Windfury Totem","Strength of Earth Totem","Mana Spring Totem"} if q==nil then q=0 end q=q+1 if q>getn(s) then q=1 end CastSpellByName(s[q])
Shaman · Restoration · Healing

Nature's Swiftness + Mouseover Healing Wave

A real emergency-heal button rather than a single-spell placeholder.

/run local c=CastSpellByName s="Healing Wave" SpellStopCasting() c("Nature's Swiftness") if UnitExists("mouseover") and UnitReaction("mouseover","player")>4 then TargetUnit("mouseover") c(s) TargetLastTarget() else c(s) end
Shaman · Restoration · Healing

Self Healing Wave

Casts Healing Wave on yourself using the legacy targeting API.

/cast Healing Wave
/script if SpellIsTargeting() then SpellTargetUnit("player") end
Warlock · All · Pet

Demon Attack

Sends your demon at the current target.

/script PetAttack()
Warlock · All · Pet

Demon Follow

Pulls your demon back to you.

/script PetFollow()
Warlock · All · Pet

Pet Attack + Corruption

Sends your demon immediately, then casts Corruption. Corruption is just the example opener: replace it with the spell you normally use to start a pull.

/script PetAttack()
/cast Corruption
Warrior · All · Combat

Start Attack

Starts your melee auto attack without relying on modern /startattack.

/script if not PlayerFrame.inCombat then AttackTarget() end
Warrior · Arms · Combat

Startattack + Mortal Strike

Better replacement for a plain Mortal Strike macro.

/run for z=1,172 do if IsAttackAction(z)then if not IsCurrentAction(z)then UseAction(z);end;end;end;
/cast Mortal Strike
Warrior · Fury · Combat

Bloodthirst + Rage-aware Heroic Strike

Adds auto-attack and rage-aware HS queuing to a core Fury button.

/cast Bloodthirst
/run local autoattack_bar_id=36 if not IsCurrentAction(autoattack_bar_id) then UseAction(autoattack_bar_id) end
/run if UnitMana("player")>=47 then CastSpellByName("Heroic Strike") else CastSpellByName("Bloodthirst") end
Warrior · Protection · Combat

Startattack + Shield Slam

Better replacement for a plain Shield Slam macro.

/run for z=1,172 do if IsAttackAction(z)then if not IsCurrentAction(z)then UseAction(z);end;end;end;
/cast Shield Slam
General · All · Profession

Start Enchant by Name

Vanilla 1.12 uses the older Craft API for Enchanting. Replace FULL ENCHANT NAME with the exact enchant name; this starts the enchant and puts it on your cursor so you can click the destination item.

/run local e="FULL ENCHANT NAME" for i=1,GetNumCrafts() do if GetCraftInfo(i)==e then DoCraft(i) return end end
General · All · QoL

Camera Distance

Sets the camera distance factor. Client/server configuration can cap the result.

/console cameraDistanceMaxFactor 4
General · All · QoL

Reload UI

Reloads the user interface.

/script ReloadUI()
General · All · Cooldowns

Use Equipped Trinkets (Slots 13 + 14)

Any class can use this snippet. In Vanilla 1.12, slots 13 and 14 are your two equipped trinkets. Add these lines to a burst/cooldown macro to attempt both on-use trinkets without hard-coding item names.

/run UseInventoryItem(13)
/run UseInventoryItem(14)
No macros match those filters.
No macros match those filters.
Copied