NeoForge-1.20.4Mod开发教程之第一个物品


NeoForge-1.20.4Mod开发教程之第一个物品

创建Ruby类

Ruby继承自 Minecraft 的 Item 类,就像你照着模型造了一个新的物品一样。
Item 是游戏里所有物品的基础类,所有物品(例如:钻石、苹果、剑等)都是它的实例或子类。

public class Ruby extends Item {

    public Ruby(Properties properties) {
        super(properties);
    }
}

现在Ruby只是一个最基础的物品,我们这里没有写任何额外逻辑,它只是把东西交给原版的 Item 类去处理。

创建注册器

接着在item这个包下创建ModItems类

public class ModItems {
    public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(Registries.ITEM, ExampleMod.MODID);  //这句是在创建一个 延迟注册器(DeferredRegister),专门用来注册你这个模组的所有物品。

    public static final Supplier<Item> RUBY = ITEMS.register("ruby",() -> new Ruby(new Item.Properties()));	//这一行表示在你刚才创建的“注册器”里注册一个叫 "ruby" 的物品。

    public static void register(IEventBus eventBus){    //这个方法表示把我这个物品注册器连接到模组事件总线上去
        ITEMS.register(eventBus);
    }
}

这里说一下什么是事件总线,简单来说事件总线就是 Minecraft 游戏发出各种行为信号的广播中心,你把方法“注册”到这个总线上,当发生对应事件时,这个方法就会被自动调用。假设你想写一个模组,在玩家每次右键点击时打印一句话:

  1. 游戏内部会在玩家右键时创建一个事件
  2. 事件总线接收到这个事件
  3. 事件总线上所有订阅了这个事件的模组方法都会被调用
事件总线用来监听什么
NeoForge.EVENT_BUS(也叫 Forge 总线)大多数游戏事件,例如玩家事件、实体事件、Tick 等
模组事件总线(Mod Event Bus)模组生命周期的事件,例如注册事件、初始化事件

最后把这个注册系统加入到总线

public ExampleMod(IEventBus modEventBus)
    {
        modEventBus.addListener(this::commonSetup);
        ModItems.register(modEventBus);//物品注册系统(ModItems) 注册到模组事件总线(modEventBus)上。
        NeoForge.EVENT_BUS.register(this);
    }

添加材质

resources的结构可以去wiki查看

在models下新建item目录,再在item里新建ruby.json

{
  "parent": "minecraft:item/generated",
  "textures": {
    "layer0": "examplemod:item/ruby"
  }
}

"parent": "minecraft:item/generated"
这一句指定这个物品使用 原版的 2D 平面物品渲染方式
这种方式适用于普通物品,比如苹果、钻石、材料类等。
这是绝大多数物品默认使用的模型。

"textures": { "layer0": "examplemod:item/ruby" }
👉 这里 layer0 是最底层的贴图层,表示这张图就是这个物品的外观。
examplemod:item/ruby 表示 Minecraft 去这个路径找纹理:assets/examplemod/textures/item/ruby.png

最后在textures里创建item目录,并把ruby.png添加进去,图片需要是16x16像素的

在游戏中通过指令/give获取

类介绍

Item

这是 Minecraft 里所有“物品”的基类,代表游戏中的一个物品类型,例如苹果、棒子、钻石等。
你在模组里自定义的物品(例如 Ruby)通常要继承它(extends Item)才能成为一个完整的物品。

  • 它定义了物品的基本行为,例如是否可以被食用、如何被使用、堆叠、掉落等。

  • 如果你想让物品有特别的行为(例如右键发光、攻击造成特殊效果等),通常会在子类中重写 Item 类的方法。

  • 如果只是一个最普通的物品,也可以直接用 new Item(...)

Item.Properties

这是一个内部静态类,用来配置你物品的各种“属性”,就像给这个物品加上标签一样。它可以设置:

常用属性包括:

  • 最大堆叠数量(stack size)
  • 耐久度(是否可损坏)
  • 是否是食物(需要提供 FoodProperties
  • 是否火焰免疫
  • 稀有度 等等

它是你在注册物品时传给 Item 构造函数的那串设置参数。
例:

new Item(new Item.Properties().stacksTo(16).rarity(Rarity.RARE))

表示这个物品最多叠 16 个,且在创造界面名字显示为稀有色。

Registries

这个不是用来“创建物品”的,而是 Minecraft/NeoForge 用来 识别和分类各种注册表的系统性集合
在 Minecraft 里,不管是物品(Item)、方块(Block)、生物类型、声音、流体等,都要登记到对应的“注册表”里,否则游戏不认识它们。

Registries 中包含了这些注册表的 (registry keys),比如:

  • Registries.ITEM → 物品注册表
  • Registries.BLOCK → 方块注册表
  • Registries.ENTITY_TYPE → 实体注册表 等

当你使用 DeferredRegister.create(Registries.ITEM, MODID) 的时候,就是在告诉 NeoForge:“我想把东西放进这个注册表(ITEM)里注册。”
这些注册表本质上是映射表(类似键值对 Map),把一个 资源 ID(例如 "examplemod:ruby")和一个对象实例(你的 Ruby 物品)关联起来。

Items

这是 Minecraft 原版里专门存放已经注册好的所有物品实例引用的类
比如像:

public static final Item IRON_INGOT;
public static final Item APPLE;

这些都是原版里所有物品的常量引用,你可以从代码里直接用(例如传给合成、吃东西逻辑等)。

它本身并不是用来注册物品的类 —— 注册物品的通常是你自己写的 ModItems 之类的类。
Items 只是一个“已注册物品的集合与常量引用表”,便于原版和其他代码快速访问已有物品。


文章作者: FanXien
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 FanXien !
  目录