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()));
}