设为首页收藏本站

ZMX - IT技术交流论坛 - 无限Perfect,追求梦想 - itzmx.com

 找回密码
 注册论坛

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

用百度帐号登录

只需两步,快速登录

搜索
查看: 109|回复: 0

[其它相关] [1.12.2]Forge注册物品

[复制链接]

签到天数: 523 天

[LV.9]以坛为家II

发表于 2024/5/25 10:15 | 显示全部楼层 |阅读模式 |Google Chrome 125.0.0.0|Windows 10
天涯海角搜一下: 百度 谷歌 360 搜狗 有道 雅虎 必应 即刻
本帖最后由 Hileb 于 2024/5/25 10:32 编辑

原版的注册表是一套简单粗暴的中注册表 RegistryNamespaced , 这套注册表能够处理注册名,注册项和数字id之间的映射关系,但这仅满足了原版的需求。
经 Forge patch 后,原版物品注册改用 IForgeRegistry,原有的 RegistryNamespaced 变更为 FMLControlledNamespacedRegistry 即 IForgeRegistry 版本的 RegistryNamespaced,已处理各种情况下的id变动(存档,网络)。

因此,在forge环境下注册物品,你只需要和其他 IForgeRegistry 一样,订阅 RegistryEvent.Register事件。其为一个 GenericEvent,正常情况下,你需要添加一个泛型指定其准确类型,对于物品来说:
  1. RegistryEvent.Register<Item>
复制代码

你可以通过 getRegistry()V 从该事件拿到 IForgeRegister ,并调用 register 注册单个项目 或 registerAll 注册一个数组内的全部项目。

注册的项目通常同时也是 IForgeRegistryEntry。Item便是如此。
public class Item extends net.minecraftforge.registries.IForgeRegistryEntry.Impl<Item>
因此,一般情况下,一个物品只对应一个注册项,拥有一个注册名,使用setRegistryName指定,其返回值为 Item。这意味着在 Forge 的设计中,注册的项目通常就是 IForgeRegistryEntry。
因此,有n个注册项,通常需要n个对象。

实例:使用数组注册两个物品:
  1. @SubscribeEvent
  2.     public static void registerItem(RegistryEvent.Register<Item> event){
  3.         //注册物品
  4.         event.getRegistry().registerAll(new Item[]{
  5.                 new Item().setRegistryName(new ResourceLocation("example", "demo")),
  6.                 new ItemSword(
  7.                         EnumHelper.addToolMaterial("fancy_material", 9, 9 , 9f, 9f, 40))
  8.                         .setRegistryName(new ResourceLocation("example", "fancy_sword"))

  9.         });
  10.     }
  11.     @GameRegistry.ObjectHolder("example:demo")
  12.     public static Item DEMO;
  13.     @GameRegistry.ObjectHolder("example:fancy_sword")
  14.     public static Item FANCY_SWORD;
  15.     //因为加了GameRegistry.ObjectHolder,FML会初始化它们,当然你也可以不使用GameRegistry.ObjectHolder,而是直接捕获它们:
  16.     //IDL的思路是在构造它们时把它们统一加入一个List再批量注册,这样:  public static final ItemSword FANCY_SWORD = new FancySword(); 添加List在构造函数完成。
  17.     //上面这个例子还可以改成: event.getRegistry().register(DEMO =  new Item().setRegistryName(new ResourceLocation("example", "demo"))); 逐行注册
  18.     //你也可以将IDF中list设计保留,但不在构造时决定注册名和写死加入list,而是像低配版DeferredRegistry:
  19.     // public static <T extends Item> T registerItem(String name, T value){
  20.              ITEMS.add(value.setRegistryName(new ResourceLocation("example", name))); return value;
  21.     //}
  22.     //public static final FancySword FANCY_SWORD = registerItem("fancy_sword", new FancySword());
复制代码
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册论坛 新浪微博账号登陆用百度帐号登录

本版积分规则

手机版|Archiver|Mail me|网站地图|IT技术交流论坛 ( 闽ICP备13013206号-7 )

GMT+8, 2024/6/17 17:17 , Processed in 0.176070 second(s), 21 queries , MemCache On.

Powered by itzmx! X3.4

© 2011- sakura

快速回复 返回顶部 返回列表