Skip to content

配置配方逻辑 ​

MBD2 21.1.1

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

MBD2 Recipes 视图显示配方类型、示例配方与 Inspector 中的 Fuel Recipe Config
配方逻辑指向已注册配方类型;燃料配置和查看器可见性属于该配方类型。

设置 ​

设置Runtime value 键效果
Enablerecipe_logic.enable配方逻辑是否运行
Name—Trait、样式谓词和蓝图用来称呼这个逻辑的名字。未改名时为 main
Threads—这个逻辑有几份副本并排运行,每份各自运行一条配方。1 到 64
Recipe type—该机器搜索的 registry ID
Recipe damping valuerecipe_logic.damping每个等待 tick 损失的进度,下限为 0。填 0 表示等待时进度冻结
Consume inputs after workingrecipe_logic.consume_inputs_after_working把普通输入的消耗推迟到完成时。每个工作 tick 都会重新模拟这些输入,输入消失会中断配方
Always search reciperecipe_logic.always_search每条配方完成后强制重新搜索,而不是复用缓存的那条
Always modify reciperecipe_logic.always_modify每轮重新应用修饰器。当 tier、升级件或机器数据会在两轮之间改变最终配方时需要它
Recipe modifiers—对匹配到的配方施加数量、时长与并行变换

上表中带键的设置同时也是 runtime value,蓝图、脚本或 UI 可以只为一台放置的机器修改它,而不动定义。

接线检查表 ​

  1. 在解析机器定义前注册或导出配方类型。
  2. 选择准确的带命名空间 ID。
  3. 为候选配方使用的每种 capability 添加至少一个 handler Trait。
  4. 为每个配方方向设置 handler IO。
  5. 分别测试普通内容与 per-tick 内容。
  6. 视觉需要反映状态时添加 waiting 和 working 状态。
  7. 从生成 UI 测试配方查看器查询。

工作期间还会重新检查条件。天气、红石、转动、热、压力或其他条件变化时配方可能进入等待;等待不等于重置,等待要付出多少进度由 damping value 决定。

执行模型参见配方生命周期;想改写而不只是缩放已匹配的配方,见蓝图。

多个配方逻辑 ​

想同时运行几条配方的机器——有三条独立产线的熔炉、顺带还能冶炼的合金炉——每条配方都需要一个配方逻辑。21.1.2 及以前每台机器只有一个;之后的版本提供两种方式增加:

  • Threads,任何逻辑都有:该逻辑的若干份副本,用同一配方类型、同一套设置,各自运行自己的配方。
  • 额外配方逻辑(Additional Recipe Logics),位于 Has Recipe Logic 的最下方:更多的逻辑,每个都有自己的名字、配方类型、线程数、damping、修饰器和开关。条目上的勾选框可以关掉它而不删除。

关闭 Has Recipe Logic 后,机器既没有额外逻辑,主逻辑也没有多余的线程;这样保存的工程不会保留它们的设置。

Threads、添加一个额外逻辑,以及关闭 Has Recipe Logic。

每个逻辑都有一个地址:第一个线程的地址就是逻辑名,其余线程依次为 name#1、name#2……。名字只能使用 a-z、0-9 和 _,且在一台机器上必须唯一;违反任一规则的额外逻辑会被跳过,名字不合法的主逻辑则以 main 运行,两者都会在日志中留下警告。

main 的三个线程共用一个输入槽,各有自己的进度条。

谁用哪些槽位 ​

不做限制时,每个逻辑都能使用机器的全部配方 handler。各逻辑在服务端线程上依次运行——先是主逻辑及其线程,再按列表顺序运行额外逻辑——所以两个逻辑争抢同一份最后的输入时,排在前面的得到它。无需加锁:一个逻辑在同一步中检查并取走配方的输入,之后下一个逻辑才运行。

要把某个 Trait 留给特定逻辑,就在它的 Recipe Logics 中列出这些逻辑:写逻辑名表示该逻辑的所有线程都可使用,写 name#thread 则只有那个线程可以。列表为空时所有逻辑都可使用。

一个物品槽 Trait,其 Recipe Logics 列表中有 smelt 和 alloy#1
这个物品槽只供 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.* 键。

主逻辑仍保存在一直以来的键下,因此旧世界中的机器加载后与原来一致。其他逻辑按名字和线程保存:给逻辑改名、删除逻辑或减少它的线程数,都会丢失它正在运行的配方。

Released under the MIT License.