NeoForge-1.20.4Mod开发教程之创造物品栏

NeoForge-1.20.4Mod开发教程之创造物品栏

本篇教程参考为Flandre芙兰NeoForge1.20.4Mod开发的视频,这篇教程是我边学边总结的,与其说是教程更像我的学习笔记,如有不清楚的地方,大家可以在评论区提问。在我力所能及的范围内,我都会解答的。

创建ModCreativeTab类

你可以将此类与ModItems类放在一个目录下,也可以和ExampleMod类放在一起

public class ModCreativeTab {
    public static final DeferredRegister<CreativeModeTab> CREATIVE_MODE_TABS =DeferredRegister.create(Registries.CREATIVE_MODE_TAB, ExampleMod.MODID);//物品栏注册器
    
    public static final String EXAMPLE_MOD_TAB_STRING = "creative.example_tab";//鼠标移到物品栏上显示的名称,会在lang中翻译这个键

    //
    public static final Supplier<CreativeModeTab> EXAMPLE_TAB =CREATIVE_MODE_TABS.register("example_tab",()->CreativeModeTab.builder()
            .withTabsBefore(CreativeModeTabs.COMBAT)//这表示这个自定义标签会插入到原版创造标签页 “战斗(Combat)” 之前
            .title(Component.translatable(EXAMPLE_MOD_TAB_STRING))//设置标签页显示的名称,使用翻译 key,这样不同语言也能自动支持
            .icon(()->ModItems.RUBY.get().getDefaultInstance())//设置这个标签的图标,这里使用注册的 Ruby 物品实例
            .displayItems((pParameters,pOutput) -> {
                pOutput.accept(ModItems.RUBY.get());//这个是标签页打开后显示的物品列表      
            })
            .build()
    );
    public static void register(IEventBus eventBus){//把你的创造标签页注册器挂到模组的事件总线上
        CREATIVE_MODE_TABS.register(eventBus);
    }
}

记得把register写到总线里去,和物品注册一样

lang中翻译creative.example_tab这个键

39dfd9fce020260128182808

还要说明一点

.displayItems((pParameters,pOutput) -> {

这里可以写成

.displayItems((parameters,output) -> {

那为什么会有这个p呢?

首先我们要知道Mojang 和 Forge 的代码通常是由自动映射生成的。Minecraft 的源代码本身被 混淆过(方法参数没有真实名字),Forge 的开发者会用映射(MCP mappings / community mappings)把名字翻译成人类可读的名字。 有些参数还没有被映射出来,这时 Forge/NeoForge 的 MDK 会自动生成临时名字,例如 p_12345_pParameters 这种带前缀 p 的形式。这就是为什么很多 Minecraft/Forge/NeoForge 示例用 p 前缀。这个 p 只是开发者/映射系统加上的前缀,用来避免和其它变量名冲突或者标记这是一个“参数”

Item和ItemStack的区别

Item 是 Minecraft 里 一种物品类型的定义,类似一份“物品的模板”

  • 它描述了这个物品是什么,比如名字、最大堆叠、耐久、效果等等

  • 比如“钻石”“苹果”“剑”这些,每种只有一个 Item 实例(单例) 所有钻石物品都是引用同一个 Item 对象。

ItemStackItem具体“物品堆”实例,就像你背包里真正放的东西:

  • 它包含了一种物品(由 Item 指定)

  • 有具体 数量(stack size)

  • 可以保存 NBT 或额外数据(如耐久、附魔、名字等)

举例:

  • 背包里有 5 个苹果 → 这是一个 ItemStack,它内部有指向苹果的 Item,并且数量是 5

  • 背包里有 1 把剑(耐久 50/250) → 它也是一个 ItemStack,但即使同样是剑,每个堆的耐久可以不同

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容