本篇教程的视频

(待发布)

本篇教程的源代码

(待发布)

添加到原版物品栏

那么首先我们首先将物品添加到原版的物品栏

这个的话就用到之前主类中的addCreative方法,当然,前提是你之前没完全删掉

如果之前删掉了的话就写上下面这个方法

1
2
3
private void addCreative(BuildCreativeModeTabContentsEvent event) {

}

同时在主类的构造函数中也要加上注册事件

1
modEventBus.addListener(this::addCreative);

确保这两个部分都有之后,我们就可以在addCreative方法中写一些语句,将我们的物品添加到物品栏中了

1
2
3
4
5
if (event.getTabKey() == CreativeModeTabs.INGREDIENTS){
event.accept(ModItems.ICE_ETHER);
event.accept(ModItems.RAW_ICE_ETHER);
event.accept(ModItems.CARDBOARD);
}

这里我们写一个if语句,判断当前物品栏是不是原版中的某一个栏,如果是的话,就将我们的物品添加进去

CreativeModeTabs.INGREDIENTS就是原材料栏的键值,这个类也是原版那些物品栏的注册类

其他的物品栏像BUILDING_BLOCKS建筑方块、COLORED_BLOCKS染色方块等等

现在,我们进入游戏,就可以在原材料这一栏看到这三个物品了

自定义物品栏

注册物品栏

那么,一般模组是会有自己单独的物品栏的,而不是直接将模组的物品和原版的东西放一起

这里我们也可以来写一个,同样的,先写一个物品栏的注册类,创建一个ModCreativeModeTabs

1
2
3
public class ModCreativeModeTabs {

}

接下来,先写一个延迟注册器

1
2
public static final DeferredRegister<CreativeModeTab> CREATIVE_MODE_TABS =
DeferredRegister.create(Registries.CREATIVE_MODE_TAB, TutorialMod.MOD_ID);

这个延迟注册器是DeferredRegister<CreativeModeTab>类型

这里面Registries.CREATIVE_MODE_TABCreativeModeTab的注册表,TutorialMod.MOD_ID是模组的ID

随后我们就来写一个物品栏

1
2
3
4
5
6
7
8
9
10
public static final RegistryObject<CreativeModeTab> TUTORIAL_TAB =
CREATIVE_MODE_TABS.register("tutorial_tab", () -> CreativeModeTab.builder()
.icon(() -> new ItemStack(ModItems.ICE_ETHER.get()))
.title(Component.translatable("itemGroup.tutorial_tab"))
.displayItems((pParameters, pOutput) -> {
pOutput.accept(ModItems.ICE_ETHER.get());
pOutput.accept(ModItems.RAW_ICE_ETHER.get());
pOutput.accept(ModItems.CARDBOARD.get());
})
.build());

与之前物品的注册差不多,这里也是创建一个RegistryObject,不过类型是CreativeModeTab

CreativeModeTab.builder()是创建一个CreativeModeTab的构造器

icon是设置物品栏的图标,它的图标是从一个物品堆栈(ItemStack)获取的,这里我们用ModItems.ICE_ETHER.get()获取我们之前注册的ICE_ETHER物品的物品堆栈,
至于物品堆栈是什么,这里我们简单介绍一下吧

物品堆栈方块实体概念类似,在游戏中,物品本身是不存储数据的,像物品的堆叠数量耐久度等等都是通过物品堆栈存储的

所以简单来说,它其实就像物品的一个容器,用来存储数据

title是设置物品栏的标题,这里我们用Component.translatable来创建一个可供语言文件翻译文本itemGroup.tutorial_tab是语言文件中的键值

displayItems是设置物品栏中的物品,这里我们用pOutput.accept来添加物品

最后再写一个build方法,返回这个构建器

举一反三

来,我们来举一反三

1
2
3
4
5
6
7
8
public static final RegistryObject<CreativeModeTab> MATERIAL =
CREATIVE_MODE_TABS.register("material", () -> CreativeModeTab.builder()
.icon(() -> new ItemStack(ModItems.CARDBOARD.get()))
.title(Component.translatable("itemGroup.material"))
.displayItems((pParameters, pOutput) -> {
pOutput.accept(ModItems.CARDBOARD.get());
}).withTabsBefore(TUTORIAL_TAB.getKey())
.build());

这里的话我们多加了一个方法,也就是withTabsBefore,也就是指定它在哪一个物品栏后面

默认的话,创造模式物品栏是按照字母顺序排列的,所以默认MATERIAL会在TUTORIAL_TAB前面

而我们可以通过这个方法将它搬到后面去

这个的话算一个小知识点吧,也是Forge这里特有的吧,Fabric没有这个方法,只能通过指定其绝对位置来决定其顺序

注册事件

最后,和前面注册物品一样的,我们得写一个方法,注册物品栏这个事件

1
2
3
public static void register(IEventBus eventBus){
CREATIVE_MODE_TABS.register(eventBus);
}

以及,不要忘记在主类构造函数中的调用

1
ModCreativeModeTabs.register(modEventBus);

语言文件

上面的物品栏中的title我们要用语言文件来翻译

1
2
"itemGroup.tutorial_tab": "Tutorial Tab",
"itemGroup.material": "Material"

测试

那么最后我们就能进入游戏来查看物品栏了

因为原版的物品栏已经将第一页占满了,所以我们添加的物品栏是在第二页