CrazyJack11266@legacy41532347 (talk | contribs) m (moved, but needs cleaning) |
CrazyJack11266@legacy41532347 (talk | contribs) m (→What? (Definitions): are al these credits really relevant anymore? this is a wiki afterall.) |
||
Line 16: | Line 16: | ||
<div style="margin-left:3%;"> |
<div style="margin-left:3%;"> |
||
− | {{faqq}}No, really. What the heck are macros and scripts? {{faqcredit|Legorol |
+ | {{faqq}}No, really. What the heck are macros and scripts? {{faqcredit|Legorol}} |
Revision as of 08:12, 20 October 2006
UI FAQ » Macros and Scripts
Macros |
---|
General guides |
Macros Beginners Guide |
Useful macros by class |
The UI FAQ is posted here on WoWWiki as well as on Blizzard's UI & Macros Forum and at WoWInterface.com.
Some of the texts will direct you to "post followups" and the like; this is referring to those two forums.
What? (Definitions)
Macros
Macros are a list of commands designed to be executed in series.
A macro can consist of any number of /<command>s or pure text to up 255 characters. With some exceptions, these commands behave exactly as if you had typed them into the chat window. Users wishing to use more advanced commands are recommended to see the Interface Customization and World of Warcraft API sections at wowwiki.com.
Scripts
Usually, not just in WoW, the term Script refers to a short to medium length program, written in some kind of simple programming language (called a scripting language). The purpose of a script is usually to control another program.
World of Warcraft has a powerful programming language called Lua embedded inside it, which is used for scripting. What this means is that WoW is able to understand and execute little programs written in the Lua language. However, in WoW, a script is usually not something that you use by itself, i.e. you don't just type in a script and execute it (although this is also possible). Instead, there are several places in WoW where you have the option to enter scripts as part of something else.
The kind of places that you can use a script:
- /script [command]
- If you type the slash command "/script" in the chat box, you can follow it with one or more valid Lua language statements (i.e. a script).
- Macros
- you can enter scripts as part of macros, by putting one or more "/script" commands in your macro.
So what can a script do? There are many resources on Lua scripts (the main one being http://www.wowwiki.com); However, the most important point is that scripts are able to perform many more game actions than slash commands. This is done via a set of functions (called API or Application Programming Interface) that WoW makes available for use in scripts. There is a quite extensive list of all the API functions available for use in scripts at http://www.wowwiki.com
Where? (Where can I learn more about macros / scripting?)
The Blizzard UI & Macros Forum, for one. Another great source of info is this site.
Also:
- http://www.wowmacros.com for pre-made macros
- http://www.wowwiki.com/Most_used_macros for even more pre-made macros
- http://www.rpgexpert.com/4118.html for help with macro commands and scripting in general.
How? (How do I use?)
General
You can then use the "if ... then ... end" codeblock to complete your macro. it should look similar to this when you're done:
/script if UnitName("target") == "fred" then CastSpellByName("Healing Touch(Rank 1)") end
Note the use of "end" at the end. it's important to Lua.
Also, note that when using Lua code, you can't use /cast to cast a spell - you have to use the CastSpellByName() "function". Luckily, CastSpellByName accepts the exact spelling of the spellname given to you by the shift-click method I mentioned above (remember, you can cut and paste after using the shift-click trick). Additionally, there is another function called CastSpell(), but you must know the SPELL NUMBER to use it.
Also notice the part that says 'target'. this is a placeholder that WoW uses to represent whatever your target it. It's a kind of variable, but it isn't a Lua variable. Other placeholders are "player", meaning yourself (no matter what your name is), "party1" through "party4" meaning your groupmates, and "pet" which means your pet. MANY wow Lua functions accept these placeholders as arguments, but they are NOT Lua variables - they are more like literals to Lua. This means that while UnitName("player") is valid, UnitName(player) is not valid unless you created a Lua variable called player and did a statement like this player = 'player' to make it contain a valid placeholder value.
This is easier if you alias it to something like:
- cprint = DEFAULT_CHAT_FRAME:AddMessage
Then you can use cprint("foo",1,0,0) multiple times in the macro without it taking quite so many characters.
ADDENDUM: It is possible, if you have Cosmos installed, to do something like:
/in 5 /say Hello, /say Fred!
And in 5 seconds you will say "Hello,". But you will say "Fred!" right now. /in is not a macro pause command, it simply lets you queue up a single command to execute at a future time.
HOWEVER, you cannot use /in to cast a spell, use an ability, or run a macro, due to the hardware event restriction. So, its usefulness is very limited. You can use it to talk, or to use items, but that's about it. Which is one reason I didn't mention it in the first place. Because 99% of the time people want a pause, its so they can cast another spell in the same macro, or switch inventory items and then use an ability, neither of which is possible using /in.
For AddOns: Follow the advice given in the "For macros:" section above. Remember that both Lua *and* XML are case-sensitive! </OnLoad> is NOT the same as </onload>. If your AddOn is listed in the [AddOns] list at character select, but doesn't seem to be loading in-game, check your XML, you likely have an error there somewhere.
If you've tried the above and STILL can't get your script to work: Make a NEW post in this forum asking for help. Please DO NOT clutter up this thread asking for help with your broken macros!
In my UI AddOn, what do I need to do to create a new "/slashcommand" that the user can type into the chat box?
- Slash command information is stored in two places. The first is a global table named SlashCmdList. In order to add a new command, create a new function with one argument. That argument will contain whatever text the user typed after the name of your command.MyAddon = {};
function MyAddon.SlashCommand(Argument)
DoSomethingWith(Argument);
end
Then create a new entry in the table for your new slash command.
SlashCmdList["My_AddOn_Slash_Command"] = MyAddon.SlashCommand;
The second place slash command information is stored is in a haphazard series of global variables. These variables' names all start with "SLASH_", then the name of an entry in SlashCmdList, and end with a digit. The value of each variable is the text the user types to active the command. It's important to note that while the names of the variables are case-sensitive, the command the user types is case-insensitive (so "/MASC", "/Masc" and "/masc" all do the same thing.
SLASH_My_AddOn_Slash_Command1 = "/MASC";
SLASH_My_AddOn_Slash_Command2 = "/MASlashCommand";
SLASH_My_AddOn_Slash_Command3 = "/MyAddonSlashCommand";
Spells, Abilities and Buffs
Do a search on curse-gaming.com for the IsBuffActive AddOn; this will provide you with an extremely simple method of checking for buffs on yourself or others.
It is, however, possible to do multiple things that don't require waiting. You could, for example, cast a spell and turn on attack. Or use two items (as long as they had independent refresh timers).
You just can't do anything that would require waiting between action A and action B.
NOTE: It is possible, however, to install an AddOn which automatically changes an action button to cast different spells in a user-specified list. So the first time you press the action button, you would cast Corruption; press it again, and you’d cast Curse of Agony; a third time would cast Shadowbolt. Danboo’s CastAway AddOn is a good example of an AddOn designed to do this very thing.
NOTE: There are some AddOns that make self-rebuffing much easier to the point of being almost automated.
/cast Presence of Mind /script SpellStopCasting(); /cast Pyroblast(Rank 1)
See also the Addendum on chaining spells at the end of this FAQ.
Interacting with the World
ADDENDUM: Template:Faqcredit
I just figured this out. This macro will spin you 180 degrees but it requires some set up:
/script SetView(1); SetView(1); TurnOrActionStart(); CameraOrSelectOrMoveStart(); TurnOrActionStop(); CameraOrSelectOrMoveStop(); SetView(4); SetView(4);
First turn the camera 180 degrees with the mouse and type /script SaveView(1); into the chat window. Now this macro will spin you around.
If you find it disorienting to have the camera whip instantly to your new view delete the last SetView(4); Now you'll spin 180 degrees and the camera will spin a moment later to catch up with you.
You can get some more range information by using CheckInteractDistance(unit, distanceType)
Addendum on chaining spells
Template:Faqcredit
Despite the popular (and usually correct) notion that you can only cast a single spell or use a single item per button press, it is possible to do so. However, what spells you can chain together is extremely limited. If you read nothing else in this post, at least read the Limitations section before posting questions.
- Limitations
You can only cast spells during a button press. You cannot have the macro wait for any period of time and then cast the spell. The limiting factor is cooldowns. Casting a spell (usually when you start to cast) usually activates a global cooldown. You can only chain together spells that could otherwise be cast together near-instantly. This means that the first spell must be instant, and it must not activate a cooldown that prevents the second spell from being used immediately.
- What You Can't Do
All of you that are looking for a way to cast Frostbolt, followed by Arcane Missles, followed by Frost Nova, followed by Blink, can just give up now. The first spell must be instant, and the next spell must be able to cast immediately following the first. There's no waiting 1 second for the global cooldown to pass allowed.
- What You Can Do
There are a few spells, usually a couple per class, that fit the rules for chaining spells. They're usually spells that affect the next casted spell, or abilities that affect the next used ability. This means things like Nature's Swiftness, Presence of Mind, Heroic Strike, Raptor Strike, etc. They have no casting time (instant) and they do not activate the global cooldown.
- How Do You Do It
The script for doing it is relatively simple. Make a macro to cast the first spell that fits the above rules. After that, you need to call the script function SpellStopCasting(). This is the key. After that, you can cast whatever you want that isn't on cooldown. For example:
/cast Nature's Swiftness /script SpellStopCasting(); /cast Healing Wave
That gives you a single button press to cast an instant Healing Wave. Another example:
/cast Presence of Mind /script SpellStopCasting(); /cast Pyroblast
That gives you an instant Pyroblast. Here's a nice one for Rogues with First Aid:
/cast Gouge /script SpellStopCasting() /script UseContainerItem(0,1) --Bandage
There is an exception to this. Spell that are 'On next Attack', like Heroic Strike or Raptor Strike should not have the SpellStopCasting(), as it will cancel the spell from happening. Hunters should like this one:
/cast Raptor Strike /cast Wing Clip
That's will do a Wing Clip immediately, and a Raptor Strike on the next attack (which might be immediately following the Wing Clip, if the weapon speed timer is up). Warriors could do the same thing with Heroic Strike and Hamstring, though that's quite alot of rage to burn through in their case.
- Items Can Be Used As Well
Most items aren't hit by the global cooldown, which means that spells that activate the global cooldown, can still be chained with many items. Druids could make an emergency self heal that chained Rejuvenation with using a healing potion. I like to have my Lightning Shield up at all times, so I chain that before using my mount. Some trinkets can be used and immediately followed by casting spells (such as the fire trinket from the new lvl50 Mage quest).
- Tips for Effective Use
This functionality is best used to enhance your existing play style, not totally change it. For example, a warrior (especially one who has the talents to reduce their bloodrage damage) could chain bloodrage before some/all attacks (Bloodrage+Execute would be useful), to make sure they're using it whenever possible. You could add logic so that it only uses the bloodrage if you have more than half health or something. You could make sure you're making the most of your Elemental Mastery/Presence of Mind by attempting to cast it with every Chain Lightning/Pyroblast you cast. Explore the many possabilities!
Many of these macros are best used in emergency situations, especially the NS+Heal ones. If you were to already have a spell casting when you hit the emergency heal button, it would begin casting the heal without NS. To get around this, if you have the room in the macro (macros can only be 255 characters long, remember), add another '/script SpellStopCasting()' line at the top of your macro. That will make it abort whatever spell you might already have been casting, and do the NS+Heal. Note that this doesn't just apply to NS+Heal; I use it for my EM+ChainLightning.
Please note that the examples here are just examples of how to chain spells together. In order to be very useful, some of them (ie the healing ones) will require some other addon or script to handle their targeting, so that your heal targets yourself if you don't have another friendly unit targeted, or automatically targets a certain party member, or whatever target you want.
- Chaining More Than 2 Spells
Though even more rarely useful, it is possible to chain more than just 2 spells/items. For example, we could enhance that druid emergency heal even further:
/cast Nature's Swiftness /script SpellStopCasting() /cast Healing Touch /script SpellStopCasting() /script UseContainerItem(0,1) --Potion
- Exceptions
One thing to note about this is that if you chain Nature's Swiftness or Presence of Mind together with a spell with a cast time, it won't work while moving, whereas it would if you casted them seperately.
The reason for this is because the client doesn't know that Nature's Swiftness or PoM is up so therefore denies the spell from being cast. This is due to the time required to communicate with the server - even latency of 1ms would cause this issue. Your latency would have to be effectively 0 (in actuality somewhere in the nanosecond range, the exact latency would depend on how fast your computer would be able to process the macro) which is not possible. This is a limitation of current technology and I suspect that it will always be the case.
This functionality also doesn't work with form or stance switches, where the second spell is only available in the form or stance you are changing to. This is probably because the client has not been told by the server that the change really took place. For example, the following can be used to revert from any druid form, and start tracking herbs.
/script local j,_,a;for i=1,GetNumShapeshiftForms() do _,_,a=GetShapeshiftFormInfo(i);j=a and i or j;end j=j and CastShapeshiftForm(j); /run SpellStopCasting() /cast Find Herbs
I really wanted a 'switch-back-to-caster-form-and-start-healing' macro, but it doesn't look like that's possible. If anyone has any way to get it to work, I'd love to know.
- A few more examples
Vanish+(anything that requires Stealth) - this will never work unless you're in Stealth already when you vanish, since the client will deny use of abilities that require stealth until the server tells it you're in stealth.
Any Seal+Judgement - this will fail unless you have an active Seal. This doesn't have to be the same seal as the one you are trying to Judge, any seal will do for the purposes of validating the Judgement spell in the client. However, I know of no issues with Divine Favor+Holy Light macros.
- Is This An Exploit?
Nope. Slouken has confirmed that this is an allowed practice. It doesn't get around cooldowns in any way. Have fun!
Macros
- See the Macros or HOWTO: Make a Macro page.
How do I write a Macro to do XXXX?
- Check the Most Used Macros to see if someone has already done something like this. Check the question below "What can't a macro do?" to see if its going to be impossible. If neither of these help, try asking on the World of Warcraft UI & Macros Forum.
- A Macro cannot:
- Use more than 255 characters
- Call another macro (with the addon "Supermacro" it is now easy to run other macros in your macro)
- Cast a spell/ability without you pressing a button
- Cast more than one spell/ability per button press, unless using an ability that isn't affected by global cooldown, like feign death or judgement.
- Insert a pause before activating a spell/ability
- Target another player's pet automatically (you can only automatically target your own pet)
- Output anything to file other than saved variables
- You can call any script command (/script ScriptFunction), any standard WoW /command such as /say or /attack, and any additional /commands made available by the AddOns you've installed, for example if you install Cosmos you can use the Cosmos Slash Commands. If you need to write a long macro, write it as an AddOn in a lua file and bind it to a slash command, just like the Cosmos ones. See the section on Lua and XML for more details.
What's the real deal with pauses?
- You can't use a pause before a spell or ability. However... you can kinda do pauses in certain ways. Firstly, the Cosmos slash commands includes a /in option. This will NOT work with spells or abilities, but works fine with chat commands. For example: "/in 5 /say Heal on the way!". You can also use certain script commands based on time, such as the movement commands. See the World of Warcraft API for more on those.