jarlyyn 发表于 2022-8-17 21:49:47

忘记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

jarlyyn 发表于 2022-8-17 21:51:52

首先,先明确我们的需要:


[*]能依次发送一串分号分割的命令
[*]可是使用#wa xxxx毫秒数进行延迟分段发送
[*]可以使用#t+,#t-命令开关触发组
[*]可以手动暂停队列
[*]可以手动继续队列

jarlyyn 发表于 2022-8-17 21:57:52

好,开始解析代码

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
这三个是控制命令,可以暂停/取消暂停/清空队列

jarlyyn 发表于 2022-8-17 22:03:30

代码核心部分开始了

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 22:05:24

本帖最后由 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即可

luoeric 发表于 2022-8-17 22:07:22

过于玄幻,mark一下不明觉厉

jarlyyn 发表于 2022-8-17 22:09:38

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的效果了

jarlyyn 发表于 2022-8-17 22:10:57

结束……
发帖子比写代码时间还长……

mimikami 发表于 2022-8-17 22:11:21

Send换成Execute会好点吗

jarlyyn 发表于 2022-8-17 22:12:26

mimikami 发表于 2022-8-17 10:11 PM
Send换成Execute会好点吗



主要为了我最后用了个别名的骚操作,用Execute会循环调用

不然Execute比较好
页: [1] 2
查看完整版本: 忘记Zmud从wa开始