简体中文
界面模板
四份界面模板分别对应哪个界面, 每个界面能用哪些槽位类型, 以及模板里可以写哪些占位符
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.yml | recipe_entry, recipe_locked |
station_preview.yml | material_satisfied, material_missing, confirm_blocked |
station_queue.yml | queue_entry, queue_pending, purchase_unavailable |
station_dismantle.yml | no_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 线程) 之外不会重绘