触发、别名、计时器、lua——mushclient超新手向说明3
本帖最后由 creat 于 2021-3-26 07:23 PM 编辑看过前面的超新手向说明
一盏灯五个字:北大侠客行——mushclient超新手向说明1
神灯照你去战斗——mushclient超新手向说明2
对于mushclient的使用应该已经算是上手了,下面我们来学习制作机器人的基础知识。
1:触发器:触发器是机器人制作的基础,它监视服务器返回的内容。只要遇到符合规则的字符串,就会做出指定的一个或一系列动作来进行响应。比如只要看到 中央广场 就执行suicide -f这个命令。
2:别名:别名用简单易记的自定义名称来代表一个或一系列动作,比如使用 chh 这三个字母来代表eat liang
eat liang
drink jiudai
drink jiudai 这4个动作
3:定时器:也叫计时器。定时器可以按设定好的时间间隔来执行一个或一系列动作,比如每10秒执行一次suicide -f。
4:关于lua:lua是一种计算机语言,也是mushclient推荐使用的脚本语言。它小巧强大,足以应付mud中出现的各种需求
4.1:字符串:字符串是一串字符的意思。在lua中,所有的字符串都放在单引号或者双引号中,比如"eat liang"或者'drink jiudai'或者"say '神灯照我去战斗'"。
4.2:变量:一个容器,容器里的内容会根据需要发生变化,比如act1="eat liang"这时act1的内容是吃干粮,act1='drink jiudai'这时act1的内容就变成了喝酒袋。
4.3:函数:函数是一套工具,这套工具可以是一件,也可以是很多件。使用这套工具就可以完成特定的任务。
5:正则表达式:一种触发器和别名中都需要使用的标准的表达式。如果一段文字中会出现不能确定内容的部分,就需要使用正则表达式来说明。当然还有其它功能。
基础知识大致如此,下面先看触发器。
触发器界面是这样的:
主界面:这里可以看到已建立的触发器,有两种显示方式。
一种是树状图:这种显示方式能够看到现有触发器的分组,分组名称是自己指定的,没有分组的会进入默认组(未分组)。
另一种是逐条显示:这种显示方式会把触发器逐条显示出来,每条会显示触发器的触发条件,发送内容,触发优先级,触发器名称(唯一),分组名称
树状视图:切换两种显示方式。
启用触发器:这个不用说明,通常情况下建议勾选。不勾时整个世界的触发器都不可用,机器人基本就废了。
启用触发器音乐:选上这个之后触发器内设置的音乐就可以播放了。通常不建议选它,读取音乐文件开销并不小。
过滤:没用过,不熟{:7_278:}
使用默认触发器:当全局设定中指定了触发器文件后这里可选,勾选后确定会出现提示选是并保存世界后,再次打开这个世界时所有触发器都会变成默认触发器中的内容。
我是没保存过触发器,所以这个功能我没用过,是否需要使用看个人爱好了。
查找、查找下一个:在触发器中寻找关键字。
保存:把当前所有的触发器保存成mct格式的文件。
载入:读取一个mct文件,选是替换触发器的全部内容,选否则把mct中的触发器加入触发器列表,如果出现重名则会添加失败。
上移、下移:把选定触发器的显示位置上/下移到顶端或原位。(没用)
复制:把选定的触发器内容复制进内存。粘贴:当内存中有符合触发器规则的内容时粘贴选项会被点亮。点粘贴会在触发器中加入所复制的触发器,重名会引起失败。
编辑:编辑一个触发器。
删除:删除选定的触发器,树形结构中可以删除一个或一组,非树形结构中支持多选。
添加:新建一个触发器,添加和编辑的界面是相同的。我们先了解用途,看图说话:
这里必须说明:一定要勾选正则表达式!!否则会出现触发不能得情况
匹配:这里是触发器是否能正常运行的核心位置,从服务器返回的字符串只要符合匹配栏的规则触发器就会发动。
匹配下面的...:点这个可以得到一个大一些的编辑框,用来编辑匹配栏的信息,内容较多的时候会用到。
转换为正则表达式:点这里会把匹配栏中的内容按整句进行正则表达式的转换,加入开头符号:^,结尾符号:$,在需要的位置还会加入转义符:\,还会勾选正则表达式选项。
样式:用于颜色触发中文字的前景色,可选内容有9个。选择后只有匹配栏中的所有的文字都是这个前景色才会触发。
文本:用于颜色触发中文字的背景色,可选内容有9个。选择后只有匹配栏中的所有的文字都是这个背景色才会触发。
以上的颜色具体是什么是在ansi配色方案里设定的,并非所见即所得的颜色。
粗体、斜体、反转:触发栏中字体的状态,有三种情况,分别是灰色:匹配所有字体;黑色:只匹配该字体;白色:不匹配该字体。
发送:发送栏中的内容,会在触发器被触发时执行。
发送下面的...:编辑发送栏的内容
发送:
一共15个选项,编号从0开始到14截止。
world:直接发送给服务器。
command:发送到命令窗口。
output:发送到显示窗口,效果相当于print函数。
status:发送到status栏,在Info栏的下面。
notepad(new):发送到一个新的记事本。(会切换当前窗口到后台)
notepad(append):追加进记事本,如果没有记事本窗口则新开一个(后台窗口)。
log file:发送到日志文件。
notepad(replace):发送给记事本,并更新记事本的内容,如果没有记事本就新开一个(后台窗口)。
world(speedwalk delay):发送到命令队列中,队列的延迟速度取决于快速行走的延迟速度设定。
variable:发送到指定的mush变量,当选择这个发送方式的时候n/a会变为变量,在这里指定mush变量名。
execute:发送给命令解析器,用法和命令行相同
speedwalk:发送到快速行走,命令格式必须符合快速行走的格式
script:发送给脚本。
world(immediate):立即发送给服务器(插队)。
script(after omit):作用和script基本相同,区别在哪里?暂时没有搞懂
排序号:触发器的优先级,决定了多个匹配规则重复的触发器哪个优先触发。这里支持0-10000之间的整数,数值小得优先。
复制通配符到剪贴板:可以把取值的通配符内容复制进内存,用ctrl+v可以粘贴,这里的取值范围是从%1-%10,再多就不可以了
名称:触发器的名字,主要用于对触发器进行单独的函数操作。
脚本:这里可以填写一个自定义函数。
组:触发器的组名,主要用于统一的函数操作。
n/a:只有在发送到variable的时候这里会变成变量,用于填写mush变量名。
改变颜色和样式为:这里可以改变匹配项的字体和字色
音乐浏览:选定一个音频文件用于触发时播放,支持格式有wav、mid、rmi。
测试:测试选择的音频文件。
不播放音乐:取消选择的音频文件。
仅在窗口未激活时播放:勾选后当mushclient为后台窗口的时候播放音乐,为当前窗口时触发不播放。
下面是勾选项目,这里说明勾选后的效果。
启用:使用这个触发器。
不区分大小写:匹配英文字母不区分大小写。
不记录:不记录进日志文件。
不显示:不显示触发行直接执行动作。
保持有效性:允许匹配行被多个触发器按优先级触发。(一般情况下同一个匹配项只会触发一个触发器。)
正则表达式:匹配行使用正则表达式。(一定要勾这个)
允许一行多次匹配:可以在一行之内匹配同一个句型多次,但是只按一次触发运行
展开变量:这里允许匹配项中使用mush变量的形式来触发。
临时触发器:标记为临时触发器,这种触发器会被DeleteTemporaryTriggers函数批量删除。
多行匹配:匹配指定行数,只有所有行都符合规则时才会触发。
通配符内容转换为小写:把通配符(代表不确定内容的特殊符号的总称,mushclient中通常是正则表达式)匹配的字母全部转化为小写。注意!这个转换只在发送项有效。使用脚本时是无效的。
仅触发一次:一次性触发器,触发后这个触发器就被删除了。
下面是右下角的显示项内容
matches:这个触发器被触发了几次,如果是0则说明触发器没有被触发过,也就是匹配规则有问题的意思。
sec:这个触发器消耗了多少时间。
calls:调用了多少次脚本,这里指的是脚本项。
确定:确认对触发器的更改。
取消:本次对触发器的所有更改作废。
帮助:打开关于触发器的帮助文件。
至此,触发器的基本内容已经都说完了。这里只是浅显的说明了一下,后面再说到触发器的时候将结合实例进行较深入的讲解。
此楼完结
撒花 本帖最后由 creat 于 2017-6-21 01:57 AM 编辑
别名:别名用简单易记的自定义名称来代表一个或一系列动作
上图
这就是alias(别名)的界面
主界面:这里可以看到已建立的别名,有两种显示方式。
一种是树状图:这种显示方式能够看到现有别名的分组,分组名称是自己指定的,没有分组的会进入默认组(未分组)。
另一种是逐条显示:这种显示方式会把别名逐条显示出来,每条会显示别名的别名,顺序,发送内容,别名名称(唯一),分组名称
树状视图:切换两种显示方式。
启用别名:这个不用说明,通常情况下建议勾选。不勾时整个世界的别名都不可用。
过滤:没用过,不熟
使用默认别名:当全局设定中指定了别名文件后这里可选,勾选后确定会出现提示选是并保存世界后,再次打开这个世界时所有别名都会变成默认别名中的内容。
查找、查找下一个:在别名中寻找关键字。
保存:把当前所有的别名保存成mca格式的文件。
载入:读取一个mca文件,选是替换别名的全部内容,选否则把mca中的别名加入别名列表,如果出现重名则会添加失败。
上移、下移:把选定别名的显示位置上/下移到顶端或原位。(没用)
复制:把选定的别名内容复制进内存。粘贴:当内存中有符合别名规则的内容时粘贴选项会被点亮。点粘贴会在别名中加入所复制的别名,重名会引起失败。
编辑:编辑一个别名。
删除:删除选定的别名,树形结构中可以删除一个或一组,非树形结构中支持多选。
添加:新建一个别名,添加和编辑的界面是相同的。我们先了解用途,看图说话:
上图是一个开关一组触发器的别名,具体内容暂时先不管它。
正则表达式依然推荐勾选,有非常大的好处。
别名和...:编辑别名的内容,这里要用能记得住得,方便使用的字符串,比如:s-f。
发送:这里是别名对应发送的内容,也就是在命令窗口输入s-f的时候客户端实际上应该执行的动作。
发送下面的...:编辑发送栏的内容
反转快速行走路径:当发送栏的内容符合speedwalk规则,且发送给speedwalk的时候这里可用,点击直接反转路径,也就是生成反向路经。
发送给:这里有14个项目。
world:直接发送给服务器。
command:发送到命令窗口。(这里有一些限制,比如:如果正在使用命令窗口,则会替换失败)
output:发送到显示窗口,效果相当于print函数。
status:发送到status栏,在Info栏的下面。
notepad(new):发送到一个新的记事本。(会切换当前窗口到后台)
notepad(append):追加进记事本,如果没有记事本窗口则新开一个(后台窗口)。
log file:发送到日志文件。
notepad(replace):发送给记事本,并更新记事本的内容,如果没有记事本就新开一个(后台窗口)。
world(speedwalk delay):发送到命令队列中,队列的延迟速度取决于快速行走的延迟速度设定。
variable:发送到指定的mush变量,在变量栏中指定mush变量名。
execute:发送给命令解析器,用法和命令行相同
speedwalk:发送到快速行走,命令格式必须符合快速行走的格式
script:发送给脚本。
world(immediate):立即发送给服务器(插队)。
排序号:别名的优先级,决定了多个别名重复的别名哪个优先作用。这里支持0-10000之间的整数,数值小得优先。
名称:别名的名字,主要用于对别名进行单独的函数操作。
脚本:这里可以填写一个自定义函数。
组:别名的组名,主要用于统一的函数操作。
变量:用于填写mush变量名。
下面是勾选项目,这里说明勾选后的效果。
启用:使用这个别名。
不记录到记录文件中:不记录进日志文件。不区分大小写:输入别名的英文字母不区分大小写。
正则表达式:匹配行使用正则表达式。(推荐勾这个)展开变量:这里允许发送栏中使用mush变量。
不显示发送的命令:如果发送给服务器,则不显示别名所发送的命令内容。
临时别名:标记为临时别名,这种别名会被DeleteTemporaryAliases函数批量删除。
保持有效性:允许匹配行被多个别名按优先级激活。(一般情况下输入一次别名只会激活一个别名。)
显示匹配的内容:理论上会显示具体使用了哪个别名。(实际上么……)
不保存到命令记录中:别名发送的内容不存入命令记录。
添加到菜单:这个选项只有别名有名称得时候才会亮,勾选之后在输出窗口或者命令窗口按ctrl+鼠标左键可以找到这个别名,点击可执行。
仅适用一次:用过之后别名就被删除。
下面是右下角的显示项内容
matches:这个别名被激活了几次,如果是0则说明别名没有被激活过,也就是别名的命名规则有问题的意思。
calls:调用了多少次脚本,这里指的是脚本项。
确定:确认对别名的更改。
取消:本次对别名的所有更改作废。
帮助:打开关于别名的帮助文件。
至此,别名的基本内容已经都说完了。这里只是浅显的说明了一下,后面再说到别名的时候可能会结合实例进行较深入的讲解。
此楼完结
撒花 本帖最后由 creat 于 2017-6-21 02:00 AM 编辑
计时器:定时器可以按设定好的时间间隔来执行一个或一系列动作。
主界面:这里可以看到已建立的定时器,有两种显示方式。
一种是树状图:这种显示方式能够看到现有定时器的分组,分组名称是自己指定的,没有分组的会进入默认组(未分组)。
另一种是逐条显示:这种显示方式会把定时器逐条显示出来,每条会显示定时器的类型,时间,发送内容,定时器名称(唯一),分组名称,距离下次发动还剩多少时间(非实时,按打开定时器界面算)
树状视图:切换两种显示方式。
启用定时器:这个不用说明,通常情况下建议勾选。不勾时整个世界的和时间相关的功能都不可用。
过滤:没用过,不熟
使用默认定时器:当全局设定中指定了定时器文件后这里可选,勾选后确定会出现提示选是并保存世界后,再次打开这个世界时所有定时器都会变成默认定时器中的内容。
查找、查找下一个:在定时器中寻找关键字。
保存:把当前所有的定时器保存成mci格式的文件。
载入:读取一个mci文件,选是替换定时器的全部内容,选否则把mci中的定时器加入定时器列表,如果出现重名则会添加失败。
上移、下移:把选定定时器的显示位置上/下移到顶端或原位。(没用)
复制:把选定的定时器内容复制进内存。粘贴:当内存中有符合定时器规则的内容时粘贴选项会被点亮。点粘贴会在定时器中加入所复制的定时器,重名会引起失败。
重置所有定时器:所有已存在的定时器都恢复到第一次运行前的状态。
编辑:编辑一个定时器。
删除:删除选定的定时器,树形结构中可以删除一个或一组,非树形结构中支持多选。
添加:新建一个定时器,添加和编辑的界面是相同的。我们先了解用途,看图说话:
间隔时间:定时器发动的频率,可以精确到0.1秒。
偏差:偏差值必须小于间隔时间,定时器重置后第一次发动的时间是间隔时间-偏差。
时间点:在指定的本地时间发动定时器。(类似闹钟的意思)
发送:这里是定时器对应发送的内容。
发送下面的...:编辑发送栏的内容
发送给:这里有14个项目。
world:直接发送给服务器。
command:发送到命令窗口。(这里有一些限制,比如:如果正在使用命令窗口,则会替换失败)
output:发送到显示窗口,效果相当于print函数。
status:发送到status栏,在Info栏的下面。
notepad(new):发送到一个新的记事本。(会切换当前窗口到后台)
notepad(append):追加进记事本,如果没有记事本窗口则新开一个(后台窗口)。
log file:发送到日志文件。
notepad(replace):发送给记事本,并更新记事本的内容,如果没有记事本就新开一个(后台窗口)。
world(speedwalk delay):发送到命令队列中,队列的延迟速度取决于快速行走的延迟速度设定。
variable:发送到指定的mush变量,在变量栏中指定mush变量名。
execute:发送给命令解析器,用法和命令行相同
speedwalk:发送到快速行走,命令格式必须符合快速行走的格式
script:发送给脚本。
world(immediate):立即发送给服务器(插队)。
名称:定时器的名字,主要用于对定时器进行单独的函数操作。
脚本:这里可以填写一个自定义函数。
组:定时器的组名,主要用于统一的函数操作。
变量:用于填写mush变量名。
下面是勾选项目,这里说明勾选后的效果。
启用:使用这个定时器。
仅触发一次:发动一次就删除该定时器。
临时定时器:标记为临时定时器,这种定时器会被DeleteTemporaryTimers函数批量删除。
断线仍然有效:断线时定时器依然发动。
不显示发送的命令:如果发送给服务器,则不显示定时器所发送的命令内容。
不记录到记录文件中:不记录进日志文件。
下面是右下角的显示项内容
matches:这个定时器发动了几次。
calls:调用了多少次脚本,这里指的是脚本项。
确定:确认对定时器的更改。
取消:本次对定时器的所有更改作废。
帮助:打开关于定时器的帮助文件。
至此,定时器的基本内容已经都说完了。这里只是浅显的说明了一下,后面再说到定时器的时候可能会结合实例进行较深入的讲解。
此楼完结
撒花 本帖最后由 creat 于 2017-8-22 06:40 AM 编辑
机器人就是用机器代替人去做那些需要机械性重复的工作。
而mud客户端机器化的原理大致是:建立触发器来监视服务器返回的消息-〉发现符合匹配规则的消息-〉成功触发执行指定的动作
现在我们来实践一下简单机器人的做法:通过触发器学习功夫
话说,进入游戏后第一个需要机器人的地方可能就是绿柳山庄和武师学功夫那里了。
我们就从这里开始
当我们输入xue wushi for force 1的时候,会得到这样的两条消息
第一条信息无论学习是否成功都会出现,所以不适合我们这个机器人的制作。
看第二条:这句话表示学习成功了。符合我们要的条件:一句话只代表一个意思。
建立触发器之前要做准备工作:复制出我们需要的句子。
当然,触发器的匹配项也可以手工输入进去,但是通常建议直接复制游戏中返回的语句,这样错误率比较低。
新建一个触发器,具体方法之前已经提到过了。我们主要看内容:
匹配项中输入我们刚才复制的句子,转换为正则表达式。并更改式样为前景色红色。
然后发送xue wushi for force 1到world,确定。
这时最基础,最简单的机器人已经做好了,来测试一下效果。
这个机器人的作用是这样运行的:1:从服务器收到了你听了武师的指导,似乎有些心得。
2:发送xue wushi for force 1给服务器。
这样只要学习成功就会发送同样的内容给服务器,自动学习就这样实现了。
我们只要等着学习失败就好了
从图中我们看到,学习成功了到达了5级。也就是到了上限。此时我们需要换一种功夫来学,那么修改触发器为:
反复如此当学到太乙神剑的时候,遇到了另外一句话
此时要去睡觉,因为是男id,所以睡房在西面,需要执行的动作是s
w
sleep
当遇到一句话触发需要多个命令的时候需要用到换行,把每一行的内容用换行符分开。这里和命令窗口的用法基本相同,但是因为发送给world,所以并不支持别名和各种标识符。
看图:
这里展示了效果完全相同的两种写法,区别在于一个使用了正则表达式中的\n来代替回车。
看看下面这个例子:
这里发送到了快速行走,发送的内容就必须符合快速行走的标准语法。关于快速行走有一个专门的帖子来说明,论坛搜索speed walking。
继续举例:
这里的三个例子都发送到了execute,也就是命令解析器。execute的功能和命令窗口完全一样,支持标识符和别名。
在例子中快速行走标识符设置了一个较长的字符串,主要是为了看起来方便,平时推荐设置成比较简单的符号,比如`个人并不推荐用#做为快速行走的标识符,原因就不具体说明了。
上面展示了几种去睡觉的姿势。
下面解锁高难度的姿势:
从这里开始发送的内容都是脚本命令,发送到script:脚本解析器。
第一种:
Send:这是一个函数,它的作用是把字符串直接发送给服务器。
"s\\nw\\nsleep" :这个是字符串,因为有引号。在lua中有引号的是字符串,没有引号的是变量。
\\n中第一个\的作用是转义符,用于解释\n。这里涉及的过程略为复杂,好记的方法是:如果使用\n会报错就用\\n,使用\\n报错就用\n。
另外:函数在使用时分为三个部分:
第一部分:函数名Send。
第二部分:括号(),当函数的实参有且只有一个字符串或table构造式的时候这个括号可以省略。
第三部分:括号中的实参,这个例子中"s\\nw\\nsleep"就是实参。这部分是可以省略的。
例子中没有看到括号是因为在第三部分有且只有一个字符串。这个语句的完整形式是这样的:Send ("s\\nw\\nsleep")
下面来看看上面这个例子的另一个写法:
这里使用了lua中的变量,个人非常推荐使用这种形式,写法虽然略为复杂,但是好处很多。
local act1:其中local是一个局部声明:它说明后面的变量是一个局部变量。act1是一个变量名,所谓变量可以理解成一个容器,里面装有你需要的东西,比如表、字符串、函数。
这里多说几句,lua中的变量分为三种:
全局变量:在不初始化脚本的情况下永久有效,系统开销大。
局部变量:离开作用范围之后立即失效,不论是否曾经使用过。系统开销小。
非局变量:既不是局部变量也不是全局变量,有自己的作用范围又可以用特定的方式进行全局操作。系统开销中等。
具体到例子中,这个局部变量act1的作用范围到触发器发送命令后截止,变量自动消失。
=:赋值符号,把等号右边的值赋予左边的变量。
Send (act1):把act1这个变量的内容发送给服务器。
当发送的内容是一个变量而不是一个字符串的时候,就意味着我们可以发送的内容不再是一个固定的值,这个语句的使用范围就变大了,同时维护起来变得简单。(当然在这里例子里体现不出来)。
这里用了Execute,也就是通过命令解析器来执行变量内容。它可以理解标识符、别名。开销会略大,不过感觉不太出来。
这个例子中的“快速行走模式”是自定义的快速行走标识符,发送到命令解析器后命令解析器会把标识符后面的内容交给快速行走功能来处理。
所以这是一个用脚本实现快速行走的实例。
这里需要说明一下,例子中的内容等同于下面代码:
go_sleep=function()--对全局变量go_sleep进行赋值
local act1="s;w;sleep"--声明一个局部变量act1,并赋值
Execute (act1)--把局部变量act1的内容发送个命令解析器
end--结束标志
这个例子中有一个重要的内容:函数构造式——用于构造一个自定义函数。构造式的标准写法:function (...) end。
function()可以理解为函数的开头,这里必须有一对小括号。end是对应的结尾,而括号中的...表示括号中可以定义不定数量的变量——形参。
这些变量在调用函数的同时被传送进来并赋值。
举个例子来说Execute(act1) 就是调用Execute这个函数并把act1传送给它。
这个例子中除了函数的构造式之外,和上一个例子内容是一样的。不过在实际测试后会发现不太对劲:命令并没有被执行。
这是因为实例中只是构造了一个函数但并没有调用它。
现在使用变量名+括号来调用这个函数:
下面来思考一个问题:如果在触发器中不进行函数构造式的赋值,只调用函数会发生什么情况呢??
后面的内容会缓慢增加hzi 让机器人活起来 lua的用法(可能) 本帖最后由 creat 于 2017-7-15 10:24 AM 编辑
关于搭建脚本编写/测试环境,可以使用Notepad++。下面是npp本体的下载链接
Notepad++ zip package 32-bit x86
nppexec是一个执行插件,要解压至npp的plugins目录中
然后是lua解释器,这里用的是5.34版本,不影响使用效果
插件安装完毕后会出现在npp的插件菜单中,按F6呼出执行界面
在1的位置填写以下命令:
npp_save
CD $(CURRENT_DIRECTORY)
t:\lua53\lua53.exe"$(FULL_CURRENT_PATH)"
其中 t:\lua53\lua53.exe 这部分需要按照自己的实际情况更改成lua53.exe的正确路径
如果是第一次执行,猛击2位置的save钮,起名保存成一个常用命令。以后再执行时直接在3的位置选择运行方法就可以了。
测试成功。
后续还会有缓慢更新…… 一个手动档对关于机器人相关提问的回答 本帖最后由 creat 于 2018-1-10 02:06 AM 编辑
下面是一个实例:实现了从一个world或者插件向其他world赋值。
要达到这个目标首先需要做得是把整个赋值语句转化为字符串形式用来进行传递
下面看一个把标准赋值语句转化为字符串的例子
function pv2str(name,str)
if type (str)~="function"
then str=name .. "='" .. str .. "'"
else str=name .."试图转换一个函数"
error(str)
end
return str
end
把一个表转化为字符串的函数(会舍弃表内的所有函数)
function tab2str(tname,t,str)
if type(t)=="table" then
str=str or ""
if str~="" then str= str .. "['" .. tname .."']={"
else str= str .. tname .."={" end
for i,v in pairs (t)
do if type(v)=="table"
then --str=str .. i .. "="
str=tab2str(i,v,str)
elseif type(i)=="number"
then str=str .. "[" .. i .. "]='" .. v .. "';"
elseif type (i)=="string"
then str=str .. "['" .. i .. "']='" .. v .. "';"
end
end
str=str .. "};"
return str
else
return pv2str(tname,t)
end
end
这个过程很简单name是变量名,str是字符串或者数字。如果试图转化一个函数的时候会出错。
转化完毕就需要发送给目标world
function trans2word(str,k)
local k=k or GetWorldID()
str=GetInfo(GetWorldById(k),36) .. str
Execute (GetWorldById(k),str)
end
str用于接受一个转化为字符串的赋值语句,k用来接受目标world的ID值,如果没有指定目标world,则默认是发送到当前world
GetInfo(GetWorldById(k),36)的作用是获取指定world的脚本标识符,用于执行脚本命令。
再设置一个用于执行的别名
<aliases>
<alias
script="pv2wv"
match="^pv2wv\s*(.+,.+)$
enabled="y"
group="transV"
regexp="y"
sequence="100"
>
</alias>
</aliases>
别名使用的脚本:
function pv2wv(n,l,w)
local w=w
local _,_,name=string.find(w,"(.-),")
local _,_,var=string.find(w,",(.-),")
local _,_,wid=string.find(w,".+,(.+)")
if not var then var,wid=wid end
var=_G
if not var then return print "var是空值" end
local str=tab2str(name,var)
trans2word(str,wid)
str=name .. " trans ok:"
print (str)
end 占坑2