游航首页 | 游戏公会 | 热点新闻 | 游航论坛 | 领内测号 | 游戏评测 | 游戏攻略
『 邀请好友』
发送关闭
»  游客: 登录 | 注册   当前位置:  论坛首页 »  热门游戏区 »  魔兽世界
35102/4页1234
发新贴子 回复贴子         刷新本主题   浏览下一篇主题  您是本帖第 1871个阅读者
 主题:[转帖] 考格威尔宏命令指南 [全部贴] [楼主贴] [打印] [收藏] 
    本主题由 承诺 于 2009-8-29 1:42:55 置为精华
yonghengzj
版主
性别:男
等级:少校
经验:1074
发贴:27
精华:1
注册:2009-8-28
状态:离线
在线:33小时
 (0)     (0)
yonghengzj的个人资料   发送短消息息给yonghengzj   发送电邮给yonghengzj   复制这个帖子   引用回复这个帖子   回复这个帖子      

回复:[转帖] 考格威尔宏命令指南
得分记录:  [我要评分]

1.       进阶:脚本

i.脚本有哪些限制?

脚本是一个强大的工具,它按照LUA语言的语法执行,利用客户端提供的接口可以产生强大的智能。所以玻璃渣就给它加了限制,防止它被滥用而影响游戏平衡性。我之所以要先讲脚本的限制,为的是让大家对它别抱太大希望。虽然脚本还是很有用,但是不能用来施法、使用物品、改换技能栏或改变当前目标。这些功能只能依靠那些“安全化”的命令来实现。

ii.什么是脚本?

魔兽世界客户端的用户界面是可以通过LUA脚本控制的。通过/run/script命令就可以执行脚本(我个人推荐使用/run,节省字符数……)。在命令后面书写脚本内容,中间不能换行。不过一个宏中可以包含多个/run命令。

过多关于LUA语言和编程的内容本文就不再赘述。如果你有一定的编程经验,那么就可以访问lua.org学习LUA语言。如果没有什么基础,那么请先看《编程入门》了解一些基本概念。

玻璃渣提供了很多API函数(Application Programming Interface),可以在LUA脚本中调用来实现对界面的控制。关于API函数和相关的内容可以看看这篇文章:《界面DIY(如果你打算花时间好好研究魔兽世界插件的话,WoWWiki是最优选择)。我不可能把所有关于用户界面的细节都讲到,因此我只打算用我最常用的一个宏做例子,简单地讲一下。想了解得可以看上面给出的链接,或者这里:Mod Author Resources sticky

下面这个宏是我给出的例子,它会向所有和你目标相同的人发送悄悄话,通知他们改变目标(我的插件CCWarn也是就是基于这段代码的)。这样就可以防止已被羊的人受到攻击。

/cast 变形术

/run for i=1,GetNumRaidMembers()-1 do local u,t="raid"..i,"target"if UnitIsUnit(u..t,t)then SendChatMessage("Change targets! Trying to sheep...","WHISPER",nil,UnitName(u))end end

呃……貌似看起来有些乱……不过没办法……首先,宏是有255字符数限制的,所以常常要用一些不美观的方式去写代码。其次,脚本要写在一行中。这两个条件导致代码的可读性很低。如果把代码单独拿出来美化一下的话,应该是这个样子:

for i = 1, GetNumRaidMembers() - 1 do

  local unit = "raid"..i

  if UnitIsUnit(unit.."target", "target") then

SendChatMessage("Change targets! Trying to sheep...", "WHISPER", nil, UnitName(unit))

  end

end


IP:您无权察看 2009-8-28 15:38:20
 推荐给好友            操作  11  楼   顶端
yonghengzj
版主
性别:男
等级:少校
经验:1074
发贴:27
精华:1
注册:2009-8-28
状态:离线
在线:33小时
 (0)     (0)
yonghengzj的个人资料   发送短消息息给yonghengzj   发送电邮给yonghengzj   复制这个帖子   引用回复这个帖子   回复这个帖子      

回复:[转帖] 考格威尔宏命令指南
得分记录:  [我要评分]

一、      命令条件语

1.       什么是命令条件语?

命令条件语是插入在宏命令中,使宏根据条件执行不同功能的语句。举个例子,下面这个宏的作用是,如果是友方目标就施放恢复,如果是敌方目标就上痛:

/cast [help] 恢复; [harm] 暗言术:痛

当这个宏执行时,首先检查[help]条件,判断当前目标是否是一个可以接受治疗/增益法术的目标。如果[help]条件成立,那么就施放恢复并执行下一条命令,否则(即没有目标,或目标不接受有益技能)继续执行下一个子句,也就是分号后[harm]那里,再判断[harm]条件。[harm]条件和[help]条件相反,判断目标是否接受敌对法术。同上,如果条件成立就释放“暗言术:痛”并执行下一条命令。如果条件不成立,由于后面没有其他子句,这条宏命令就算执行完了,但是什么动作都没有做。

注:如果没有写[harm]条件,实际运行效果是差不多的。不过,如果你没有目标或者当前目标不接受任何法术,那么屏幕上将会出现错误信息,或者对于某些技能,鼠标将会变成选择施放目标的状态。


IP:您无权察看 2009-8-28 15:39:49
 推荐给好友            操作  12  楼   顶端
yonghengzj
版主
性别:男
等级:少校
经验:1074
发贴:27
精华:1
注册:2009-8-28
状态:离线
在线:33小时
 (0)     (0)
yonghengzj的个人资料   发送短消息息给yonghengzj   发送电邮给yonghengzj   复制这个帖子   引用回复这个帖子   回复这个帖子      

回复:[转帖] 考格威尔宏命令指南
得分记录:  [我要评分]

1.       可以使用条件语的命令

只有那些“安全化”命令可以接受命令条件语。其实正是经过安全化的命令才需要条件语。常规命令,比如说聊天、表情之类的,可以通过脚本来实现命令条件语的功能。而且暴雪不想限制大家在聊天时使用分号(;)。如果/s命令可以使用命令条件语的话,那么下面这个命令就会只说hello

/say Hello; I’m a n00b

以下是当前客户端中安全化命令的列表:

#show1

#showtooltip1

/assist

/cancelaura

/cancelform

/cast

/castrandom

/castswquence

/changeactionbar

/clearfocus

/cleartarget

/click

/dismount

/equip2

/equipslot2

/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逻辑上也不算是安全化命令,因为它们的功能是可以通过插件和脚本实现的。

当然,如果你希望在常规命令中使用命令条件语,就需要安装专门的插件。MacroTalk,这是我的一个作品,通过在非安全化命令前添加/opt,然后在/opt中处理各类条件来实现对不同命令的调用(当然只能是非安全化命令)。最新版的SuperMacro中应该也有类似的功能。

IP:您无权察看 2009-8-28 15:40:40
 推荐给好友            操作  13  楼   顶端
yonghengzj
版主
性别:男
等级:少校
经验:1074
发贴:27
精华:1
注册:2009-8-28
状态:离线
在线:33小时
 (0)     (0)
yonghengzj的个人资料   发送短消息息给yonghengzj   发送电邮给yonghengzj   复制这个帖子   引用回复这个帖子   回复这个帖子      

回复:[转帖] 考格威尔宏命令指南
得分记录:  [我要评分]

1.       [target=]条件语

该条件语使得宏命令除了可以对条件进行判断外,还可以设置动作的目标。例如,下面这个宏运行时,无论当前目标是谁,玩家只会给自己绑绷带:

/use [target=player] 厚灵纹绷带

Target条件语在指定动作目标的同时,也指定了进行条件判断的目标。下面这个垃圾宏是一个纯教学例子,看我的说明:

/cast [help] [target=targettarget, help] [target=player] 快速治疗

这个宏运行的时候,首先会检查[help]条件。如果条件为真,那么就开始吟唱快速治疗。否则就跳至第二个条件,[target=targettarget, help]。此时,判断目标和技能目标都被设定为你当前目标的目标,然后进行help条件判断。如果条件成立就对你当前目标的目标施放快速治疗,否则再跳至第三个条件。而第三个条件总是成立的,所做的只是把你自己当作施法目标。

2.       语法

命令条件语是按什么规则生效的?恐怕要回答这个问题很容易引起混乱。所以,趁还没有正式开始讲,我先用一些现实生活的例子做类比。看不懂不要紧,这只是些概念,技术性的内容后面都还会再提到的。


IP:您无权察看 2009-8-28 15:42:36
 推荐给好友            操作  14  楼   顶端
yonghengzj
版主
性别:男
等级:少校
经验:1074
发贴:27
精华:1
注册:2009-8-28
状态:离线
在线:33小时
 (0)     (0)
yonghengzj的个人资料   发送短消息息给yonghengzj   发送电邮给yonghengzj   复制这个帖子   引用回复这个帖子   回复这个帖子      

回复:[转帖] 考格威尔宏命令指南
得分记录:  [我要评分]

i.条件语语法简介

所有的宏命令的基本工作方式是相同的:一个命令,后面带上一个或多个参数(取决于命令的要求,有些甚至不需要任何参数)。看下面这些例子:

/cast 猛击

\___/ \___/

  |    |

  |  参数

  |

命令

 

/petattack

\_______/  \/

    |      |

    |   参数(为空)

    |

  命令

 

/castsequence reset=target 献祭, 腐蚀术, 痛苦诅咒, 生命虹吸

\_________/  \_______________________________________/

      |                        |

    命令                    参数

而命令条件语可以通过对一组条件进行的判断来选择命令的实际参数。首先,可以用分号分隔出若干个“若干组条件+参数”这样的子句,逻辑上,分号就相当于高级语言中的else或是elseif。条件的组数不定,也可以没有,同一组条件用一个方括号括在一起。而每组条件中有可以包含多个条件。就像这样:

/命令 [一组条件] [另一组条件] 参数1; [又一组条件] 参数2; ……

前面的例子已经说明了,宏命令的解释过程是从左至右的。当一组条件被判定成立时,命令就会采用其对应的条件。如果某一个子句中不包含条件,那么就被无条件判定为成立。像/cast XXX这种简单的宏命令就可以理解为一个只有一个子句的宏,而这个子句又不包含条件。而如果一个宏的任何一组条件都不为真,那么它就完全不会执行。


IP:您无权察看 2009-8-28 15:43:46
 推荐给好友            操作  15  楼   顶端
yonghengzj
版主
性别:男
等级:少校
经验:1074
发贴:27
精华:1
注册:2009-8-28
状态:离线
在线:33小时
 (0)     (0)
yonghengzj的个人资料   发送短消息息给yonghengzj   发送电邮给yonghengzj   复制这个帖子   引用回复这个帖子   回复这个帖子      

回复:[转帖] 考格威尔宏命令指南
得分记录:  [我要评分]

i.条件语法

每组条件都是由逗号分隔的一些条件语组成的,各条件不分前后次序。逻辑上,[target=]总是先发生作用,然后其他的条件才进行判定。逗号在这里可以理解为“并且”,也就是说各条件简是逻辑“与”的关系。比如[help, nodead, target=focus]的含义就是:我的焦点是友善的,并且是只活的。

注意:条件是对大小写敏感的,如果你把[help]写成了[Help],宏运行时会报错。

条件中有组合式的使用方式,比如nodead,同样对于help,你可以用nohelp表示相反的条件。但是nohelp不等于harm:首先,helpharm都要求目标存在才有可能成立;其次,有些目标,比如中立阵营NPC、非战斗宠物或者护送任务NPC等,既不算help,也不算harm

还有些条件可以指定一些特定的参数。比如[stance],姿态,单独使用时表示“在任一姿态中”(显然这对战士来说是废话一句)。如果给它加上参数,就可以指定在某个姿态下,格式是在条件语后写上冒号(:),然后后面写上参数,每个参数间用斜线(/)分隔。综上所述,一个条件语的完整格式如下(<>表示其中的部分是可选的):

[<no>condition<:parameter</parameter</parameter<…>>>>]

下面举个例子,如果在战斗或防御姿态施放盾击,否则转入防御姿态:

/cast [stance:1/2] 盾击; 防御姿态

这个宏用伪代码写的话就是:

IF 当前在姿态1或姿态2

 THEN 用盾击

 ELSE 切换防御姿态

注意:“no”前缀是对整个条件和所有参数的修饰,即把原来的真变为假,假变为真。比如[nostance:1/2]表示“不在姿态1也不在姿态2中”。

ii.完整的EBNF语法

EBNF规范很熟悉的人,以上内容可以概括为:

command = "/", command-verb, [ {command-object, ";" } command-object] ]

command-verb = ? any secure command word ?

command-object = { condition } parameters

parameters = ? anything which may be passed to the command word ?

condition = "[" condition-phrase { "," condition-phrase } "]"

condition-phrase = [ "no" ], option-word, [ ":" option-argument { "/" option-argument } ]

option-argument = ? any one-word option, such as 'shift, 'ctrl', 'target', '1', '2' ?


IP:您无权察看 2009-8-28 15:44:22
 推荐给好友            操作  16  楼   顶端
yonghengzj
版主
性别:男
等级:少校
经验:1074
发贴:27
精华:1
注册:2009-8-28
状态:离线
在线:33小时
 (0)     (0)
yonghengzj的个人资料   发送短消息息给yonghengzj   发送电邮给yonghengzj   复制这个帖子   引用回复这个帖子   回复这个帖子      

回复:[转帖] 考格威尔宏命令指南
得分记录:  [我要评分]

i.参数为空

有些命令是可以没有参数的,这里就存在着一个陷阱。比如:

/petattack [target=focus, harm];

很多初学者一看,认为这个宏的含义应该就是判断焦点是否为敌对,如果是,就把宠物送上去咬。而实际上呢?让我们分析一下:

/petattack [target=focus, harm]  ;

\________/ \______________/ V  V  V

    |             |        |   |   |

  命令        条件语1    |   |  参数2 (为空)

                          |   |

                          |  条件语2(为空)

                          |

                        参数1 (为空)

现在看出来了吧?由于那个分号的存在,这个语句实际上包含两个子句,而一个条件语为空的子句是被当作条件成立处理的,因此即使前面的条件语1不成立,也会执行一个/petattack

ii.条件为空

有时我们需要在特定条件下对特定目标施放技能,并在条件不成立的情况下按常规施放。这中效果可以通过使用一组空条件来获得。下面例子中的宏在执行时会对你鼠标指向的友方单位施放圣光闪现。如果鼠标没有指向任何单位或者指向的目标不是友善的,那么就会按常规对当前目标施放,或者根据设置(如自动自我施法、自我施法功能键)对自己施放。

/cast [target=mouseover, help] [ ] 圣光闪现


IP:您无权察看 2009-8-28 15:45:44
 推荐给好友            操作  17  楼   顶端
晶晶
性别:女
等级:上校
经验:2793
发贴:53
精华:6
注册:2009-7-29
状态:离线
在线:437小时
门派:全部门派
 (0)     (0)
晶晶的个人资料   发送短消息息给晶晶   发送电邮给晶晶   复制这个帖子   引用回复这个帖子   回复这个帖子   主页         

回复:[转帖] 考格威尔宏命令指南
得分记录:  [我要评分]
UP 帮助好大!谢谢楼主

----------------------------------------------
点击开新窗口欣赏
IP:您无权察看 2009-8-28 15:51:44
 推荐给好友            操作  18  楼   顶端
匿名
晶晶的个人资料   发送短消息息给晶晶   发送电邮给晶晶   复制这个帖子   引用回复这个帖子   回复这个帖子   

回复:[转帖] 考格威尔宏命令指南
厉害!!!!!!

IP:您无权察看 2009-8-28 19:13:57
 推荐给好友            操作  19  楼   顶端
yonghengzj
版主
性别:男
等级:少校
经验:1074
发贴:27
精华:1
注册:2009-8-28
状态:离线
在线:33小时
 (0)     (0)
yonghengzj的个人资料   发送短消息息给yonghengzj   发送电邮给yonghengzj   复制这个帖子   引用回复这个帖子   回复这个帖子      

回复:[转帖] 考格威尔宏命令指南
得分记录:  [我要评分]

i.[target=]条件语与命令参数

很多命令的参数是可以直接指定目标的。比如/target party1就可以把小队中第一个队友作为你的目标。而用/target [target=party1]的话,虽然看起来别扭,但是效果也是一样的。但是宏的设计者不希望我们根据一个单位的状态而对另一个单位执行动作,因此大多数情况下[target=]条件和命令参数只能有一个发生作用。例如:

/target [target=focus, dead] party1

客户端会把party1直接忽略掉——因为你已经指定了[target=focus]。不过这种情况也有例外,就是个别命令拥有一个“特殊单位”(其实也就是该命令会影响的单位标志符)。见下表:

命令                   特殊单位

/target                  target

/focus                  focus

/startattack          target

/petattack            pettarget

当在[target=]中使用的是该命令的“特殊单位”时,命令执行目标不会被设置为该单位,而命令参数中指定的目标也不会被忽略。例如

/focus [target=focus, dead] [target=focus, noharm] target

由于focus/focus命令的特殊单位,所以/focus的目标就不会被[target=focus]设置成焦点,而是target,即当前目标。如果没有指定target/focus就相当于没有参数,同样是把当前目标设为焦点。

 


IP:您无权察看 2009-8-31 8:48:51
 推荐给好友            操作  20  楼   顶端
35102/4页1234
发新贴子 回复贴子
页面运行: 1551 毫秒

Powered by 联动北方科技 人工智能技术   2008-2016 网际游航    
京ICP证号090597    京ICP备案09017624号    京公网安备110112000093号
本网站由联动北方提供人工智能领域的技术与支持
86-27-87056338  Email:webmaster@ngamebar.com