跳到主要内容

普通商店

normal 是最基础也最完整的购买型商店模式。它读取 goods 中配置的商品,支持分页、确认购买、购物车、收藏、赠送、搜索、比价、限购、动态定价、随机商品和物物交换。

适用场景

  • 固定商品商城:材料、装备、礼包、消耗品等常规售卖。
  • 虚拟商品商城:通过商品动作发权限、点数、属性或执行命令。
  • 活动货架:通过 goods.*.ifconditionlimitation 控制玩家可见商品和限购。
  • 物物交换:通过 buy.mode: items 做材料兑换、混合支付。

关键配置

字段说明
modenormalNORMAL,或缺省不写(默认回退为普通商店)
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.modenormal 支持 items 物物交换;写到其他模式会回退为货币购买

玩家能做什么

功能说明
点击购买点击商品后直接购买或进入确认界面
加入购物车确认界面可把商品加入购物车后统一结算
收藏商品商品可加入收藏夹,之后快速跳转回来源商店
赠送商品支持把可赠送商品送给其他玩家;属性类或纯脚本商品不支持赠送
搜索商品图标动作 malkuth search 会进入普通/限时商店的通用搜索
比价/malshop compare [关键词] 可跨普通/限时购买型商店对比价格
物物交换buy.mode: items 可要求玩家消耗指定物品,也可与货币价格混合使用

配置示例

下面节选自默认 shop/normal_full.ymlshop/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 当前只搜索 normallimit_time,不会搜索玩家商店、拍卖行、全球市场或回收商店。
  • random_price 需要商品槽位有实际 id,否则随机价格会被跳过。
  • goods.*.currency 会影响商品展示里的 {has_currency}{currency_type} 和实际扣款优先级。
  • goods.*.currency 当前只支持字符串;如果直接写 %papi_var%,插件能读余额,但没有 take / deny 脚本时会在真实扣款阶段失败。
  • 确认界面顶部余额仍以商店级货币展示;如果一个商店里混用多种商品货币,建议在模板里补上 {currency_type} 一起提示。

相关页面