|
本帖最后由 littleknife 于 2015-10-24 09:16 AM 编辑
****************************************************************************************
一、【一个脚本】的核心思路:
以模块化脚本框架引用方式实现机器人的集成化,使得复杂机器的编写成为可能;单一的配置文件配置MUSH的运行状态,使得配置MUSH更加简洁。
****************************************************************************************
(1)设置文件的编辑变成统一【一个脚本】,使机器的撰写更加方便。MUSH的设置文件主要包含变量、脚本、触发、Alias等,都是各自的文件,要想设置好一个机器人需要自己存储这些文件。而更换机器人就要把它们都换一遍,这里的【一个脚本走天下】其核心思路就是考虑以前用惯了zmud的用.mud文件的思路,以一个文件引用所有的东西。而脚本框架的应用则彻底不再依靠MUSH的触发、变量、alias的配置文件意思。
(2)框架所提供的整合代码的思路,使得复杂的冗长的lua代码被实质上整合到【一个脚本】里,所以这也是其核心思路之一。通过这种模块化的集成,力图只制作一个集成脚本【框架脚本】就可以完成机器人的研发。而【底层框架】则为大多数应用层机器人提供了核心的函数及方法。
其实这种模块化的思路好多玩家已经在自觉不自觉的使用了。所以,机器达人们请不要见笑,鲁班门前弄大斧了。
作为自己的一篇学习笔记、一篇心得体会,发出来供大家共勉,抛砖引玉罢了。有心的朋友请您提出宝贵的意见和建议,谢谢!
****************************************************************************************
****************************************************************************************
★pkuxkx2014【一个脚本走天下】之《底层框架》集成模块文件V20141214:
补充MUSH自带的wait.lua模块:将此文件拷贝至MUSH\lua目录下。
****************************************************************************************
【注:此脚本框架文件不可与城际互联插件同时使用,否则相互冲突。压缩包中的db库是城际互联节点库,请拷贝至MUSHclient.exe目录下。】
****************************************************************************************
★成功加载《底层框架》后的界面效果如下:
****************************************************************************************
****************************************************************************************
二、【一个脚本】框架的先续基础内容:你若想弄清楚下面的内容,得提前知道的内容是:
****************************************************************************************
如何建立一个MUSH的总文件MCL文件;
如何在这个文件的引用.lua脚本;
基本MUSH的常识性知识:比如什么是MUSH的变量,Lua的变量、正则表达式是什么、什么是触发等等。
MUD游戏的基本常识性知识:行走、吃饭、喝水、看东西、学习、打坐、吐纳,这些都是什么意思。
基本的lua编程基础:比如什么是lua,什么是表格。基本lua程序语言的写法等等。
****************************************************************************************
三、【底层框架】的使用方法:
****************************************************************************************
首先,用一个总的配置文件(这里是pkuxkx_littleknife.lua)作为主引用文件,里面有一定的初始设置。其中包含底层框架
模块文件xkx_frame.mod的载入,通过这个mod文件(mod文件是我自己定义的文件,格式就是文本文件)固定几个底层模块(*.mod),
如:行走系统模块、系统函数模块、战斗模块、学习练习模块等等。注意:这里有载入顺序问题,顺序不对也许会出错。
最后,则是以表格loadlua_list作为应用层模块的引用来调各个【应用层模块】。
---------------------------------------------------------------------------------------------------------------------------
pkuxkx_playerid.lua:总配置文件,只需要对这个总配置文件进行适当的修改即可完成载入模块的目的。
---------------------------------------------------------------------------------------------------------------------------
关于各个mod文件: 【 鉴于一楼资源紧张,各mod模块中的函数简介放在二楼。】
在mod目录下,还有一些以mod为扩展名的文本文件。这些被我称为底层引用库文件,主要是提供一些实用函数。
鉴于广大同学的建议,这里不再详细说明各个mod的函数,有些东西也都是自己按需要加入到底层框架中。只是在下面【应用模块】中以实例
的形式把常用的底层函数加以介绍吧。相信,随着时间的推移。多数同学会形成自己的底层框架支持函数。
---------------------------------------------------------------------------------------------------------------------------
****************************************************************************************
四、【应用层模块】的设计与使用:如何用框架来做应用层模块,就是怎么来用MUSH做模块化机器人的问题。
****************************************************************************************
首先,是你开发的【应用层模块】应放在总配置文件pkuxkx_playerid.lua(即调用文件,压缩包里的是pkuxkx_littleknfie.lua)的loadlua_list表中。形如下图:
其次,你只要集中精力弄自己的应用模块,及合理使用框架函数即可。
比如我编了个quest_hubiao.lua的机器人,怎么加入到框架中?就是loadlua_list表加一行“quest_hubiao.lua”即可。
注:这里的mod和lua文件都是文本文件、lua代码,格式上没有区别。只是我为了区分已完成的模块自定义为Mod。研发和测试代码我用Lua扩展名而已。
****************************************************************************************
1、封装模块(面向对象程序设计):
应用层模块的研发,我的建议是用封装模块的形式做,也就是面向对象程序设计的思路。即:无论是【应用中心】还是【任务模块】均采用封
装的形式进行封装。其好处是均以对象的方式使用,可以随时整合到各个使用机器人中。
- -----具体的封装代码:
- AppMOD={
- new=function()
- local _AppMOD={}
- setmetatable(_AppMOD,{__index=AppMOD})
- return _AppMOD
- end,
- interval=5,
- timeout=20,
- help="格式:帮助文件",
- -------------------------------------
- Sleeproomno=player.Sleeproomno,
- Eatfoodroomno=player.Eatfoodroomno,
- Trainingroomno=player.Trainingroomno,
- -------------------------------------
- aimroomno="",
- aimroomname="",
- -------------------------------------
- jobnpcname="",
- jobnpcid="",
- jobnpcmenpai="",
- jobwords="",
- }
- function AppMOD:finish()
- end
- function AppMOD:fail()
- end
- AppMOD_button=function()
- print(AppMOD.help)
- SetCommandSelection (1, -1)
- PasteCommand("#AppMOD ")
- end
- AppMOD_alias=function(name, line, wildcards)
- do_AppMOD(wildcards,AppMOD_ok,AppMOD_fail)
- end
- do_AppMOD=function(wildcards,AppMOD_ok,AppMOD_fail)
- local tmp_AppMOD=AppMOD.new()
- tmp_AppMOD.finish=AppMOD_ok
- tmp_AppMOD.fail=AppMOD_fail
- tmp_AppMOD:start(wildcards)
- end
- function AppMOD:start(wildcards)
- wait.make(function()
- self:update()
- local f=function() self:check(wildcards) end
- getinfo(f)
- end)
- end
- -----封装后模块的应用:
- (1)do_AppMOD(wildcards,AppMOD_ok,AppMOD_fail),命令引用。
- (2)脚本定义引用:形如:
- local xkd_studyliterate=qxuexi.new()
- local condition={"shi","literate",100,nil,"west;west"}
- xkd_studyliterate.Sleeproomno=self.Sleeproomno
- xkd_studyliterate.Eatfoodroomno=self.Eatfoodroomno
- xkd_studyliterate.menpai="xkd"
- xkd_studyliterate.finish=function()
- self.need_studyliterate=false
- self:main()
- end
- xkd_studyliterate:start(condition)
复制代码 ****************************************************************************************
2、应用模块的研发实例:
【应用实例】的代码文件是:xkd_rb.lua。其中里面包含了【应用中心】xkd_center的代码,执行层【任务模块】xkd_Diaoyu的代码。限于篇幅,请自行下载前面的压缩文件查阅。
在新的框架模块下,应用模块的研发是基于一个总的【应用中心】的任务框架思路来完成的,其核心设计思想是尽可能的实现总协调的目的。定义是:判定自身状态并指向执行层的【任务模块】,也就是总调度文件的意思。下面以一个非pkuxkx的【侠客岛钓鱼机器】的例子说明下用法。
(1)【应用中心】的代码:
贴完代码,我才发现,这个代码的格式整理真是头痛的要命。故此,限于篇幅我已经在pkuxkx_mod2014这个压缩包里,涵盖了相关代码。也注释了部分内容。这里提供的还是一个框架性质的代码文件。希望诸位能理解,也希望借此给哪些新入MUSH的玩家以借鉴性的作用。
(2)【任务模块】,即执行层的代码:这里钓鱼就是任务。这里任务的定义是通过一系列命令可以获取经验和潜能的事件。
(3)一个完整的执行层【任务模块】框架代码:
- AppMOD={
- new=function()
- local _AppMOD={}
- setmetatable(_AppMOD,{__index=AppMOD})
- return _AppMOD
- end,
- interval=5,
- timeout=20,
- help="格式:帮助文件",
- -------------------------------------
- Sleeproomno=player.Sleeproomno,
- Eatfoodroomno=player.Eatfoodroomno,
- Trainingroomno=player.Trainingroomno,
- -------------------------------------
- aimroomno="",
- aimroomname="",
- -------------------------------------
- jobnpcname="",
- jobnpcid="",
- jobnpcmenpai="",
- jobwords="",
- }
- function AppMOD:finish()
- end
- function AppMOD:fail()
- end
- AppMOD_button=function()
- print(AppMOD.help)
- SetCommandSelection (1, -1)
- PasteCommand("#AppMOD ")
- end
- AppMOD_alias=function(name, line, wildcards)
- do_AppMOD(wildcards,AppMOD_ok,AppMOD_fail)
- end
- do_AppMOD=function(wildcards,AppMOD_ok,AppMOD_fail)
- local tmp_AppMOD=AppMOD.new()
- tmp_AppMOD.finish=AppMOD_ok
- tmp_AppMOD.fail=AppMOD_fail
- tmp_AppMOD:start(wildcards)
- end
- function AppMOD:start(wildcards)
- wait.make(function()
- self:update()
- local f=function() self:check(wildcards) end
- getinfo(f)
- end)
- end
- function AppMOD:check(wildcards)
- local askjob=function() self:askcmd() end
- local endf=function()
- do_walkgo(self.masterroomno,0.2,askjob,askjob)
- end
- if me.hp["neili"]<=1.2*me.hp["neilimax"] then
- do_dazuo(1.2,"curmaxneili",endf,endf)
- else
- busytest(endf)
- end
- end
- function AppMOD:askcmd()
- end
- function AppMOD:cooltime()
- end
- function AppMOD:main()
- end
- -----------------------------------------------
- function AppMOD:dosomething1()
- end
- function AppMOD:dosomething2()
- end
- function AppMOD:dosomething3()
- end
- function AppMOD:dosomething4()
- end
- -----------------------------------------------
- function AppMOD:update()
- local AppMOD_triggerlist={
- {name="AppMOD_dosth1",regexp="Here is trigger1 RegularExpression",script=function() self:dosomething1() end,},
- {name="AppMOD_dosth2",regexp="Here is trigger2 RegularExpression",script=function() self:dosomething2() end,},
- {name="AppMOD_dosth3",regexp="Here is trigger3 RegularExpression",script=function() self:dosomething3() end,},
- {name="AppMOD_dosth4",regexp="Here is trigger4 RegularExpression",script=function() self:dosomething4() end,},
- }
- ---Creat Trigger-->>
- for k,v in pairs(AppMOD_triggerlist) do
- addtri(v.name,v.regexp,"q_AppMOD",v.script)
- end
- ---End Creat Trigger--<<
- local noecho_trilist={
- "noecho_tri1",
- "noecho_tri2",
- }
- local _noechotri=linktri(noecho_trilist)
- addtri("AppMOD_noecho",_noechotri,"q_AppMOD","")
- SetTriggerOption("AppMOD_noecho","omit_from_output",1)
- EnableTriggerGroup("q_AppMOD",1)
- end
- AddAlias("alias_AppMOD_button","#AppMOD_button","",alias_flag.Enabled + alias_flag.Replace ,"AppMOD_button")
- AddAlias("alias_AppMOD","#AppMOD (.*)","",alias_flag.Enabled + alias_flag.Replace+ alias_flag.RegularExpression ,"AppMOD_alias")
- SetAliasOption("alias_AppMOD","group","job_AppMOD")
- SetAliasOption("alias_AppMOD_button","group","job_AppMOD")
复制代码 至此,通过本次的说明更新性,希望能给有用MUSH编写机器的玩家给以帮助。
最后,本作只是一个自学笔记,在各位机器达人面前弄斧献丑,不要见笑。
******************************************************************************************************
【一个脚本框架】近期更新记录:
20141214:针对框架文件加入map_p2palias.mod模块,此模块为城际互联算法模块,在xkx_frame.mod中默认加载,可自行屏蔽。实现框架脚本内直接应用城际互联(故不需加载插件,若加载插件则屏蔽此模块即可)的作用。
****************************************************************************************************** |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|