本篇教程的视频

本篇教程的源代码

GitHub地址:TutorialMod-Start-1.20.1

准备工作

那么从本期教程开始,我们正式的开始,这个1.20.1 fabric模组的开发教程

那么第一期教程的话,和以往一样,我们就来进行开发环境的配置

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的下载
Oracle官网

它分三个端,三个端的不同的安装程序,下载你自己对应系统

这里我们以Windows为例

那么它还分一些不同的安装方式,有三个东西

其中一个是zip,这是压缩文件,它是已经完全安装好的Java,你可以下载解压之后,放到你自己的Java目录中

另外两个exemsi,这两个的话都是安装程序,可以自己选择下载安装

安装的话,默认是安装到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下载

IDEA的安装默认也在C盘,这个的话,你就改到其他的位置好了,如果你C盘够大,也可以装C盘里

那么,在安装中,会有一个更新path变量的选项,这个选项的话,勾选了的话,需要重启电脑才能生效

模组模板文件

那么接下来我们要去生成Fabric模组的模板文件

这里我们要到它的模板生成器的网站上

链接:生成器

生成器

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

Mod Name

这个是模组的名字,可以按照你的需求填写,比如TutorialMod

这个名字在生成的文件中,会变成我们的我们之后常说的modid

如果你的模组名字中间有空格,那么生成的文件中会自动把空格替换成-

比如说Tutorial Mod会变成tutorial-mod

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

Package Name

这个是包名,一般是com.你的名字.模组名(上面的modid)

我的话就可以写com.besson.tutorial(最后一个可以不是modid的)

一般就是你的域名倒过来,然后加上模组名

Minecraft Version

显然易见,这个是我们要开发的Minecraft版本,这里我们选择1.20.1

Advanced Options

下面是一些高级选项

Kotlin Programming Language,如果你会kotlin可以勾选

Mojang Mappings,这个是Mojang的官方映射,我们不需要这个,
因为我们的模组是基于Fabric的,Fabric已经提供了yarn映射。

本教程也是基于Fabricyarn映射,如果你使用Mojang映射,有些方法名、类名可能会不一样

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

Split client and common sources,这个是分离客户端和服务端源码,可选可不选,不过这里我们先不选

我们的模组基本上是在服务端上运行的,比如方块实体的运算处理,箱子内存了什么东西,都是服务端存储的

而当玩家打开箱子时,才会触发服务端向客户端发包,告诉客户端箱子内存了什么东西,然后你可以拿出来或者放进去一些东西

不过,像一些渲染,如方块实体、生物实体、GUI、Screen等和渲染有关系的东西,都是在客户端上运行的

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

初始化项目

解压好我们的模板文件之后,我们用IDEA打开它

Gradle构建

而后,IDEA会自动进行Gradle的构建,不过,这个过程往往是模组开发之路上的第一块绊脚石

Gradle构建所需的资源都在外网,所以,这个构建过程建议全程使用7个木棍

不过Gradle可以换源,具体的内容自行百度

那么在Gradle构建期间,我们可以先看看build.gradle里的JVM版本

1
2
3
4
5
6
7
8
9
10
11
12
13
tasks.withType(JavaCompile).configureEach {
it.options.release = 17
}

java {
// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
// if it is present.
// If you remove this line, sources will not be generated.
withSourcesJar()

sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}

我们可以发现,Gradle默认的JVM版本是17

项目结构

那么确认了Gradle使用的是17之后,我们也得来看看项目结构里的设置是否正确

项目结构的快捷键是Shift+Alt+Ctrl+S,也找到设置中的项目结构打开,在项目界面,找到SDK,确认一下使用的是JDK17

在后面一个模块中,也可以设置使用的SDK,这里我们选择17

当然,其实用21也是没关系的,只要你的项目不出问题,JDK21也是可以选择的(我选择的是21)

项目结构

Gradle JVM

虽然说我们看到build.gradle里,它默认使用的是17,但是,有时候IDEA会自己给你选择其他的版本,我们也来检查一下

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

同样的,21如果不出问题,也可以用

Gradle JVM

IDEA一些小设置

IDEA 2024.3版本之后,我们就不再需要安装中文语言包这个插件了,因为这个时候中文已经是IDEA内置语言

外观与行为->系统设置->语言和区域,我们可以更改语言设置(当然需要重新启动

语言设置

那么另外的插件方面,Minecraft Development可以装一下,像Translation这样的翻译插件也可以装一个

运行genSources

当终端出现BUILD SUCCESSFUL字样,说明我们的Gradle构建已经成功

接下来我们就要进行源代码的获取,也就是带有注释的源文件java后缀),而不是IDEA给我们反编译的文件(class后缀)

在IDEA右侧栏中,我们找到一个大象的图标,那个是Gradle的图标

Tasks -> fabric找到genSources,双击运行,等待它运行完成,也是出现BUILD SUCCESSFUL字样即代表构建成功

那么接下来,我们找一个Minecraft的文件,就拿模板文件生成中的mixin示例文件为例,
也就是ExampleMixin,我们按住CTRL,再点击MinecraftServer,就可以跳转到MinecraftServer文件

不过,在你没有选择源文件之前,你会发现标签页上的class后缀的,这是IDEA反编译的,
同时在标签页下方还有一行蓝色的东西,其中一个选项是选择源,点击它,选择我们刚刚运行生成的源文件,
即带source后缀的jar文件

选择好之后,我们就得到了java后缀的源文件,也可以看到冒出来的一堆注释

那么在此之后,你打开绝大多数的Minecraft文件,都是java后缀的源文件

一些文件

那么接下来我们来看看一些比较重要的文件

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的最大内存,可以根据自己的电脑配置来调整

1
2
3
4
5
# Fabric Properties
# check these on https://fabricmc.net/develop
minecraft_version=1.20.1
yarn_mappings=1.20.1+build.10
loader_version=0.16.10

这个是Fabric的配置,我们可以在这里修改Minecraft版本yarn映射版本loader版本

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

链接:Fabric

在这个网站上,我们可以看Latest Versions中对应Minecraft的版本是否有更新,
如果有的话,就可以将网站上的内容复制到我们的这个文件中,重新建构以更新项目

版本更新

1
2
3
4
# Mod Properties
mod_version=0.0.1-1.20.1
maven_group=com.besson.tutorial
archives_base_name=tutorial-mod

这个是模组的配置,我们可以在这里修改模组的版本号,另外两个是包名模组名(modid),后面两个基本就不去动它

1
2
# Dependencies
fabric_version=0.92.3+1.20.1

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

build.gradle

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

1
2
3
4
plugins {
id 'fabric-loom' version '1.9-SNAPSHOT'
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}"
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"

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

}
...

这个是Gradle依赖,我们可以在这里添加一些依赖

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

后续我们将争对这一部分的进行专门的讲解

LICENSE

这是许可证文件,也是开源项目所遵循的开源协议文件

我们可以在这里修改许可证的内容。具体的内容你可以自行百度,把他们复制到这个文件中即可

你也可以在GitHub上生成你的许可证文件

fabric.mod.json

这个是模组的描述文件,里面有一些模组的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
...
"id": "tutorial-mod",
"version": "${version}",
"name": "Tutorial Mod",
"description": "这里是描述",
"authors": [
"北山Besson"
],
"contact": {
"homepage": "https://fabricmc.net/",
"sources": "https://github.com/FabricMC/fabric-example-mod"
},
"license": "CC0-1.0",
"icon": "assets/tutorial-mod/icon.png",
"environment": "*",
...
}

id是模组的ID,就是modid

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

name是模组的名字

description是模组的描述

authors是作者,可以有多个

contact在一些启动器上是会自动读取的,比如HMCL,你打开模组信息时,会展示官方页面和源代码页面的,
homepage的话,假设你的模组有一个专门的网站,那可以写上,
sources就是你的源代码仓库的地址

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

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

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

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

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

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

TutorialModClient.java

注意你创建的位置,要和上面写的路径一致,不然找不到

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

}
}

这个类要实现ClientModInitializer接口,
然后重写onInitializeClient方法。

这个方法会在客户端初始化的时候被调用。

TutorialMod.java

这个是我们的主类文件,它会在我们游戏启动的时候被调用。我们可以在这里添加一些初始化代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class TutorialMod implements ModInitializer {

public static final String MOD_ID = "tutorial-mod";

// 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 = LoggerFactory.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!");
}
}

MOD_ID在现在的版本中,已经自动给你拿出来了,以后我们会用到

重新建构

因为我们改了一些文件,所以我们需要重新构建一下项目

我们可以找到一个大象带一个重新加载的图标,点击它即可进行重构

查看源代码/资源文件

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

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

我们找到Gradle: net.minecraft:minecraft-merged-xxx(这一串可能不一样):1.20.1-net.fabricmc.yarn.1_20_1.1.20.1+build.10-v2

在这个里面,我们可以找到Minecraft的源代码

net文件夹下存放的一般是Minecraft的源代码,我们可以直接查看

外部库

resource下的assetsdata文件也是我们可以查看的东西

assets是资源文件,data是数据文件

启动!

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

前面一个运行配置没有的话,可以退出重进一下

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