大家好,这里是唯。
这一期讲完我们就正式进入实战环节了。还记得第一期的Lua控制台吗?那个其实是我们在写Lua的Mod的时候很常用的辅助工具。如果你熟悉Efx,Shlp,Fsm,Lmt等游戏文件,那么,Lua控制台能给你提供更多的帮助。好了,话不多说,我们开始。
一、观察Lua控制台
安装第一期里的Lua控制台脚本,进入游戏,去训练场最好,因为后面我会提一些东西训练场才容易观察。你会发现这个控制台是可以拖动和放大缩小的。我们稍微拖动一下,如图。
我们可以看到这里有丰富的信息,从游戏数据一级一级往下点,就可以变成我图里的样子,下三角表示展开,右三角表示有可展开内容。
当然,你也可以通过这里查看你安装了哪些LuaMod,它们的名字叫什么。
打开派生信息,你也可以看到更详细的动作内容。
那么,到这里,大家应该发现了几个关键的信息,我们一一解释一下它们的作用。
先附上LuaScript的网站地址:
1、地图id:对应函数为:
回忆一下我们第三期有关函数的内容,这个函数翻译过来的意思是获取游戏里的地图id,获取的函数,自然有个返回值,示例用一个局部变量local MapId来接收。
比如截图里,训练场地图id是504,我们就可以写一写简单的判断了,比如,我们这个脚本想要在训练场才触发,那么我们可以这样写:
我这里还没想好具体要做什么,所以暂时没写if里边的内容。是不是很简单呢?
2、武器类型:MHWI有14把武器,对应0 - 13
这里我装备的武器是太刀,对应3,不信的话可以拆包看一下,太刀的文件都是wp03。
这里放一张对照表:
wp00:大剑 wp01:片手 wp02:双刀 wp03:太刀 wp04:大锤
wp05:狩猎笛 wp06:长枪 wp07:铳枪 wp08:斩斧 wp09:盾斧
wp10:操虫棍 wp11:弓箭 wp12:重弩 wp13:轻弩
对应函数为:
3、武器id:武器id是指具体是哪一把武器。通过武器类型我们可以知道3是太刀,而武器id则具体到是哪一把太刀。这里是241,也就是
(注:我这里用了三天刀的幻化)
对应函数为:
他们的用法和前边的地图id用法是一致的。那么,刚才的代码,我们是不是可以做进一步,更精确的限制了呢?我们可以再加上限制,比如,它必须是太刀,并且是黑龙歼灭刀,请看:
(注:变量要先赋值了才能用,所以我这里是先获取了3个函数值,再使用)
这种写法和下边这种:
是等价的。
哪一种更好呢?其实各有千秋。
前者简单,判断也只需要单次,相对快捷。
后者复杂,判断需要多次,但是想要调整的话修改简单。
具体看个人喜好,如果是简单问题,推荐前者,也便于Lua脚本的快速响应。
4、动作id:MHWI有很多动作,这些动作有自己的编号,这个编号和Lmt文件挂钩。我们可以在游戏里用太刀右键打一个突刺,看一下它的动作id。
对应函数为:
用法和地图id的一致,不多赘述了。
那么它怎么和Lmt文件挂钩呢?(这部分内容选看,有Lmt基础者优先)
用在线网站:https://tool.oschina.net/hexconvert/
把49257转换成十六进制:
可以看到转换结果是c069。这里c指的是战斗动作,我们无视它。
把069转换回十进制:
转换结果105,开太刀的lmt文件,运行模板,找到第105号头偏移,这个,就是突刺动作的头偏移。
看到这里,你应该明白了,为什么后期动作类作者不再更新lmt表格。
一方面,吃力不讨好;另一方面,Lua控制台更直观。
通过头偏移的指针,我们可以轻松找到动画块头的地址,通过动画块头,我们可以很轻松的继续找到骨骼区(也就是动画)和判定区,然后其实一切都联系上了。
注:这个转换方法并非我原创,来自南风焓。
5、当前Fsm:
同样,我们再用一下突刺,看一下它的当前Fsm。
是3-79。同理,3指的是战斗动作的fsm,-后边的79,指的是Fsm的绝对id。
对应函数:
怎么和Fsm内容联系上呢?(这部分内容选看,有Fsm基础者优先)
我们知道,MHWI的文件大都是十六进制文件,那么Fsm里的那个绝对id自然也是十六进制。道理就很简单了,把79转换为十六进制:
是4f。那么,突刺在fsm里的绝对id就是4f。
注:这部分内容同样是南风焓的,我只是转述一下当时学的内容。
和Lmt是个包含了动画 + 判定的文件不同,Fsm是个派生表,因此工作人员很懒,他们只写有派生的动作。所以有的fsm id在Fsm里找不到,这不奇怪。想用的话自己加上就可以了(钩爪不行)。如果不会的话可以看我的fsm重置版教程。
其实还有很多有趣的东西,比如重力加速度,下落速率之类的,但是篇幅有限,正所谓:话多不甜,胶多不粘,多说无益,还是需要大家自己去了解,探索,实践。
LuaScript里还有很多函数,比如Efx的,Shlp的,可以做特效,做剑气,等等。
对了,不知道大家发现没有,其实我只讲了一半。
既然有Get(获取),那么,对应的肯定也有一组Set(设置)。代码其实都是这样的结构,一组获取值,一组设置值。
题外话,这样的一组结构,加上属性(描述一些特性的变量)和方法(函数)的公有私有,在Java里被称为JavaBean。
最后,第三期好像没作业是吧?我们留这样一份代码:
它的逻辑各位应该清楚了,如果是训练场,武器类型是太刀,且是黑龙歼灭刀,那么执行突刺动作。
请大家思考,这份代码能否在游戏里顺利运行?是否会有问题?如果有问题,为什么?怎么解决?
可以实际写写看。下一期,我们转入正式的Lua脚本编写环节,基础请一定巩固。
好的,那么,我们下期见。