忘记Zmud从wa开始
本帖最后由 jarlyyn 于 2022-8-17 10:10 PM 编辑一直以来,群里总有人问mush怎么实现#wa,然后我会开始祥林嫂一样说wa不好用,队列好用。
正好今天群里顺口答应了实现一个,所以贴一下,让所有对wa念念不忘的人能彻底和zmud断离舍
先放代码,再解析
--
re=rex.new("([^;]+)")
cmdre=rex.new("^\\s*#(?<cmd>\\S+)( (?<param>.+)){0,1}$")
-- 命名空间
queue={}
--队列数据
queue.data={}
--最后一次发送的数据
queue.last=""
--队列是否暂停
queue.paused=false
--插入数据
queue.insert=function(data)
re:gmatch(data,function (m, t)
table.insert(queue.data,m)
end)
end
queue.try=function()
if queue.paused then
return
end
while #queue.data~=0 do
cmd=queue.data
table.remove(queue.data,1)
s,e,t=cmdre:match(cmd)
if t==nil then
queue.last=cmd
Send(cmd)
else
f=cmds]
if f==nil then
print("未知的命令"..t["cmd"])
return
end
queue.pause()
f(t["param"])
return
end
end
end
queue.send=function(data)
queue.insert(data)
queue.try()
end
queue.pause=function()
queue.paused=true
end
queue.continue=function()
queue.paused=false
queue.try()
end
queue.discard=function()
queue.data={}
end
cmds={}
cmds["wa"]=function(data)
if data then
DoAfterSpecial(data/1000,"queue.continue()",12)
end
end
cmds["t+"]=function(data)
if data then
EnableTriggerGroup(data,true)
end
queue.continue()
end
cmds["t-"]=function(data)
if data then
EnableTriggerGroup(data,false)
end
queue.continue()
end
cmds["#pause"]=function(data)
end
cmds["#continue"]=function(data)
queue.continue()
end
on_alias=function (m,l,w)
queue.send(l)
end
首先,先明确我们的需要:
[*]能依次发送一串分号分割的命令
[*]可是使用#wa xxxx毫秒数进行延迟分段发送
[*]可以使用#t+,#t-命令开关触发组
[*]可以手动暂停队列
[*]可以手动继续队列
好,开始解析代码
queue={}这个是代码的空间,我们所有的代码放在这个里,避免污染
queue.data={}这个是待发送的字符串列表,就是;分割都的命令
queue.last=""最后一次发送的命令,方便想使用这串代码的人实现,行走busy重走的功能
queue.paused=false队列是否暂停,暂停状态不发送命令。wa就是先暂停,DoAfterSpecial指定秒数后取消暂停继续
queue.pause=function()
queue.paused=true
end
queue.continue=function()
queue.paused=false
queue.try()
end
queue.discard=function()
queue.data={}
end
这三个是控制命令,可以暂停/取消暂停/清空队列
代码核心部分开始了
re=rex.new("([^;]+)")用来分割分号的正则
cmdre=rex.new("^\\s*#(?<cmd>\\S+)( (?<param>.+)){0,1}$")
用来匹配 #xxx xxxxx 形式指令的正则,方便起见,我用了个捕获组,就不用数括号了
queue.insert=function(data)
re:gmatch(data,function (m, t)
table.insert(queue.data,m)
end)
end
将指令分割后插入队列
queue.send=function(data)
queue.insert(data)
queue.try()
end发送指令,先插入后尝试发送
queue.try=function()
if queue.paused then
return
end
while #queue.data~=0 do
cmd=queue.data
table.remove(queue.data,1)
s,e,t=cmdre:match(cmd)
if t==nil then
queue.last=cmd
Send(cmd)
else
f=cmds]
if f==nil then
print("未知的命令"..t["cmd"])
return
end
queue.pause()
f(t["param"])
return
end
end
end
核心命令,具体来说,就是
如果队列暂停了就退出
当队列不为空时不停弹出第一个指令
如果指令不是#开头的指令,则直接发送
如果是#开头的指令,就先暂停队列,由注册的指令继续后续处理。
本帖最后由 jarlyyn 于 2022-8-17 10:39 PM 编辑
cmds={}
cmds["wa"]=function(data)
if data then
DoAfterSpecial(data/1000,"queue.continue()",12)
end
end
cmds["t+"]=function(data)
if data then
EnableTriggerGroup(data,true)
end
queue.continue()
end
cmds["t-"]=function(data)
if data then
EnableTriggerGroup(data,false)
end
queue.continue()
end
cmds["pause"]=function(data)
end
cmds["continue"]=function(data)
queue.continue()
end
on_alias=function (m,l,w)
queue.send(l)
end
注册的指令。
和明显,wa就是DAS一个continue
#t+ #t-就是开/关处罚组后continue
如果你想新定义命令,就加在这里,注意continue即可
过于玄幻,mark一下不明觉厉 jarlyyn 发表于 2022-8-17 10:05 PM
注册的指令。
和明显,wa就是DAS一个continue
现在可以测试了(记得关掉换行符)
queue.send("hi;#wa 2500;kok")
看看是不是你要的效果
更骚一点就是加一个别名
代码:
on_alias=function (m,l,w)
queue.send(l)
end
别名:
至少再我的客户端里,可以直接 hi;#wa 2500;kok,实现类似zmud的效果了
结束……
发帖子比写代码时间还长…… Send换成Execute会好点吗 mimikami 发表于 2022-8-17 10:11 PM
Send换成Execute会好点吗
会
主要为了我最后用了个别名的骚操作,用Execute会循环调用
不然Execute比较好
页:
[1]
2