需要先参考 Fabric 文档的设置开发环境,然后参考 Fabric 文档的创建项目
开发环境:
- JDK 21
- IDE IntelliJ IDEA
根据 Fabric Wiki 的原文内容,先学习添加物品和方块。
入门可以先尝试添加一些物品和方块。另外,建议了解一下如何在不重启 Minecraft 的情况下应用更改,以便调试。
边学习制作Mod,边学习Java开发。

在 1.21.1 中创建第一个物品
从 1.21.2 开始,物品注册重写了。需要把 RegistryKey 存储到 Item.Settings 中,将以下代码写到 src/client/resources/hydrogen-peroxide.client.mixins.json 中。
public final class TutorialItems {
private TutorialItems() {
}
public static final Item CUSTOM_ITEM = register("custom_item", Item::new, new Item.Settings());
public static Item register(String path, Function factory, Item.Settings settings) {
final RegistryKey- registryKey = RegistryKey.of(RegistryKeys.ITEM, Identifier.of("tutorial", path));
return Items.register(registryKey, factory, settings);
}
public static void initialize() {
}
}
JAVA 入门语法
在 Java 中,所有“函数”本质上都是“方法”,因为函数在类中被称为方法,而 Java 是面向对象编程,不存在写在类之外的函数。
一般情况下,类需要创建对象之后才可以被调用。工具类就是只有静态方法(和静态常量),不需要创建对象,可以直接调用的类。
在 Java 中,通过 修饰符 + class + 类名 来定义类
在
class前可以添加“修饰符”(modifier),一些常用的修饰符为:
- (无修饰符/默认):只能被同一个包内的类访问
public:可以被任何地方的类访问final:禁止继承,一般用于工具类abstract:抽象类,不可以创建对象,可以包含抽象方法(需要子类实现)
[修饰符] class 类名 {
类体(成员)
}以下的成员需要在类体 { } 内定义
在 Java 中,通过 修饰符 + 数据类型 + 方法名 + (参数列表) 来定义成员方法
在
数据类型前可以添加“修饰符”(modifier),一些常用的修饰符为:
public:任何地方都能访问private:只能本类内部访问protected:允许同包任意类访问,也允许不同包的子类访问。final:禁止子类重写该方法static:声明为静态成员,直接用类名访问
[修饰符] 返回类型 成员方法名(参数) {
方法体
}在 Java 中,通过 修饰符 + 数据类型 + 方法名 来定义成员变量
在
数据类型前可以添加“修饰符”(modifier),一些常用的修饰符为:
public:任何地方都能访问private:只能本类内部访问protected:允许同包任意类访问,也允许不同包的子类访问。final:一旦赋值就不能改变(变成常量)static:声明为静态成员,直接用类名访问
[修饰符] 数据类型 成员变量名 = 初始值;在 Java 中,通过 修饰符 + 类名 + (参数列表) 来定义构造方法
用于创建对象时给成员变量赋初始值,在
类名前可以添加“修饰符”(modifier),一些常用的修饰符为:
public:任何地方都能访问private:只能本类内部访问protected:允许同包任意类访问,也允许不同包的子类访问。
[修饰符] 类名(参数) {
初始化赋值代码
}构造方法赋值与定义成员变量时直接赋值的区别
定义时赋值 = 给所有对象一个统一的默认值(先执行)。
构造方法赋值 = 给每个对象定制不同的初始值(后执行,可覆盖默认值)。
对比四种访问修饰符
| 修饰符 | 同一个类 | 同一个包 | 不同包的子类 | 任何类 |
|---|---|---|---|---|
private | ✅ | ❌ | ❌ | ❌ |
| (无修饰符) | ✅ | ✅ | ❌ | ❌ |
protected | ✅ | ✅ | ✅ | ❌ |
public | ✅ | ✅ | ✅ | ✅ |
8 种基本类型
| 类型名称 | 关键字 | 占用字节 | 位数 | 默认值 | 取值范围 |
|---|---|---|---|---|---|
| 字节型 | byte | 1 | 8 | 0 | -128 ~ 127 |
| 短整型 | short | 2 | 16 | 0 | -32,768 ~ 32,767 |
| 整型 | int | 4 | 32 | 0 | -2,147,483,648 ~ 2,147,483,647 |
| 长整型 | long | 8 | 64 | 0L | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
| 单精度浮点 | float | 4 | 32 | 0.0f | 约 ±3.40282347E+38F(有效位数6-7位) |
| 双精度浮点 | double | 8 | 64 | 0.0d | 约 ±1.79769313486231570E+308(有效位数15-16位) |
| 字符型 | char | 2 | 16 | '\u0000' | 0 ~ 65,535(Unicode 字符) |
| 布尔型 | boolean | 不确定(通常1字节) | 1 | false | true / false |
注意:
long类型字面量需加L或l(如100L);float需加F或f(如3.14f)。
自定义物品
public static final Item CUSTOM_ITEM = register("custom_item", Item::new, new Item.Settings());注册物品
public static Item register(String path, Function factory, Item.Settings settings) {
final RegistryKey- registryKey = RegistryKey.of(RegistryKeys.ITEM, Identifier.of("tutorial", path));
return Items.register(registryKey, factory, settings);
}
在 Minecraft 的 Item 类里面,还有一个 Settings 类。所以 Settings 就是 Item 的内部类。
内部类通常用来表示和外部类紧密相关、辅助外部类工作的东西。
Item是“物品本体”。Settings是“物品的配置参数”。配置参数只对物品有意义,离开物品就没用了。所以把它放在
Item里面,逻辑上更自然。
Minecraft 注册系统的 register 方法会处理传入的物品信息,然后添加到注册表中。
触发类的加载
public static void initialize() {
}添加物品模型、纹理和模型映射
这是因为我们还没有给物品提供纹理(texture)、烘焙模型(baked module,以下简称模型)以及相应的模型映射(自 1.21.4 开始)。这些文件分别位于以下位置:
为物品注册纹理需要物品模型.json文件和纹理图像文件。 您将需要将它们添加到资源目录中。每个文件的直接路径是:
Comments NOTHING