oolong 发表于 2015-11-6 12:29:33

zmud4.62用Lua脚本写机器人

本帖最后由 oolong 于 2015-11-6 12:32 PM 编辑

刚发现,很好用。下面是资料站点,自己看,要英文水平。。。
http://forums.zuggsoft.com/forums/viewtopic.php?p=110827
http://imts.sourceforge.net/doku.php
http://rrthomas.github.io/lrexlib/manual.html#match

基本扫除了zmud的唯一缺陷。。太慢

文件我再上传一下吧

我写了几个触发,你可以测试一下:
1, haha
2, hp
3,aa
4,bb 5 12
enjoy




北大侠客行MUD,中国最好的MUD

suwuji 发表于 2015-11-6 22:02:12

zmud将更加强大了,虽然我不用它

trace 发表于 2015-11-8 11:26:16

这样为啥不直接用mush

ffdm 发表于 2015-11-17 11:27:01

楼主可否提供一些 触发的匹配符号 alias的制作写一点小教程!供广大462爱好者学习使用!

oolong 发表于 2015-11-24 07:33:50

本帖最后由 oolong 于 2015-11-28 06:12 PM 编辑

回复 4# ffdm
匹配我是用正则的,trigger alias这些可以自己写,我提供自己写的一些供你参考。
其实本人也在学习阶段。
--trigger.lua 模仿zmud的触发器#trigger

rex = require("rex_pcre") --正则匹配库

trig_rex= trig_rex or {} --触发匹配表
trig_func= trig_func or {} --触发内容执行function函数表
trig_disable= trig_disable or {} --记录触发关闭表
reset_triggers= reset_triggers or {}--每次匹配重置id,open close 表

--1)执行触发,每次接受到服务器的信息执行
mb.server_line=   function ()
      local         from_server_line = string.gsub(mb.raw_line, ".%[%d-;%d-m","") --去除颜色
                        from_server_line = string.gsub(from_server_line, ".%[%d-m","") --去除颜色
                        reset_trigger()--重置所有trigger开启关闭状态 防止操作table过程报错
      for id,_ in pairs(trig_rex) do
                local params={}
                        params,params,params,params,params,params,params,params,params=rex.match(from_server_line,trig_rex)
                if params then
                        params[-1]=from_server_line
                        trig_func(params)
                end
      end
end

--2)添加trigger
function add_trigger(id,trig_rex_string,trig_func_function)
      trig_rex=trig_rex_string;
      trig_func=trig_func_function
      trig_disable=trig_rex_string;
end

--3)删除trigger
function del_trigger(id)
      trig_rex=nil;
      trig_func=nil;
      trig_disable=nil;
end

--3)判断id是否存在trigger
function is_trigger(id)
if trig_rex then
return true
else
return false
end
end

--4)判断id是否存在trigger是否关闭状态
function is_trigger_closed(id)
if trig_disable then
return true
else
return false
end
end

--5)临时关闭trigger下次触发重置
function close_trigger(id)
      reset_triggers="close"
end

--6)临时开启trigger下次触发重置
function open_trigger(id)
      reset_triggers="open"
end

--7)重置trigger,每次触发前复位
function reset_trigger()
      for id,v in pairs(reset_triggers) do
                if v=="close" then
                        if trig_rex then
                        trig_disable=trig_rex
                end
                        trig_rex=nil;
                end
               
                if v=="open" then
                        trig_rex=trig_disable;
                end
      end
reset_triggers={}
end

--举例
--注意正则匹配的时候要多写一个转义符号\,比如(\S+) 写成(\\S+)
--[[
add_trigger("test","\^\\s*你「(哈哈哈)」(\\S+)几声。",function(params)
echo("\n"..C.x.."参数params[-1]:"..params[-1])
echo(C.x.."参数params: "..params)
echo(C.x.."参数params: "..params)
local test="haha 1+2="
local test1=1
local test2=2
local test3=test1+test2
send("say 我要发送: "..test1.." + "..test2.." = "..test3)
end)
--open_trigger("test")
--close_trigger("test")
--del_trigger("test")
]]

oolong 发表于 2015-11-24 07:36:04

本帖最后由 oolong 于 2015-11-28 06:14 PM 编辑

回复 4# ffdm

--alias.lua 模仿zmud 命令解析器#alias
var={}--变量表var["xxx"]="yyy"
alias = alias or {}--alias 表

--1)执行客户端送来指令cmd
mb.client_aliases=function(cmd)
      if var["debug"] and var["debug"]==1 then
                echo("\n"..C.y.."输入指令:"..cmd)
      end
      excute(cmd)
      return true
end

--2)增加alias
function add_alias(cmd,alias_function)
      alias=alias_function
end

--3)删除alias
function del_alias(cmd)
      alias=nil
end

--4)执行cmud
function excute_alias(cmd)
      if string.match(cmd,"(%S+)") and string.match(cmd,"(%S+)")~="" and alias then
                local i=0
                local params={"","","","","","","","","",""}
                for match in string.gmatch(cmd,"(%S+)") do
                        params=expand(match)
                        i=i+1
                end
                if alias] then
                        params[-1] = string.match(cmd,"^"..params.." (.+)")                        if params[-1] thenparams[-1]= expand(params[-1]) end
                        alias](params)
                end
      else
                if var["debug"] and var["debug"]==1 then
                        echo(C.y..cmd)
                end
                        send(expand(cmd))
      end
end

--5)分解解析alias指令by";"
function excute(cmd)
      for match in string.gmatch(cmd..";","(.-);") do
                if string.match(match,"(#%d+)%s-.+") then
                local times=string.match(match,"#(%d+)%s.+")
                local action=string.match(match,"#%d+%s(.+)")
                        for i=1,times do
                              excute_alias(action)
                        end
                else
                        excute_alias(match)
                end
      end
end

--6)展开变量by @
function expand(cmd)
      if string.match(cmd,"@(%S+)") then
                cmd=string.gsub(cmd,"@(%S+)",var)
                return cmd
      elseif string.match(cmd,"%$(%S+)") then
                cmd=string.gsub(cmd,"%$(%S+)",var)
                return cmd
      else
                return cmd
      end
end

----例子
--[[
add_alias("aa",function(params)
      var["aa"]="xixi"
      local test=params[-1] or "全部参数"
      local test2=params
      local test3=params or "参数1"
      send("say 参数0 alias: "..test2)
      send("say 参数-1全部: "..test)
      send("say 参数1第一个: "..test3)
      excute("e;@aa;w;look")
      echo("\n"..C.x.."测试alias aa完毕")
end)
]]
--定义几个alias自己用 查看trigger var alias
--listt listv lista
add_alias("listt",function(params)
      echo("\n"..C.x.."以下触发trigger")
      for k,v in pairs(trig_rex) do
                echo(C.g.."#trigger id: "..k.." == rex: "..v)
      end
      echo(C.x.."以上触发trigger")
end)
add_alias("listv",function(params)
      echo("\n"..C.x.."以下变量var")
      for k,v in pairs(var) do
                echo(C.c..'#var "'..k..'" =="'..tostring(v)..'"')
      end
      echo(C.x.."以上变量var")
end)
add_alias("lista",function(params)
      echo("\n"..C.x.."以下别名alias")
      for k,v in pairs(alias) do
                echo(C.y..'#alias "'..k..'" =="'..tostring(v)..'"')
      end
      echo(C.x.."以上别名alias")
end)

jizong 发表于 2015-11-28 20:43:58

太牛X了~~~如此的技术贴~~UP一个
看看,学习

ffdm 发表于 2015-12-6 12:58:16

可以举个例子来说明么光看代码好晕!

jizong 发表于 2015-12-9 16:39:06

这个,到底怎么用呢?如果能解决这个问题,NND,462岂不是焕发青春了?

jizong 发表于 2015-12-9 17:41:40

额,我试过了,先运行mb-core.exe
然后,zmud链接本机的127.0.0.1 1001
相当于,在zmud和服务器之间,增加了一个拦截的盒子
会把服务器发过来的东西和客户端发给服务器的东西,拦截下来
如此这般,就可以动手脚了!

确实,很不错的创意啊!
页: [1] 2
查看完整版本: zmud4.62用Lua脚本写机器人