Skip to content

界面模板 ​

四份界面模板分别对应哪个界面, 每个界面能用哪些槽位类型, 以及模板里可以写哪些占位符

EmakiStation 一共有四份界面模板, 都放在 plugins/EmakiStation/gui/ 下

模板对应界面工作站配置键
station_catalog.yml配方目录页 (第一页)layout
station_preview.yml材料预览页 (第二页)preview_layout
station_queue.yml合成队列页 (第三页)queue_layout
station_dismantle.yml分解界面分解站的 layout

前三页构成合成侧的三页结构: 目录页左键直接提交, 右键进入材料预览; 预览页确认提交; 队列页查看, 取消, 领取与购买队列位. 分解界面是独立的, 由 /emakistation dismantle <工作站> 进入

槽位必须显式写 type ​

EmakiStation 的槽位必须显式写 type. CoreLib 的模板解析器只会对少数几个专用键名自动推断类型; 你用自定义键名又不写 type, 它就只是一个纯装饰的格子

判定顺序是「先看 type, 为空再看槽位键名」, 所以只有键名刚好等于下方类型名时才能省略 type

yaml
slots:
  recipe_list:
    slots: [10, 11, 12]
    type: "recipe_list"

配方目录页可用类型 ​

type作用
recipe_list列出配方. 必需, 缺失时布局校验不通过
queue_open打开合成队列页
batch_multiplier循环切换倍率, 左键递增, 右键递减
output_toggle切换产物去向
prev_page / next_page / page_info翻页
close关闭界面

配方目录页没有 input 槽. 玩家不放材料进界面, 材料在提交时直接从背包与仓库合并扣除

目录页的点击行为: 左键点条目直接按当前倍率提交; 右键进入材料预览; 未解锁的条目 (display_condition 不满足) 点了没有任何反应

材料预览页可用类型 ​

type作用
material_list列出所选配方的材料需求. 必需
recipe_display显示当前预览的配方
cost_display显示货币成本与玩家余额
max_craftable显示按材料与余额最多能做几次, 点击直接拉满
batch_multiplier循环切换倍率
confirm提交
back返回目录页, 会停在原来那一页
prev_page / next_page / page_info材料列表翻页
close关闭界面

预览页只读, 你不能往里放物品

倍率按钮的循环档位固定为 1 → 10 → 64 → 1000 (左键递增, 右键递减, 到顶回绕). max_craftable 会按材料与余额算出上限并直接设为当前倍率

材料数量的显示规则 ​

需求量显示方式
≤ 99图标上带真实数字, 客户端直接画出来
≥ 100图标数量固定为 1, 不画数字, 真实数量只出现在 lore 的 %required_exact%

所以 lore 里一定要保留 %required_exact%, 否则需求很大时你无从得知真实数量

65~99 超过多数物品的自然堆叠上限, 插件会临时把被渲染图标的 max_stack_size 组件调高. 这个改动只作用在界面里的展示图标上, 永远不会交到玩家手里

合成队列页可用类型 ​

type作用
queue_view列出队列条目. 必需
capacity_display显示已用 / 上限, 以及上限的来源
queue_purchase购买额外队列位, 左键买 1 个, Shift 买一整批
claim_all领取全部待领取产物
back返回目录页, 会停在原来那一页
prev_page / next_page / page_info队列翻页
close关闭界面

队列页同样只读, 你不能往里放物品

队列条目的点击行为: 点 PENDING_CLAIM 条目等同于「领取全部」; 点其他条目会取消它. queue_purchase 的「买一整批」取批量选项里的最大值 (见付费队列位)

分解界面可用类型 ​

type作用
dismantle_input展示当前选中配方的输入物品图标 (只读预览, 不放物品)
dismantle_item_display同 dismantle_input, 别名
dismantle_rolls_display显示投掷次数范围 (%rolls_min% / %rolls_max%)
dismantle_output_list分解产物列表, 多格分页, 含 pool_entry / rolled_output 虚拟物品
dismantle_confirm确认执行分解, 或领取已投掷产物
prev_page / next_page / page_info产物列表翻页
back返回目录页
close关闭界面

分页控件同时服务于「预览概率池」和「已投掷产物」两种列表, 翻页上限会跟着你当前所处的状态切换

占位符全集 ​

界面模板里的 %...% 是模板内部占位符, 由 EmakiStation 渲染, 与 PlaceholderAPI 无关 (PAPI 变量只在条件表达式文本里会被透传解析)

标题占位符 (模板顶层 title) ​

占位符配方目录页材料预览页合成队列页分解界面
%station_name%✓✓✓✓
%station%✓✓✓✓
%player%✓✓✓✓
%recipe%—✓—✓
%recipe_name%—✓—✓
%page%✓———
%pages%✓———
%used% / %max%——✓—

目录页标题里的 %pages% 取的是配方条目总数 (源码就是这么写的), 不是总页数. 你想要真实总页数, 请改用槽位 page_info

目录页槽位占位符 ​

槽位类型可用占位符
recipe_list%recipe%, %recipe_name%, %result_name%, %result_amount%, %duration%, %batch%, %index%, %page%, %pages%, %conditions%, %costs%, %materials%; 未解锁条目额外有 %lock_reason%
batch_multiplier%batch%, %batch_exact%
output_toggle%output%, %output_state%
page_info / prev_page / next_page%page%, %pages%, %total%

%conditions% / %costs% / %materials% 是整行展开占位符: 写在 lore 时必须独占一行, CoreLib 会把该行按条目数展开成多行. 写成 材料: %materials% 不会展开

预览页槽位占位符 ​

槽位类型可用占位符
material_list%material%, %material_id%, %requirement_id%, %count_key%, %required%, %required_exact%, %owned%, %owned_exact%, %satisfied%, %consumed%, %alternatives%, %index%, %page%, %pages%
recipe_display%recipe%, %recipe_name%, %result_name%, %result_amount%, %duration%, %batch%
cost_display%cost%, %cost_exact%, %currency%, %balance%, %affordable%, %free%
max_craftable%max%, %max_exact%, %batch%
batch_multiplier%batch%, %batch_exact%
confirm%recipe%, %recipe_name%, %batch%; 被拦下时 (改用 confirm_blocked 虚拟物品) 为 %block_reason%, %block_text%
page_info / prev_page / next_page%page%, %pages%, %total%

队列页槽位占位符 ​

槽位类型可用占位符
queue_view普通条目: %index%, %recipe%, %batch%, %state%, %remaining%, %cost%, %currency%, %page%, %pages% (待领取条目改用 queue_pending 虚拟物品, 占位符集合相同)
capacity_display%used%, %max%, %purchased%, %base%, %ceiling%, %pending%
queue_purchase可购买时: %slots%, %cost%, %currency%, %items%; 不可购买时 (改用 purchase_unavailable 虚拟物品): %reason%, %reason_text%
claim_all%pending%
page_info / prev_page / next_page%page%, %pages%, %total%

分解界面槽位占位符 ​

槽位类型可用占位符
dismantle_input / dismantle_item_display%recipe%, %recipe_name%, %input% (没有匹配配方时改用 no_recipe 虚拟物品)
dismantle_rolls_display%rolls_min%, %rolls_max%, %recipe_name%
dismantle_output_list概率池条目: %item%, %amount_min%, %amount_max%, %weight%, %chance%, %index%, %page%, %pages%; 已投掷产物: %item%, %amount%, %amount_exact%, %index%, %total%
dismantle_confirm未投掷: %recipe%, %recipe_name%; 已投掷 (改用 dismantle_claim 虚拟物品): %recipe_name%, %output_count%
page_info / prev_page / next_page%page%, %pages%, %total%

%chance% 是按权重换算的百分比 (保留一位小数), %weight% 是原始权重

virtual_items 与 texts ​

四份模板都有 virtual_items 段, 用来定义列表项的图标形态:

模板已使用的 virtual_items 键
station_catalog.ymlrecipe_entry, recipe_locked
station_preview.ymlmaterial_satisfied, material_missing, confirm_blocked
station_queue.ymlqueue_entry, queue_pending, purchase_unavailable
station_dismantle.ymlno_recipe, dismantle_input, pool_entry, rolled_output, dismantle_claim

这些键缺失时会用内置的图标和文案替代 (例如目录里未解锁的条目用灰色染料, 确认被拦下时用屏障). 前三份合成模板还有 texts 段, 用来配置行文本片段: 目录页的 texts.recipe.* 与 texts.output_state.*, 预览页的 texts.block_reason.* 与 texts.output_state.*, 队列页的 texts.purchase_reason.*. 分解界面没有 texts 段

texts.block_reason.* 与 texts.purchase_reason.* 的键名对应插件内部的拒绝原因键 (如 insufficient_materials, station.queue_full, no_price_defined). 这些键缺失时, 界面会直接显示原始原因键

交互约束 ​

  • 所有顶部界面槽位点击都会被取消 (不可取走图标), 拖拽到顶部界面也会被拦下
  • 数字键, 副手交换键与不支持的组合键点击会被忽略
  • 同一个界面会话里的连续点击受 gui.click_throttle_ms 限制
  • 已经打开的界面会按 gui.refresh_interval_ticks 定时重绘, 该玩家自己的线程 (owner 线程) 之外不会重绘