找回密码
 注册
搜索
查看: 13895|回复: 67

非猿类mush lua教学贴(简单应用)

[复制链接]
门派:天龙寺
发表于 2017-4-5 23:35:57 | 显示全部楼层 |阅读模式
本帖最后由 modman@tj 于 2017-4-6 00:18 编辑

玩了这么久的mud,一直以来都是用的zmud,当年也为了机器人折腾了好久。
直到sjever这里,开始在ptbx和faint大神的领导下,转用mush。
由于工作和兴趣的关系,虽然不是猿类,但也对VBA和Lisp语言有一定了解,迷茫了一阵子之后,总算对lua稍有了解。
看到很多人对mush有点儿畏惧的感觉,就大致写一下自己的理解,尽可能用白话写清楚。

很多东西其实目前也不能完全搞定,论坛里大神其实也很多,我写这个也就是起个抛砖引玉的作用。
会编Zmud机器人的应该都可以搞定mush的。

预计需要2~3天写完,请大家暂时不要回复。。。。给我留着楼层

评分

2

查看全部评分

门派:古墓派
发表于 2017-4-7 14:02:28 | 显示全部楼层
modman@tj 发表于 2017-4-6 00:04
首先,做些准备工作

我这些日子用下来,觉得mush比zmud舒服的地方就是,改东西的时候,有个好用的编辑器 ...

请用luaeditor6.20非常好用。而且是绿色版
门派:天龙寺
 楼主| 发表于 2017-4-7 00:55:49 | 显示全部楼层
二、说一下触发器的设置
以送信的lua里面一段为例:
  1.     DeleteTriggerGroup("songxin2_check")
  2.     DeleteTriggerGroup("songxin2_killer")
  3.     create_trigger_t('songxin_ask1',"^>*\\s*你向褚万里打听",'','songxin_ask')
  4.     create_trigger_t('songxin_ask2',"^>*\\s*这里没有这个人。$",'','songxin_nobody')
  5.     SetTriggerOption("songxin_ask1","group","songxin_ask")
  6.     SetTriggerOption("songxin_ask2","group","songxin_ask")
  7.     EnableTriggerGroup("songxin_ask",false)   
复制代码

这里面DeleteTriggerGroup就是删掉括号里那个分组的触发器,
create_trigger_t是创建触发器的一个子程序,不需要理解太多,照着已有的格式就可以
songxin_ask1,songxin_ask2 这个是触发器的名称,根据自己的需要写上就行1、2、3...一直排下去
然后是触发内容。上面说过怎么写了
最后的songxin_ask  songxin_nobody就是调用这两个子程序,比如songxin_ask,在编辑器里面搜索一下,就能找到
  1. function songxin_ask()
  2.     EnableTriggerGroup("songxin_ask",false)
  3.     EnableTriggerGroup("songxin_accept",true)
  4. end
复制代码

SetTriggerOption("songxin_ask1","group","songxin_ask") 这个呢,就是把已经命名的触发器分组到songxin_ask里面
这里有个小技巧,和fqyy学的。如果一大堆的触发器放在一个组里
可以写成:
  1. for i=1,2 do SetTriggerOption("songxin_ask"..i,"group","songxin_ask") end
复制代码

这个就是i从1循环到2,然后把"songxin_ask"..i 名称的触发器,都归到一个组里面,行数多的时候,这样写简单点儿。
比如有20句,只需要改成 for i=1,20就可以了。

我们在zmud的时候也会分组,便于开、关、删除
EnableTriggerGroup("songxin_ask",false) 这个就是关掉这个组,EnableTriggerGroup("songxin_ask",true)就是打开
也可以单独开关分组中的其中一个触发器
EnableTrigger("songxin_killer1",true) 或者 EnableTrigger("songxin_killer1",false)

就和Zmud中的 #t+ #t-用法一样
门派:天龙寺
 楼主| 发表于 2017-4-6 00:04:11 | 显示全部楼层
首先,做些准备工作

我这些日子用下来,觉得mush比zmud舒服的地方就是,改东西的时候,有个好用的编辑器
能够用颜色区分语句,变量什么的。行号也都清楚不像Zmud改起来其实很累人。

所以,需要准备一个编辑器,比如Editplus,sublime,Vim。。。猿类们常用的编辑器有好多,随便找一个就行。
门派:天龙寺
 楼主| 发表于 2017-4-6 00:05:48 | 显示全部楼层
一、lua的一些基础知识
1、function
  1. function xxx()
  2. .....
  3. end
复制代码

这个东西,可以叫函数,其实我还是习惯按basic的习惯叫成子程序;每个lua都是由一大堆的子程序构成的
随时可以调用。 记得一定要有end结尾。
2、变量
和zmud的变量含义是一样的,储存我们的一些常用数据,比如身高、体重、三围之类的。也可以做成开关(0 或者 1)
如果变量前面没有加local,那么所有的lua里面都可以读取这个变量的值,
加了local的,就只能在function里面读取,属于本子程序内部的变量。
3、注释
一句话前面加上 -- 这句话就不起作用了,用来自己记一点儿东西,比如修改时间什么的。或者屏蔽掉部分可能没用的语句
如果想屏蔽一大段就是:       --[[          xxxxxxxxx         ]]
在方括号中间的全部会被屏蔽掉。
4、比较运算符
<                >                <=                >=                ==                ~=  前面的不用说大家都知道,注意的是 ==是等于,~=是不等于
这个在if条件判断里面用,和zmud有一点区别。
门派:天龙寺
 楼主| 发表于 2017-4-6 00:15:27 | 显示全部楼层
5、逻辑运算符
and or not 比较简单,与或非。 false 和 nil 的值为假,其他的为真
这个比Zmud的逻辑判断功能要强大多了
比如可以写成:
  1. if (a>6 and b==5) or (a<1 and b<4) and c==3   then
  2. ....
  3. end
复制代码

括号配好对,可以写一大长串。Zmud写起来真没这个轻松。

真假判断可以看下面的例子:
print(not nil)                        --> true
print(not false)                        --> true
print(not 0)                        --> false
print(not not nil)                        --> false
这个用来做一些开关的。先看懂再说。
门派:天龙寺
 楼主| 发表于 2017-4-6 00:22:38 | 显示全部楼层
6、连接运算符
很简单,就是两个点 ..
比如:
  1. exe('jifa force '.. perform.force)
复制代码

这里面perform.force 是自己的内功。以天龙寺来说,这个话的意思就是执行: jifa force kurong-changong

再比如:
  1. exe('cun '.. l_cnt ..' cash')
复制代码

这个就是执行 cun xxx cash,   l_cnt是cash的数量变量
门派:天龙寺
 楼主| 发表于 2017-4-6 00:33:38 | 显示全部楼层
本帖最后由 modman@tj 于 2017-4-6 00:53 编辑

7、引号和括号
引号中的东西代表字符串,用单引号、双引号都一样,但如果嵌套,就要区分单引号和双引号
比如:
'壹仟两银票' 和 “壹仟两银票” 是一样的;但是   '100' 和100是不一样的。 '100'是字符串,100是数字。
  1. '^(> )*你把 "ppp1" 设定为 "\\D*;perform\\s*(\\D*)\\s*" 成功完成。'
复制代码

这个里面就区分了单引号和双引号。可以想象成大中小括号的关系,有头有尾就可以。

括号,一个是用在调用function的时候,还有一个就是触发器里面,这点和Zmud很相似
比如Zmud的触发器里面: ^·食物·(*).*~%(%s)·潜能·(*)/(*)
带括号的可以提取出来,不带括号的就不能提取

mush里面提取用可以看下面的例子
  1. create_trigger_t('ypt_catch_id','^>*\\s*西夏一品堂\\s*武士\\s*(\\D*)\\s*\\((\\D*)\\)\\n这是西夏一品堂从江湖上重金招聘的一名武林高手。\\n此人看上去师承\\D*,擅长使用(\\D*)伤敌!','','ypt_check_skills')
  2. function ypt_check_skills(n,l,w)
  3. sxjob.id1=string.lower(w[2])
复制代码

一品堂武士的id是第二个括号里面的,所以是w[2] 他的名字就是w[1]其他的类似。string.lower是其他lua里面写好的子程序,用来把所有的字母都改成小写。
门派:天龙寺
 楼主| 发表于 2017-4-6 00:45:48 | 显示全部楼层
本帖最后由 modman@tj 于 2017-4-6 00:54 编辑

8、正则表达式(就是写Zmud的时候到底用%* 还是%d 这些东西)
mush提供了完整的帮助,英文好的自己看
http://www.gammon.com.au/mushclient/regexp.htm

常用的: \n代表换行   \s 代表空格  \( 代表左括号   \)代表右括号
\D代表字符   \d代表数字。。。其实现在的触发器里面都已经有了,这个照猫画虎的做就行

把触发的语句copy到lua里面,对照着看一下,应该很容易就看懂了。
比如:
  1. create_trigger_t('ypt_fight6','^(> )*你把 "ppp1" 设定为 "\\D*;perform\\s*(\\D*)\\s*" 成功完成。','','ypt_pfm1')
  2.      --你把 "ppp1" 设定为 "bei none;bei leg;jifa parry shenlong-tuifa;unwield bishou;unwield bian;jiali max;perform zhuiming wushi" 成功完成。
复制代码


这个里面就是捕捉ppp1设定时候的文字,前面的\\D*是 bei none;bei leg;jifa parry shenlong-tuifa;unwield bishou;unwield bian;jiali max
后面括号内的\\D*是 zhuiming wushi 这个用来捕捉 perform的 ,用w[2]捕捉到 zhuiming wushi
然后就可以执行 exe('perform '..w[2]),这样做到后面只发perform zhuiming wushi 不会不停的bei 啊,jifa 啊。



写累了,今天先到这里。。。
门派:不明
发表于 2017-4-6 09:20:27 | 显示全部楼层
顶!楼主讲讲抓变量呗。比如用这个做例子:做一个emote查询函数。从头到尾讲下来,基本上什么都涉及到了
门派:姑苏慕容
发表于 2017-4-6 18:41:28 | 显示全部楼层
学习了,看的懂,不想搞
门派:不明
发表于 2017-4-6 18:43:32 | 显示全部楼层
让磨得慢大神写完,别插楼啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|书剑永恒MUD ( 闽ICP备14012032号|闽公网安备 35050202000162号 )

GMT+8, 2025-6-6 12:31 , Processed in 0.050000 second(s), 34 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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