模组开发可不能止步于配置IDEA啊!

开发Minecraft模组的第一步是什么!

是配置IDEA、配置工程环境!

然后呢!第二步是什么!

不知道!

前言

曾经多次想要尝试入门模组开发的我已经摸清了套路,那就是网络上大多数的模组开发教程,都存在明显的头重脚轻现象。

也就是说,这些教程打着适合新手的旗号,将第一步——下载IDEA、配置工程、科学加速的步骤写得无比详细,然后配置完了之后呢?如果我想添加一个方块,配套一个物品,写入一个合成表,添加一个状态效果,新建一个维度,创造一种生物,撰写一个成就呢?

如果真的是为了新手而写的教程,那么以上所有的问题都应该事无巨细地写成教程,然而无论是模组加载器的官方文档,还是网上本来就不多的各种教程,显然都并没有这样的打算。

很显然,开发模组本就是存在门槛的工作,注定了有效的帮助资料不会太多。残忍地说的话,如果连配置IDEA都要花上几天的时间,那么还是考虑换个方向吧……

而我——是不可能从如何下载安装IDEA开始说起的。作为软件工程专业的学生,我不可能把我电脑上的无比顺手的开发环境给卸载掉再重新安装,也不准备在虚拟机里面重复一遍安装流程。

我们直接从开发模组之前的必要前置知识开始说起吧。以Fabric模组为例——我们究竟是在为什么东西写代码?或者说,Fabric究竟是什么?

Fabric是什么

Fabric是一个Minecraft的非官方模组加载器(Mod Loader)。强调非官方并无他意,只是强调目前Mojang没有提供官方的模组开发方案,因此无论是Forge、Fabric、NeoForge还是Quilt都是非官方的。

非官方还意味着Minecraft没有义务在自己的开发过程中考虑Fabric,因此你的模组随时有可能因为Minecraft本身的原因而导致不再兼容(否则的话,理论上所有加载器的所有模组都是可以无限向后兼容的,但是怎么可能呢~);非官方还意味着Fabric和Minecraft是不可混为一谈的两个部分,为了开发Fabric模组,你不仅要读Fabric的官方文档,你还需要读Minecraft的什么啊?源码

毕竟作为没有官方支持模组计划的商业游戏,Mojang没有理由为我们撰写一份Minecraft模组开发指南,扒开自己的游戏的皮让我们端详里面的模样。

请放心,虽然Mojang不让我们看Minecraft源码,但是Fabric允许我们看Minecraft源码了。Fabric工程的Gradle任务中包含了生成Minecraft源代码的任务,执行此任务即可生成当前版本的Minecraft的源码,包括代码注释,去除混淆。这样,有条件了解Minecraft是如何运行的之后,我们才有能力编写与Minecraft协同运作的代码。

如何实现你想要的功能

你的模组,是想要实现什么功能呢?

芒果窗实现的是对游戏内屏幕的美化。Fabric没有提供对应的方案,因此需要直接修改Minecraft的源码。因此,芒果窗通过Mixin将自己的代码插入Minecraft的源码中,在游戏进入主菜单屏幕、创建世界屏幕等时用我们定制的新屏幕取代游戏中原本的屏幕。

Mixin是一种将我们编写的Java代码编译出的字节码插入到已经编译好的字节码中,从而修改原本Java程序的运行表现的技术。Fabric文档对此有详细介绍。但编写芒果窗的过程仍然需要我们同时阅读Fabric文档与Minecraft源码,否则我们无从得知如何编写我们的插入代码,以及将我们的代码插入到哪里。

同时,芒果窗还使用了访问扩大技术,从而允许我们访问Minecraft中原本被设计成不允许访问的私有成员函数,并将我们的代码插入其中。这也是在Fabric文档中的,同样也需要我们阅读Minecraft的源码。

而,仍然在设计阶段的新模组GameHelper需要向游戏中添加新的GUI,并且使用新的绑定键位触发,在GUI中实现更多功能。Fabric提供了一个可选的Fabric api模组,提供了大量方便我们修改游戏中内容的方法,从而我们可以直接使用Fabric api的轮子来造车。GUI是通过Fabric api的轮子添加进游戏的,按键也是通过Fabric API的轮子添加到游戏的绑定按键中的,但是功能的实现(例如修改gamerules)仍然需要通过阅读Minecraft的源码,找到那个用来从客户端向服务端发送玩家执行指令的方法,然后调用它。调用Mojang写好的方法则无需使用Mixin了。

总结来说,向原版游戏里加入新东西,需要使用Fabric API的轮子;修改原版游戏有的东西,需要使用Mixin修改Minecraft的源代码。

客户端与服务端

Fabric提供@Environment(EnvType)注解来标记哪些代码是客户端代码或服务端代码。由于Minecraft是客户端-服务端结构的游戏,模组也要考虑在两种不同环境下的运行差异。简单地区分的话,向游戏中加入新方块、新物品、新生物、新维度等的模组是双端模组,需要同时考虑双端;像芒果窗这样只修改原版屏幕的则是客户端模组。

你需要在开发初期就考虑好你的模组运行在哪里。Fabric模组需要提供入口来供Fabric Loader调用,不同的入口对应了不同的加载顺序和加载位置,模组的客户端代码需要客户端入口,服务端代码需要服务端入口,双端都需要的代码就可以放在主入口中。代码的位置错误(例如在服务端加载了客户端代码)很可能会导致意外情况,如游戏崩溃。

Java还是Kotlin

Minecraft Java版使用Java开发,模组加载器也都是Java代码,因此一般来说还是建议模组也使用Java。目前来看,开发者能选择的只有Java 21或者22,这是Minecraft本身的要求。

至于Kotlin,也并非不能用来开发模组。芒果现在也正在GameHelper中完全使用kotlin,主要是我也想知道到底行不行()Kotlin相比Java确实更加现代一些,但也有额外的学习成本,以及你打包出来的模组可能也需要额外的Kotlin前置模组。

尾声

芒果计划在这里逐步完善一系列的Minecraft开发教程,不仅是模组开发,也可能涉及原版向的数据包开发等。

毕竟,这方面的实用的资源真的太少了嘛……

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容