魔兽科普:银之石的宏命令讲堂
2015-08-20 19:28:53 作者:hjg719 来源: 浏览次数:0
摘要:由于一些主管和客观的原因,我的举例会以武僧,特别是织雾的为主。
4、命令条件语
4.1 什么是命令条件语?
条件语是宏的重要组成部分,用以实现根据不同情况执行不同命令的功能,即一定程度上的判断能力。(当然BLZ为了不让它太逆天做了很多限制)以下是一个典型的织雾整合技能宏:
Code (c):
/cast [harm] 贯日击;抚慰之雾
它还有一个版本:
Code (c):
/cast [help] 抚慰之雾;贯日击
前者的意思是,判断当前目标(@target缺省掉了)是否敌对,是则对它释放贯日,否则按照常规方式释放毛线,所谓常规方式就是等效于从技能书中拉出来的图标。
后者则是反过来,判断当前目标是否友善,是则毛线,否则按照常规方式释放贯日。
他们有一个微小差别,当你没有选中任何目标时,前者会对自己拉毛线(如果你在设置里勾选了自动自我施法的话,当然它一般是默认勾选的),而后者会提示“我需要一个目标”,所以严格来说前者更好。(原则4)
4.2 可以使用条件语的命令(完全引用)
只有那些“安全化”命令可以接受命令条件语。其实正是经过安全化的命令才需要条件语。常规命令,比如说聊天、表情之类的,可以通过脚本来实现命令条件语的功能。而且暴雪不想限制大家在聊天时使用分号(;)。如果/s命令可以使用命令条件语的话,那么下面这个命令就会只说hello:
/say Hello; I’m a n00b
以下是当前客户端中安全化命令的列表:
#show (1)
#showtooltip (1)
/assist
/cancelaura
/cancelform
/cast
/castrandom
/castsequence
/changeactionbar
/clearfocus
/cleartarget
/click
/dismount
/equip (2)
/equipslot (2)
/focus
/petagressive
/petattack
/petautocastoff
/petautocaston
/petdefensive
/petfollow
/petpassive
/petstay
/startattack
/stopattack
/stopcasting
/stopmacro
/swapactionbar
/target
/targetenemy
/targetfriend
/targetlasttarget
/targetparty
/targetraid
/use
/userandom
注(1):#show和#showtooltip不是真正意义上的安全化命令,但是它和/use以及/cast的内部机制相仿。
注(2):/equip和/equipslot逻辑上也不算是安全化命令,因为它们的功能是可以通过插件和脚本实现的。
4.3 [target=]条件语
[target=]条件语让我们可以指定宏的判断和作用目标(等号后写单位标识符或者队友名字),就是说判断和作用目标是同一个,你不能实现对A目标判断再对B目标施放法术。target=可以简写为@(读作at或者target=都可以),如 [target=player] 和 [@player] 是等价的。当它省略不写的时候等价于 [@target] 也就是当前目标。注意target=的作用是“指定”,不是“判断”,学过C或者类似语言的同学会比较容易理解,这两者就是一个等号(赋值)和两个等号(相等)的区别。
这是一个简单的例子:
Code (c):
/cast [help][@targettarget,help][@player] 复苏之雾
它按从左到右顺序判断:当前目标、目标的目标是否友善,是则给它复苏,否则给自己复苏。
4.4 语法
4.4.1 命令格式
在进入正题之前我先定义一些概念,不记得也没关系下面提到的时候回头看就好了。首先一条宏命令的格式是这样的:
/命令 子句1;子句2;子句3;。。。。。。。。。
子句和子句之前用分号隔开,它们判断的优先级从左到右,而一个子句由若干组条件和参数组成,于是格式变成这样:
/命令 [一组条件][另一组条件] 参数1; [又一组条件] 参数2; 。。。。。。。。。
每个子句由若干组条件和一个参数构成,每组条件用中括号括起,它们也是从左到右判断(也可以简单地理解为“或”关系)。如果某个条件是空的(一对空的中括号),则它被判定为成立,按照常规方式释放(相当于直接从技能书中拖出来的技能)。
4.4.2 条件语
一个条件中可以包含若干个条件语(help,harm,@target等),条件语之间用逗号隔开,是“和”关系(读作而且便可),它们没有先后顺序,但阅读上我们总是把@的目标先说。
4.4.3 注意事项
判断条件还可以在前面加no来表示相反的逻辑,如nohelp,noharm;但是noharm并不等于help,因为显然逻辑上help需要目标存在为前提,noharm则包括目标不存在和help两种情况(所以我们经常把它和targetenemy一起用);而且实际上存在一些单位,它们既不是help也不是harm,下面会说到。
如果某一个子句中没有(省略了)条件,则认为它被判定为成立;参数大多数时候为法术、物品名称、或者单位名称、单位标识符。
条件语是对大小写敏感的,需要全部小写,否则会报错。
。
例如:
Code (c):
/cast [harm,nodead][@targettarget,harm,nodead] 碎玉闪电;[help,nodead][@targettarget,help,nodead] 抚慰之雾;抚慰之雾
它的意思是:先判断目标或目标的目标是否敌对而且没死(条件1、2),是则闪电(参数1);否则判断目标或目标的目标是否友善而且没死(条件3、4),是则毛线(参数2),再否则直接释放(条件5为空)毛线,结果是对自己毛线。
一条命令只会执行一个动作,一旦前面的条件满足便不再判断后面的条件。判断的优先级很重要,因为当你设计稍微复杂一点的宏的时候会出现复数个条件同时成立的情况(比如目标敌对和目标的目标友善同时成立),必须设定好采用哪一个条件的判断和参数。
注意条件和参数同时为空的情况,原文的例子:
Code (c):
/petattack [@focus,harm];
它表示如果焦点是敌对的,则让BB上去咬,但是注意这后面还有一个分号,它的后面没有条件或参数,它等价于这二者任一:
Code (c):
/petattack [@focus,harm][]
/petattack [@focus,harm][@target]
如果前面的条件不成立则让BB咬(玩家的)当前目标。
4.4.4 [target=]的注意事项(完全引用)
很多命令的参数是可以直接指定目标的。比如/target party1就可以把小队中第一个队友作为你的目标。而用/target [target=party1]的话,虽然看起来别扭,但是效果也是一样的。但是宏的设计者不希望我们根据一个单位的状态而对另一个单位执行动作,因此大多数情况下[target=]条件和命令参数只能有一个发生作用。例如:
/target [target=focus, dead] party1
客户端会把party1直接忽略掉——因为你已经指定了[target=focus]。不过这种情况也有例外,就是个别命令拥有一个“特殊单位”(其实也就是该命令会影响的单位标志符)。当在[target=]中使用的是该命令的“特殊单位”时,命令执行目标不会被设置为该单位,而命令参数中指定的目标也不会被忽略。例如:
/focus [target=focus, dead] [target=focus, noharm] target
由于focus是/focus命令的特殊单位,所以/focus的目标就不会被[target=focus]设置成焦点,而是target,即当前目标。如果没有指定target,/focus就相当于没有参数,同样是把当前目标设为焦点。
宏命令 特殊单位
/target target
/focus focus
/startattack target
/petattack pettarget
4.5 常用命令条件语
4.5.1 总表
存在(exists)
死亡(dead)
姿态(stance:0/1/2/…/n)
功能键状态(modifier:shift/ctrl/alt)
点击状态(button:1/2/…/5/<虚拟按键号>)
已装备(equipped:<物品类型>)
存在(exists)
死亡(dead)
姿态(stance:0/1/2/…/n)
功能键状态(modifier:shift/ctrl/alt)
点击状态(button:1/2/…/5/<虚拟按键号>)
引导中(channeling:<技能名称>)
宠物(pet:<宠物名称或类型>)
战斗(combat)
行动方式、室内外状态(mounted,swimming,flying,indoors & outdoors)
允许飞行 (flyable)
小队/团队队友(party/raid)
在小队/团队中(group:party/raid)引导中(channeling:<技能名称>)
宠物(pet:<宠物名称或类型>)
战斗(combat)
行动方式、室内外状态(mounted,swimming,flying,indoors & outdoors,flyable)
小队/团队队友(party/raid)
在小队/团队中(group:party/raid)
4.5.2 敌/友(help / harm)
很简单,是敌是友,但是注意虽然我在全文用“敌对”和“友善”来表示这两个条件,但是其实他们的判断标准不是看名字颜色,而是“是否可以接受攻击(增益、治疗)法术”。比如黄名的小动物其实是harm的,而七星殿门口那个祥和之灵商人,她既不是harm也不是help。
4.5.3 存在(exists)
很简单,目标存在即为真,你选中了一个目标@target就存在,设定了焦点@focus就存在,但是从逻辑上大家也看得到,一些条件中包含了“存在”的前提(help、harm、dead等),所以上面也说过,其实exists用的不多,而noexists反而更常见。
4.5.4 死亡(dead)
目标挂了,和存在类似,你不会想要对一个挂了的人做什么(除了复活),所以一般我们会用到nodead,它更多的用来防止我们选错技能目标后鼠标进入待选择状态。
4.5.5 姿态(stance:0/1/2/…/n)
表示处在按照姿态栏顺序的哪一个姿态下,多个用/链接,不写数字表示在任意姿态下(显然这对XD才有意义)。
4.5.6 功能键状态(modifier:shift/ctrl/alt)
可以简写为 [mod:shift/ctrl/alt] 表示配合这些功能键按下时成立;nomod也用的很多,表示不按任何功能键时成立。注意:假设你的宏里设置了alt+快捷键 的功能,而alt+快捷键设置给了动作条上的一个按钮,那么后者的优先级更高,宏的功能不会被执行。
4.5.7 点击状态(button:1/2/…/5/<虚拟按键号>)
鼠标左、右、中(滚轮)、侧1、侧2键按上去是不一样的效果,记得上面click也可以选择按键吧,那个也可以和这个配合的,也许你可以做一个吃喝的省键位宏,不过我不是鼠标流,宏格子也不太够。。
4.5.8 引导中(channeling:<技能名称>)
判断正在引导某一个技能,名称省略时表示引导任何技能。注意区分引导和吟唱(读条)的概念。武僧常用的引导为是怒雷、毛线、闪电。
另外,神鹤踢虽然描述上说是引导技能,但它并不能通过这个条件来判断,就是说系统并不承认它是引导技能,[channeling:神鹤引项踢] 是不会成立的。
4.5.9 宠物(pet:<宠物名称或类型>)
我们用的最多的是直接省略参数用 [pet] ,它表示宝宝存在。过去我们可以用它来判断双分的灵魂是否放下了,现在不行了,它只能表示猫咪是否在场。
4.5.10 战斗(combat)
很简单,战斗中通过,战斗外不通过,用的非常多的条件语。
4.5.11 行动方式、室内外状态(mounted,swimming,flying,indoors & outdoors,flyable)
分别表示:在坐骑上、正在游泳、正在飞行、在室内、在室外、允许飞行。
显然这些通常用来相对智能地,下坐骑、选择合适坐骑释放。
4.5.12 小队/团队队友(party/raid)
表示你@的单位处于你所在的小队或者团队中。
4.5.13 在小队/团队中(group:party/raid)
表示你自己处于一个小队或团队中。
相关报道: