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

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

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

创建Ruby类

c0f465756d20260128151348

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的结构添加调整成图中所示

20453ebba220260128151408

在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添加进去,图片需要是16×16像素的

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

ce1f26335620260128151433

物品名称设置

lang目录下新建en_us.jsonzh_cn.json

这两个文件用来翻译Mod中的键,Ruby现在在游戏的名称是item.examplemod.ruby而不是Ruby

{
  "item.examplemod.ruby": "Ruby"
}

这是en_us中的写法,zh_cn只需要改成对应中文就行,写好之后我们的Ruby就能在游戏中正确显示名称了

类介绍

Item

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

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

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

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

     

Item.Properties

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

常用属性包括:

  • 最大堆叠数量(stack size)

  • 耐久度(是否可损坏)

  • 是否是食物(需要提供 FoodProperties

  • 是否火焰免疫

  • 稀有度 等等

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

new Item(new Item.Properties().stacksTo(16))

表示这个物品最多叠 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 只是一个“已注册物品的集合与常量引用表”,便于原版和其他代码快速访问已有物品。

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

请登录后发表评论

    暂无评论内容