观前提示

本教程适用于Minecraft 26.1 Fabric的模组开发,不是Java教程。在开始之前也请先学习Java,具有一定的Java基础后再来学习

虽然1.21.X一直再变,但这里的教程可能适用于1.21.4-26.1版本的模组开发,请结合实际情况

如果有问题,请加QQ群(也不要来直接找我)。B站私信不回,谢谢

本篇教程的视频:

(待发布)

本篇教程源代码

GitHub地址:(待发布)

准备工作

安装JDK25

由于26.1采用了Java25来编写,所以说我们开发26.1的模组自然要采用Java25。这里提供的是Oracle JDK25的下载地址,你也可以选择其他JDK25的版本

安装的路径一般不用改,除非你C盘真的塞不下了,再改到其他地方去

JDK下载安装地址:JDK25

环境变量配置

安装好JDK25后,我们需要配置环境变量。其实不配置也可以,但是需要你在IDEA中配置

我们先找到系统变量,Win11的位置在:设置 -> 系统 -> 系统信息 -> 高级系统设置 -> 环境变量

然后在系统变量中新建一个JAVA_HOME变量,变量值为你的JDK21的安装路径,如C:\Program Files\Java\jdk-25

然后再新建一个CLASSPATH变量,变量值为.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;这样就配置好了JDK25的环境变量

安装 IDEA

IDEA是一个非常好用的IDE,现在已经不再分专业版社区版了,两个版本已经合并了,只在软件里面有订阅功能,也可以不订阅,免费用着就行

其他的IDE自然可以,但推荐使用IDEA,因为在查看源代码、搜索等方面都很方便

IDEA的安装也很简单,直接下载安装包,然后一路下一步就可以了。安装过程中有一步是选择添加"bin"文件夹到PATH,这个选项可以勾选,但需要重启才会生效

IDEA下载链接:IDEA

Fabric 开发模板文件生成

Fabric提供了一个模板文件生成器,可以帮助我们快速生成一个Fabric模组的模板文件

Fabric Template Generator

链接:Fabric Template Generator

然后我们来看里面的一些设置:

Mod Name

这个是模组的名字,可以按照你的需求填写,比如TutorialMod。这个名字在生成的文件中,会变成我们的我们之后常说的modid

如果你的模组名字中间有空格,那么生成的文件中会自动把空格替换成-。比如说Tutorial Mod会变成tutorial-mod

注意,modid一旦生成就不要乱改,否则会导致模组无法正常运行

Package Name

这个是包名,一般是com.你的名字.模组名。比如说com.besson.tutorialmod。一般就是你的域名(开源仓库的)倒过来,然后加上模组名

Minecraft Version

显然易见,这个是我们要开发的Minecraft版本,这里我们选择26.1(本篇教程编写时,还没有正式版,如果没有26.1,就选择26.1对应的快照版本即可)

Advanced Options

勾选Data Generation,这个是生成数据包的,我们后面会用到

不勾选Split client and common sources,这个是分离客户端和服务端源码,我们不需要这个,因为我们的模组基本上是在服务端上运行的(假设你开了个服务器加了这个模组),模组内的运算都是在服务器上完成,再发回客户端的

另外的一个是Kotlin Programming Language,如果你会kotlin,可以勾选,但我不能保证此系列教程是否适用

映射的选项已经没有了,因为从26.1开始,Mojang正式移除代码中的混淆,所有的类名、方法名、字段名都是官方名称,所以我们不需要再选择映射了

(Yarn R.I.P.)

一切准备完成后,我们点击下方的下载按钮即可下载模板文件。并将它解压到你的工作目录

初始化项目

接下来,我们用IDEA打开我们的项目。然后它将自动进行Gradle构建

此过程强烈建议使用加速器,不然很容易超时导致建构失败。当然,你可以将gradle的下载源改为国内的镜像源,至于方法就自行百度了

一些小设置

在等待Gradle建构的时候,我们可以先进行一些小设置

AI 辅助编程的插件可以根据自己的需要安装,这里就不多说了

翻译插件可以安装一下,这样可以翻译一些英文的文档。方法:File -> Settings -> Plugins -> 搜索Translation -> 安装

其他的主题、字体等设置可以自行调整。这里就不再赘述

检查

当Gradle建构完成后,我们可以检查一下文件是否有问题。看看是否有报错的地方,一般是不会有的

检查项目结构:文件 -> 项目结构,快捷键Ctrl+Alt+Shift+S,检查项目设置的项目中的SDK,是否为JDK25

项目结构

检查Gradle JVM:文件 -> 设置 -> 构建、执行、部署 -> 构建工具 -> Gradle,检查Gradle JVM是否为JDK25

Gradle JVM

确保以上两个地方都是JDK21,那一般就不会出问题。

运行 genSource

这个是Gradle的一个task,我们可以在IDEA的右侧找到Gradle,然后找到Tasks -> fabric -> genSource,然后双击运行即可。这个用于获取源代码的,方便我们查看源代码

genSource

其他文件

我们来看一下项目中的一些比较重要的文件:

gradle.properties

这个文件是Gradle的配置文件,里面有一些Gradle的配置。

1
2
3
# Done to increase the memory available to gradle.
org.gradle.jvmargs=-Xmx1G
org.gradle.parallel=true

比如说org.gradle.jvmargs=-Xmx1G,这个是Gradle的最大内存,可以根据自己的电脑配置来调整。

org.gradle.parallel=true是并行编译,这个可以加快编译速度。

1
2
3
4
5
# Fabric Properties
# check these on https://fabricmc.net/develop
minecraft_version=26.1-snapshot-1
loader_version=0.18.4
loom_version=1.14-SNAPSHOT

这个是Fabric的配置,我们可以在这里修改Minecraft版本、loader版本、loom版本(loom是Fabric的Gradle插件)

当版本有更新时,我们可以在这里修改,然后重新建构项目即可。版本信息可以在这里给出的网站上找到。

1
2
3
4
# Mod Properties
mod_version=1.0.0
maven_group=com.besson.tutorial
archives_base_name=tutorial

这个是模组的配置,我们可以在这里修改模组的版本、包名、模组名

1
2
# Dependencies
fabric_version=0.140.2+26.1

这个是Fabric的API版本,同样我们可以用上面的那个网站来检查更新。

build.gradle

这个是Gradle的构建文件,里面有一些Gradle的配置。

1
2
3
4
plugins {
id 'net.fabricmc.fabric-loom' version "${loom_version}"
id 'maven-publish'
}

这个是Gradle的插件,我们可以在这里添加一些插件。而fabric-loom是Fabric的插件,其版本也可以在上面的网站上找到。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
......
repositories {
// Add repositories to retrieve artifacts from in here.
// You should only use this when depending on other mods because
// Loom adds the essential maven repositories to download Minecraft and libraries from automatically.
// See https://docs.gradle.org/current/userguide/declaring_repositories.html
// for more information about repositories.
}

dependencies {
// To change the versions see the gradle.properties file
minecraft "com.mojang:minecraft:${project.minecraft_version}"

implementation "net.fabricmc:fabric-loader:${project.loader_version}"

// Fabric API. This is technically optional, but you probably want it anyway.
implementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"

}
......

这个是Gradle的依赖,我们可以在这里添加一些依赖。也是为我们模组添加的依赖,一般的可以被当作lib使用的模组的Wiki中会告诉我们如何添加

后续我们也可以举一些例子

LICENSE

这是许可证文件,也是开源项目所遵循的开源协议文件。我们可以在这里修改许可证的内容。具体的内容你可以自行百度,把他们复制到这个文件中即可。

fabric.mod.json

路径是src/main/resources/fabric.mod.json,这个是模组的描述文件,里面有一些模组的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
......
"id": "tutorialmod",
"version": "${version}",
"name": "Tutorial Mod",
"description": "这是描述",
"authors": [
"北山Besson"
],
"contact": {
"sources": "https://github.com/BeiShanair/tutorialmod-template-1.21"
},
"license": "CC0-1.0",
"icon": "assets/tutorialmod/icon.png",
"environment": "*",
......
}

id是模组的ID,就是modid

version是模组的版本,这个是在gradle.properties中配置的

name是模组的名字

description是模组的描述

authors是作者,可以有多个

contact是联系方式,一般是GitHub地址,当然这里还有一个homepage(这里被我删掉了),假设你的模组有一个专门的网站,那可以写上

license是许可证,这个是在LICENSE文件中配置的

icon是模组的图标,这个是在assets/tutorialmod/icon.png中配置的

environment是环境,一般是*,表示所有环境。

下面,我们要为其中的entrypoints添加一些内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
......
"entrypoints": {
"main": [
"com.besson.tutorialmod.TutorialMod"
],
"fabric-datagen": [
"com.besson.tutorialmod.TutorialModDataGenerator"
],
"client": [
"com.besson.tutorialmod.TutorialModClient"
]
}
......

这里多加一个client,也就是客户端,因为模组中有一些特殊的代码需要在客户端运行,比如渲染。

而后我们需要创建TutorialModClient这个类

TutorialModClient.java

路径是src/main/java/com/besson/tutorialmod/TutorialModClient.java

1
2
3
4
5
6
public class TutorialModClient implements ClientModInitializer {
@Override
public void onInitializeClient() {

}
}

这个类要实现ClientModInitializer接口,然后重写onInitializeClient方法。这个方法会在客户端初始化的时候被调用。

TutorialMod.java

路径是src/main/java/com/besson/tutorialmod/TutorialMod.java,这个是我们的主类文件,它会在我们游戏启动的时候被调用。我们可以在这里添加一些初始化代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class TutorialMod implements ModInitializer {
public static final String MOD_ID = "tutorial";

// This logger is used to write text to the console and the log file.
// It is considered best practice to use your mod id as the logger's name.
// That way, it's clear which mod wrote info, warnings, and errors.
public static final Logger LOGGER = LogManager.getLogger(MOD_ID);

@Override
public void onInitialize() {
// This code runs as soon as Minecraft is in a mod-load-ready state.
// However, some things (like resources) may still be uninitialized.
// Proceed with mild caution.

LOGGER.info("Hello Fabric world!");
}
}

MODID我习惯性地喜欢在它们之间加上下划线,也好看一点

MODID是我们之后用的比较多的字段

重新建构

因为我们改了一些文件,所以我们需要重新建构一下项目。我们可以找到一个大象带一个重新加载的图标,点击它即可进行重构。

查看源代码/资源文件

查看源代码,我们可以直接利用IDEA的随处搜索,在IDEA界面的右上角,快捷键double Shift,然后输入我们要查找的类名即可。

一些Minecraft的类我们可以按住Ctrl,然后点击类名,就可以直接跳转到Minecraft的源代码中

注意,也许你打开的时候,这个文件的后缀名是.class,我们可以点击选择源,将我们的源代码文件夹选择为一个带source的,一般就是在蹦出来的窗口中,前提是运行了genSource

另外就是最简单粗暴的方法,直接翻外部库

我们找到Gradle: net.minecraft:minecraft-merged-5e17f48361:26.1-snapshot-1

在这个里面,我们可以找到Minecraft的源代码。net文件夹下存放的一般是Minecraft的源代码,我们可以直接查看

resource下的assetsdata文件也是我们可以查看的东西。assets是资源文件,data是数据文件。

启动!

折腾完以后,我们就可以启动我们的游戏了。我们可以在IDEA的右上角的运行中,找到Minecraft Client运行,也可以找到gradle任务中的runClient运行。

当游戏可以正常运行的时候,那么恭喜你!你已经完成了第一步!