开发环境配置 1.20 Forge 长线教程计划
本篇教程的视频
本篇教程的源代码
GitHub地址:TutorialMod-1.20.1-Forge-Start
前言
和前面的教程一样,我们就来一个简短的前言
本系列教程和后面即将开行的NeoForge
教程一样,不再像Fabric
,通过讲解源代码来做教程,
而是回到那种它们的文档怎么写的,那么我们就怎么写的状态
当然,我会穿插关于源代码
的部分,有些地方还是会用上的
Forge
和NeoForge
的话,并不太适合通过源代码来进行模组开发教程
一方面,它们有自己独立的注册系统
,并不像Fabric
那样可以直接用原版的注册系统,Fabric
的运作逻辑和它们两个并不一样
另一个方面,根据Minecraft
的EULA
协议,是不能公开他们的源代码的,因为Forge
和NeoForge
现在采用了Mojang
的官方映射,
我通过源代码来做教程有风险,虽然教程可能是个特殊的领域,但小心为妙,万一哪一天我被制裁了
不过,既然都说到这里了,我们就来聊聊这三端的运作逻辑
吧
Fabric
,最轻量级
,因为它本身是一个Mixin
,通过Mixin
来将模组注入到游戏中
而Mixin
的话,最早由Sponge
项目提出的,在Fabric
中广泛运用,Mixin
是一种更轻量、模块化、易维护的修改方式
我们现在在Fabric
中用的Mixin
,也依旧是Sponge
的
Mixin
对游戏的破坏很小,所以游戏运行较为稳定
而Fabric
的缺点
就在于它没有像Forge
和NeoForge
那样那么多的API
,
很多模块需要借助第三方API
,或者自己手动去写
所以可能会造成大型模组
首选Forge
和NeoForge
这样的印象,不过,你愿意折腾,Fabric
也是完全可行的
Forge
的话,它的运作依赖于它的Patch
系统,patch
,那么翻译过来就是补丁
,它是从字节码
的层面来将模组加载进游戏的
但patch
和Mixin
相比,它更复杂,而且无法做到像Mixin那样模块化、细致化的修改,更难维护
它是有可能破坏游戏某些代码,所以它的稳定性相比较于Fabric
就没那么好
虽然Forge
在后面引入了Mixin
来代替Patch
系统的一部分,但主要还是依赖于Patch系统
NeoForge
,从Forge中分离出来,是Forge
的重构版,因为原先的Patch
系统过于老旧
和难以维护
,NeoForge
模块化了原来的Patch
系统,虽然仍然延用Patch,但模块化
的设计也更易于开发和维护,
同样也使用Mixin
,更加简洁现代化
它的稳定性优于原本的Forge,不过因为附带很多其他内容,所以体积较大,启动时间较长(但还是比Forge快)
另外呢,还是那句老话,模组开发,通其一,便可通其二
,你学会一个端的,另外两端也可以直接上了
再把基础内容过一遍,上手很快的
准备工作
那么从本期教程开始,我们正式的开始,这个1.20.1 Forge
模组的开发教程
Forge
的教程就止步于1.20.1
,在1.21
,我们还将开行1.21.1 NeoForge
长线教程计划
在高版本上的话,应该是NeoForge
用得更多
那么第一期教程的话,和以往一样,我们就来进行开发环境的配置
JDK17
那么我们的Minecraft
的话,它是拿Java
去写的
而我们要进行开发的话,就得装一个JDK
啊
这个JDK
的全称的话就是Java Development Kit
(开发工具包),简称JDK
大家学Java
的时候的话,应该也都是装过这个东西的
不管是8
也好,还是17
也好,还是21
,应该都是装过这个东西的
1.20.1
它这个版本,它应该是拿Java 17
去写的,所以说我们安装的版本的话,应该要装的是这个JDK17
啊
当然你装JDK21其实也没有问题,它这个版本的话,主要你得看那个模板文件里面,它用的那个Gradle
的版本
关于它的下载的话,我这里提供Oracle
官网上的Java
下载
链接:Oracle
链接里点进去,再往下翻,就能翻到JDK17
的下载
它分三个端,三个端的不同的安装程序,下载你自己对应系统
这里我们以Windows
为例
那么它还分一些不同的安装方式,有三个东西
其中一个是zip
,这是压缩文件,它是已经完全安装好的Java,你可以下载解压之后,放到你自己的Java目录中
另外两个exe
和msi
,这两个的话都是安装程序,可以自己选择下载安装
安装的话,默认是安装到C盘
的,其实也不用改安装路径,IDEA
会默认到C盘找你的Java
当然你也可以选择安装到其他位置,只要你自己找得到就行
不过,在Oracle上下载JDK17
的话,现在是要注册登录
的,所以说你下载的话,得先注册一个Oracle的账户
嫌麻烦的话,你也可以去百度搜索一下,JDK17的下载,有很多其他的网站
IDEA
IDEA
的全称是IntelliJ IDEA
,是JetBrains
公司的一款Java IDE
那么现在我们就用它作为我们模组开发的编辑器,其他编辑器当然也可以,只是我个人建议使用IDEA
,有些操作会方便一点
那么下载这里我提供官方的下载链接
链接:IDEA下载
那么到下载界面,先别捉急下载
,开头的那个IntelliJ IDEA Ultimate
,什么30天免费试用,咱不要
那玩意是专业版
,其实就对模组开发而言,社区版
足矣,我们用不着专业版的一些功能
然后往下翻,找到IntelliJ IDEA Community
,下载社区版
就行,社区版是完全免费的
IDEA的安装默认也在C盘,这个的话,你就改到其他的位置好了,如果你C盘够大,也可以装C盘里
那么,在安装中,会有一个更新path变量
的选项,这个选项的话,勾选了的话,需要重启电脑
才能生效
PS:以上两个部分直接引自【1.20.1 Fabric 长线教程计划】的第一期,因为差不多,拿过来就能用了
模板文件
那么接下来,我们就要开始正式开发了,首先我们得先获得一个模板
文件
这里我们前往Forge的官网,去下载一个MDK,这个是模组开发工具包
在左侧栏中找到1.20.1
,我们能看到它推荐版本是1.20.1-47.4.0
,我们用它就行
点击Mdk
,跳转到下载页面(应该是要使用魔
法的),等页面右上角出现SKIP
,点击一下,就开始下载了
然后我们就获得了一个压缩包
,然后将它解压到一个地方(记得创建一个文件夹),然后将整个文件夹用IDEA
打开
初始化项目
Gradle构建
进入IDEA
之后,它会自动开始Gradle
的构建,当然,这个过程不出意外的话还是要魔法
同理,出现BUILD SUCCESSFUL
之后,就说明构建成功了,当然可能会出现一些警告
,不用管他
Gradle使用的Java版本
构建完成之后,我们可以到build.gradle
文件中,当前项目使用的Java
版本
1 | // Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17. |
可以看到,它默认使用的是Java 17
,这个是没问题的
项目结构
接下来我们来看看项目结构
里的设置是否正确
项目结构的快捷键是Shift+Alt+Ctrl+S
,也找到设置中的项目结构打开,在项目
界面,找到SDK
,确认一下使用的是JDK17
在后面一个模块
中,也可以设置使用的SDK,这里我们选择17
当然,其实用21
也是没关系的,只要你的项目不出问题,JDK21
也是可以选择的
Gradle JVM
虽然说我们看到build.gradle
里,它默认使用的是17
,但是,有时候IDEA
会自己给你选择其他的版本,我们也来检查一下
设置
-> 构建、执行、部署
-> 构建工具
-> Gradle
,检查Gradle JVM
是否为JDK17
同样的,21
如果不出问题,也可以用
IDEA一些小设置
IDEA 2024.3
版本之后,我们就不再需要安装中文语言包
这个插件了,因为这个时候中文已经是IDEA
的内置语言
了
在外观与行为
->系统设置
->语言和区域
,我们可以更改语言设置(当然需要重新启动
)
那么另外的插件
方面,Minecraft Development
可以装一下,像Translation
这样的翻译插件也可以装一个
模组基本配置
模组主类
接下来我们来看看模组主类
,模板文件默认的名字是ExampleMod
这个类会在模组加载中调用,用来加载模组
然后在这个类中,我们可以看到一些示例,比如注册物品
、方块
、物品栏
等等
1 | // Create a Deferred Register to hold Blocks which will all be registered under the "examplemod" namespace |
这些也都是我们后面会讲到的,在这里的话就全删了,我们后面会单开类去注册各个内容的
删掉以后,在构造函数
中出现的报错也删掉,addCreative
方法中报错的也删掉
另外的一些LOGGER
之类的,也可以删掉,那些是日志输出的
但注意不要把MODID
下的那个LOGGER
字段删了
MODID
在ExampleMod
类中,我们可以看到MODID
字段,这个字段是模组的唯一标识符
在我们模组开发中,这个东西是最重要的东西,它是我们的命名空间
它默认是examplemod
,我们得改改,改成我们自己的,这里我做教程的话,我就使用tutorial_mod
了
这个MODID
可以重构成MOD_ID
,看起来更好看一点
1 | public static final String MOD_ID = "tutorial_mod"; |
敲重点!!!这个ID在自己定义的时候,只能用小写字母和下划线
!不能有其他字符!否则在加载模组时会崩溃!
Fabric
那边还能用短横线,但在Forge
和NeoForge
这里就不行
主类的名字我们也可以进行更改,这里我改成TutorialMod
注意使用IDEA的重命名功能来进行,快捷键是Shift+F6
,不然会报错
文件夹结构
文件夹结构也可以进行更改,因为它默认的是com.example.examplemod
这里我给它改成com.besson.tutorial
mods.toml
在src/main/resources/META-INF
文件夹下,有一个mods.toml
文件,这个文件是模组的配置文件
这个文件下的大部分东西是在gradle.properties
文件中定义的,
我们待会直接看gradle.properties
中的参数即可
gradle.properties
接下来我们就来看看这个文件,这个是整个项目,或者说模组的配置文件
模组的名称
、mod id
、版本
等等信息都是在这个文件中定义的,所以这也是一个很重要的文件
minecraft_version
1 | # The Minecraft version must agree with the Forge version to get a valid artifact |
显然易见,这个是定义Minecraft
版本的,这里我们使用1.20.1
版本
forge_version
1 | # The Forge version must agree with the Minecraft version to get a valid artifact |
这个是定义Forge
版本的,这里我们使用47.4.0
版本
mod_id
我们在模组主类中改了MOD ID
,所以在这里我们也要改
1 | # The unique mod identifier for the mod. Must be lowercase in English locale. Must fit the regex [a-z][a-z0-9_]{1,63} |
mod_name
这个是模组在模组列表中显示的名字
1 | # The human-readable display name for the mod. |
这里你写啥字符都行
mod_license
这个是模组使用的许可证,像一些开源许可证,比如说MIT
、GPL3.0
等等
1 | # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. |
这里更改之后,在项目文件下还有一个LICENSE.txt
文件,这个文件就是许可证文件
mod_version
这个是模组的版本,我的建议是带上Minecraft
的版本号,这样你自己进行多版本移植的时候也清楚
1 | # The mod version. See https://semver.org/ |
mod_group_id
这个就是文件夹结构,上面我们也改了,所以这里也要改
1 | # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. |
如果这个mod_group_id
不正确,模组加载器就找不到你的模组主类,也无法加载你的模组
mod_authors
这个是模组的作者
1 | # The authors of the mod. This is a simple text string that is used for display purposes in the mod list. |
mod_description
这个是模组的描述
,这里我们写一个简单的描述
注意换行不是直接回车
,要使用\n
转义
1 | # The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. |
映射
然后,我们回过头来看mapping_channel
和mapping_version
这两个东西
这个是我们模组开发中使用的映射
什么是映射
?我简单解释一下
Minecraft
是闭源
的商业游戏,如果你拆过它的jar包就会发现,你尝试去找它的源码时,
你会发现一大堆奇怪的类名、方法名,这些都不是正常的类名、方法名,而是被混淆
过的
而映射
的作用,就是将混淆过的类名、方法名还原成正常的类名、方法名
Mojang
也公开了一部分映射,Forge
和NeoForge
也已经使用这些映射,而Fabric
还有Yarn
映射
Mojang的映射并不完整,使用我们在看源代码的时候,还是会看到很多filed_XXX
、method_XXX
这样的类名、方法名,
它们并没有完全反编译过来,在开发中可能得理解好久才能反应过来,所以我们得改一下这里的映射
这里我们要使用羊皮纸映射
,也就是Parchment
,它完善了Mojang
的映射,这个映射同样可以用在Fabric上
羊皮纸映射的版本可以在它提供的网站上找到:版本
更改映射
1 | # The mapping channel to use for mappings. |
这里我们使用parchment
接下去改版本,版本格式照着上面的提示YYYY.MM.DD-MCVersion
,这里我们使用2023.09.03-1.20.1
版本
1 | # The mapping version to query from the mapping channel. |
添加maven仓库
羊皮纸映射获取要设置其maven
仓库,我们到settings.gradle
文件中添加
1 | repositories { |
添加插件
羊皮纸映射需要使用一个Librarian
插件,我们到build.gradle
文件中添加
1 | plugins { |
重构项目
做完这一切之后,我们点击右上角冒出来的大象图标,同步更改Gradle
设置,对项目进行重构
同样也是出现BUILD SUCCESSFUL
,说明重构成功
运行genIntellijRuns
点击右侧Gradle
(大象)的图标,找到Tasks/forgegradle runs
下的genIntellijRuns
,双击运行
这个是完成gradle
配置,生成IntelliJ IDEA
的配置文件
同样也是出现BUILD SUCCESSFUL
,说明配置成功
启动!
那么最后一步了,同样也是在Tasks/forgegradle runs
下有一个runClient
,双击运行
你也可以找到上方运行菜单中的runClient
,点击运行
这个就是启动游戏,那么当熟悉的音乐出来之后,你能够进入游戏,说明开发环境没有问题
那么恭喜你,正式踏入了我们1.20.1 Forge
模组开发的大门!