本篇教程的视频:

本篇教程源代码

GitHub地址:Tutorial Mod - CreativeModeTabs

本篇教程目标

  • 理解原版物品栏注册
  • 学会物品栏注册

查看源代码

我们先来看看原版是如何添加物品到物品栏的。之前的教程也提到过了,原版物品栏的注册在CreativeModeTabs类中。

1
public static final ResourceKey<CreativeModeTab> INGREDIENTS = createKey("ingredients");

首先我们看到它的注册,这里使用的是createKey方法,这个方法是一个静态方法,返回一个RegistryKey<CreativeModeTab>

注册方法

1
2
3
private static ResourceKey<CreativeModeTab> createKey(final String id) {
return ResourceKey.create(Registries.CREATIVE_MODE_TAB, Identifier.withDefaultNamespace(id));
}

看着这个方法的返回语句,是否和之前物品的注册键方法有些类似呢?是的没错,同样的,Identifier要我们自行更改

注册语句

那么除此之外,我们可以看到bootstrap方法中一堆的ingredients.accept(...)

那么这些东西便是将物品加入到物品栏的方法了

1
2
3
4
5
6
7
8
9
10
11
12
13
Registry.register(
registry,
INGREDIENTS,
CreativeModeTab.builder(Row.BOTTOM, 3)
.title(Component.translatable("itemGroup.ingredients"))
.icon(() -> new ItemStack(Items.IRON_INGOT))
.displayItems((parameters, ingredients) -> {
ingredients.accept(Items.COAL);
...
});
})
.build()
);

这里我们以INGREDIENTS为例,我们可以看到它使用的是Registry.register方法,这个方法是用来注册物品栏的

但是首先我们得知道这个registry应该写什么,其实它就是Registries.CREATIVE_MODE_TAB,这个是原版的物品栏注册器

1
public static final Registry<CreativeModeTab> CREATIVE_MODE_TAB = registerSimple(Registries.CREATIVE_MODE_TAB, CreativeModeTabs::bootstrap);

我们在Registries类中可以看到,CREATIVE_MODE_TAB是一个Registry<CreativeModeTab>类型的常量,创建的时候使用的是bootstrap方法

而我们自己写的时候直接使用Registries.CREATIVE_MODE_TAB即可

那么接下来,我们看到第二个参数是INGREDIENTS,这个是一个RegistryKey<CreativeModeTab>类型的常量,这个是物品栏的ID吗,也是上面注册的ID

然后我们看到CreativeModeTab.builder方法,这个方法是用来创建物品栏的,里面有一些参数,比如Row.BOTTOM,这个是指物品栏所在的位置,这里的BOTTOM表示它在GUI的下面那行中,3是指在第4个;

那么其他的还有Row.TOP,这个是指在GUI的上面那行中

我们接着看title方法,这个是用来设置物品栏的名字的,这里使用的是Component.translatable方法,这个方法是用来设置物品栏名字的,这里使用的是itemGroup.ingredients,这个是一个翻译键,我们可以在语言文件中找到这个翻译键,然后设置物品栏的名字

然后我们看icon方法,这个是用来设置物品栏的图标的,这里使用的是Items.IRON_INGOT,这个是物品栏的图标,这里使用的是铁锭

displayItems方法是用来设置物品栏的物品的,这里使用的是一个lambda表达式,这个lambda表达式有两个参数

一个是parameters,一个是ingredientsingredients是用来设置物品栏的物品的,这里的东西省略了,我们就不展开了

创建物品栏

创建 ModCreativeModeTabs 类

首先我们创建一个类ModCreativeModeTabs

1
2
3
public class ModCreativeModeTabs {

}

创建注册键

接下来我们创建一个注册键

1
2
public static final ResourceKey<CreativeModeTab> TUTORIAL_TAB = ResourceKey.create(
BuiltInRegistries.CREATIVE_MODE_TAB.key(), Identifier.fromNamespaceAndPath(TutorialMod.MOD_ID, "tutorial"));

记得要使用fromNamespaceAndPath传入我们自己的模组ID

创建物品栏

1
2
3
4
5
6
7
8
9
10
11
public static final CreativeModeTab TUTORIAL = FabricCreativeModeTab.builder()
.icon(() -> new ItemStack(ModItems.ICE_ETHER))
.title(Component.translatable("itemGroup.tutorial"))
.displayItems((parameters, output) -> {

output.accept(ModItems.ICE_ETHER);
output.accept(ModItems.RAW_ICE_ETHER);
output.accept(ModItems.CARDBOARD);
output.accept(Items.DIAMOND);

}).build();

区别于原版的注册语句,这里我们直接用FabricCreativeModeTab.builder方法创建物品栏,它会自己给我们排位置(按首字母排序)

然后里面的方法我就不赘述了,前面都讲过了,这是与原版一样的

物品栏里面不止可以加我们自己模组的物品,也可以加原版物品

初始化注册方法

同样的,我们也来写一个初始化注册方法

1
2
3
4
public static void register() {
TutorialMod.LOGGER.info("Registering Custom Creative Mode Tab for " + TutorialMod.MOD_ID);
Registry.register(BuiltInRegistries.CREATIVE_MODE_TAB, TUTORIAL_TAB, TUTORIAL);
}

这里我们同样写了一个输出日志

另外还需要写一个额外的注册语句,用于将我们的物品栏和它的注册键绑定

主类还要调用这个方法

1
ModCreativeModeTabs.register();

举一反三

我们可以再写一个,举一反三

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static final ResourceKey<CreativeModeTab> TUTORIAL_TAB2 = ResourceKey.create(
BuiltInRegistries.CREATIVE_MODE_TAB.key(), Identifier.fromNamespaceAndPath(TutorialMod.MOD_ID, "tutorial2"));

public static final CreativeModeTab TUTORIAL2 = FabricCreativeModeTab.builder()
.icon(() -> new ItemStack(ModItems.ICE_ETHER))
.title(Component.translatable("itemGroup.tutorial2"))
.displayItems((parameters, output) -> {
output.accept(ModItems.ICE_ETHER);
output.accept(ModItems.RAW_ICE_ETHER);
output.accept(ModItems.CARDBOARD);

output.accept(Items.DIAMOND);
}).build();

public static void register() {
Registry.register(BuiltInRegistries.CREATIVE_MODE_TAB, TUTORIAL_TAB2, TUTORIAL2);
}

语言文件

1
2
3
4
{
"itemGroup.tutorial": "Tutorial Tab",
"itemGroup.tutorial2": "Tutorial Tab2"
}

这里的语言文件用来翻译物品栏的名字

测试

现在我们启动游戏,由于原版的物品栏已经填满了第一页,不过它会自动生成一个翻页符,我们点击翻页符,就可以看到我们的物品栏了