Mushclient中wait.lua模块的扩展(更新版)
本帖最后由 hasea 于 2014-1-20 08:38 PM 编辑内容为上次(http://pkuxkx.net/forum/thread-36660-1-1.html)发出的模块更新版本。
这几天在写脚本,感到一些不方便的地方。昨晚在论坛讨论多行触发时,发现当多行触发和单行触发同时存在,会存在一些问题,虽然可以解决,但看起来很丑且复杂。比如下面这个:
在匹配单行的时候,一定要等下一行出现数据才会返回。这个是很让人难受的。当然你可以用好几行代码来避免这个问题!
我决定重新构建一种更简便的方法。
对于脚本来说,简洁优雅是我们一向的追求。
1、增加一个等待多个触发器返回的函数。用法如下:
以上函数将创建一个单行触发器,一个2行的多行触发器,一个定时器,一个协程对象。
这个与上例的比较好像差别不太,看起来还更多代码。但注意上面那个是有bug的,除非你能忍受。
这个函数的作用是不会再尝试对一行的正则匹配取两行数据。
注意上个版本在wait.regexp中使用table,只是为了看代码更加清晰。会把几个正则字符串合并为(字符串1|字符串2|字符串3)这种样式。这有很多限制。
2、把协程包装为一种更加简单的暂停机制使用。以便在需要的时候能够中断函数中的流程。用法如下:
这在mud遇到图片或是什么特殊情况,想来还是很好用的!!
注意在子线程中不能使用此函数来暂停,这样将会产生严重的错误。由于子线程一般没有需要暂停的情况,这好像是不实用的。所以没有为子线程增加暂停和唤醒函数了。
3、下面对模块中的所有函数做一下说明。
wait.time(seconds)旧模块函数
wait.regexp (regexp, timeout, flags,multi, multi_lines)旧模块函数,修改支持多行
wait.match (match, timeout, flags)旧模块函数
wait.make (f)旧模块函数
wait.mulregexp (regexps, timeout, flags)新增加函数。允许多行多触发器
wait.pause (sign)新增加函数。暂停函数进程
wait.wake (sign,text)新增加函数。恢复暂停的函数进程
以下为模拟子线程的触发函数
wait.subwait:new ()新增加函数。新建子线程
wait.subwait:close ()新增加函数。关闭子线程
wait.subwait:time (seconds)新增加函数。子线程中定时等待
wait.subwait:regexp (regexp, timeout,flags, multi, multi_lines)新增加函数。子线程中的正则触发
wait.subwait:mulregexp (regexps,timeout, flags)新增加函数。子线程中的多触发器等待函数
Fix:修正2个bug。 2014.1.20
附件:
北大侠客行MUD,中国最好的MUD mush因你会更精彩!! 多谢两位北侠前辈的支持。yct6
可惜看起来用的人不多。 我是进来顶楼主的~
虽然我对单纯的机器人编写的热情已经褪得七七八八了,但楼主解决的正是曾经的我苦思而不得其的问题。我有一种可以瞑目了的赶脚,呵呵
希望时间能检验这些代码的稳定性(楼上小白鼠加油啊:)
期待楼主的更多创意 mush因你会更精彩!!
emyt 发表于 2013-12-10 11:58 AM http://pkuxkx.net/forum/images/common/back.gif
静静真是爱学习呀。 请教flags,multi, multi_lines 的意思和用法呀。 本帖最后由 hasea 于 2013-12-18 07:47 PM 编辑
回复 10# qdz
flags:和原来wait.regexp函数第3个参数一样的参数。用来表示触发器的功能特性的一个标识组合。具体应该看mushclient文档。和mushclient中的AddTriggerEx函数第三个参数的取值是相同的。一般默认为nil即可。
multi:是否启用多行触发。默认为false。
multi_lines: 多行触发的行数。 回复 11# hasea
收到,谢谢。 本帖最后由 kaillera 于 2014-8-28 11:36 PM 编辑
为啥我按照例子代码执行的时候会提示“attempt to index field 'subwait' (a nil value)”这样的错误,已经require "wait"了,mush版本4.90function subthread()
local st=wait.subwait:new()
wait.make(function()
while true do
print("-----sub-----")
st:time(2)
end
end)
return st
end
function mainfun()
wait.make(function()
local st=subthread()
for i = 1,5 do
print("-----main----")
wait.time(2)
end--for
st:close()
print("-----close-----")
end)
end 试了一下用这个替代系统的wait会导致奔溃
页:
[1]
2