简体中文
付费队列位
付费队列位的三道开关, queue_costs.yml 里的价格档位怎么写, 买一个队列位要花多少, 以及已购额度存在哪里
你可以在队列页花钱买额外队列位. 价格档位写在 plugins/EmakiStation/queue_costs.yml, 文件名由 config.yml 的 queue.purchase.cost_file 指定
注意这是业务数据文件: release_default_data 只在文件缺失时释放一次, 版本升级不会覆盖你已经改过的内容
三道开关
任一关闭都不能购买:
| 开关 | 位置 |
|---|---|
queue.purchase.enabled | config.yml, 全服总开关 |
queue.allow_purchase | stations/<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字段
| 字段 | 类型 | 必填 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|---|
tiers | list | 否 | [] | 映射列表 | 价格档位的列表. 不合法的档位会被跳过, 并打一条 [station] WARN |
tiers[].count_range | string | 否 | — | "N" 或 "min-max", 正整数 | 这个档位覆盖从第几个到第几个队列位, 例如 "1-2". 解析不了 (不是正整数, 或者 max < min) 时该档位会被跳过 |
tiers[].currency | 段 | 否 | — | 见下两行 | 货币价格. 和 item 都缺失或都不合法时, 这个档位会被跳过 |
tiers[].currency.type | string | 否 | "vault" | vault, excellent (excellenteconomy 等价) | 经济的来源方. 填了无法识别的值会报 Unrecognised queue cost currency type, 并当作没有货币价格 |
tiers[].currency.amount | double | string | 否 | — | 数值需 >0; 或非空字符串表达式 | 货币金额. 数字小于等于 0 时当作没有货币价格; 字符串会交给 CoreLib 的 ExpressionEngine 计算, %count% 表示这次要买第几个队列位 |
tiers[].item | 段 | 否 | — | 见下两行 | 额外要求的物品价格 |
tiers[].item.source | string | 否 | — | CoreLib ItemSource token | 额外要求的物品. 空或空白当作没有物品价格 |
tiers[].item.amount | integer | 否 | 1 | >0 | 物品数量. 小于等于 0 时当作没有物品价格 |
fallback | 段 | 否 | 不启用 | 见下三行 | 备用档. currency 与 item 都没有可用信息时, 整个 fallback 不启用 |
fallback.currency.type | string | 否 | "vault" | 同 tiers[].currency.type | 备用档的货币类型 |
fallback.currency.amount | double | string | 否 | — | 同 tiers[].currency.amount | 备用档的金额, 支持表达式 |
fallback.item.source / fallback.item.amount | string / integer | 否 | — / 1 | 同 tiers[].item | 备用档的物品价格 |
fallback.max_amount | double | 是 (启用 fallback 时) | — | >0 | 单个队列位的价格上限. 缺失或非正数时备用档整体失效, 超出 tiers 的队列位将不可购买 |
batch.enabled | boolean | 否 | true | true, false | 是否允许批量购买 |
batch.options | list<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. 这是插件自己维护的状态文件, 不是配置: 要手工修改请先停服, 插件在玩家上线时读取, 在购买时和停服/自动保存时写回. 额度为空 (没买过) 的玩家不会生成这个文件
| 字段 | 类型 | 必填 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|---|
player | string | 是 | — | 玩家 UUID | 该文件的归属玩家 |
stations | 映射 | 是 | — | <工作站 id> → 记录 | 按工作站分开记录已购额度 |
stations.<工作站 id>.purchased_slots | integer | 否 | 0 | ≥0 | 这个玩家在这个工作站已经买了几个队列位. 是 0 或缺失表示没有额外额度 (读取时小于等于 0 都当作 0) |
yaml
player: "0f1e2d3c-4b5a-6978-8796-a5b4c3d2e1f0"
stations:
blacksmith:
purchased_slots: 3