Skip to content

付费队列位 ​

付费队列位的三道开关, queue_costs.yml 里的价格档位怎么写, 买一个队列位要花多少, 以及已购额度存在哪里

你可以在队列页花钱买额外队列位. 价格档位写在 plugins/EmakiStation/queue_costs.yml, 文件名由 config.yml 的 queue.purchase.cost_file 指定

注意这是业务数据文件: release_default_data 只在文件缺失时释放一次, 版本升级不会覆盖你已经改过的内容

三道开关 ​

任一关闭都不能购买:

开关位置
queue.purchase.enabledconfig.yml, 全服总开关
queue.allow_purchasestations/<id>.yml, 单个工作站是否出售
emakistation.purchase玩家权限, 默认 true

发货默认值 ​

yaml
tiers:
  - count_range: "1-2"
    currency:
      type: vault
      amount: 5000
  - count_range: "3-4"
    currency:
      type: vault
      amount: 20000
  - count_range: "5-6"
    currency:
      type: vault
      amount: 50000
    item:
      source: "diamond"
      amount: 8

fallback:
  currency:
    type: vault
    amount: "100000 * 1.15 ^ (%count% - 7)"
  max_amount: 500000000

batch:
  enabled: true
  options:
    - 1
    - 2
    - 5

字段 ​

字段类型必填默认值取值范围说明
tierslist否[]映射列表价格档位的列表. 不合法的档位会被跳过, 并打一条 [station] WARN
tiers[].count_rangestring否—"N" 或 "min-max", 正整数这个档位覆盖从第几个到第几个队列位, 例如 "1-2". 解析不了 (不是正整数, 或者 max < min) 时该档位会被跳过
tiers[].currency段否—见下两行货币价格. 和 item 都缺失或都不合法时, 这个档位会被跳过
tiers[].currency.typestring否"vault"vault, excellent (excellenteconomy 等价)经济的来源方. 填了无法识别的值会报 Unrecognised queue cost currency type, 并当作没有货币价格
tiers[].currency.amountdouble | string否—数值需 >0; 或非空字符串表达式货币金额. 数字小于等于 0 时当作没有货币价格; 字符串会交给 CoreLib 的 ExpressionEngine 计算, %count% 表示这次要买第几个队列位
tiers[].item段否—见下两行额外要求的物品价格
tiers[].item.sourcestring否—CoreLib ItemSource token额外要求的物品. 空或空白当作没有物品价格
tiers[].item.amountinteger否1>0物品数量. 小于等于 0 时当作没有物品价格
fallback段否不启用见下三行备用档. currency 与 item 都没有可用信息时, 整个 fallback 不启用
fallback.currency.typestring否"vault"同 tiers[].currency.type备用档的货币类型
fallback.currency.amountdouble | string否—同 tiers[].currency.amount备用档的金额, 支持表达式
fallback.item.source / fallback.item.amountstring / integer否— / 1同 tiers[].item备用档的物品价格
fallback.max_amountdouble是 (启用 fallback 时)—>0单个队列位的价格上限. 缺失或非正数时备用档整体失效, 超出 tiers 的队列位将不可购买
batch.enabledboolean否truetrue, false是否允许批量购买
batch.optionslist<integer>否[1, 5]正整数批量购买时可以选的数量. 非正数会被忽略, 全部不合法时会改回 [1, 5]. 实际的批量档位还会强制带上 1, 并且只保留大于 1 的显式值

记住 fallback.max_amount 是必需项: 缺失或非正数时备用档整体失效, 超出 tiers 的队列位就不能再买了. 它的作用是防止指数表达式溢出成 Infinity

yaml
# 示例: 只卖前 4 个队列位, 之后不再出售 (不写 fallback)
tiers:
  - count_range: "1"
    currency:
      type: vault
      amount: 2000
  - count_range: "2-4"
    currency:
      type: vault
      amount: 8000

计价规则 ​

你买第 N 个队列位时, 价格由 N 落在哪个 count_range 决定. N 是你在这个工作站已买数量加 1, 各工作站分开计数. 越靠前的档位优先; 一个都没匹配上就用 fallback

批量购买按逐格计价再求和结算, 不是「单价乘数量」, 否则你可以一次按最便宜的那档买下一大批

缺价就拒绝: 某一格既没有匹配的档位也没有 fallback 时, 购买会被拒绝, 不会免费放行. 文件缺失或整体不可用时, 付费队列位功能整体关闭

与上限的关系 ​

你买到的队列位是叠加在基础长度或权限档之上的, 但最终仍然会被工作站的 queue.max_length 截断. 插件在报价时就会拒绝那些会被截断吞掉的购买, 不会先收钱再让你发现买了没用

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

unlocks.yml 已购额度存档 ​

每个玩家已购的队列位记录在 plugins/EmakiStation/data/<玩家 UUID>/unlocks.yml. 这是插件自己维护的状态文件, 不是配置: 要手工修改请先停服, 插件在玩家上线时读取, 在购买时和停服/自动保存时写回. 额度为空 (没买过) 的玩家不会生成这个文件

字段类型必填默认值取值范围说明
playerstring是—玩家 UUID该文件的归属玩家
stations映射是—<工作站 id> → 记录按工作站分开记录已购额度
stations.<工作站 id>.purchased_slotsinteger否0≥0这个玩家在这个工作站已经买了几个队列位. 是 0 或缺失表示没有额外额度 (读取时小于等于 0 都当作 0)
yaml
player: "0f1e2d3c-4b5a-6978-8796-a5b4c3d2e1f0"
stations:
  blacksmith:
    purchased_slots: 3