物品字典(OreDictionary)

基本信息

属性 值 来源
注册方法 CommonProxy.registerOres() CommonProxy.java:261-279
调用时机 preInit 阶段,早于 init 中的世界生成与实体注册 CommonProxy.java:145(preInit 内);对比 init 中的 :156 registerWorldGen()、:157 registerEntities()
实际注册名数量 8 OreDictionary.registerOre 共 8 处调用(CommonProxy.java:263-277)
字典名前缀 无统一前缀,Draconic 与 Awakened 后缀区分觉醒阶段 见下表

这是本模组唯一的跨配方兼容层。8 个字典名是本条目唯一要记住的东西 —— 其余物品都没有进入物品字典。

全部 8 个字典名

# 字典名 绑定对象 启用条件 引用
1 oreDraconium ModBlocks.draconiumOre 方块启用 CommonProxy.java:263
2 blockDraconium ModBlocks.draconiumBlock 方块启用 CommonProxy.java:265
3 blockDraconiumAwakened ModBlocks.draconicBlock 方块启用 CommonProxy.java:267
4 ingotDraconium ModItems.draconiumIngot 物品启用 CommonProxy.java:270
5 dustDraconium ModItems.draconiumDust 物品启用 CommonProxy.java:272
6 ingotDraconiumAwakened ModItems.draconicIngot 物品启用 CommonProxy.java:274
7 nuggetDraconium ModItems.nuggetDraconium.copy() ModItems.nugget 启用 CommonProxy.java:276
8 nuggetDraconiumAwakened ModItems.nuggetAwakened.copy() ModItems.nugget 启用 CommonProxy.java:277

命名规律:普通形态用 Draconium,觉醒形态用 DraconiumAwakened;方块 / 锭 / 尘 / 粒分别用 block / ingot / dust / nugget 前缀。没有 oreDraconiumAwakened —— 觉醒龙矿与普通龙矿共用 oreDraconium 之外的方块条目,觉醒态只有锭和粒两种命名。

启用门控

每个注册都被 ModBlocks.isEnabled(...) 或 ModItems.isEnabled(...) 守卫(第 1–6 项),第 7–8 项共用一次 ModItems.isEnabled(ModItems.nugget) 判定(CommonProxy.java:275-278)。这是本模组对「配置关闭某个内容」的统一处理方式,被关闭的内容不会进入物品字典 —— 附属模组用这些字典名写配方时,在对应内容被关闭的整合包中会匹配失败。

⚠️ 第 2、3 项对方块使用了 new ItemStack(...) 包装,而第 1 项直接传 Block(CommonProxy.java:263 vs :265)。OreDictionary.registerOre 两种重载都合法,这里只是写法不统一,不影响字典名。

第 7、8 项绑定的是 ItemStack 快照

这 8 个条目里有 6 个绑定 Block 或 Item 对象,只有最后 2 个绑定的是已经实例化的 ItemStack:

字段 声明类型 赋值 区分方式
ModItems.nugget ItemDE(本体) nugget = new Nugget();(ModItems.java:184) ——
ModItems.nuggetDraconium ItemStack new ItemStack(nugget, 1, 0)(ModItems.java:202) 损伤值 0
ModItems.nuggetAwakened ItemStack new ItemStack(nugget, 1, 1)(ModItems.java:203) 损伤值 1

也就是说**「龙粒」与「觉醒龙粒」是同一个 Nugget 物品的两个损伤值(meta 0 / meta 1)**,不是两个 Item;ModItems.nugget 本身没有字典名。

CommonProxy.java:276-277 传的是 ModItems.nuggetDraconium.copy() / ModItems.nuggetAwakened.copy()。ItemStack.copy()(1.7.10)会保留 stackSize 与损伤值,并在 NBT 非空时深拷贝 NBT —— 这里的源堆是 stackSize 1、无 NBT,所以复制结果与源堆等价。

实际效果是:字典条目拿到的是一份快照堆,而不是对 ModItems 字段的引用。后续若有代码修改 ModItems.nuggetDraconium 这个字段的 stackSize 或 NBT,已注册的字典条目不会跟着变。

字典名与本模组自己的配方

这 8 个名字不是单向外露的 —— 模组自己的合成配方就在消费其中 7 个。逐个统计 CraftingHandler.java 中以字符串字面量出现该名字的配方条目数(grep -c "\"<name>\""):

字典名 CraftingHandler 内引用处 本模组是否消费
ingotDraconium 22 是(最常用)
ingotDraconiumAwakened 22 是(最常用)
dustDraconium 3 是
blockDraconium 2 是
blockDraconiumAwakened 1 是
nuggetDraconium 1 是
nuggetDraconiumAwakened 1 是
oreDraconium 0 否 —— 唯一未被自己的配方用到的名字

这带来一个实际后果:因为配方走 addOre / addShapelessOre 的物品字典匹配,其它模组往 ingotDraconium 等名字里注册的物品会自动出现在 Draconic Evolution 的配方里,无需 DE 显式支持。反过来,某个整合包若用 oreDraconium 写配方,DE 自己的龙矿也会被匹配上。

逐条配方见合成配方系统。

未注册字典名的物品

全仓只有上述 8 次 OreDictionary.registerOre(CommonProxy.java:263-277),其绑定对象为 3 个方块 + 3 个物品 + 2 个 ItemStack 常量。48 个已注册物品中只有 3 个(draconiumIngot / draconiumDust / draconicIngot)进了字典,其余 45 个物品没有字典名,使用时必须按 draconicevolution: 注册名硬引用。以下为进度链上最关键的未命名物品(字段名取自 ModItems.java):

物品 字段(ModItems.java) 备注
龙之心 dragonHeart(:97) 觉醒龙锭的合成材料,没有 heartDraconium 之类命名
混沌核心 chaoticCore(:115) 进度核心
混沌碎片 chaosShard(:113) 终局材料
混沌片段 chaosFragment(:117) 终局材料
龙之力核心 draconiumEnergyCore(:110) 进度核心
飞龙核心 wyvernCore(:93) 进度核心
觉醒核心 awakenedCore(:98) 进度核心
龙晶核心 draconicCore(:100) 进度核心

4 种进度核心(draconicCore / wyvernCore / awakenedCore / chaoticCore)与 2 种混沌终局材料都没有字典名。若某个整合包新增了使用混沌材料的配方,只能走 draconicevolution: 硬引用。工具与护甲同样全部无字典名。

相关条目