北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 10694|回复: 10

zmud4.62用Lua脚本写机器人

[复制链接]
发表于 2015-11-6 12:29:33 | 显示全部楼层 |阅读模式
本帖最后由 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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-11-6 22:02:12 | 显示全部楼层
zmud将更加强大了,虽然我不用它
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-11-8 11:26:16 | 显示全部楼层
这样为啥不直接用mush
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-11-17 11:27:01 | 显示全部楼层
楼主可否提供一些 触发的匹配符号 alias的制作  写一点小教程!供广大462爱好者学习使用!
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 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[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9]=rex.match(from_server_line,trig_rex[id])
                if params[1] then
                        params[-1]=from_server_line
                        trig_func[id](params)
                end
        end
end

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

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

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

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

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

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

--7)重置trigger,每次触发前复位
function reset_trigger()
        for id,v in pairs(reset_triggers) do
                if v=="close" then
                        if trig_rex[id] then
                        trig_disable[id]=trig_rex[id]
                end
                        trig_rex[id]=nil;
                end
               
                if v=="open" then
                        trig_rex[id]=trig_disable[id];
                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[1]: "..params[1])
echo(C.x.."参数params[2]: "..params[2])
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")
]]
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 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[cmd]=alias_function
end

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

--4)执行cmud
function excute_alias(cmd)
        if string.match(cmd,"(%S+)") and string.match(cmd,"(%S+)")~="" and alias[string.match(cmd,"(%S+)")] then
                local i=0
                local params={"","","","","","","","","",""}
                for match in string.gmatch(cmd,"(%S+)") do
                        params=expand(match)
                        i=i+1
                end
                if alias[params[0]] then
                        params[-1] = string.match(cmd,"^"..params[0].." (.+)")     
                       if params[-1] then  params[-1]= expand(params[-1]) end
                        alias[params[0]](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[0]
        local test3=params[1] 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)
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-11-28 20:43:58 | 显示全部楼层
太牛X了~~~如此的技术贴~~UP一个
看看,学习
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-12-6 12:58:16 | 显示全部楼层
可以举个例子来说明么  光看代码好晕!
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-12-9 16:39:06 | 显示全部楼层
这个,到底怎么用呢?如果能解决这个问题,NND,462岂不是焕发青春了?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-12-9 17:41:40 | 显示全部楼层
额,我试过了,先运行mb-core.exe
然后,zmud链接本机的127.0.0.1 1001
相当于,在zmud和服务器之间,增加了一个拦截的盒子
会把服务器发过来的东西和客户端发给服务器的东西,拦截下来
如此这般,就可以动手脚了!

确实,很不错的创意啊!
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-24 05:49 AM , Processed in 0.010394 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表