今天我们来介绍下WoW中的Macros,这是一种强大的工具,使得每个玩家可以定制自己常用的动作,极大的提高游戏效率。

在继续之前,你需要:
1、WoW(废话。。。)。
2、DiscordMods有个很好的Discord Macro Functions Library,里面有些方便的函数可以大幅简化你的代码,必备。
3、你还需要一些特定功能的函数库,例如这个极其有用的IsBuffActive,用一个函数判断某个buff是不是在unit身上;还有一个AfterCast,是WoWar的Camus版主喜欢的,用于根据法术施放的结果来确定说什么话。
4、一个好的WoW LUA脚本编辑器,这个不是必须的,但是有的话,可以避免一些初级的语法错误,我用的是:WoW SciTe LUAWoWWiki还有其他一些有用的工具介绍。
5、如果在这方面有任何问题,你可以在你可以在WoWWiki找到一些有用的东西。

好,Let’s go!


首先我们来看看基本的宏。要在WoW中建立自己的宏是很简单的:
1、输入/m 回车,会打开一个宏命令编辑的窗口;
2、选择新建,在弹出的对话框中输入名称,选择对应的图标,确定;
3、在编辑窗口输入宏代码;
4、点击完成,然后就可以把图标拖到你的动作条上去了用了。

我们来看两个基本的例子。第一个是一句话的,就是常用的一些表情,不喜欢每次去点那个泡泡的话(或者像我干脆把泡泡废了的),就可以作个宏,然后拉到动作条上去。代码如下:

/Cry

或者

/哭泣

效果一样,就是对你选中的对象哭。。。相关的列表很长,我就不列了,你可以在泡泡中找到,也可以下载一些综合资料,例如8M推荐的WoW Guide,里面也有。

第二个例子也很简单,就是你释放某些法术的时候,希望通知队友,代码如下:

/施放 地狱烈焰(等级 2)
/y 正在释放地狱烈焰,注意保护!

很简单,开始放地狱烈焰,同时招呼牧师给个盾啥的。这里用的是喊叫(红字),有时候需要在小队或者团队频道喊,那么用/p或者/ra之类的频道代替/y。还可以借助一些函数实现更加复杂和自动化的效果,例如:

/施放 地狱烈焰(等级 2)
/script SmartChat(“正在释放地狱烈焰,注意保护!”, false, nil)

第二句调用Discord库里的一个有用的函数SmartChat,它的效果是:根据你目前所在的队伍,自动把消息发到团队、小队频道,或者你在solo的时候直接用“说”。很简单是吧?再来看第三个,稍微复杂一点,如果你希望在你的消息中引用你目前选中的对象,那么:

/施放 放逐术(等级 2)
/script SmartChat(“正在放逐 >>%t<< ,请不要攻击!", false, nil)

注意里面的%t,这个变量在运行时会被替换为你目前选中的对象。

这里有个小技巧,可以避免你输错那些难以记住的技能名称,在Macro编辑窗打开的情况下,打开技能书,Shift+Click技能名称可以把对应技能(连同等级)加入到编辑窗口中。

进一步的,有时候放逐会失败——也许你选择了错误的目标,又或者被抵抗,那个时候你要是还是说不要攻击,会被人踩死,所以就用得到AfterCast这个方便的工具了:

/script SmartChat(“正在放逐 >>%t<<", false, nil) /aftercast +fail /script SmartChat("放逐 >>%t<< 失败!", false, nil) /aftercast /script SmartChat("已放逐 >>%t<< 40秒,请不要攻击!", false, nil) /施放 放逐术(等级 2)

/aftercast后面的内容只有本宏中的法术释放成功才会触发,+fail表示后面的内容只有法术释放失败之后才触发,类似的命令共有4种:
+done 法术成功施放后(缺省,要是什么都不写,就是这个)
+fail 法术施放失败后
+interrupt 法术施放被打断后
+start 法术施放开始时

也许你会想:这可好了,我把我的所有常见战术都做成宏,一个键就自动播放出来,怪就死了,多好!但是这是不行的,因为Blizzard为了防止利用宏作出类似外挂功能的事情,对宏做了严格的限制:
1、宏中没有延时功能,宏中的每条语句都是同时执行的,也就是说,施放某个法术,完了以后再释放第二个法术,是不可能的,两个法术会同时释放,然后有一个会因为另一个法术正在释放而失败。
2、一般情况下每个技能的释放必须唯一对应一个硬件事件,例如鼠标点击或者键盘按键。
所以,请放弃想按一次键释放超过一个技能的妄想(其实也有例外,看下面)。

好,关于基本的宏就到这里,还有很多变化,去网上还有上面提供的链接中去找吧!

接着我要介绍一下强大的动作条插件DAB的宏。DAB运行定义一组宏,在某些事件发生时,执行一段脚本,你可以改变按钮和动作条的显示状态或者其他操作。这个能力能够是你轻松的作出强大的、交互式的、上下文相关的UI。具体操作很简单:
1、输入/dab 回车,打开DAB设置界面;
2、选择OnEvent Macros功能,从上面的列表中选择一个事件,然后在下面填入代码就行了。

我们来看一些例子。

例一:当你的Mana不足时自动显示出一个兰瓶的按钮。

在Unit’s Mana Changed事件中加入:

if arg1=="player" then
if ImInCombat() and (ManaPercent("player") < .25) then
DAB_Floater_Show(106)
else
DAB_Floater_Hide(106)
end;
end;

其中ManaPercent函数来自Discord函数库,你要是不想用它,可以用这个代替:

if UnitMana("player")/UnitManaMax("player") < .40 then

ImInCombat也是Discord函数库里的,判断自己目前是否处于战斗状态,不在战斗状态的话,还是用魔法水来回蓝吧。DAB_Floater_Show和DAB_Floater_Hide都是DAB带的函数,用来显示和隐藏某个浮动按钮,后面的参数是按钮的ID,在DAB设置界面中选择Show Button IDs就可以看到每个按钮的ID。

例二:当你的某个buff失效之后立刻显示对应法术的按钮,好让你继续加上这个buff。

在Unit's Buffs/Debuffs Changed事件中加入:

if arg1=="player" then
if (not IsBuffActive("魔甲术")) and (not UnitIsGhost("player")) then
DAB_Floater_Show(101)
else
DAB_Floater_Hide(101)
end;
end;

IsBuffActive来自IsBuffActive插件,这个目前似乎是必须的,没找到其他简单的办法替代。后面的参数是你要检测的buff名字或者名字的一部分,例如这里用魔甲术,就会检测出各个级别的魔甲术。后面一个UnitIsGhost的判断是WoW标准的API,告诉你对象是否处于灵魂状态,如果是,就不要显示什么按钮啦。

例三:当你选中一个可攻击对象的时候,显示一个定制好的动作条,上面是你常用的起手技(即拉怪的技能)。

在You Change Targets事件中加入:

if UnitCanAttack("player", "target") and UnitHealth("target") > 0 then
DAB_Bar_Show(8)
else
DAB_Bar_Hide(8)
DAB_Bar_Hide(9)
end;

DAB_Bar_Show和DAB_Bar_Hide都是DAB带的函数,用来显示和隐藏某个动作条,后面的参数是动作条的ID,在DAB设置界面中选择BarN对应的就是ID为N的动作条。我的Bar8是开始攻击的起手技,Bar9是一些用于给予对手最后一击的终结技(见例五)。
这里的逻辑是:如果选中的是可以攻击的对象,而且对象尚未死亡,那么显示起手技动作条。

例四:当你的HP不足时显示快速加血物品和技能。
例五:当你正在攻击的对象的HP足够低的时候,显示一个定制好的动作条,上面是你常用的终结技,例如作为术士的我,可能需要使用能够产生灵魂碎片的技能终结对手,有些技能要求怪物血量足够少的时候才有可能成功,那么也可以放在这里。

在Unit's Health Changed事件中加入:

if arg1=="player" then
if (not UnitIsGhost("player")) and (HealthPercent("player") < .40) then
DAB_Bar_Show(7)
else
DAB_Bar_Hide(7)
end;
end;

if arg1=="target" then
if ImInCombat() and not(UnitIsDead("target")) and (HealthPercent("target") < .50) then
DAB_Bar_Show(9)
else
DAB_Bar_Hide(9)
end;
end;

这个我想已经不需要做什么解释了吧。


然后我们来搞点高级技巧。上面说了一般情况下一次按键只能释放一个技能。其实这个是有例外的。有兴趣的看看官网论坛对这个问题的说明:

http://forums.worldofwarcraft.com/thread.aspx?fn=wow-interface-customization&t=241109

大意是这样子的:

尽管通行(并且基本正确)的观点认为每次按键只能施放一个法术或者使用一件物品,事实上在一个宏中施放2个法术确实可能。然而,何种法术才能同时施放有着极为严格的限制。

[限制]
只能在按键时施放法术。不可能令宏等待任何期间而后施法。限制的因素是冷却(cooldown) 。施法一般会导致公共冷却(通常在开始施放时)。只有通常能近乎即刻施放的法术才能在宏中一次施放。这意味第一个法术必须是瞬发的,并且必须不会引发公共冷却以致妨碍第二个法术被立即释放。

[不能做什么]
所有试图在奥术飞弹(Arcane Missles)、冰环(Frost Nova)、闪现(Blink)后瞬发冰弹(Frostbolt)的朋友们,现在就放弃吧!第一个法术必须是瞬发的,而后的法术必须能在第一个之后立即施放。没有方法等待1秒的公共冷却经过。

[能做什么]
有很少一些法术,通常每个职业一对,符合同时施放的规则。通常是会影响下一法术的法术,或是影响下一技能的技能。以我的术士来说,诅咒增幅和痛苦诅咒就是这样的一对。

[怎么做]
达成这一功能的宏非常简单。建立一个宏来施放符合上述规则的第一个法术。而后,需要调用脚本函数SpellStopCasting()。这是关键所在。而后,就可以施放任何想要的法术,只要没有冷却。

对于术士来说,很简单啦,有一些法术符合上面说的要求,例如诅咒增幅,后面接它能够影响的法术,例如痛诅。这个宏就是这样的:

/script CastSpellByName("诅咒增幅"); SpellStopCasting(); CastSpellByName("痛苦诅咒");

一个类似的例子就是恶魔术士的瞬召宏:

/施放 恶魔支配
/script SpellStopCasting();
/施放 召唤魅魔(召唤)

还有更加牛的,如果你带虚空,可以牺牲之,然后再瞬召一个出来,曾几何时,这招可以吓跑一堆人 >.< :

/script --CastSpellByName("恶魔支配");
/施放 恶魔支配
/script SpellStopCasting();
/施放 召唤虚空行者(召唤)

这里有个小trick,注意第一行的script,用--注释掉了,但是放在这里是有用的。原来WoW对于宏的CD时间是按照宏中第一句中的法术来看的,这个宏里只有恶魔支配这个技能是有CD的,所以这么一写,这个宏的CD就等于恶魔支配技能的CD了。你要是把这个宏拖到一个按钮上,就可以看到CD的显示了。

还有下面这个著名的饰品宏:

/script if GetInventoryItemCooldown("player", 13) == 0 then UseInventoryItem(13); SpellStopCasting(); end
/script if GetInventoryItemCooldown("player", 14) == 0 then UseInventoryItem(14); SpellStopCasting(); end
/施放 暗影箭(等级 10)

这个宏过去可以实现双开,现在不行了,但是也可以帮助你自动开启可以开启的那个饰品,然后开炮,你要做的就是把这个宏绑到一个按钮上,然后不停的点,它会把剩下的事情做好的。

官网上还有其他职业的对应说明,有兴趣的自己看看吧。