用户:MashKJo/1.12.2模组开发教程/7.自定义创造模式物品栏

读者可能已经注意到了:之前笔者添加的新物品,都是放在“杂项”这一创造模式物品栏中的——那么我们可不可以自定义我们的Mod的独有创造模式物品栏呢?当然可以。

所有创造模式物品栏都是net.minecraft.creativetab.CreativeTabs的实例,这个类是抽象类,且只有一个抽象方法:ItemStack getTabIconItem(),这个方法用于决定该创造模式物品栏的显示的图标,它返回一个ItemStack实例。另外,CreativeTabs还有2个构造方法:(String label)(int index, String label),我们应该用前者,而后者是给原版的CreativeTabs用的——毕竟后者可以显式指定CreativeTabs的数字ID,显然Modder不该用这个,否则兼容性会被搞得一塌糊涂。

如果你没什么特殊的需求,只需要弄个匿名内部类就可以了:

public static final CreativeTabs TUTORIAL_MOD_TAB = new CreativeTabs("tutorial_mod"){
    @Override
    public ItemStack getTabIconItem(){
        return new ItemStack(TutorialModItems.RUBY);
    }
};

此外,创造模式物品栏名称的本地化键名为"itemGroup." + label,例如,上述代码定义的创造模式物品栏,其名称的本地化键名为itemGroup.tutorial_mod

另外,CreativeTabs类中还有一些方法可以覆写,借此你可以控制:是否有搜索框、搜索框宽度、创造模式物品栏背景图,等等。这里笔者再讲一下设定背景图的方法:setBackgroundImageName。这个方法传入一个String——没错,不是ResourceLocation,很意外吧?这个String中应该包含材质文件的扩展名——其实只能是.png。如,笔者传入"tutorial_mod.png",那么该文件的实际路径为assets/[modid]/textures/gui/container/creative_inventory/tabs_tutorial_mod.png。没错,Mojang在这里不仅硬编码了该文件的父级目录,甚至还包括文件名本身——这是什么离谱的设计??最后,该文件的尺寸,只能是256×256,但其实际显示的地方没这么大,其右下角的部分是透明,这块你根据原版的相关材质改就行。

向创造模式物品栏中手动添加ItemStack

很简单,只需要覆写displayAllRelevantItems这个方法即可,该方法的默认实现为:遍历物品的注册表,并调用所有已经注册的Item实例的getSubItems方法。如果我们想把原版的某个东西加个特殊的附加NBT,塞进我们的Mod的创造模式物品栏里,该怎么做?虽然是个特别奇怪的需求,但真的可以做到。注意覆写该方法的时候,先调用super.displayAllRelevantItems这个方法。