Skip to content

合成队列

一个玩家在一个工作站拥有一条队列。队列是串行单线的:只有队首在推进,后面的条目排队等待。

条目状态

状态是否占用队列长度说明
WAITING已提交,排在队列中等待。
RUNNING队首,正在推进耗时。
PENDING_CLAIM已完成但产物没能投递,等待玩家领取。

PENDING_CLAIM 刻意不占用队列长度:否则仓库和背包同时满的玩家会被自己未投递的产物锁死队列,什么都排不进去。待领取条目由 limits.max_pending_claim 单独限制,默认 100。

队列长度的三个来源

来源与基础长度的关系配置位置
基础长度起点config.ymlqueue.base_length,工作站可覆盖。
权限档取代emakistation.queue.<n>,需 queue.permission_tiers: true
付费购买叠加队列页购买,见 付费队列位

权限档取数字最大的一档生效,没有任何该前缀权限时保持基础长度。付费额度叠加在生效档之上,最终统一被 queue.max_length 截断。

权限档是「取代」而付费是「叠加」,这样管理员事后给某个玩家发权限档,不会把他花钱买的额度吞掉。

推进方式

queue.progress_mode 决定队首如何计时:

行为
offline按真实时间推进,玩家离线期间继续走时。
online仅在玩家在线时累计。

offline 只表示「计时继续」,不表示「离线发货」。EmakiStorage 拒绝对离线玩家做任何写操作,所以离线期间到点的条目只是「已到期」,真正结算发生在玩家下次上线时。

队列推进任务全服只有一个定时器,间隔由 queue.tick_interval 控制,默认 20 tick,不是每条队列一个定时器。

耗时

单次耗时来自配方的 duration_seconds,再乘工作站或全局的 speed_multiplierduration_seconds0 或省略时立即完成,不进队列。

取消与退还

text
/emakistation cancel <工作站> <序号>

命令与界面里的序号从 1 开始(API 的 index 参数从 0 开始)。

退还比例来自工作站的 queue.cancel_refund_rate,材料与已付货币按同一比例折算。退还总是回到材料原本来自的通道,与工作站的产物路由无关。

退还不按进度折算。串行单线队列里只有队首有进度,为一个几乎不存在的情况引入逐条目进度记账不值得,这是有意的简化。

部分退还仍然报告成功,缺口作为 Partial 原因键携带。

PENDING_CLAIM 状态的条目不能取消,会被拒绝并返回 station.cancel_pending_claim

领取产物

text
/emakistation claim

一次领取该玩家在所有工作站的全部可投递待领取产物。仍然投递不了的条目保持待领取而不是让整个调用失败,所以这个命令可以无条件执行。

管理员操作

text
/emakistation admin queue <...>

需要 emakistation.admin