合成显示模式

合成计算器界面上决定「结果面板显示什么」的四档开关。它由 RecordCraft.Mode 这个 4 值枚举驱动,另有一套 Recipe.IO 3 值枚举用于「输入配方里哪一栏是什么」。

本 mod 不显示任何「伤害 / 挖掘速度 / 爆炸抗性 / 耐久」之类的装备属性。 本 mod 是纯配方计算器,结果面板里出现的每一个格子都是一种物品 / 流体 / 矿物词典 / 占位符标签的数量,没有任何来自 Item.getItemAttributeModifiers()、 ToolMaterial、Block.getExplosionResistance() 的数值。见 本 mod 没有的东西。

基本信息

属性 值
枚举类 me.towdium.jecalculation.data.structure.RecordCraft.Mode
取值数量 4(INPUT / OUTPUT / CATALYST / STEPS)
字段 RecordCraft.mode(public Mode mode)
初始值 构造时赋 Mode.INPUT(RecordCraft 构造函数第 40 行)
持久化 随 RecordCraft 的 NBT 一并写入 record.json 的 craft 段
切换副作用 每次切换都会 Controller.setRCraft(record) 并刷新计算器
相关枚举 Recipe.IO(3 值,见下)

全部 4 个取值

GuiCraft.refreshResult() 用 switch (record.mode) 把结果面板绑定到四个互斥的数据源, 这就是「每个模式渲染什么」的权威依据:

枚举值 结果面板数据源 渲染内容
INPUT calculator.getInputs() 当前需求的全部原始材料清单(正数量)
OUTPUT calculator.getOutputs(getInventory()) 从现有背包出发,多余的产出清单
CATALYST calculator.getCatalysts() 计算过程中收集到的所有催化剂,并去重取最大值
STEPS calculator.getSteps(getInventory()) 合成步骤列表(每步给出主产物的标签)

对应源码(GuiCraft.refreshResult()):

switch (record.mode) {
    case INPUT:
        result.setLabels(calculator.getInputs());
        break;
    case OUTPUT:
        result.setLabels(calculator.getOutputs(getInventory()));
        break;
    case CATALYST:
        result.setLabels(calculator.getCatalysts());
        break;
    case STEPS:
        result.setLabels(calculator.getSteps(getInventory()));
        break;
}

若 calculator == null(还没有任何标签被压入),四个分支都不执行, 结果面板被 setLabels(new ArrayList<>()) 清空。

切换时的按钮禁用行为

GuiCraft.setMode(Mode mode) 除了设置字段,还会把另外三个标签按钮置灰, 让界面始终只有一个可编辑的槽位:

传入 mode 被 setDisabled(true) 的按钮
INPUT output、catalyst、steps
OUTPUT input、catalyst、steps
CATALYST input、output、steps
STEPS input、output、catalyst

源码形式是四行等价的 xxx.setDisabled(mode == XXX)。

配方槽位枚举 Recipe.IO(3 值)

配方编辑界面用它给「输入 / 产物 / 催化剂」三组槽位分类。它与 Mode 是不同的枚举, 不要混淆:

枚举值 语义 对应 Recipe 字段 NBT 键
INPUT 原料 Recipe.input "input"
OUTPUT 产物 Recipe.output "output"
CATALYST 催化剂 Recipe.catalyst "catalyst"

另有一个静态辅助方法 Recipe.IO.isInput(boolean b),返回 b ? INPUT : OUTPUT。

Recipe.getLabel(IO type) 内部走 get(type, input, output, catalyst),用一个 无 default 兜底(抛 RuntimeException("Internal error"))的 switch 做分派。

Mode 与 IO 的配合关系

Mode 管的是结果面板,只影响读;IO 管的是配方槽位,同时影响读写:

  • mode == CATALYST 时,玩家往 catalyst 槽压标签,配方被标为「需要但不消耗」; 计算器在 代价列表算法 的 addCatalyst() 里把它们汇总去重, 不参与乘除。
  • mode != CATALYST 时,catalyst 槽被 setDisabled(true),无法压入新标签。
  • NEI overlay 传进来的配方会按 IO 落到三组槽位(见 NEI 集成)。

数值语义:数量 vs 百分比

标签上的数量有两种表示,由 ILabel 的 isPercent() 区分:

表示 含义 参与运算时的处理
绝对数量(isPercent() == false) 具体个数 在 Recipe.multiplier() 中先 × 100
百分比(isPercent() == true) 该标签代表的一组物品的占比 不缩放,直接参与

界面上每个槽位右侧的 # / % 两个按钮就是用它来切换的 (GuiRecipe 中的 WButtonText(…, "#", "recipe.to_percent") 与 WButtonText(…, "%", "recipe.to_amount"))。详见 配方消歧。

相关条目