合成配方系统
基本信息
Draconic Evolution 在 common/handler/CraftingHandler.java 的 init() 中集中注册全部合成配方,初始化调用点为 CommonProxy.java:154 CraftingHandler.init();。
| 属性 | 值 |
|---|---|
| 源文件 | common/handler/CraftingHandler.java(1087 行) |
| 初始化调用 | CommonProxy.java:154 |
| 生效配方总数 | 90 |
| 熔炼配方数 | 2 |
配方数量统计
init() 中共出现 90 次生效的配方注册调用,按注册方式分类:
| 注册方式 | 次数 | 底层 API | 说明 |
|---|---|---|---|
addOre(result, pattern, keyMap, ...) |
54 | ShapedOreRecipe |
有序合成,支持物品字典名 |
add(result, pattern, keyMap, ...) |
16 | GameRegistry.addRecipe |
原版有序合成,只支持 Item / Block 实例 |
addShaplessOre(result, ingredients) |
11 | ShapelessOreRecipe |
无序合成,支持物品字典名 |
addEnergy(result, pattern, keyMap, ...) |
9 | ShapedOreEnergyRecipe |
DE 自定义有序合成 |
方法名
addShaplessOre在源码中拼写为Shapless(缺少e),这是 Brandon3055 原始代码的笔误,引用时必须照抄。已核实:addShapelessOre(正确拼写)在整个仓库中出现 0 次。
统计口径说明:使用 [ \t]+ 行首锚定与「全文调用扫描」两种独立正则分别统计,结果完全一致(均为 addOre 54 / add 16 / addShaplessOre 11 / addEnergy 9)。早期使用 \s+ 的版本会跨越换行匹配并产生错误计数,已弃用。
熔炼配方
CraftingHandler.java:111-119 注册了 2 条熔炼配方:
| 输入 | 输出 | 经验 | 条件 |
|---|---|---|---|
draconiumBlend(混合龙尘) |
draconiumIngot × 2 |
1.0 | isEnabled(draconicIngot) && isEnabled(draconicBlend) |
draconiumDust(龙尘) |
draconiumIngot × 1 |
1.0 | isEnabled(draconicIngot) && isEnabled(draconicDust) |
禁用联动机制
所有 add* 辅助方法在注册前都会做双重过滤(CraftingHandler.java:1016-1023 等 4 个方法各一份):
private static void addOre(ItemStack result, Object... recipe) {
if (result == null) return;
for (Object o : recipe) {
if (o == null) return;
String s = o instanceof Item ? ((Item) o).getUnlocalizedName()
: o instanceof Block ? ((Block) o).getUnlocalizedName() : null;
if (s != null && ConfigHandler.disabledNamesList.contains(s)) return;
}
GameRegistry.addRecipe(new ShapedOreRecipe(result, recipe));
}
因此:
- 结果为
null→ 整条配方跳过。 - 任一材料为
null→ 整条配方跳过。 - 任一材料的未本地化名出现在配置项
disabledNamesList中 → 整条配方跳过。
材料通常通过 getStack(Block, count, meta) / getStack(Item, count, meta) 取得,这两个辅助方法会先检查 ModBlocks.isEnabled / ModItems.isEnabled(CraftingHandler.java:1080-1086),若被禁用则返回 null,从而触发上面的第 2 条。
这是一个「全有或全无」的设计:在 disabledNamesList 中禁用任何一个材料,都会连带让用到它的全部配方消失。
跨模组条件分支
init() 中存在若干受其他模组影响的分支:
| 条件 | 影响 | 来源 |
|---|---|---|
!Loader.isModLoaded("dreamcraft") |
整块跳过龙芯与双足飞龙核心配方 | CraftingHandler.java:26, 28 |
Loader.isModLoaded("ThermalDynamics") |
追加 Thermal 系列配方分支 | CraftingHandler.java:850 |
Loader.isModLoaded("IronChest") |
追加 Iron Chest 相关配方分支 | CraftingHandler.java:1001 |
dreamcraft 分支意味着:安装 dreamcraft 后,龙芯与双足飞龙核心的基础配方不再注册,这两个物品必须通过其他来源获得。
死代码:被注释的配方
CraftingHandler.java:86 有 1 条被整行注释的配方:
// addOre(ModItems.draconiumBlend, " D ", "DID", " D ", 'I', "ingotIron", 'D', ModItems.draconiumDust);
这是混合龙尘的唯一合成途径。注释掉之后 draconiumBlend 只剩熔炼输出、没有合成输入,详见 材料与消耗品 的「已知缺陷」。
核心升级链配方
四级核心是一条直接合成链,不经过升级调整器:
| 阶段 | 形状 | 注册方式 | 来源 |
|---|---|---|---|
| 龙芯 → 双足飞龙核心 | CSC / SMS / CSC |
add(...) |
CraftingHandler.java:41-50 |
| 双足飞龙核心 → 觉醒核心 | CSC / SCS / CSC |
addOre(...) |
CraftingHandler.java:52 |
| 觉醒核心 → 混沌核心 | ACA / CSC / ACA |
addOre(...) |
CraftingHandler.java:53-62 |
材料对照见 核心与材料。
数值
| 数值名 | 值 | 来源 |
|---|---|---|
| 生效配方总数 | 90 | CraftingHandler.init() |
ShapedOreRecipe |
54 | 同上 |
| 原版有序合成 | 16 | 同上 |
ShapelessOreRecipe |
11 | 同上 |
ShapedOreEnergyRecipe |
9 | 同上 |
| 熔炼配方 | 2 | CraftingHandler.java:111-119 |
| 被注释的配方 | 1 | CraftingHandler.java:86 |
| 受条件分支影响的配方块 | 3 | CraftingHandler.java:26, 850, 1001 |
交互
| 触发 | 行为 |
|---|---|
在 disabledNamesList 中加入某物品名 |
该物品与所有用到它的配方一并消失 |
| 安装 dreamcraft | 龙芯与双足飞龙核心配方消失 |
| 安装 ThermalDynamics / IronChest | 追加额外配方 |