# SuperCleveRoid Macros Enhanced macro addon for World of Warcraft 1.12.1 (Vanilla/Turtle WoW) with dynamic tooltips, conditional execution, and extended syntax. ## Requirements | Mod | Required | Purpose | |-----|:--------:|---------| | [SuperWoW](https://github.com/balakethelock/SuperWoW/releases) | ✅ | Extended API (addon won't load without it) | | [Nampower](https://gitea.com/avitasia/nampower/releases) (v2.24+) | ✅ | Spell queueing, DBC data, auto-attack events | | [UnitXP_SP3](https://codeberg.org/konaka/UnitXP_SP3/releases) | ✅ | Distance checks, `[multiscan]` enemy scanning | ## Installation 1. Download and extract to `Interface/AddOns/SuperCleveRoidMacros` 2. **Recommended pfUI:** Use [jrc13245/pfUI](https://github.com/jrc13245/pfUI) for full compatibility with macro spell scanning and action bar features --- ## Quick Start ### Basic Syntax ```lua #showtooltip /cast [mod:alt] Frostbolt; [mod:ctrl] Fire Blast; Blink ``` - **Conditionals** in `[]` brackets, space or comma separated - **Arguments** use colon: `[mod:alt]`, `[hp:>50]` - **Negation** with `no` prefix: `[nobuff]`, `[nomod:alt]` - **Target** with `@`: `[@mouseover,help]`, `[@party1,hp:<50]` - **Spell names** with spaces: `"Mark of the Wild"` or `Mark_of_the_Wild` ### Multi-Value Logic ```lua [buff:X/Y] -- X OR Y (has either) [buff:X&Y] -- X AND Y (has both) [nobuff:X/Y] -- NOT X AND NOT Y (missing both) - operators flip for negation ``` ### Comparisons ```lua [hp:>50] -- Health above 50% [buff:"Name"<5] -- Less than 5 seconds remaining [debuff:"Name">#3] -- 3+ stacks (use ># for stacks) ``` ### Special Prefixes | Prefix | Example | Description | |:------:|---------|-------------| | `!` | `!Attack` | Only use if not active | | `?` | `?[equipped:Swords] Ability` | Hide from tooltip | | `~` | `~Slow Fall` | Toggle buff on/off | --- ## Conditionals Reference All conditionals support negation with `no` prefix (e.g., `[nocombat]`, `[nobuff]`, `[nohelp]`). Some also have semantic opposites: `help`/`harm`, `isplayer`/`isnpc`, `alive`/`dead`, `inrange`/`outrange`. ### Modifiers & Player State | Conditional | Example | Description | |-------------|---------|-------------| | `mod` | `[mod:alt/ctrl/shift]` | Modifier key pressed | | `combat` | `[combat]` `[combat:target]` | In combat (player or unit) | | `form/stance` | `[form:1]` `[stance:2]` | Shapeshift/stance index | | `stealth` | `[stealth]` | In stealth (Rogue/Druid) | | `group` | `[group]` `[group:party/raid]` | Player in group type | | `resting` | `[resting]` | In rest area | | `swimming` | `[swimming]` | Can use aquatic form | | `moving` | `[moving]` `[moving:>100]` | Moving / speed % (MonkeySpeed) | | `zone` | `[zone:"Ironforge"]` | Current zone name | ### Resources | Conditional | Example | Description | |-------------|---------|-------------| | `myhp` | `[myhp:<30]` | Player HP % | | `myrawhp` | `[myrawhp:>1000]` | Player raw HP value | | `myhplost` | `[myhplost:>500]` | Player HP lost (max - current) | | `mypower` | `[mypower:>50]` | Player mana/rage/energy % | | `myrawpower` | `[myrawpower:>500]` | Player raw power value | | `mypowerlost` | `[mypowerlost:>200]` | Player power lost | | `druidmana` | `[druidmana:>=500]` | Druid mana while shapeshifted | | `combo` | `[combo:>=4]` | Combo points | | `stat` | `[stat:agi>100]` `[stat:ap>1000]` | Player stats (see below) | **Stat types:** `str`, `agi`, `stam`, `int`, `spi`, `ap`, `rap`, `healing`, `armor`, `defense`, `arcane_power`, `fire_power`, `frost_power`, `nature_power`, `shadow_power`, `arcane_res`, `fire_res`, `frost_res`, `nature_res`, `shadow_res` ### Buffs & Debuffs | Conditional | Example | Description | |-------------|---------|-------------| | `mybuff` | `[mybuff:"Name"<5]` | Player has buff (with time check) | | `mydebuff` | `[mydebuff:"Name"]` | Player has debuff | | `mybuffcount` | `[mybuffcount:>15]` `[nomybuffcount:>28]` | Player buff slot count (32 max) | | `buff` | `[buff:"Name">#3]` | Target has buff (with stacks) | | `debuff` | `[debuff:"Sunder">20]` | Target has debuff (with time) | | `cursive` | `[cursive:Rake<3]` | Cursive addon tracking (GUID-based) | ### Cooldowns & Casting | Conditional | Example | Description | |-------------|---------|-------------| | `cooldown` | `[cooldown:"Spell"<5]` | CD remaining (ignores GCD) | | `cdgcd` | `[cdgcd:"Spell">0]` | CD remaining (includes GCD) | | `gcd` | `[gcd]` `[gcd:<1]` | GCD is active / remaining time | | `usable` | `[usable:"Spell"]` | Spell/item is usable | | `reactive` | `[reactive:Overpower]` | Reactive ability available | | `known` | `[known:"Spell">#2]` | Spell/talent known (with rank) | | `channeled` | `[channeled]` | Currently channeling | | `channeltime` | `[channeltime:<0.5]` | Channel time remaining (seconds) | | `selfcasting` | `[selfcasting]` | Player is casting/channeling | | `casttime` | `[casttime:<0.5]` | Player cast time remaining | | `checkcasting` | `[checkcasting]` `[checkcasting:Frostbolt]` | NOT casting (specific spell) | | `checkchanneled` | `[checkchanneled]` | NOT channeling (specific spell) | | `queuedspell` | `[queuedspell]` `[queuedspell:Fireball]` | Spell queued (Nampower) | | `onswingpending` | `[onswingpending]` | On-swing spell pending | ### Target Checks | Conditional | Example | Description | |-------------|---------|-------------| | `exists` | `[@mouseover,exists]` | Unit exists | | `alive/dead` | `[alive]` `[dead]` | Alive or dead | | `help/harm` | `[help]` `[harm]` | Friendly or hostile | | `hp` | `[hp:<20]` `[hp:>30&<70]` | Target HP % | | `rawhp` | `[rawhp:>5000]` | Target raw HP value | | `hplost` | `[hplost:>1000]` | Target HP lost | | `power` | `[power:<30]` | Target power % | | `rawpower` | `[rawpower:>500]` | Target raw power value | | `powerlost` | `[powerlost:>100]` | Target power lost | | `powertype` | `[powertype:mana/rage/energy]` | Target's power type | | `level` | `[level:>60]` `[mylevel:=60]` | Unit level (skull = 63) | | `class` | `[class:Warrior/Priest]` | Target class (players only) | | `type` | `[type:Undead/Beast]` | Creature type | | `isplayer` | `[isplayer]` | Target is a player | | `isnpc` | `[isnpc]` | Target is an NPC | | `targeting` | `[targeting:player]` `[targeting:tank]` | Unit targeting you / any tank | | `istank` | `[istank]` `[@focus,istank]` | Unit is marked as tank (pfUI) | | `casting` | `[casting:"Spell"]` | Unit casting spell | | `party` | `[party]` `[party:focus]` | Unit in your party | | `raid` | `[raid]` `[raid:mouseover]` | Unit in your raid | | `member` | `[member]` | Target in party OR raid | | `hastarget` | `[hastarget]` | Player has a target | | `notarget` | `[notarget]` | Player has no target | | `pet` | `[pet]` `[pet:Cat/Wolf]` | Has pet (with family) | | `name` | `[name:Onyxia]` | Exact name match (case-insensitive) | | `tag` | `[tag]` | Target is tapped (by anyone) | | `notag` | `[notag]` | Target is not tapped | | `mytag` | `[mytag]` | Target is tapped by you | | `nomytag` | `[nomytag]` | Target is not tapped by you | | `othertag` | `[othertag]` | Target is tapped by someone else | | `noothertag` | `[noothertag]` | Not tapped by others (yours or unclaimed) | ### Range & Position | Conditional | Example | Description | |-------------|---------|-------------| | `distance` | `[distance:<40]` | Distance in yards (UnitXP) | | `inrange` | `[inrange:"Spell"]` `[inrange:Spell>N]` | In spell range / count in range | | `outrange` | `[outrange:"Spell"]` `[outrange:Spell>N]` | Out of spell range / count out | | `meleerange` | `[meleerange]` `[meleerange:>N]` | In melee range / count in melee | | `behind` | `[behind]` `[behind:>N]` | Behind target / count behind | | `insight` | `[insight]` `[insight:>N]` | In line of sight / count in LoS | **Multi-Unit Count Mode:** Add operator + number to count enemies matching the condition (requires UnitXP). Operators: `>`, `<`, `>=`, `<=`, `=`, `~=` ```lua /cast [meleerange:>1] Whirlwind -- AoE if 2+ enemies in melee /cast [behind:>=2] Blade Flurry -- Cleave if behind 2+ enemies /cast [inrange:Multi-Shot>1] Multi-Shot -- AoE if 2+ in spell range /cast [insight:>0] Arcane Explosion -- AoE if any enemy in LoS ``` ### Equipment | Conditional | Example | Description | |-------------|---------|-------------| | `equipped` | `[equipped:Daggers]` | Item/type equipped | | `mhimbue` | `[mhimbue]` `[mhimbue:Instant_Poison]` | Main-hand has temporary imbue | | `ohimbue` | `[ohimbue]` `[ohimbue:Crippling_Poison]` | Off-hand has temporary imbue | **Imbue Conditionals (Poisons, Oils, Sharpening Stones):** ```lua [mhimbue] -- Has any temporary imbue [mhimbue:Instant_Poison] -- Has specific imbue (tooltip match) [mhimbue:<300] -- Imbue expires in < 300 seconds (5 min) [mhimbue:Instant_Poison<300] -- Specific imbue with time check [mhimbue:>#5] -- Has > 5 charges remaining [nomhimbue] -- No temporary imbue (apply needed) ``` **Note:** Temporary imbues are detected via tooltip time/charge markers, filtering out permanent enchants like Crusader. ### CC & Immunity | Conditional | Example | Description | |-------------|---------|-------------| | `cc` | `[cc]` `[cc:stun/fear]` | Target has CC effect | | `mycc` | `[mycc]` `[mycc:silence]` | Player has CC effect | | `immune` | `[immune:fire]` `[immune:stun]` | Target IS immune (skip cast) | | `noimmune` | `[noimmune]` `[noimmune:bleed]` | Target NOT immune (allow cast) | | `resisted` | `[resisted]` `[resisted:full/partial]` | Last spell was resisted | **CC Types:** stun, fear, root, snare/slow, sleep, charm, polymorph, banish, horror, disorient, silence, disarm, daze, freeze, shackle **Loss-of-control** (checked by bare `[cc]`): stun, fear, sleep, charm, polymorph, banish, horror, freeze, disorient, shackle **Damage Schools:** physical, fire, frost, nature, shadow, arcane, holy, bleed ### Addon Integrations | Conditional | Addon | Example | Description | |-------------|-------|---------|-------------| | `swingtimer` | SP_SwingTimer | `[swingtimer:<15]` | Swing % elapsed | | `stimer` | SP_SwingTimer | `[stimer:>80]` | Alias for swingtimer | | `threat` | TWThreat | `[threat:>80]` | Threat % (100=pull) | | `ttk` | TimeToKill | `[ttk:<10]` | Time to kill (seconds) | | `tte` | TimeToKill | `[tte:<5]` | Time to execute (20% HP) | | `cursive` | Cursive | `[cursive:Rake>3]` | GUID debuff tracking | | `moving` | MonkeySpeed | `[moving:>100]` | Speed % (100=normal run) | | `targeting:tank` | pfUI | `[targeting:tank]` | Target is attacking any tank | | `istank` | pfUI | `[istank]` | Target is marked as tank | ### pfUI Tank Integration Identify loose mobs in trash pulls by checking if enemies are targeting designated tanks. Works with pfUI's tank marking systems. **Tank Conditionals:** | Conditional | Description | |-------------|-------------| | `[targeting:tank]` | Target IS attacking any player marked as tank | | `[notargeting:tank]` | Target is NOT attacking any tank (loose mob!) | | `[istank]` | Target unit IS marked as tank | | `[noistank]` | Target unit is NOT marked as tank | **Setting Up Tanks in pfUI:** 1. **Nameplate Off-Tank Names** (recommended): `/pfui` → Nameplates → Off-Tank Names - Add tank names separated by `#`: `#TankName1#TankName2#TankName3` - These names will show different colored nameplates AND work with `[targeting:tank]` 2. **Raid Frame Toggle**: Right-click a player in raid frames → "Toggle as Tank" - Only works when raid frames are visible **Example Macros:** ```lua -- Pick up loose mobs (not targeting any tank) /cast [multiscan:nearest,notargeting:tank,harm] Taunt -- Only taunt if mob is targeting you (tank) /cast [targeting:player] Sunder Armor -- Assist tanks - attack what they're tanking /cast [multiscan:nearest,targeting:tank,harm] Sunder Armor -- Emergency taunt on loose mob hitting a healer /cast [notargeting:tank,notargeting:player] Taunt ``` **Debug Command:** ``` /cleveroid tankdebug ``` Shows all marked tanks, current target info, and conditional results. ### Warrior Slam Conditionals For optimizing Slam rotations without clipping auto-attacks: | Conditional | Description | |-------------|-------------| | `noslamclip` | True if Slam NOW won't clip auto-attack | | `slamclip` | True if Slam NOW WILL clip auto-attack | | `nonextslamclip` | True if instant NOW won't cause NEXT Slam to clip | | `nextslamclip` | True if instant NOW WILL cause NEXT Slam to clip | ```lua /cast [noslamclip] Slam /cast [slamclip] Heroic Strike -- Use HS when past slam window /cast [nonextslamclip] Bloodthirst ``` ### Auto-Attack Conditionals (Nampower v2.24+) Track player melee swings and incoming attacks. Requires `NP_EnableAutoAttackEvents=1` CVar. | Conditional | Example | Description | |-------------|---------|-------------| | `lastswing` | `[lastswing]` | Any melee swing in last 5 seconds | | `lastswing:type` | `[lastswing:crit]` | Last swing was specific type | | `lastswing:48] Shred /cast [myrawpower:>40] Claw -- WITH /firstaction: Only Shred casts if energy >= 48, Claw is skipped /firstaction /cast [myrawpower:>48] Shred /cast [myrawpower:>40] Claw -- Mixed mode: priority section + always-queue section /firstaction /cast [myrawpower:>48] Shred -- Priority: only one of these /cast [myrawpower:>40] Claw /nofirstaction /cast Tiger's Fury -- Always evaluates (can queue alongside) /startattack -- With conditionals /firstaction [group] -- Priority mode only in groups /cast [myrawpower:>48] Shred /cast [myrawpower:>40] Claw ``` **Child Macro Behavior:** `/firstaction` and `/nofirstaction` in child macros (called via `{MacroName}`) affect subsequent lines in the parent macro. Think of the child's lines as being "inlined" at the call site. **Comparison:** - `/stopmacro [cond]` - Stop if condition is true (regardless of cast success) - `/skipmacro [cond]` - Stop current submacro only - `/firstaction [cond]` - Stop on first **successful** cast/use (priority mode) - `/nofirstaction [cond]` - Re-enable multi-queue behavior after `/firstaction` ### Commands without Conditional Support | Command | Description | |---------|-------------| | `/retarget` | Clear invalid target, target nearest enemy | | `/runmacro Name` | Execute macro by name (use `{MacroName}` in `/cast` for conditionals) | | `/rl` | Reload UI | ### UnitXP 3D Enemy Scanning `/target` with any conditionals automatically uses UnitXP 3D scanning to find enemies in line of sight, even without nameplates visible. The only exception is `[help]` without `[harm]` (friendly-only targeting). ```lua /target [name:Onyxia] -- Scans for exact name match /target [nodead,harm] -- Scans for living enemies /target [hp:<30] -- Scans for low HP enemies /target [cc:stun] -- Scans for stunned enemies -- Kara 40 Mage Incantagos example -- /target [name:Red_Affinity] /cast [name:Red_Affinity] Fireball /target [name:Blue_Affinity] /cast [name:Blue_Affinity] Frostbolt /target [name:Mana_Affinity] /cast [name:Mana_Affinity] Arcane Missiles ``` If no matching target is found, your original target is preserved. --- ## Features ### Debuff Timer System Auto-learns debuff durations from your casts. 335+ spells pre-configured. ```lua /cast [nodebuff:Moonfire] Moonfire -- Apply if missing /cast [debuff:Moonfire<4] Moonfire -- Refresh if < 4 sec left /cast Wrath -- Filler ``` ### Combo Point Tracking Tracks finisher durations (Rip, Rupture, Kidney Shot) accounting for combo points spent. ### Talent & Equipment Modifiers Automatically adjusts tracked durations for talents (Imp. Gouge, Taste for Blood, etc.) and equipment (Idol of Savagery). ### Special Mechanics (TWoW) - **Carnage** (Druid): Detects Rip/Rake refresh from Ferocious Bite proc - **Molten Blast** (Shaman): Flame Shock refresh detection - **Conflagrate** (Warlock): Immolate reduction tracking - **Dark Harvest** (Warlock): DoT acceleration compensation --- ## Immunity Tracking Guide The addon auto-learns NPC immunities from combat. When a spell fails with "immune", the addon remembers it for that NPC. ### Using `[noimmune]` | Usage | What it checks | |-------|----------------| | `[noimmune]` | Auto-detects spell's school from action | | `[noimmune:fire]` | Fire immunity specifically | | `[noimmune:bleed]` | Bleed immunity specifically | | `[noimmune:stun]` | Stun CC immunity | ### Common Examples ```lua -- Fire Mage: Skip immune targets /cast [noimmune] Fireball -- Warlock: Check shadow immunity /cast [noimmune:shadow] Corruption -- Rogue: Skip stun-immune targets /cast [noimmune:stun] Cheap Shot /cast Sinister Strike -- Druid: Check fear immunity for Hibernate /cast [noimmune:sleep,type:Beast/Dragonkin] Hibernate ``` ### Split Damage Spells (Rake, Pounce, Garrote) These spells have an initial physical hit + a bleed DoT. The addon **automatically checks BOTH immunities**: ```lua -- Checks both physical AND bleed immunity /cast [noimmune] Rake -- With time check using Cursive /cast [noimmune, cursive:Rake<1.5] Rake -- Multi-DoT rotation /cast [noimmune, nocursive:Rake] Rake /cast [noimmune, nocursive:Rip, combo:>=4] Rip ``` `[noimmune]` for these spells returns false (skip cast) if target is immune to **either** component. You can also check specific schools: - `[noimmune:physical]` - only checks physical immunity - `[noimmune:bleed]` - only checks bleed immunity ### Pure Bleed Spells (Rip, Rupture, Rend) These are pure bleeds with no initial hit: ```lua -- Rip (pure bleed) /cast [noimmune, combo:>=4] Rip -- Rupture (pure bleed) /cast [noimmune, combo:>=4] Rupture ``` ### Manually Adding Immunities If you know an NPC is immune before fighting: ```lua /cleveroid addimmune "Boss Name" bleed -- Permanent bleed immunity /cleveroid addimmune "Boss Name" fire "Shield" -- Fire immune only when buffed /cleveroid addccimmune "Boss Name" stun -- Permanent stun immunity ``` ### Viewing Learned Immunities ```lua /cleveroid listimmune -- All school immunities /cleveroid listimmune bleed -- Only bleed immunities /cleveroid listccimmune -- All CC immunities /cleveroid listccimmune stun -- Only stun immunities ``` --- ## Debuff Tracking Guide ### Built-in Tracking (`[debuff]`) The addon checks debuffs on the target: ```lua -- Basic: Only cast if target doesn't have Moonfire /cast [nodebuff:Moonfire] Moonfire -- Time check: Refresh when < 4 seconds left /cast [debuff:Moonfire<4] Moonfire ``` **Notes:** - Existence checks (`[nodebuff]`, `[debuff]`) detect ANY debuff on target - Time-remaining checks (`[debuff:X<5]`) use internal tracking from your casts - Shared debuffs (Sunder, Faerie Fire) are detected from any source ### Cursive Integration (`[cursive]`) [Cursive](https://github.com/avitasia/Cursive) provides more accurate GUID-based tracking: ```lua -- Check if target has Rake (any time remaining) /cast [nocursive:Rake] Rake -- Refresh when < 3 seconds remaining /cast [cursive:Rake<3] Rake -- Complex: Only if missing OR about to expire /cast [nocursive:Rake>1.5] Rake ``` **Advantages of Cursive:** - GUID-based (survives target switching) - Tracks pending casts - Works at debuff cap - More accurate timing ### MonkeySpeed Integration (`[moving]`) [MonkeySpeed](https://github.com/jrc13245/MonkeySpeed) provides accurate movement speed detection via SuperWoW's `UnitPosition` API: ```lua -- Only cast if standing still /cast [nomoving] Aimed Shot -- Cast instant ability while moving /cast [moving] Arcane Shot -- Check speed percentage (100 = normal run speed) /cast [moving:>100] Sprint -- Already faster than normal /cast [moving:<50] Escape Artist -- Currently slowed -- Combined with other conditionals /cast [nomoving, harm] Aimed Shot /cast [moving, harm] Arcane Shot ``` **Speed Reference:** | Speed | Description | |-------|-------------| | `0` | Standing still | | `100` | Normal run speed | | `160` | Level 40 mount | | `200` | Epic mount | **Notes:** - Basic `[moving]`/`[nomoving]` works without MonkeySpeed (position fallback) - Speed comparisons (`[moving:>100]`) require MonkeySpeed addon - Speed values vary with buffs/debuffs affecting movement ### Recommended DoT Macro Patterns **Druid Feral (with Cursive):** ```lua #showtooltip /cast [noimmune, nocursive:Rake] Rake ``` **Druid Feral (without Cursive):** ```lua #showtooltip /cast [noimmune, nodebuff] Rake ``` **Warlock Multi-DoT:** ```lua #showtooltip /cast [noimmune:shadow, nodebuff] Corruption ``` **Rogue Rupture:** ```lua #showtooltip /cast [noimmune, nodebuff, combo:>=4] Rupture ``` --- ## Settings ```lua /cleveroid -- View settings /cleveroid realtime 0|1 -- Instant updates (more CPU) /cleveroid refresh 1-10 -- Update rate in Hz /cleveroid debug 0|1 -- Debug messages /cleveroid learn -- Manually set spell duration /cleveroid forget -- Forget duration(s) ``` ### Immunity Commands ```lua /cleveroid listimmune [school] /cleveroid addimmune "NPC" school [buff] /cleveroid listccimmune [type] /cleveroid addccimmune "NPC" type [buff] ``` ### Combo Tracking ```lua /combotrack show|clear|debug ``` --- ## Supported Addons **Unit Frames:** [pfUI](https://github.com/jrc13245/pfUI), LunaUnitFrames, XPerl, Grid, CT_UnitFrames, agUnitFrames, and more **Action Bars:** Blizzard, [pfUI](https://github.com/jrc13245/pfUI), Bongos, Discord Action Bars **Integrations:** SP_SwingTimer, TWThreat, TimeToKill, QuickHeal, Cursive (with mouseover support for DoT timer bars), ClassicFocus, SuperMacro, MonkeySpeed > **Note:** For pfUI users, the [jrc13245/pfUI fork](https://github.com/jrc13245/pfUI) includes native SuperCleveRoidMacros integration for proper cooldown, icon, and tooltip display on conditional macros. --- ## Known Issues - Unique macro names required (no blanks, duplicates, or spell names) - Reactive abilities must be on action bars for detection - HealComm requires MarcelineVQ's [LunaUnitFrames](https://github.com/MarcelineVQ/LunaUnitFrames) for SuperWoW compatibility --- ## Credits Based on [CleverMacro](https://github.com/DanielAdolfsson/CleverMacro) and [Roid-Macros](https://github.com/DennisWG/Roid-Macros). Cursive integration by Avitasia. MIT License