物品字典(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: 硬引用。工具与护甲同样全部无字典名。