需要先参考 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 种基本类型

类型名称关键字占用字节位数默认值取值范围
字节型byte180-128 ~ 127
短整型short2160-32,768 ~ 32,767
整型int4320-2,147,483,648 ~ 2,147,483,647
长整型long8640L-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
单精度浮点float4320.0f约 ±3.40282347E+38F(有效位数6-7位)
双精度浮点double8640.0d约 ±1.79769313486231570E+308(有效位数15-16位)
字符型char216'\u0000'0 ~ 65,535(Unicode 字符)
布尔型boolean不确定(通常1字节)1falsetrue / 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文件和纹理图像文件。 您将需要将它们添加到资源目录中。每个文件的直接路径是: