7.1 #wa命令
#wa是#wait的缩写,用来延迟一个命令的执行.
用法一:延迟的具体时间以毫秒为单位指定.
比如{#wa 2000;hp}作用是2秒后发送hp这个命令
#wa后面可以指定具体数字,也可以指定一个变量,用变量来控制等待的时间。
前面章节中多次使用这种用法.#wa命令太重要了,如果没有#wa,任何命令都是立即发送,容易造成机器人发狂.另外有些命令执行完毕之后人物处于busy状态,用#wa命令来度过busy时间,#wa的时间设置应该保守一些,一般大于busy时间.
用法二:不指定时间,#wa单独使用
实例一:{study book for 1;hp;#wa;exert regenerate}
在zmud 462和555两个版本中,运行结果为
> study book for 1
hp
你的「基本剑法」进步了!
exert regenerate
你从身上拿出一本华山剑谱准备好好研读。
你研读了一次有关基本剑法的技巧,似乎有点心得。
> ≡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━≡
【 精神 】 110 / 130 [100%] 【 精力 】 0 / 0 (+ 0)
【 气血 】 48 / 97 [ 80%] 【 内力 】 0 / 0 (+ 0)
【 食物 】 0 / 300 [饥饿] 【 潜能 】 234901
【 饮水 】 0 / 300 [饥渴] 【 经验 】 75643
≡━━━━━━━━━━━━━━━━━━━━━━━◎北大侠客行◎━━≡
> 你略一凝神,精神看起来好多了。
study book for 1;hp;#wa3个命令同时发送执行,然后等待命令执行的结果,但是只等待一行信息,接着发送exert regenerate这个命令。#wa后面的命令得不到hp的信息,如果想让#wa后面的命令对内力气血进行判断,数一下上面的行数,至少需要连续6次#wa,而且会被中途输出的其他信息干扰,实用性为0。使用462和555版本的可以忘记这个用法。需要用其他方法来替代这个用法,最简单的就是tell自己的id,然后用tell的信息做触发。
在zmud721中运行结果为
> study book for 1
hp
你的「基本剑法」进步了!
你从身上拿出一本华山剑谱准备好好研读。
你研读了一次有关基本剑法的技巧,似乎有点心得。
> ≡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━≡
【 精神 】 110 / 130 [100%] 【 精力 】 0 / 0 (+ 0)
【 气血 】 48 / 97 [ 80%] 【 内力 】 0 / 0 (+ 0)
【 食物 】 0 / 300 [饥饿] 【 潜能 】 234901
【 饮水 】 0 / 300 [饥渴] 【 经验 】 75643
≡━━━━━━━━━━━━━━━━━━━━━━━◎北大侠客行◎━━≡
exert regenerate
> 你略一凝神,精神看起来好多了。
具有比较高的实用性了。不同版本的差异请多多体会。
注意事项:#wa为单线流程,多个#wa同时执行时,后面的会替代前面。
试验A:在命令行里输入#wa 10000;hp,然后输入#wa 1,会发现hp被立刻执行了
试验B:在命令行反复输入{#wa 3000;hp}6次,每次输入的间隔小于3秒,会发现hp迟迟没有执行,当你停止输入时,3秒后会同时执行6次hp
请大家自行体会,做机器人时应该尽量避免多个#wa同时执行,另外可以重新输入#wa xxx来延长或者缩短前面已经输入的#wa命令。这个虽然是#wa命令的不足之处,但是仍然可以被我们利用。
因为#wa单线流程的特点,决定了#wa只用于简单的控制时间。
7.2 tick timer
点击菜单Actions->Tick Timer来设置tick timer,有3个要素组成:Timer Interval,Timeout Margin和Timeout Command。
举例来说,设置Timer Interval为10,Timeout Margin为2,Timeout Command为hp,点击Start之后,zmud开始循环倒计时10秒,当计时至2秒时,执行hp这个命令。
这是另外一个控制时间的工具,最大的优点是稳定,我喜欢称它为计时器。准确地倒计时,准确地执行命令,不受到机器人的影响。缺点在于一个窗口只能设置一个tick timer,一般只用在最关键的地方。
相关命令#timer on,#timer off,#ts和#tz等。
#timer on :打开tick timer
#timer off:关闭tick timer
#ts 数字: 设置Timer Interval中的值
#tz: 重置计时器的时间,让他重新开始计时
以上4个命令被用于trigger,alias中用来对tick timer进行操作.
注意:zmud 555在加载其他机器人时,不同的时间器之间会发生干扰,tick timer的3要素都会发生改变,所以建议Timeout Command中的值统一填为timer,并且新建一个alias timer来保存计时结束需要执行的命令串。
实例二:胡一刀接任务的时间间隔为10分钟,10分钟到了的时候由机器人提醒
tick timer中Timer Interval设置为600秒,Timeout Margin设置为5秒,Timeout Command设置为{#say 可以接任务了!}
#tri {胡一刀说道:『我收到消息,听说&hydaddress有盗宝人&dbrname~(&dbr~)找到了闯王宝藏的地图} {#tz}
实例三:用#wa来实现计时器的功能,这样你就拥有相当于2个计时器了。
#alias ticktimer {#wa 10000;hp;ticktimer}
如果你在命令行输入ticktimer,恭喜你,你有了另外一个计时器,每隔10秒就执行一次hp命令。如果你不修改ticktimer这个alias,它将永远不会停止,请用#alias ticktimer {}来停止这个时间器。
实例四:达摩院领悟,内力不足时回去睡觉
#alias lw {#if @sleep {d;sd;w;n;sleep} {#wa 500;lingwu sword 100;exert regenerate;lw}}
#tri {你的内力不够。} {#var sleep 1}
这个例子也可以用tick timer来实现;zmud721中也可以直接用#wa来实现;或者用下面要讲到的#alarm来实现。zmud的灵活性使得同样的事情,可以有很多种方法完成。
zmud本身提供#while命令,但是#wa和#while混合使用时会出问题,所以我一般不用#while,而是用这种自身嵌套来实现#while的功能。
上面的2个例子都用到了alias的自身嵌套,更多的用法大家可以自己创造,在高级篇中我会大量的使用自身嵌套,使用时需要注意不要造成死循环,一定要设置一个办法让它停止;否则,唉,你的zmud已经崩溃了,重启吧!
7.3 #alarm命令(重要)
实际上#alarm是创造一个alarm类型的trigger,以时间作为触发,相关命令为#untr
命令格式为#alarm hh:mm:ss {cmds}
其中hh:mm:ss为时:分:秒,时间前面可以加上"+"或者"-",hh、mm、ss前面也可以加上*或者直接用*代替,"+" "-" "*"这3个特殊字符的含义举例说明
#alarm 2:50:00 {#say 保卫时间到了}
时间前面没有+和-,以你计算机上的时间作为触发,凌晨2点50分提示保卫时间到了
#alarm -00:00 {save}
前面加了-,以你的连线时间作为触发.时间上没有指定小时,默认为任意小时,连线时间达到整点时自动save
#alarm +01:05 {cmd}
前面加个+,则建立一个一次性trigger,触发之后自动删除.并且既不以连线时间为触发,也不以计算机时间为触发,而是从建立trigger时算起,65秒之后触发
#alarm +65 {cmd}
跟上面的#alarm +01:05 {cmd}完全相同
#alarm (2|6|10|14|18|22):50:00 {#say %eval(%i+1)点保卫时间到了}
以计算机时间作为触发,并且用"|"指定了多个小时,同时用到了(),小时被保存到了临时变量%i中。
不光能在保卫时提醒,还指出了是哪个时间点的保卫。
#alarm *10:00 {save}
没有"+""-",以计算机时间作为触发。小时未指定默认为任意,分钟指定为*10意思是10的倍数,这个trigger会在计算机时间的分钟为00、10、20、30、40、50时自动save
#alarm -2:30:* {hp}
小时和分都有具体指定,秒为任意。这是一个每秒钟触发一次的trigger,但是仅在你连线时间为2个半小时的触发。事实上小时分和秒都可以设定为任意,看下面的例子
#alarm -* {hp}
每秒钟触发一次,永远不会停止,用#untr -*删除这个trigger
建议:使用这个命令太频繁,机器人里会有很多已经触发过的alarm类型的trigger,但是这些trigger并没有删除掉,建议创建这个trigger的时候,统一取一个alarm的类名,这样就可以随时用#delclass alarm来删除所有的alarm类型的trigger.
实例五:胡一刀接任务的时间间隔为10分钟,10分钟到了的时候由机器人提醒
#tri {胡一刀说道:『我收到消息,听说&hydaddress有盗宝人&dbrname~(&dbr~)找到了闯王宝藏的地图} {#alarm +600 {#say 可以接任务了!}}
实例六:保卫时间自动上线
#alarm {2|6|10|14|18|22}:50:00 {#connect;@account.zhanghao;@account.mima}
#tri {【公告天下】保卫襄阳任务全部结束} {quit;#disconnect}
其中record类型变量@account中保存有帐号密码信息
#connect连接服务器,#disconnect从服务器断开
实例七:守门结束后退出,天亮前上线
#tri {你的经验增加了*!} {#var time [1440-%ctime];#alarm +@time {#connect;@account.zhanghao;@account.mima};quit;#disconnect}
//经过大米用天色做触发统计游戏中1天的时间为24分钟,因此[1440-%ctime]就是晚上的时间
//在#alarm的时间中用到了变量,这也是zmud允许的一个用法;用变量来控制时间使得#alarm这个命令的作用大大增加,对时间的控制也更加灵活
实例八:多个tick timer并存
#alias tick1 {#alarm +40 {cmd1;tick1}}
#alias tick2 {#alarm +20 {cmd2;tick2}}
命令行输入tick1;tick2就建立了2个tick timer,分别是20秒计时和40秒计时
计时存在时输入tick1或者tick2可以重置计时,相当于#tz命令
#untr +40或者#untr +20可以删除这2个alarm类型的trigger,相当于#timer off
实例九:#tri {林震南说道:「你上次运镖太辛苦了,下去休息休息吧。」} {#alarm +5 {ask lin about job}}
这个例子曾在第二章中出现过,用的是#wa 5000,需要打开关闭触发来防止误触发
这里用#alarm,就不需要那么麻烦,无论如何也不会出现同时输入多个"ask lin about job"的情况
但是新的问题是:如果有人一直在林这里制造干扰,命令就发不出去了。所以还是有必须要打开关闭触发。
注一:#alarm是一个功能更为强大的命令,和#wa,tick timer一起构成了zmud控制时间的3柄利器。
注二:在wiki里诚三的一篇文章中也讲过#alarm这个命令,不过我认为他讲的"-"的作用不准确,而且时间中应该不允许出现小数,所以#alarm -0.5是永远也不会触发的。
注三(新增):在721中去测试#alarm发现wiki里诚三的文章讲的是正确的。由于alarm命令在721中与另2个版本差异较大,下面专门举几个例子说明下。
不管什么版本中,#alarm都是trigger,时间就是它的Pattern。
在721中,Pattern相同的#alarm +@time,后建立的不会替代先建立的。
#alarm -0.5 {};#alarm -10;#alarm -30{}
时间中用到了-号,并且小时和分都未指定,分别是每0.5秒,每10秒,每30秒触发一次,不以连线时间触发,跟#alarm +类似,但是触发之后不会删除。后建立的会替代更新掉先建立的。意味着不停的输入#alarm -5 {commands},commands永远不会执行。
#alarm -1:05 {};#alarm -2:30 {}
这2个命令跟zmud555中一样,以连线时间为触发,只触发一次。
最后的总结就是721中alarm命令很矛盾很复杂,使用时请尤其小心。更多的差异请自行试验。