swift 发表于 2009-3-21 18:11:52

zmud中#WA的妙用

zmud中#WA命令的妙用
不知道会玩pkuxkx多久,所以有一点体会就写出来吧。
在写zmud机器人时往往会遇到这种情况:希望立即提取某一个或一组数值(如气血值),再马上对这个数值进行判定,然后根据情况决定下一步的行动。最常见的例子就是少林跳楼涨dodge,跳下来之后必须马上决定是吸气呢还是继续跳呢还是去打坐或睡觉。对这种情况zmud的#WA命令提供了很好的解决办法。
#WA就是#WAIT的简略写法。许多人可能只知道#WA加个数值表示等待一定的时间,实际上#WA本身也可以单独用。在zmud 4.62中#WA表示等待下一行出现,在7.21版本中表示等待服务器端传输上个命令的output的结束,简单地说,就是等待提示符再次出现(在pkuxkx中提示符是>)。比如在命令输入hp;#WA;hi那么在462中显示结果为
>hp
≡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━≡
hi
【 精神 】 100   / 100    【 精力 】 0   / 0   (+   0)
【 气血 】 100   / 100    【 内力 】 0   / 0   (+   0)
【 食物 】 0   / 400    [饥饿]【 潜能 】 104                  
【 饮水 】 357   / 400    [缺水]【 经验 】 2                     
≡━━━━━━━━━━━━━━━━━━━━━━━◎北大侠客行◎━━≡
> 你双手抱拳,作了个揖道:各位英雄请了!

在721中显示的结果为
>hp
≡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━≡
【 精神 】 210   / 220    [ 64%]【 精力 】 0   / 0   (+   0)
【 气血 】 130   / 140    [ 77%]【 内力 】 0   / 1   (+   0)
【 食物 】 0   / 400    [饥饿]【 潜能 】 20032               
【 饮水 】 0   / 400    [饥渴]【 经验 】 7496                  
≡━━━━━━━━━━━━━━━━━━━━━━━◎北大侠客行◎━━≡
> hi
你双手抱拳,作了个揖道:各位英雄请了!

从上两例可以看出来,4.62中#WA是等待确定的一行,而7.21中#WA是等待服务器端把上个命令的结果完整地输出。因此我们可以利用这点来有效地提取hp数值。下面7.21里一个简单的跳楼机器人:
#ALIAS tiaolou {enter;#6 u;out}
#TRIGGER {你已稳稳地站在地上。} {#WA 2000;hp;#WA;#IF @neili>1000 and @jing>300 and @qi>450 {tiaolou} {#IF @neili>1000 {exert regenerate;exert recover;tiaolou} {exert regenerate;exert recover;dazuo 500}}
#TRIGGER {你运功完毕,深深吸了口气,站了起来。} {hp;#WA;#IF @neili>1000 and @jing>300 and @qi>450 {tiaolou} {#IF @neili>1000 {exert regenerate;exert recover;tiaolou} {exert regenerate;exert recover;dazuo 500}}

这是个相当简化的跳楼机器人,在鼓楼小院输入tiaolou即开始运行。如果是在4.62中,则上面trigger的命令中#WA被替换成4个#WA,同样也可以确保读出当前的气血内力值。

相对来说,7.21中的#WA命令更为好用,因为它不会受到干扰,比如chat或rumor频道消息。
此外,在zmud 7.21中,#WA可以有更多的用途。比如当你内力值很高的时候(如一万多),如何一口气向师傅请教几千上万次?如果手动操作,要不就输入太多的命令系统拒绝执行,要不就是等待时间过多。721中的#WA可以循环,因此可帮你实现这个功能。下面是一个简单的一口气像书生请教一千次literate的例子。
#LOOP 1000 {learn shu sheng for literate 50;#WA;exert regenerate;#WA}
这一用法还将适用于内力值很高时在少林领悟。各位可以试试自行开发。

[ 本帖最后由 swift 于 2009-3-21 10:05 PM 编辑 ]

swift 发表于 2009-3-21 18:21:35

添加到wiki里了,算是为北侠做点贡献

wellcome 发表于 2009-3-21 20:16:50

写的真不错,我以前居然不知道,好好研究一下。

swift 发表于 2009-3-21 21:58:56

补充说明一下,在cmud中已经取消了#WA命令,代之以waitfor,从适用范围来说,waitfor不如wa。在上文的例子中,跳楼仍然可以用waitfor实现,但是如何一次性输入上千个命令而不被系统踢出或拒绝执行?这个waitfor就做不到了

[ 本帖最后由 swift 于 2009-3-21 10:00 PM 编辑 ]

sure 发表于 2009-3-22 00:40:00

zmud的#wa是单线程的,即一个zmud的多个id窗口同时输入#wa是排队执行的,特烦。

swift 发表于 2009-3-22 01:20:52

原帖由 sure 于 2009-3-22 12:40 AM 发表 http://pkuxkx.net/forum/images/common/back.gif
zmud的#wa是单线程的,即一个zmud的多个id窗口同时输入#wa是排队执行的,特烦。
多个id同时大量的wa在zmud会造成巨慢,721的改进是#WA命令可以循环了,因此简化了不少程序。另外等待服务器的回馈信息,这个挺好,可以实现高效地输入大量命令。

swift 发表于 2009-3-22 01:23:49

cmud在某个版本(二点几?)之后终于也实现了多线程的wait

greney 发表于 2009-5-11 08:47:57

#ala 更妙
页: [1]
查看完整版本: zmud中#WA的妙用