饥荒联机版mod开发摸鱼(一)

今日起床较晚,本来计划着今天的每日一摸应该去搞一搞es6Proxy

并且也确实看了一会儿觉得挺好玩的,但是还没有摸完就有人提到了昨天玩饥荒遇到的事情

我们装了一个鱼塘的mod,然后那个作者上一次更新是好几年前,然后近期饥荒更新了一个部分就是原来钓鱼获得的死鱼现在是活鱼并且可以称重。

但是呢,那个鱼塘他的合成配方还是那个死鱼,所以就不能合成了。。。

然后我在游戏的scripts目录找了半天并没有找到淡水鱼这个prefabs

然后我就寻思着说不定fish即可以表示死鱼也能表示活鱼呢。。然后我就以这个错误的方向去找了很久的证据,然后脸被打的啪啪响。

其实一开始我会这么想纯粹是因为看到了一个meats.lua,也就是肉,在这个文件里面定义了很多的肉类,然后由于这个游戏的代码结构并不是很熟悉,所以我就踩了一个坑(x

找到正确的方向是因为突然灵光一闪,根据饥荒的烹饪系统,每个食物都会有不同的属性,比如鱼是1个单位的鱼,1个单位的肉。然后我找到了scripts根目录下的cooking.lua文件,这个文件里面定义了各个食物的烹饪属性,然后我翻到了fish发现它只有一个定义。然后人都傻了。因为有一个叫Show Me的mod可以在游戏内显示食物的各个烹饪属性,然后之前在游戏内看到了活鱼是0.5个单位的鱼和0.5个单位的肉。

不对,然后我就继续在cooking.lua找了一会儿,看到了一个肉和鱼都是0.5单位的,然后看到了一个prefabpondfish。然后。。莫非就是它了?这就是我找了一个下午的它?

在游戏内开控制台

1
c_give('pondfish')

啊!是他,一条活生生的鱼。

感觉干了一下午的无用功,看了挺多代码的。

收获大概就是大概明白了饥荒这个游戏scripts目录下面的一些文件的作用,以及更多的关于lua的语言特性,常用写法什么的,跟我之前写手游挂机脚本用的那些lua有比较大的区别。

可以看到在prefabs文件夹下的很多东西都会有onXxxxfunction,里面大致是一些触发某事件的行为,但是我并没有找到调用这些事件的地方,或许可以看看actions.lua这个文件,当然还有更多的可能需要找。

然后就是看了半天并没有找到程序的入口,这让人十分难受。也就是所谓的main函数,我的想法就是他应该会在一个很明显的位置,然后刚刚找到pondfish这个东西突然发现我看了这么久的代码还不知道到处可以看到的inst到底是个什么意思,遂百度之:instance指代的是某个物品或者单位的实例。

然后发现每个东西的下面总会有一个fn或者commonfn方法,看起来特别像扮演构造方法的角色,然后第一行就是local inst = CreateEntity()随在CreateEntity上按下了转到定义,然后一小会儿之后vscode带我到了一个叫mainfunctions.lua的文件里面,好家伙,里面有好多我平时看到的奇奇怪怪的函数。

然后最关键的是在这个文件旁边我还看到了一个main.lua,联想到c语言的int main(),再想到java的public static void main(String[] args),这莫非就是。。遂点开

哦豁,看起来很像这个东西了啊!

里面有好多的require(),看起来引用了很多的东西。

但是开头也有很多没预先定义的方法,所以最开始的入口是不是这个还真的不是很清楚,可能需要明天继续看

不得不说,慢慢的摸透一个程序的运行机制真的很爽(雾

然后这可能是真的每日摸鱼吧(x

然后又回到最初的起点,要让现在的版本可以做出那个鱼塘应该只需要吧AddRecipe()方法内的参数的fish换成pondfish就好了

不过要考虑到在新的版本这个mod还能不能变得好玩,那么就要让他的生成物也变成现在的版本的东西。

或许可以考虑以后可以业余写一写饥荒的mod,23333

其实游戏开发者好像也为modder留下了很多的余地,虽然这可能也是解释型的脚本语言不可避免地吧。

然后就是这样了,前面提到的目标留到以后实现。。嗯

我寻思着我应该会再有一篇文章叫做饥荒联机版mod开发摸鱼(二)什么的吧,2333