Skip to content

2.2 基础物品

阅前注意

从本节开始,将会涉及到一些Forge相关的概念,这些概念会和第一章一样放在最后一节进行讲解(需要讲解的概念会放在每节的最后一段)。

注册物品

在Forge中,我们需要将物品进行“注册”才能够在Minecraft中使用。

注册的过程相当复杂,不过幸运的是,Forge为我们提供了一个类DeferredRegister<T>,可以帮助我们完成注册的过程。

现在我们创建一个类,专门用于注册物品,在本教程中,这个类放在moe.gensoukyo.thirst.register包下,命名为ItemRegister

然后我们为这个类添加一个静态成员变量,类型为DeferredRegister<Item>,名字为ITEMS

public class ItemRegister {
    public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID);
}

这里的DeferredRegister相当于是一个容器,用于存放我们注册的物品。而Item是泛型,如果你不理解,可以简单理解为容器中所存放的物品的类型。

对了,关于变量名,我们提倡对于final变量使用全大写的下划线分割命名法,这样可以方便区分普通可变变量。

这个容器现在是空的,我们要做的就是向这个容器中添加我们想要注册的物品。我们先注册一个简单的,没有任何别的作用的物品:

public static final RegistryObject<Item> KETTLE = ITEMS.register("kettle", () -> new Item(new Item.Properties()));

RegistryObject是一个指针,指向了我们注册的物品,这个概念比较难以理解,如果你不理解,可以简单理解为RegistryObject就是我们注册的物品(但实际上这是错的,不过是否能够理解不重要)。

为这个变量赋值的语句比较难,但是好消息是你不需要理解它在做什么,只需要照抄就完事。

但是目前,你需要理解register的第一个参数的含义,这个参数代表了我们注册的物品的物品ID,和ModID一样,它是物品的唯一标识符。

此时这个容器还无法被Forge认可,因为我们还没有将它添加到Forge中,我们只是单纯的定义了这个容器并未使用,我们需要将我们之前的容器注册到Forge的事件总线当中。

我们需要在我们的主类中添加这样一段代码:

public Thirst() {
        var bus = FMLJavaModLoadingContext.get().getModEventBus();
        ITEMS.register(bus);
}

这里的Thirst()代表了我们主类的构造函数,构造函数会在类被定义为对象时被调用,也就是说我们在构造函数中定义的语句会在游戏启动时被执行。

这里的FMLJavaModLoadingContext.get().getModEventBus()代表了Forge的事件总线,我们将我们的容器注册到这个事件总线中,这样Forge就能够识别我们的容器了。

现在,我们可以在游戏中通过give命令获得我们注册的物品了(点击runClient]运行游戏):

/give @s thirst:kettle

纯物品

代码片段

在本章节,我们修改了Thirst类以及创建了ItemRegister类,现在的文件结构如图: 文件结构

Thirst.java

// imports

@Mod(Thirst.MODID)
public class Thirst {
    public static final String MODID = "thirst";
    private static final Logger LOGGER = LogUtils.getLogger();

    public Thirst() {
        var bus = FMLJavaModLoadingContext.get().getModEventBus();
        ITEMS.register(bus);
    }
}

ItemRegister.java

// imports

public class ItemRegister {
    public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID);

    public static final RegistryObject<Item> KETTLE = ITEMS.register("kettle", () -> new Item(new Item.Properties()));
}

Forge相关概念