Shadowlands Macro API Bugs & Improvement Wishlist

Historical Issues

  • Fix the bug with /petdefensive not putting pets into defensive stance
  • Change [flyable] to check whether the character can fly in a given zone, not whether the given zone is flight-enabled

New Shadowlands Issues

Macro API/UI Improvements

  • Additional Character Specific Macro Slots - with all the additional spells in Shadowlands we’re going to need them.
  • Macro conditions for identifying…
    • when warmode is active
    • when pvp talents are active
    • if a given pvp talent is selected
  • Consolidation/Morphing of Cleansing spells so they don’t need to be coded separately
    • Druid: Remove Corruption and Nature’s Cure
    • Paladin: Cleanse Toxins and Cleanse
    • Priest: Purify Disease and Purify
    • Shaman: Cleanse Spirit and Purify Spirit
  • Morphable base spells for hunter pet family abilities so they don’t need to be explicitly coded for each pet family - similar to Command Demon
  • Reticle condition support ([@cursor] [@player]) for items and commands eg. /petmoveto
  • Make /castrandom and /userandom follow the same priority logic as /cast and /use.
    • Currently /cast prioritizes spells and /use prioritizes items while /userandom is simply an alias of /castrandom - Horn of Winter (Spell: 57330) and Horn of Winter (Item:140749) can be used to test
  • /castsequence, /castrandom etc. support for items/spells with commas in their names (eg Yu’lei, Daughter of Jade)

Proposed Aliases for Commonly Used Conditions

  • #showtooltip - #st
    • and/or have #showtooltip be implied for all macros unless explicitly disabled or modified by #show
  • talent - tal
  • @mouseover - @mo

Add a [petspec:x] for hunters so pet family-specific abilities can be macro’ed more easily without resorting to itemizing each and every pet that I could possibly use in that family.


I’d really love a new macro tab that’s class specific. (So, for example, when I’m on a any of my druids, I’d see a “Druid” tab that all my druids share.) For those of us with a habit of having multiples of the same class, this would make things so much cleaner. Right now, I have to sort through all my different classes macros in the shared macro tab, which is a pain. (Or copy the class specific macros over, which is a nightmare anytime I tweak a macro.)

I’d like some extra characters for macro names.

I’d like to see the macro panel updated to allow more room to see what is going on. Something that looked more like the Mount tab, where one side has the icons and the full macro name, and the other side would then allow more room for the panel for editing macros — maybe with a slightly larger font than the current panel. (I find the font size with the current editing panel hard to read, especially as macros tend not to have a lot of white space to keep the character count down.)


Posted this to the Beta forums since I’ve got access now.


9.0.2 (35854) has broken multi-key modifiers.

mod:shiftalt now functions like mod:shift
mod:altshift now functions like mod:alt
rather than requiring that both shift+alt are pressed before the condition returns true.

left vs right modifiers (mod:lalt vs mod:ralt) appear to still be functioning correctly at this time.

ok this is super messed up, ctrlalt and ctrlshift still work as intended but altctrl and shiftctrl are bugged like the above. ctrlshiftalt is treated as ctrlshift and ctrlaltshift is treated as ctrlalt

Setting Self Cast Key and Focus Cast Key to None has no effect on anything.

shiftalt returns TRUE on shift+alt :white_check_mark:
shiftalt returns TRUE on shift :x:
shiftalt returns FALSE on alt :white_check_mark:

altshift returns TRUE on alt+shift :white_check_mark:
altshift returns TRUE on alt :x:
altshift returns FALSE on shift :white_check_mark:

shiftctrl returns TRUE on shiftctrl :white_check_mark:
shiftctrl returns TRUE on shift :x:
shiftctrl returns FALSE on ctrl :white_check_mark:

ctrlshift returns TRUE on ctrlshift :white_check_mark:
ctrlshift returns FALSE on ctrl :white_check_mark:
ctrlshift returns FALSE on shift :white_check_mark:

altctrl returns TRUE on altctrl :white_check_mark:
altctrl returns TRUE on alt :x:
altctrl returns FALSE on ctrl :white_check_mark:

ctrlalt returns TRUE on ctrlalt :white_check_mark:
ctrlalt returns FALSE on ctrl :white_check_mark:
ctrlalt returns FALSE on alt :white_check_mark:



Having Tranq shot back is nice. I can scrap the macro I had for purging across 5 pet families.

1 Like

Updated the OP with the most recent version from the Beta forums so we have a record after those forums get deleted.

1 Like

Re-reading OP, you might want to modify this:

There are 2 active abilities for most pets - the Specialization Ability and the Family Ability. For BM Hunters, there are also Exotic Abilities. For select pets, there are also Bonus Abilities.

Hunters already have a spell, Command Pet, which uses the Specialization Ability.

Family and Exotic abilities should get their own base spells.

Bonus abilities are largely non-combat (e.g. Trick) or can be set to autocast (e.g. Prowl) and could be left as-is.

I’d change the verbiage to “Morphable base spells for Hunter pet family abilities…” for clarification.

1 Like

I agree with Elvenbane’s suggestions.

Conditionals that I think are needed

Conditionals that I think would be helpful
Minlvl:x - Character level is at least x
Maxlvl:x - Character level does not exceed x
Itemexists - Item exists in inventory on character.

Agreed with [bg]and [arena] (maybe just consolidated as [PvP], which is mentioned in OP), but what would the point of class and faction conditionals be? Casting based on the class/faction of your enemy target is crossing the line into decision-making IMO, and there is no reason to have it check your own class and faction, as you can use character specific slots.

For Race, same as class/faction above.

For min/max lvl, I could see it as a player-only conditional, but would use mathematical operators e.g. [lvl=60][lvl<10][lvl>=49] rather than separate conditionals.

Why do you need [itemexists], basic /use already checks that and skips the line if it returns false.

Class, race and faction conditionals are regarding the player’s class, race and faction to create macros that can be used by more than one toon. The class conditional is particularly needed for those of us with a bunch of toons who are running out of macro space. I have specific uses for each but if i could only choose one it would be class.

Conditionals specifically for battlegrounds and arenas would allow the selection of specific talents, gear and potions in those situations. This doesn’t negate the need for a generic pvp conditional.

An itemexists conditional could be used to check if you have a particular elixir or flask before queuing for a dungeon or bg for example. As i tried to delineate in my previous post its something that i’d find helpful versus something i consider a need.

I like your suggestion of mathematical operators as it would probably be shorter and more clear.

@Elvenbane [flyable] appears fixed in most areas of Shadowlands. Still returning true during the intro Maw scenario (where you can’t mount at all), but correctly returning false in Oribos and Bastion.

We need a macro conditional for being in places like the Maw where you are unable to mount, similar to [noflyable]. I have a nifty travel macro that combined mount, ghost wolf, and water walking into a single button, and it does not work in the Maw without a fix at the moment:

/cast [swimming] Water Walking;
/cast [indoors] Ghost Wolf;
/cast [flyable,nocombat] Snowy Gryphon;
/cast [combat,outdoors] Ghost Wolf;
/use [nocombat,outdoors,noswimming,noflyable] Pinto;
/dismount [mounted]

Since the Maw is outdoors this macro tries to mount me and I get the mount error. I think something like /cast [nomountable] Ghost Wolf; would fix the problem if only we had such a thing.

An easy fix for that (once you clean up everything else onto a single /cast line) is to just add another /cast [nocombat]Ghost Wolf to the end of the macro.

The first line will (correctly) fail since you can’t use a mount, but because mounts aren’t subject to the GCD, the second line will fire just fine.

Druids can do the same for Travel Form and Worgen for Running Wild.

This one works for me. Casts a random mount useable in whatever zone I’m in and Ghost Wolf if I can’t mount in the zone. It also drops you directly into Ghost Wolf from a mount.

/stopmacro [flying]
/run C_MountJournal.SummonByID(0)
/run UIErrorsFrame:Clear()
/cast Ghost Wolf

/sigh looks like they deleted the version from the beta forums.

I thought I had already posted this here, but there is an issue with the Sound_EnableSFX() CVar and UIErrorsFrame show/hide/clear scripts - neither work properly at present.

Kind of obscure, and it’s been an issue for a while, but there are a few scripts commonly called in macros that are no longer functioning as of mid BfA at least, possibly longer.

/run UIErrorsFrame:Hide()
/run UIErrorsFrame:Clear()
/run UIErrorsFrame:Show()
Commonly used to suppress red error text (e.g. “You are in the wrong zone” “Not ready yet” etc) when combining off-GCD abilities and trinkets with on-GCD (typically rotational) abilities.

/console Sound_EnableSFX 0
/console Sound_EnableSFX 1
Used to disable sound effects in situations similar to the above. This one works but very inconsistently. I wrote an add-on including this that enables and disables Hunter tracking when entering/leaving a rest area, and it will generally disable and enable sound immediately, before the tracking spells have fired, despite the enable command coming after the casts. I had it enabled while playing a Warrior, and it only disabled the sound, I had to manually re-enable it every time. I can’t get it to work in macros at all.

See also Sound_EnableErrorSpeech, exhibiting the same issue.

Isn’t that just a race condition issue? I’ve seen a number of macros with delays on the re-enabling side that makes these work.

I think so, but something changed with how it’s parsed.

I used to be able to do

#showtooltip Aimed Shot
/console Sound_EnableSFX 0
/run UIErrorsFrame:Hide()
/use 13
/use 14
/use Trueshot
/use [@focus,help,nodead][@pet,nodead]Misdirection
/run UIErrorsFrame:Clear()
/run UIErrorsFrame:Show()
/console Sound_EnableSFX 1
/use Aimed Shot

Doing that now I get all the error text, the “I can’t do that yet” voice lines, and the woosh sounds.

To be clear, what I’m after with these is to have full text and audio feedback if there is an issue casting Aimed Shot, and no feedback whatsoever if Aimed Shot fires and everything else is on cooldown. Delaying the re-enable until after Aimed Shot defeats the entire purpose, and I might as well just disable the Sound_EnableErrorSpeech() CVar, mute the “woosh” sound with an add-on, and permanently hide the UIErrorsFrame at that point.

I thought this was stickied?