宏从入门到精通(盗贼专用)

一直看各种宏的教学,没有一片足够清晰严格的。

在这些教学里,函数的变量和作用都没有说明,宏的语法也没有说明,这样对玩家自己改进宏十分不利。
那些写宏教程的也很奇怪,难道都不屑于说明语法么?或者就是直接从国外网站照样copy过来的?
恩,对大多数人可能不管黑猫白猫复制下来能用的宏就万事ok了...但我个人不喜欢不求甚解的态度,
而且看见过的多数拿出来分享给别人用的宏,用计算机专业的标准衡量,代码往往冗余,这就意味着
效率的损失,也就意味着片刻的延时,或许片刻就是生死的分界线....
这篇宏的经验文章写给那些想多了解一些宏的知识的玩家,
如果不想自己动手写宏的玩家不用往下看。


1,宏的基本常识
宏是一个脚本,发送到服务器端执行。这个脚本由一组命令序列构成,长度不超过255个字符。
序列中的每一个命令,由一个/ 开头,例如/say /script 等等。
/script 后面跟随脚本特有的语句和函数。

你可以罗列多个/script命令在一个脚本里,也可以在一个/script命令中写多个函数,这都可以。
因为宏就是依次执行所有的命令,所以不需要在宏的最后添加end 标记,或在命令之间加;
事实上,end标记 是if语句的组成部分,你在写if语句时才用到end关键字。命令和命令之间用
换行或; 隔开都可以,我喜欢用换行..呵呵,省掉不必要的; 代码也清楚些

常用的if语句语法如下:

/script if [条件表达式] then [命令序列] end
or
/script if [条件表达式] then [命令序列1] else [命令序列2] end

这里条件表达式不需要在外面套括号,和C,java的习惯不同,应该是为了减少不必要的字符数,
毕竟WOW宏有长度限制。

条件表达式 中 相等用 == , 否定用not, 不等于可以写 not (A == B),
暴雪没有提供!= 作为不等于,很奇怪。 例子:
if sword == GetInventoryItemLink("player", 16) then ....
if not (sword == GetInventoryItemLink("player", 16)) then ....

注1,这里的sword是全局变量。每一个全局变量的生命周期是一次登陆中从声明变量到退出魔兽,
通常在每次登陆后额外运行一个设定宏来设定我们所需要的全局变量。

注2,GetInventoryItemLink()是一个取装备link的函数,
GetInventoryItemLink("player", number)是从人物身上取装备的link,number代表人物装备画面的不同槽, 头部,颈部,依次递增,于是16代表主手武器,17代表副手武器
GetInventoryItemLink("player", 16) 就代表了主手武器的link

2,盗贼专用宏的编制思路,
其实用宏就是为了切换武器,既不放弃匕首的背刺和伏击,也能用高攻的单手剑,达成两全其美的效果。

一般有两种风格的切换宏,
1,主手剑副手匕首,用背刺,伏击时把匕首换到主手。用其他技能时把剑换到主手。
2,主手剑副手剑,背包里放一把匕首,用背刺,伏击时,把背包里的匕首换到主手。用其他技能时把剑换回来。

前一种方案的切换武器的宏如下:

PickupInventoryItem(16) PickupInventoryItem(17)

还记得吧,16代表主手武器,17代表副手武器。
PickupInventoryItem就是相当于打开人物装备面板(Inventory, 按C)
做点击数字对应位置的动作。这个宏很简单,
就是先点击主手武器,然后鼠标上应该有主手武器,然后点击副手武器,
这时候两把武器就会交换。瞬间执行的效果当然就是瞬间交换,但这个宏有能够感觉得到的明显延时,
因为PickupInventoryItem这个函数执行比较慢。推荐用下一个方案。

后一种方案的切换武器的宏如下:
PickupContainerItem(0, 1) PickupInventoryItem(16) PickupContainerItem(0, 1)

PickupContainerItem是从背包里取装备,第一个参数指背包,第2个参数指背包里的槽位,
这里的约定是0代表主背囊,然后从右向左,依次是1,2,3,4
背包里槽位从上到下,从左往右排序,注意!从1开始。这和一般从0开始的习惯有点不同。

因此PickupContainerItem(0, 1) 就是点取我主背包上数第一排左数第一格的物品。
然后PickupInventoryItem(16) 放到主手位置,
然后把原先主手位置的物品PickupContainerItem(0, 1)放到背包里。完成一次武器交换。

这个切换动作明显比前一个更快。推荐使用,而且副手因此可以保持用高DPS的剑,有助于提高攻击效率么,当然,你爱在副手保持什么武器都可以,呵呵。

现在我们有了一个基本的切换宏,但每次用技能都手工切换很难忍,我们继续实践很多人想到过的,
为特定技能写不同的宏,保证不同技能使用合适的武器。

基本思路是用全局变量记录主手使用的剑,在用不同技能时判断主手位武器是剑或否,看情况切换。

全局变量的设置宏:
/script setglobal("sword", GetInventoryItemLink("player", 16))
/script SendChatMessage("主手剑"..sword, "say", this.language,"")

第二句命令把你的主手武器说出来,让自己能够看见。如果碰巧是匕首在主手(例如上次断线不巧等等),就切换一次,重新运行设置宏。保证sword变量对应自己的主手剑。

先用邪恶攻击举例:我们要保证每次邪恶攻击都使用高攻击的剑,所以先判断主手武器,如果需要切换就切换,然后执行邪恶攻击。

/script if not (sword == GetInventoryItemLink("player", 16)) then PickupContainerItem(0, 1) PickupInventoryItem(16) PickupContainerItem(0, 1) end
/script CastSpellByName("邪恶攻击(等级 5)")

但类似写背刺的宏会有问题,背刺的有效性判断在宏执行之前,
这就使得流传的一些背刺宏需要连按两下,第一下只能完成切换,第二下才能背刺,这很是不方便。

因此,我的思路是在凿击之后直接切换武器,因为凿击通常接着就要背刺。这样背刺就可以直接进行了。而且背刺后应该换回剑继续,因为背刺的60能量开销使得它在绝大多数情况不能连续进行,除了某些升主动天赋的贼...

凿击宏如下:
/script CastSpellByName("凿击(等级 3)")
/script if ( sword == GetInventoryItemLink("player", 16) ) then PickupContainerItem(0, 1) PickupInventoryItem(16) PickupContainerItem(0, 1) end

背刺宏如下:
/script CastSpellByName("背刺(等级 5)");
/script PickupContainerItem(0, 1) PickupInventoryItem(16) PickupContainerItem(0, 1)

如果敌人已经晕了,而我在他背后,例如偷袭之后,
那么这个宏连按两下,也可以起到第一下切换,第二下背刺的效果。
通常偷袭后是连续邪恶攻击攒点还是背刺伤害 要视情况而定,所以偷袭的宏后面我没有加固定切换的
代码。

大体上就是这样,以上的宏解说希望对各位贼友有帮助,其他各个技能的宏如果觉得必要应该可以
自己写出来了,呵呵,自己写一写就会彻底掌握了。当然不能就此精通,
题目的言过其实,就是搞笑而已。呵呵