普通商店
normal 是最基础也最完整的购买型商店模式。它读取 goods 中配置的商品,支持分页、确认购买、购物车、收藏、赠送、搜索、比价、限购、动态定价、随机商品和物物交换。
适用场景
- 固定商品商城:材料、装备、礼包、消耗品等常规售卖。
- 虚拟商品商城:通过商品动作发权限、点数、属性或执行命令。
- 活动货架:通过
goods.*.if、condition、limitation控制玩家可见商品和限购。 - 物物交换:通过
buy.mode: items做材料兑换、混合支付。
关键配置
| 字段 | 说明 |
|---|---|
mode | 写 normal、NORMAL,或缺省不写(默认回退为普通商店) |
currency | 必填;可用 Vault、PlayerPoints、PAPI 自定义货币,商品级也可覆盖货币 |
goods | 必填;每个条目对应一个商店槽位或随机池 |
confirm.open | 是否打开确认购买界面,商品级 goods.*.confirm.open 可覆盖 |
item_count_limit | 商店级商品数量限制,作用于购买链路 |
trade_amount_limit | 商店级交易金额限制,作用于购买链路 |
target_inventory | 可选;购买发货目标背包,如 vanilla / legendwarehouse / soulringx |
refresh | 可选;配合 random_pool / random_price 做玩家独立随机商品 |
schedule | 可选;按 cron + duration_hours + discount 做定时活动折扣 |
goods.*.buy-actions | 按点击类型配置购买数量,如左键 1 个、右键 16 个 |
goods.*.condition | 按优先级匹配条件并覆盖展示、价格、购买数量等字段 |
goods.*.dynamic_price | 动态定价,按交易量调整价格 |
goods.*.currency | 商品级货币覆盖,优先于商店顶层 currency;当前只支持字符串写法 |
goods.*.buy.mode | 仅 normal 支持 items 物物交换;写到其他模式会回退为货币购买 |
玩家能做什么
| 功能 | 说明 |
|---|---|
| 点击购买 | 点击商品后直接购买或进入确认界面 |
| 加入购物车 | 确认界面可把商品加入购物车后统一结算 |
| 收藏商品 | 商品可加入收藏夹,之后快速跳转回来源商店 |
| 赠送商品 | 支持把可赠送商品送给其他玩家;属性类或纯脚本商品不支持赠送 |
| 搜索商品 | 图标动作 malkuth search 会进入普通/限时商店的通用搜索 |
| 比价 | /malshop compare [关键词] 可跨普通/限时购买型商店对比价格 |
| 物物交换 | buy.mode: items 可要求玩家消耗指定物品,也可与货币价格混合使用 |
配置示例
下面节选自默认 shop/normal_full.yml 与 shop/item_trade_example.yml:
mode: NORMAL
enable: true
display: '&b普通商店'
currency:
mode: vault
confirm:
open: true
title: '&8武器商城 &7{page}/{max-page}'
layout:
- '#########'
- ' ggggggg '
- ' ggggggg '
- ' ggggggg '
- ' ggggggg '
- 'P##I#S##N'
goods:
1:
id: diamond_sword_basic
amount: 1
price: 500
buy-actions:
- click: LEFT
amount: 1
- click: RIGHT
amount: 16
condition:
- id: vip-discount
priority: 100
when: 'perm vip'
display:
name: '&6VIP {name}'
buy:
price: 420
3:
id: mm_legendary_sword
amount: 1
price: 5000
limitation:
window: permanent
player: 1
global: 10
dynamic_price:
enable: true
base: 5000
min: 3000
max: 10000
window_hours: 24
sensitivity: 0.05
物物交换只在 normal 模式中生效:
goods:
5:
id: item1
amount: 1
price: 1000
buy:
mode: items
items:
- check:
contains_name:
uncolor: true
match: 碎片
amount: 5
商品也可以单独覆盖货币。下面节选自默认 shop/item_trade_example.yml:
goods:
2:
id: item1
amount: 3
price: 150
currency: playerpoints
6:
id: item1
amount: 1
price: 200
currency: playerpoints
buy:
mode: items
items:
- check:
material: DIAMOND
amount: 3
如果你要把某个商品改成自定义 PAPI 货币,推荐先在 currency.yml 注册一个货币 key,再在这里写这个 key;不要直接把 %papi_var% 当成可扣款货币长期使用。
当前实现注意点
buy.mode: items是普通商店专属功能;其他模式写了会告警并按货币购买处理。schedule.discount会在最终成交价阶段统一叠加,所以它会覆盖到基础价、条件价、随机价和动态价之后的结果。malkuth search当前只搜索normal与limit_time,不会搜索玩家商店、拍卖行、全球市场或回收商店。random_price需要商品槽位有实际id,否则随机价格会被跳过。goods.*.currency会影响商品展示里的{has_currency}、{currency_type}和实际扣款优先级。goods.*.currency当前只支持字符串;如果直接写%papi_var%,插件能读余额,但没有take/deny脚本时会在真实扣款阶段失败。- 确认界面顶部余额仍以商店级货币展示;如果一个商店里混用多种商品货币,建议在模板里补上
{currency_type}一起提示。