配置配方逻辑
MBD2 21.1.1配方逻辑将一个机器定义连接到一个 MBDRecipeType,一次运行其中的一条配方。只有机器拥有可处理配方内容的兼容 handler proxy 时才会搜索。一台机器也可以并排运行多个配方逻辑。

设置
| 设置 | Runtime value 键 | 效果 |
|---|---|---|
| Enable | recipe_logic.enable | 配方逻辑是否运行 |
| Name | — | Trait、样式谓词和蓝图用来称呼这个逻辑的名字。未改名时为 main |
| Threads | — | 这个逻辑有几份副本并排运行,每份各自运行一条配方。1 到 64 |
| Recipe type | — | 该机器搜索的 registry ID |
| Recipe damping value | recipe_logic.damping | 每个等待 tick 损失的进度,下限为 0。填 0 表示等待时进度冻结 |
| Consume inputs after working | recipe_logic.consume_inputs_after_working | 把普通输入的消耗推迟到完成时。每个工作 tick 都会重新模拟这些输入,输入消失会中断配方 |
| Always search recipe | recipe_logic.always_search | 每条配方完成后强制重新搜索,而不是复用缓存的那条 |
| Always modify recipe | recipe_logic.always_modify | 每轮重新应用修饰器。当 tier、升级件或机器数据会在两轮之间改变最终配方时需要它 |
| Recipe modifiers | — | 对匹配到的配方施加数量、时长与并行变换 |
上表中带键的设置同时也是 runtime value,蓝图、脚本或 UI 可以只为一台放置的机器修改它,而不动定义。
接线检查表
- 在解析机器定义前注册或导出配方类型。
- 选择准确的带命名空间 ID。
- 为候选配方使用的每种 capability 添加至少一个 handler Trait。
- 为每个配方方向设置 handler IO。
- 分别测试普通内容与 per-tick 内容。
- 视觉需要反映状态时添加
waiting和working状态。 - 从生成 UI 测试配方查看器查询。
工作期间还会重新检查条件。天气、红石、转动、热、压力或其他条件变化时配方可能进入等待;等待不等于重置,等待要付出多少进度由 damping value 决定。
执行模型参见配方生命周期;想改写而不只是缩放已匹配的配方,见蓝图。
多个配方逻辑
想同时运行几条配方的机器——有三条独立产线的熔炉、顺带还能冶炼的合金炉——每条配方都需要一个配方逻辑。21.1.2 及以前每台机器只有一个;之后的版本提供两种方式增加:
- Threads,任何逻辑都有:该逻辑的若干份副本,用同一配方类型、同一套设置,各自运行自己的配方。
- 额外配方逻辑(Additional Recipe Logics),位于 Has Recipe Logic 的最下方:更多的逻辑,每个都有自己的名字、配方类型、线程数、damping、修饰器和开关。条目上的勾选框可以关掉它而不删除。
关闭 Has Recipe Logic 后,机器既没有额外逻辑,主逻辑也没有多余的线程;这样保存的工程不会保留它们的设置。
每个逻辑都有一个地址:第一个线程的地址就是逻辑名,其余线程依次为 name#1、name#2……。名字只能使用 a-z、0-9 和 _,且在一台机器上必须唯一;违反任一规则的额外逻辑会被跳过,名字不合法的主逻辑则以 main 运行,两者都会在日志中留下警告。
main 的三个线程共用一个输入槽,各有自己的进度条。谁用哪些槽位
不做限制时,每个逻辑都能使用机器的全部配方 handler。各逻辑在服务端线程上依次运行——先是主逻辑及其线程,再按列表顺序运行额外逻辑——所以两个逻辑争抢同一份最后的输入时,排在前面的得到它。无需加锁:一个逻辑在同一步中检查并取走配方的输入,之后下一个逻辑才运行。
要把某个 Trait 留给特定逻辑,就在它的 Recipe Logics 中列出这些逻辑:写逻辑名表示该逻辑的所有线程都可使用,写 name#thread 则只有那个线程可以。列表为空时所有逻辑都可使用。

smelt 和 alloy 的第二个线程使用。多方块部件的 handler 通过匹配到该部件的样式谓词遵循同样的规则:谓词的 Recipe Logics 限定控制器的哪些逻辑可以使用它们,部件自身 Trait 的列表也照样生效。见多方块。
一次只能跟随一条配方的 handler(Create 的转速就是一例)只归第一个被允许使用它的逻辑,其他逻辑看不到它。
状态、事件与 UI
- 机器的状态,以及由此决定的
working、waiting状态,汇总自它的所有逻辑:任一逻辑在工作即为工作,否则任一在等待即为等待,否则全部暂停才是暂停,其余为空闲。 - 配方事件按逻辑分别触发,并指明是哪一个:KubeJS 事件上的
recipeLogic,以及蓝图入口节点的recipeLogic输出。 - UI 在常用 ID 后追加
@与地址,即可绑定某个逻辑的进度条、燃料条和配方查看器按钮:ui:progress_bar@smelt、ui:fuel_bar@alloy#2。不带后缀的 ID 仍属于主逻辑。Machine UI 编辑器为每个逻辑各提供一个进度条和一个燃料条。 - Jade 显示所有已启用的逻辑,除主逻辑外都带上地址。JEI、REI 与 EMI 会把机器显示为它所运行的每种配方类型的催化剂。
单机覆盖与存档
每个额外逻辑都有自己的 runtime value,由它的所有线程共享:recipe_logic.<name>.enable、.damping、.always_search、.always_modify 与 .consume_inputs_after_working。主逻辑及其线程沿用上面的 recipe_logic.* 键。
主逻辑仍保存在一直以来的键下,因此旧世界中的机器加载后与原来一致。其他逻辑按名字和线程保存:给逻辑改名、删除逻辑或减少它的线程数,都会丢失它正在运行的配方。