接下来,我们可以开始制作我们的第一个mod了。如果你还需要一个合适的java开发环境,你可以参考Kaupenjoe的视频以及网上其他博主和视频主的资料。这里还是建议使用intelij作为你的开发软件,一方面作为pycharm的同厂商软件,使用手感也与pycharm相近,另一方面,代码自动补全确实省事不少。
先从手头有的东西开始
API的开发模板
我们既然需要通过一些插件作为跳板来开发模组,那么,相关工程的代码模板也必不可少。
这里以forge mod开发举例,你可以很轻而易举地从github上pull一个forge的开发模板到本地环境。我这里使用的是1.19.3的mdk,实际开发中可能还需要针对你modding的目标版本使用不同的模板和编写方式,但大同小异。
如图,src就是日后我们存储大部分相关源代码的地方,gradle相关的文件则用于自动构建项目,git相关则是用作之后在本地与git之间交互的。
除此之外,那些README啥的txt你可以全扬了。
关于模板内部的各类参数,我们等打开开发环境之后再说:
你的开发环境
接下来,我们打开编辑软件,这里以intelij为例:
我们需要做的就是等待gradle自行完成项目的建构,紧接着,你的forge模板上就会有一个完整的minecraft运行环境,里面包括了很多你会用到的东西。
顺带,记得把你的gradle的默认java改成项目自带的Java环境,像这样:
minecraft本体的各类参数和函数
如果你要尝试开发一个包含功能性方块、功能性物件、一套完整合成系统,甚至生物模型、AI、生态的大型mod,其工作量不亚于让你重新开发一个minecraft,但好消息是,minecraft本体当中为你提供了大量原生的代码,减轻了你自行编写函数的工作量。
在gradle建构完成后,你可以在你的External Libaries文件夹看到客户端及其文件,在正式开发mod之前,建议细细翻阅,以免自己在编写(实为复现)的时候出现莫名的格式问题(毕竟不同版本之间可能会有大重构,就像1.19.2到1.19.3直接把物品分类大改了一样):
让我们回到模板
src文件夹下包含两个关键的大类,一个是项目本体(java),存放实现功能的主要代码;一个是模组资源(resources),存放模组的各类模型等。
在开始编程之前,我们需要认识我们的模板。
java类
java类下有一个ExampleMod文件,那是一切的开始之一,我们点进去看看各项组件:
MODID:你的模组的ID,日后很多调用都需要以ID为关键参数。我们需要把它的内容替换为为全小写格式的,我们自己的模组名。这里就以tutorialmod为例。Kaupenjoe习惯将此变量名改为MOD_ID,可能是后期编写的时候会与客户端源文件冲突?
LOGGER:一个简单日志门面的接口,关于slf4j的详细内容可以参考https://56data.cc/1563.html,本文不作赘述。
BLOCKS、ITEMS、EXAMPLE_BLOCK、EXAMPLE_BLOCK_ITEM:forge提供的各类物件的注册模板,方便你快速在类中注册物品,但自己写的话多半用不上。
以及下方的各类函数,其上都有一定的注释,这里不多赘述。但是需要注意一下EventBusSubscriber,这个组件涉及到forge、mod和minecraft本体之间的交互,因为mod本身也是一个项目,它需要通过订阅和消息处理来进行驱动。
forge在加载了mod之后forge就会根据mod的订阅消息情况适时的发送消息。也就是说mod也是消息驱动的程序。当然开始一个mod的编程就要从消息处理开始。
forge提供了一个特殊的Annotation来订阅消息。这个Annotation 就是@EventHandler
————摘自ManaGeryzy的博客
EventBusScriber也有相应的教程,需要的话可以查阅。
还有一个关键组件是addCreative,这个比较好懂,与我们在创造模式的面板上能否看到我们写出来的物品相关联。
所以,我们开发的第一件事情就是——把东西扬个干净。
可能你会问,为什么呢?明明有这么多重要的内容和好用的模板。但我想说,一是这些东西可能不合你的代码风格,二是目前在离线开发阶段,我们并没有操作这些东西的必要,三是留太多反倒看得头疼,并且会让代码成为工友不友好型。
回到正题,我们首先把主函数名称和文件名、以及所有次级调用改为自己的模组名(这里我用TutorialMod),然后把所有的MOD_ID改成自己想要的,接下来,官方模板应删尽删,留下MODID和LOGGER,注释应删尽删,函数内容应删尽删(但public TutorialMod()需要把modEventBus相关留下),由于我们目前离线开发,所以OnSeverStarting整个扬了,最后你会看到如下结果:
清爽多了。
resources类
接下来是resources类,我们点开其中的mods.toml,这是我们模组的配置文件之一,其中包含如下要修改的内容:
license:模组工程的协议类型。由于我们只是在别人的基础上开发,所以用偏专利型的All Rights Reserved还是不稳妥,建议用MIT。
modId:不用多说
displayName:你的模组最后显示在mc里的名称,需要改成你自己的mod名称。
authors、credits、description:作者、赞助、描述。这些看你心情。
dependencies.XXX:环境依赖,点后面记得改成你自己的模组id。
build.gradle
在主文件夹下还有一个build.gradle需要变动,这玩意涉及到你的项目build时候的一些参数:
version:模组版本
group:你的模组所处的类,这里建议配合你的java类起名进行修改,比方说你的模组程序文件在net/drivenhank/tutorialmod
下,那么这里要同步为net.drivenhank.tutorialmod
。
archivesBaseName:需要同步为你的模组id。
除此之外,文件中所有examplemod都要同步为你的模组id。
做完这些更改,你只需要点开右侧边栏的gradle项,重新加载所有的gradle项目,然后点击Tasks->forgegradle runs->run client,然后就可以看到在mc里头,我们的mod能够正常显示了:
各种精巧的小工具
首先是intelij自带的git工具,非常方便你在开发时存档。你只需要把你的mod给share on github或者直接push上去:
在github上自动存档力
然后是misode的各种generator,方便开发时构建各类物品的json:
至于模型制作,如果局限于原版构型,我比较建议用ps硬画,但是如果要实现复杂模型,Blockbench也许是一个不错的选择。
先讲到这里。下一回,我们将实现mod的部分功能:做出一些普通的方块和物品。