EmakiStation
EmakiStation 是 Emaki 系列的通用合成工作站模块。它把「按配方投入材料、排入队列、到点领取产物」这条流程做成可配置的 GUI 工作站,并额外提供一套完全独立的分解站。
合成侧是三页式界面(配方目录 → 材料预览 → 合成队列),队列串行推进。材料从「背包 + 仓库」合并池扣除,安装 EmakiStorage 后仓库参与供料;产物按配置路由到仓库或背包,两边都放不下时进入待领取状态,不会掉落也不会销毁。
基本信息
| 项目 | 值 |
|---|---|
| 模块版本 | 1.1.0 |
| API 坐标 | emaki.jiuwu.craft:emaki-station-api:1.1.0 |
| 主类 | emaki.jiuwu.craft.station.EmakiStationPlugin |
| 主命令 | /emakistation |
| 别名 | /estation、/est |
| 硬依赖 | EmakiCoreLib |
| 软依赖 | EmakiStorage、PlaceholderAPI |
| 描述符基线 | api-version: "1.21.8"、folia-supported: true |
| Java | Java 25 |
| 主要权限 | emakistation.use(默认 true)、emakistation.purchase(默认 true)、emakistation.dismantle(默认 true)、emakistation.reload(op)、emakistation.debug(op)、emakistation.admin(op) |
POM/runtime/API 与默认 config.yml 的版本值是 1.1.0;源码内部的 AppConfig.CURRENT_VERSION = "1.0.2" 是配置迁移结构常量,两者用途不同,不要混用。
功能页面
| 页面 | 内容 |
|---|---|
| 命令与权限 | /emakistation 的 9 个子命令、6 个权限节点与两个访问权限前缀。 |
| 配置详解 | config.yml 的 queue、limits、storage、persistence、gui 五段。 |
| 工作站定义 | stations/<id>.yml 的布局、权限、队列参数、材料通道与产物路由。 |
| 配方定义 | recipes/<配方>.yml 的归属、材料、产物、耗时、货币成本与两种条件门。 |
| 合成队列 | 队列长度的三个来源、串行推进、取消退还与待领取状态。 |
| 付费队列位 | queue_costs.yml 的档位、逐格计价与三道开关。 |
| 物品分解 | 独立分解站与分解配方的 input_source、rolls、pool 权重抽取。 |
| 界面模板 | 四份 GUI 模板的槽位类型与「必须显式写 type:」约束。 |
| API 与集成 | emaki-station-api 的门面、查询与操作接口及线程约束。 |
| 事件 API | StationCraftSubmitEvent、StationCraftCancelEvent、StationCraftCompletedEvent。 |
核心能力
- 无序集合匹配:配方只看材料种类与总数,不看摆放位置,没有 shaped 概念。
item_sources是「任意其一」集合,数量按集合内总数计算——需要 64 个时,30 个 coal 加 34 个 charcoal 也算满足。 - 背包与仓库合并供料:两个通道都开启时,材料来自合并池并优先扣背包。玩家看不到通道切换按钮,界面里显示的「拥有」就是两边合计。
- 串行单线队列:一个玩家在一个工作站只有一条队列,只有队首在推进。
waiting与running占用队列长度,pending_claim不占用。 - 队列长度三来源:基础长度、
emakistation.queue.<n>权限档、付费购买。权限档取代基础长度,付费额度叠加在其上,最终统一被max_length截断。 - 产物永不丢失:所有配置目标都放不下时,条目转为待领取,等玩家用
/emakistation claim或界面按钮领取。 - 分解站完全独立:分解站与合成站 ID 互不关联,各自在
stations_dismantle/与recipes_dismantle/目录加载,不是工作站的第四页。
文件结构
服务器运行后,EmakiStation 主要使用以下文件:
text
plugins/EmakiStation/
├─ config.yml
├─ queue_costs.yml
├─ stations/
│ └─ blacksmith.yml
├─ recipes/
│ └─ example_recipe.yml
├─ stations_dismantle/
│ └─ example_dismantle_station.yml
├─ recipes_dismantle/
│ └─ example_dismantle_recipe.yml
├─ gui/
│ ├─ station_catalog.yml
│ ├─ station_preview.yml
│ ├─ station_queue.yml
│ └─ station_dismantle.yml
└─ lang/
├─ zh_CN.yml
└─ en_US.yml| 路径 | 说明 |
|---|---|
config.yml | 主配置:队列默认值、容量上限、仓库通道、持久化、界面节流。 |
queue_costs.yml | 付费队列位档位。业务数据文件,只在缺失时释放一次,版本升级不覆盖管理员内容。 |
stations/<id>.yml | 合成工作站定义。文件名与 id 一致。 |
recipes/<配方>.yml | 合成配方定义。一个文件一条配方,归属由配方侧的 station_ids 声明。 |
stations_dismantle/<id>.yml | 分解站定义,与合成站互不关联。 |
recipes_dismantle/<配方>.yml | 分解配方定义,含输入物品与产物概率池。 |
gui/*.yml | 四份界面模板:配方目录、材料预览、合成队列、分解界面。 |
lang/*.yml | 命令、界面、预检与控制台文案。 |
快速开始
- 把
EmakiCoreLib-*.jar与EmakiStation-*.jar放入服务器plugins/。 - 不要把
emaki-station-api-*.jar放进plugins/;API Jar 只作为开发者的编译依赖。 - 首次启动后检查
plugins/EmakiStation/config.yml与示例工作站stations/blacksmith.yml。 - 打开示例工作站:
text
/emakistation open blacksmith- 查看自己的队列与领取产物:
text
/emakistation queue
/emakistation claim- 修改配置后重载:
text
/emakistation reload使用提示
- 工作站的
channels.backpack与channels.storage不能同时为 false,否则该工作站会被拒绝加载——能打开但永远用不了,不如启动时就报错。 channels.default是保留键,当前不再生效。合并通道之后没有「停在哪个通道」这回事,留着只为让旧配置不报未知键。- 仓库通道除了
storage.enabled: true,还需要 EmakiStorage 提供emakistorage:atomic_batch能力才会启用。缺少该能力时不会退化为逐个取出,因为那会让材料在背包里闪现一次。 progress_mode: offline只表示「计时继续」,不表示「离线发货」。离线期间到点的条目只是已到期,真正结算发生在玩家下次上线时。- 三份布局文件(
layout、preview_layout、queue_layout)都必须存在,缺任何一个都会在启动预检里报missing_layout。 - 材料分配是贪心的,没有回溯。同一个物品能满足多条需求时会分配给先声明的那条,极少数情况下会让理论可行的配方匹配失败,拆分配方即可规避。