Skip to content

工作站定义 ​

stations/<id>.yml 里每个字段怎么写, 工作站怎么决定材料从哪来, 产物往哪去, 以及配方归属由谁声明

合成工作站放在 plugins/EmakiStation/stations/ 下, 一个文件就是一个工作站, 文件名与 id 一致

完整示例 ​

yaml
id: "blacksmith"
display_name: "<gold>铁匠工坊</gold>"

layout: "station_catalog"
preview_layout: "station_preview"
queue_layout: "station_queue"

permission: ""

queue:
  base_length: 3
  max_length: 16
  progress_mode: "offline"
  cancel_refund_rate: 1.0
  speed_multiplier: 1.0
  allow_purchase: false

channels:
  backpack: true
  storage: true
  default: "backpack"

output:
  default: "storage_first"
  player_switchable: true

condition:
  invalid_as_failure: true

字段 ​

字段类型必填默认值取值范围说明
idstring是——工作站 id, 与文件名一致. 缺失时该文件被拒绝加载 (station.station_missing_id)
display_namestring否取 idMiniMessage 文本界面上显示的标题名称
layoutstring否取 idgui/<名字>.yml 的 id配方目录页使用的布局. 省略时会按工作站 id 去找布局文件, 所以示例里写的是 station_catalog
preview_layoutstring否"station_preview"gui/<名字>.yml 的 id材料预览页使用的布局
queue_layoutstring否"station_queue"gui/<名字>.yml 的 id合成队列页使用的布局
permissionstring否""权限节点打开这个工作站需要的权限. 留空时会自动改用 emakistation.access.<id>
queue段否继承 config.yml 的 queue见下表队列参数, 省略的键会继承主配置里的同名值
channels段否两个通道都启用见下表材料的来源通道
output段否storage_first + 可切换见下表产物送去的方向
condition段否空条件见下表条件检查, 语法与其他 Emaki 模块一致, 见条件系统.目前这段会被解析并保存, 但运行时不会对它做判断, 所以它不会限制打开, 也不会因此被拒绝

三个布局文件 (layout, preview_layout, queue_layout) 一个都不能少, 缺任何一个, 启动预检都会报 missing_layout

注意, 物品分解页不属于工作站: 分解站是独立配置, 见物品分解

yaml
# 示例: 让新工作站跟随示例布局, 并单独限制权限节点
id: "alchemy"
display_name: "<light_purple>炼金台</light_purple>"
layout: "station_catalog"
preview_layout: "station_preview"
queue_layout: "station_queue"
permission: "emakistation.access.alchemy"

配方归属 ​

工作站文件里没有 recipes 段. 开放哪些配方由配方侧决定: 你在 recipes/<配方>.yml 里用 station_ids 列出所属工作站. 配方不写 station_ids, 就表示它对所有工作站开放

queue 段 ​

你可以在工作站侧覆盖主配置 queue 段的同名键, 另外还有工作站独有的 allow_purchase 键. tick_interval 与 purchase 只能由主配置控制

字段类型必填默认值取值范围说明
base_lengthinteger否继承主配置 (3)1~64, 越界截断本工作站的基础队列长度
permission_tiersboolean否继承主配置 (true)true, false本工作站是否启用权限分档
max_lengthinteger否继承主配置 (32)base_length~64, 越界截断本工作站的队列长度硬上限
progress_modestring否继承主配置 ("offline")offline, online本工作站队首的计时方式
cancel_refund_ratedouble否继承主配置 (1.0)0.0~1.0, 越界截断取消条目时材料与已付货币的退还比例
speed_multiplierdouble否继承主配置 (1.0)≤0 按 1.0 处理, 上限 100.0本工作站的配方耗时倍率
allow_purchaseboolean否falsetrue, false这个工作站是否出售额外队列位. 还需要 config.yml 的 queue.purchase.enabled 为 true

你取消一个条目时, 已付的货币会按 cancel_refund_rate 折算退还, 跟材料用同一个比例

channels 材料通道 ​

字段类型必填默认值取值范围说明
backpackboolean否truetrue, false是否从玩家背包取材
storageboolean否truetrue, false是否从 EmakiStorage 仓库取材. 真正启用还需要 storage.enabled 与 emakistorage:atomic_batch 能力
defaultstring否"backpack"backpack, storage保留键, 当前不再生效: 源码会读取这个值, 但没有任何界面或扣料的地方真正用它

你把 backpack 和 storage 都关掉, 这个工作站会被拒绝加载 (station.station_no_channel). 这样的配置能打开, 却永远用不了, 所以插件宁可在启动时就报错

两个都开着时, 材料来自「背包加仓库」合并成的一个池子, 优先扣背包. 你看不到通道切换按钮, 也不需要切换, 界面里显示的「拥有」就是两边合计

default 留着只是为了让旧配置文件不报未知键, 后续版本可能移除. 别把它当作可用配置

output 产物去向 ​

字段类型必填默认值取值范围说明
defaultstring否"storage_first"storage_first, backpack_first, storage_only, backpack_only默认的产物去向. 填了无法识别的值会改回 storage_first
player_switchableboolean否truetrue, false玩家能不能在界面里切换自己的产物去向偏好. 关掉后点 output_toggle 没有效果

default 四个取值的含义, 以及玩家可切换后的实际效果:

值行为
storage_first优先进仓库, 满了退到背包
backpack_first优先进背包, 满了退到仓库
storage_only只用仓库
backpack_only只用背包

所有去处都放不下时, 这条产物会进入「待领取」状态, 不会掉落, 也不会销毁

condition 条件门 ​

工作站文件里的 condition 采用 CoreLib 的通用条件块, 字段与条件系统一致

目前运行时不会对工作站级别的条件做判断: 这段会被解析, 保存, 并在启动预检时做一次结构校验, 但你打开工作站 (/emakistation open 或 API openGui) 时不会检查它, 条件不满足也不会被拒绝. 下面列出可以写的键, 方便你按未来版本的含义先把配置写好

字段类型必填默认值取值范围说明
condition.typestring否all_ofall_of, any_of, none_of, at_least, exactly条件的组合方式. 填了无法识别的值会改回 all_of
condition.entrieslist否[]字符串表达式, type: expression 节点, 嵌套条件组条件节点的列表. 为空时整个条件组一直算作 true
condition.required_countinteger否0非负整数at_least / exactly 下需要满足的条件数量
condition.invalid_as_failureboolean否truetrue, false条件配置写错或算不出结果时, 是否算作失败
condition.on_pass.actionslist<string>否[]动作管道行条件通过后要执行的动作. 目前不执行
condition.on_fail.actionslist<string>否[]动作管道行条件失败后要执行的动作. 目前不执行
condition.on_fail.block_outputboolean否falsetrue, false条件失败时是否拦下产物输出. 工作站不产出产物, 所以没有实际作用
condition.on_fail.messagestring否""MiniMessage 文本条件失败时发给玩家的提示. 目前不发送