今天我们来介绍下WoW中的Macros,这是一种强大的工具,使得每个玩家可以定制自己常用的动作,极大的提高游戏效率。
在继续之前,你需要: 1、WoW(废话。。。)。 2、DiscordMods有个很好的Discord Macro Functions Library,里面有些方便的函数可以大幅简化你的代码,必备。 3、你还需要一些特定功能的函数库,例如这个极其有用的IsBuffActive,用一个函数判断某个buff是不是在unit身上;还有一个AfterCast,是WoWar的Camus版主喜欢的,用于根据法术施放的结果来确定说什么话。 4、一个好的WoW LUA脚本编辑器,这个不是必须的,但是有的话,可以避免一些初级的语法错误,我用的是:WoW SciTe LUA。WoWWiki还有其他一些有用的工具介绍。 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)
这个宏过去可以实现双开,现在不行了,但是也可以帮助你自动开启可以开启的那个饰品,然后开炮,你要做的就是把这个宏绑到一个按钮上,然后不停的点,它会把剩下的事情做好的。
官网上还有其他职业的对应说明,有兴趣的自己看看吧。
October 22nd, 2005 at 10:05 am
if arg1==”player” then if (not IsBuffActive(“魔甲术”)) and (not UnitIsGhost(“player”)) then DAB_Floater_Show(101) else DAB_Floater_Hide(101) end; end;
IsBuffActive函数能否用于wow内的macro中? 上述例子能否在改用macro来写呢? 1.判断自己有没有魔甲术的buff 2.如果有 --什么也不干 3.如果没有--施放 魔甲术(等级x)
谢谢
October 22nd, 2005 at 12:00 pm
可以。只要你装了IsBuffActive这个插件,就可以在WoW的任何脚本环境中使用这个函数。
October 23rd, 2005 at 9:17 am
还是关于IsBuffActive的问题
从官网BBS术士版看到这个macro:
/script z=0;for i=1,8,1 do GameTooltipTextLeft1:SetText(nil);GameTooltip:SetUnitDebuff(“target”,i);if GameTooltipTextLeft1:GetText()==”Siphon Life” then z=1;end;end;if z==1 then TargetNearestEnemy();else CastSpellByName(“Siphon Life(Rank 4)”);end
由于我是恶魔30+毁灭21 出不了虹吸,我把Siphon Life替换成腐化测试,但是在CWOW1.8下出现宏报错窗口。
不用IsBuffActive,正确的写法应该如何?
如果用 IsBuffActive 函数,应该怎么写?
November 2nd, 2005 at 10:42 am
/script SmartChat(“正在放逐 >>%t>%t>%t<< 40秒,请不要攻击!”, false, nil) /施放 放逐术(等级 2)
我研究了一下这个脚本,发现自己打断施法,会引起第三行事件触发,也就是错误的信息,那么是AfterCast内部函数的问题么
November 2nd, 2005 at 11:47 am
嗯,是有这个问题,应该是AfterCast的问题,现在没时间仔细研究。。。要是你结果了,可要分享一下哦~~
November 18th, 2005 at 11:44 am
对例四五的问题 这个我把按键改了,没问题,可是总是出错怪掉血是ImInCombat出问题,自己掉血是HealthPercent出问题。我只装了DAB,PERL,TITAN,NECROSIS,我是WL。不知道是不是没装相关的函数插件? 万分感谢
November 18th, 2005 at 4:38 pm
我修改成这样了,就可以用了 终于完全改好了,没有DAB_Bar_TimeToHide这个函数,只好用浮动了
现在怪的血少于15弹出吸取碎片和卤莽,8秒后消失
if arg1==”player” then if UnitHealth(“player”)/UnitHealthMax(“player”) < .40 then DAB_Bar_Show(8) else DAB_Bar_Hide(8) end; end; if arg1==”target” then if UnitHealth(“target”)/UnitHealthMax(“target”) < .15 then DAB_Floater_Show(36);DAB_Floater_Show(37); DAB_Floater_Show(38)
DAB_Floater_TimeToHide(36, 8); DAB_Floater_TimeToHide(37, 8); DAB_Floater_TimeToHide(38, 8); end; end;
November 19th, 2005 at 2:29 pm
上面我说了,使用Discord Macro Lib可以简化很多脚本,没有的话就只好自己写,就像你做的,good work ^_^
December 24th, 2005 at 4:03 pm
楼主知不知道哪里有对于DAB宏语句的说明 这样的 我想做个事件宏:在我使用了有CD的技能的按扭(比如霜星),在人物旁边显示一个按扭(也是霜星)用来看CD时间 时间到了后此按扭就隐藏
December 24th, 2005 at 8:51 pm
楼上的需求很常见也很实用,但是非常遗憾的,DAB3的“技能冷却”条件判断有问题,至少我试验的结果有问题,我会找时间再研究下怎么弄 ^_^
December 25th, 2005 at 6:29 pm
那么FLEXBAR 可以的吧 可是我语句不好 /FLEXBAR SHOW BUTTON=1 ON=’startcombat’ TARGET=’PLAYER’ IF=’not incooldown’ /FLEXBAR HIDE BUTTON=1 ON=’cooldownstart’ TARGET=1 这样吗
February 7th, 2006 at 7:42 pm
FlexBar对于事件下的命令按钮的切换是非常擅长也是设计它的初衷,但是Discord Macro是方便人们制作宏命令所设计的,正如它的名字一样。而且看了它的代码对我启发很大,但是FlexBar就是一个框架和一个UI实践的意义不大
May 18th, 2006 at 6:32 pm
如果都用公共冷却时间两个魔法是不能设置成一个宏按键一次完成的是吗????
May 19th, 2006 at 12:00 am
楼上:是的。
October 22nd, 2006 at 4:46 pm
看了你的BLOG,很是钦佩!也是在GOOGLE上到处急着找WOW的找邮件插件才找到你这的,看了不少你写的东东,却怎么也找不到你的联系方式,无奈之中选择了回复你的文章,希望你能看到,我需要开发一个邮件插件,不是现在到处都可以下载到的那种,也是涉及到LUA格式的,可惜我对程序等等基本不明白,在此请教高人!希望得到指点,我的Email是 tzpsky@gmail.com QQ是817127 联系电话是:0551-2651558 叫我汤汤就OK, 期盼你的回复~焦急!等待….谢谢~~
November 28th, 2009 at 3:19 pm
博主原来搬家到这里了啊。你原来网站上的音乐介绍帖很不错啊,本来偶尔会去回味一下的,但是从某一天开始就登不上去了。。。
结果今天搜wow宏的时候又搜到这里了,会经常来看看的