合成显示模式
合成计算器界面上决定「结果面板显示什么」的四档开关。它由 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"))。详见 配方消歧。
相关条目
- 代价列表算法 -
getInputs()/getOutputs()/getCatalysts()的实现 - 合成步骤优化 -
STEPS模式的贪心 + 回退两段算法 - 数学显示模式 - 另一个界面对应的
State(3) /Operator(5) - 配方消歧 - 同一物品多配方的选择与
#/%切换 - 本 mod 没有的东西 - 本 mod 不提供的数值维度