1.28.2007

魔兽世界宏和脚本入门

1. What? (定义)
- 1.1 宏
- 1.2 脚本
2. Where? (我在哪能学到更多宏和脚本的知识)
3. How? (我怎么用?)
- 3.1 概括
- 3.2 法术、技能和Buff
- 3.3 与世界互动
4. 关于连续施法的补充

www.wowwiki.com
[英文]

1 - What?
1.1 宏

宏本是个编程术语,暴雪在WoW中也提供了强大的Lua编辑器,允许用户和玩家自己编写宏来丰富游戏体验。宏的定义就是一系列命令组合在一起以完成某些特定的操作,也可叫做子程序。

WOW中的宏可以由任意数量的/<命令>或纯文本组成,但最多255个字符。你可以将其直接写在聊天对话框中。如果要获得更高级的宏应用,请访问上面的链接,里面有权威详细的指导和说明。

1.2 脚本

不仅仅是在WOW中,脚本(Script)这个词一般指较为短小的用一种被称为脚本语言编写的程序。编写脚本的目的是用它来控制另一个程序。

魔兽世界内嵌了一个强大的(Powerful)脚本语言,叫Lua。这东西的意义就在于WoW可以理解并执行那些用Lua语言编写的小程序。不过脚本通常来说都不能单独使用,比如你不能只是输入一行脚本就去执行(尽管这也是可能的),而是在WoW中有几个地方让你选择性地将脚本作为其他什么东西的一部分。

你可以用脚本的地方:

/script
如果你在聊天框中输入了一个/命令"/script",你可以在它后面跟一些有效的Lua语句,比如脚本。


你可以将脚本作为宏的一部分,在你的宏里面放置一些"/script"语句。

那脚本能干什么呢?www.wowwiki.com有许多关于Lua脚本的资源,不过最重要的一点就是脚本能比/命令实现更多的游戏动作,这就要通过一种叫WoW开放的API(Application Programming Interface),还是那网站有许多关于API的东西。

2. Where?

我在哪儿能学到更多宏/脚本的知识?

wwww.wowwiki.com


http://forums.worldofwarcraft.com/board.html?forumId=11114&sid=1


www.wowwiki.com/Most_used_macro
有许多现成的宏

www.rpgexpert.com/4118.html
常规宏的应用帮助

http://bbs.ngacn.com/thread.php?fid=200
NGA UI区

3. How?

我怎么创建一个宏?
- 在聊天框中输入/macro或/m,调出宏面板,然后单击“新建”,给它一个名字和图标,然后输入你要制作的宏的命令。

我怎么做一个条件宏?
- 要使用条件句,你需要触发Lua编译器。用/script作为宏的开头,之后的一切内容都将作为Lua来运行。把所有宏的内容都写在一行里是非常重要的,而且要保证在255个字符内。

你可以用"if...then...end"的代码块来完成你的宏,完成之后看起来应该像这个样子:
/script if UnitName("target") == "fred" then CastSpellByName("治疗之触(等级 1)") end
注意结尾要写上end,这对Lua语言很重要。

另外,还有一点需要注意,就在使用Lua代码的时候不能用/cast来释放法术而必须用CastSpellByName()函数。CastSpellByName接受Shift+左键从技能名提出施法语句的方法(打开技能书,Shift+左键点击技能名即可,就像提取物品链接那样)。除此之外,还有一个函数叫/CastSpell(),但你必须知道法术的序号。

并且注意上面那个"target"是占位符,WoW用它带表示你当前的的目标。它是一种变量,但不是Lua变量。其他占位符是,"player"表示你自己,不管你叫什么名字;"party1"到"party4"分别代表你的队友,"pet"代表宠物。许多WoW lua函数接受这些占位符作为参数,但它们并非Lua变量,更像是字面量。这意思就是说,UnitName("player")是有效的,而UnitName(player)却是无效的,除非你创建了一个变量叫player,并且整一句player="player"使其包含一个有效的占位符的值。

在用Lua脚本编码时,用不用给每条语句后面都加个分号?
Lua不需要这么做,但如果你喜欢的话也可以。那样的确便于阅读而且是个好的习惯。Lua对标记还不够严格,可以理解没有分号的语句。甚至像下面这么糟糕的语句也是合法的:/script a =5 b =6 Message(a..b)c= a +b

我怎样在聊天框输出文本?
- 用DEFAULT_CHAT_FRAME:AddMessage(msg,r,g,b,a),其中msg是文本,r,g,b是红绿蓝(0,1),a表示alpha透明度(0表示完全透明,1表示完全不透明),如果不写将被视为完全不透明。
如果你用别名来表示的话,这就简单多了。
cprint = DEFAULT_CHAT_FRAME:AddMessage
然后你就可以反复用cprint("foo",1,0,0),而不必每次都输入那么一堆字符了。

补充: 如果你用Comos的话,也可以这样做:
/in 5 /say Hello,
/say Fred!

在5秒之后说"你好!",但你会马上说Fred!。/in并不是宏暂停命令,它只不过允许你实现简单命令的等待和排队。

但是,你不能用/in来释放法术、技能或运行其他宏,这因为硬件事件的限制,所以它的用途非常有限。你可以用它来说话、使用物品,仅此而已。这也是我不把它放在一开始就指出的原因,因为99%的时间里人们想要个暂停,这样的话他们就可以在一个宏里释放另一个法术或切换物品栏的物品然后使用技能,任何这些在/in里面都是无法实现的。

为什么我的宏/脚本用不起来?我基本肯定我的代码没错了。
- 对于宏:两次甚至三次地检查你的语法。记住Lua是区分大小写的!也检查三遍法术技能名称,好在汉字名称一个是一个,不像英文错个字母就够郁闷半天。

对于插件:遵循上面对宏的建议。记住Lua和XML都是区分大小写的!和不一样。如果你的插件在[插件]列表里可选,但在游戏里加载不上,检查你的XML,可能什么地方弄错了。

如果上面办法都试过还是用不起来,到网上论坛发贴寻求帮助。

我怎么注册"/"命令?
在我的UI插件里,要让用户可以在聊天框里输入信息,我需要做什么?
/命令信息存储在两个地方。第一个是叫SlashCmdList的全局表格。新建一个有1个参数的函数用来添加命令。该函数将在你的函数名之后包括一切用户输入的内容。
MyAddon = {};

function MyAddon.SlashCommand(Argument)

DoSomethingWith(Argument);

end

然后在表格中为你的新/命令创建一个项(Entry)。
SlashCmdList["My_AddOn_Slash_Command"] = MyAddon.SlashCommand;

第二个地方是一系列无序的全局变量。这些变量的名字全都由"SLASH_"开头,然后是SlashCmdList的项名(Entry Name),最后以一个数字结束。
每个变量的值都是用户输入的激活命令的文本。有一点很重要,就是变量名区分大小写,但用户输入的文本是不区分大小写的。所以:"/MASC", "/Masc" and "/masc" 都是一个意思。
SLASH_My_AddOn_Slash_Command1 = "/MASC";

SLASH_My_AddOn_Slash_Command2 = "/MASlashCommand";

SLASH_My_AddOn_Slash_Command3 = "/MyAddonSlashCommand";

法术、技能和Buff

要知道一个法术技能释放信息的最好办法是什么?
- 先打开宏编辑面板,然后打开技能书。将鼠标指针定位在宏编辑框内,然后按住Shift键再用鼠标左键去点你要的技能,游戏会自动为你提取并添加准确的语句,你还可以修改和复制。

我能做一个条件宏来根据我的Buff来判断要做什么吗?
- 这是可能的,但WoW UI没有提供简单函数来检查Buff。有几个办法可以实现,但不太地道。最好的办法就是用有这样功能的插件,然后运用到你的宏里面。

http://www.curse-gaming.com/cn/wow/去搜索IsBuffActive,这个插件将为你自己和别人提供极其简单的Buff检查方法。

有没有可能在一个宏里使用多个技能,比如先腐蚀、痛苦诅咒,然后放暗影箭?
- 不可以。因为宏不能等待时间,但要连续施法,你就得先放一个然后等这个结束之后再放另一个。即便是瞬发法术也是要触发差不多1秒钟的公共冷却。所以没有等待,你也就不能在一个宏里释放多个法术了。另外要施法必须有玩家的键盘或鼠标的硬件事件,这也是为什么不能先放一个再放一个的原因了。

但是,有可能在不需要等待的情况下做很多事。比如你可以在施法结束之后进行攻击,你还可以使用2个物品(只要他们有独立的冷却时间)。

只是你不可以做任何在A动作和B动作之间需要等待的事。

注意: 但有可能使用那种能够自动改变技能栏按钮的的插件,这样就可以在用户指定的技能列表里进行切换。也就是说,你第一次按下技能钮的时候,放腐蚀,再按就上痛苦诅咒,第三次就放暗影箭了。像Danboo的CastAway就是这类插件。

在...的时候自动释放...,这样的宏或脚本怎么写?
- 不可以。你只能通过硬件事件(鼠标点击或键盘按键)来实现法术、和技能,而且硬件事件也必须触发正常的技能按钮否则也不行。你可以在特定时间段之后调用CastSpellByName,但法术不会释放。

注意: 有一些能够自动补Buff的插件在这一点上来说已经相当自动了。

你怎么在一个宏里连接多个技能?
- 在不激活公共冷却的前提下,一个宏里可以连接多个法术(比如自然迅捷)。要这么做,简单地在两个技能之间加一句/script SpellStopCasting();
/cast 气定神闲
/script SpellStopCasting();
/cast 炎爆术(等级 1)

文章底部的附录里还有更多此类内容。

与世界互动

你能帮我写一个自动拾取尸体或剥皮的宏吗?
不,不通过鼠标点击是无法拾取物品的。

我怎样做个跳起然后转体180度的宏?
和移动相关的函数现在需要硬件事件才能工作了,所以这样的宏不可行。要在以前的话,你只能像键盘那样的速度进行转动,那在PvP中实在是太慢了。最好还是多练习用鼠标操作。

附录: 我要指出,这个宏可以让你转体180但需要一些设置。
/script SetView(1); SetView(1); TurnOrActionStart(); CameraOrSelectOrMoveStart(); TurnOrActionStop(); CameraOrSelectOrMoveStop(); SetView(4); SetView(4);

首先将镜头旋转180度并在聊天框里输入/script SetView(1);现在这宏就可以让你转体了。

如果你发现这么直不愣怔的转体让你晕头转向,删除最后那个 SetView(4); 现在你转体180之后,镜头会过一会儿再转过来跟上你。

我怎么做个告诉我和目标距离的插件或宏?
- 获得你和敌对目标的准确距离的技能已经被移除。现在你最多只能获得一个给予你当前技能是否可用的范围(比如30到36码)。

我能做个宏自动拿战场旗子吗?
- 这是不可能的。任何与3D世界的互动(比如和NPC交谈、拾取物品……)都需要通过鼠标点击。

附录: 连续施法

尽管流行的概念说你每按一次键只能施放一个法术或技能或使用一个物品(通常来说也是对的),但还是有可能多做点什么的,只不过能够连续施放的技能非常有限。

如果你在这篇文章里没找到什么有用的东西,那么至少该在提问之前看看下面的“限制”。

限制
你在按一次键只能施放一次法术,你能让宏有任何时间的等待然后再施法。限制的条件就是冷却。放一个法术(一般都是你开始吟唱的时候)通常都会激活公共冷却。你只能连接那些能够近似瞬发的法术。那意思就是说第一个法术必须是瞬发,而且不能激活阻止第二个法术立即施放的公共冷却。

你不能的事
那些在寻找先放冰箭接奥术飞弹再接冰环最后闪现的人现在可以放弃了。第一个法术必须是瞬发,第二个必须紧随第一个立即施放。不可能等1秒的公共冷却。

你能做的事

差不多每个职业有2个符合连续施放规则的技能。通常都是前一个影响后一个或下一次的法术,这意思就是像自然迅捷、气定神闲、英勇打击、猛禽一击等等,这些都没有施放时间(瞬发)而且不会激活公共冷却。

你怎么做

这个脚本相当简单。做一个宏,先放一个符合上述规则的法术,然后你得调用一个叫SpellStopCasting()的函数。这是关键,在此之后你就可以施放任何不在冷却的技能了。举个例子:

/施放 自然迅捷
/script SpellStopCasting();
/施放 治疗波

这个宏可以让你按一个键就可以放瞬发的治疗波。

再来一个:

/施放 气定神闲
/script SpellStopCasting();
/施放 炎爆术

这个是瞬发大火球的宏。

这是个非常棒的盗贼急救宏:

/施放 凿击
/script SpellStopCasting()
/script UseContainerItem(0,1) --绷带的

这里有个例外,如"英勇打击"、"猛禽一击"'这路作用到下一次使用的技能就不必加SpellStopCasting()了,因为它会在开始使用前取消一切动作。

猎人们应该喜欢这个:

/施放 猛禽一击
/施放 摔绊

这个宏可以立即发摔绊然后接猛禽一击(如果武器时间正好的话)。战士也可以把同样的方法用到英勇和断筋中,尽管这样会消耗大量怒气。

也可以使用物品

多数物品不会有公共冷却,那意思就是不会像法术那样触发公共冷却,也就可以连续的使用了。德鲁伊可以做一个紧急自救,即回春+治疗药水。我喜欢一直用闪电盾,所以我把它连在召唤坐骑之前。一些饰品也可以紧随法术之后使用。

关于效果运用的提示

这个功能只是增强你的生存游戏风格,而不会改变它。举个例子:一个战士(特别是加了减少血性狂暴伤害天赋的)可以将血性狂暴接在某些/全部攻击之前(血性狂暴+斩杀是相当有用的),尽量能用就用。你可以加一个逻辑判断,例如在你有一半以上的生命值或其他什么情况的时候才用。

上面这些宏最好是用在紧急情况,尤其是自然迅捷+治疗。如果在你按下紧急治疗的时候你正在吟唱某个法术,那么你就会直接施放治疗而没有迅捷。要避免这一情况,在不超过255字符的情况下,在宏的顶部加一句/script SpellStopCasting(),这将在一开始就停止一切法术的施放,然后再用自然迅捷+治疗。注意这不仅仅与此,其他类似技能也一样。

请注意,这里只是简单介绍技能的连接。为了使用途更广泛更重要,你还可以在中间添加语句或使用插件来治疗他人。

连接2个以上的法术

尽管用途更小,但还是有可能实现的。举个例子,我们可以进一步增强德鲁伊的紧急治疗:
/施放 自然迅捷
/script SpellStopCasting()
/施放 治疗之触
/script SpellStopCasting()
/script UseContainerItem(0,1) --药水

例外
这里有一点需要注意,就是如果你在一个周期内将自然迅捷/气定神闲和一个法术连接在一起,它不能在移动中进行,但是如果你分开来用就可以了。

原因就是客户端并不知道自然迅捷或气定神闲已经启动,所以禁止在跑动中施放。这是由于需要和服务器端进行互通的时间——即便是1毫秒的延迟也会造成这样的问题。你的延迟必须为0(准确点说就是10亿分之1秒,具体的要看你的电脑能够在多长时间内处理这个宏),这是不可能的。这在当前的技术条件下无法解决,我琢磨以后也够呛。

这一功能在切换形态和姿态的时候也用不了,第二个法术只能用在你将要切换到的姿态和形态下。这大概是因为服务器端没有告诉客户端切换是否真要发生。举个例子,下面这个宏用途是从任何形态还原并开始开启寻找草药。

/script local j,_,a;for =1,GetNumShapeshiftForms() do _,_,a=GetShapeshiftFormInfo(i);j=a and i or j;end j=j and CastShapeshiftForm(j);
/run SpellStopCasting()
/施放 寻找草药

我真想做一个切换到施法形态后立即治疗,但看起来是不可能了。如果谁有办法,我真的很想知道。

再来点例子
消失+(任何需要潜行的勾当) - 这也是不可行的,除非你在消失的时候已经处于潜行,因为客户端会禁止你使用需要潜行的技能,除非服务器端告诉客户端你已经消失了,宏在同时运行,服务器和客户端可不是。

任何圣印+审判 - 这也不行,除非你有已经激活的圣印。但我知道神恩+圣光的宏是没有问题的。

这算不算犯规?
不,Slouken(暴雪官方代表)已经明确指出这是允许的。它无论如何不会忽略冷却时间。

祝你愉快!

0 Comments: