经济模块
MatrixShop 当前通过 MatrixLib 的共享经济模块统一管理货币定义和交易动作。
它和旧版“每个商店自己随便写货币逻辑”的思路不同,当前版本采用的是:
- 统一定义货币
- 模块、商店或商品只引用货币 key
- 未定义时默认回退到
vault
核心结论
Economy是核心模块,始终启用,不支持关闭。- 默认货币定义文件是
plugins/MatrixLib/Economy/currency.yml - 运行时会同步到
plugins/MatrixShop/Economy/currency.yml与plugins/MatrixStorage/Economy/currency.yml - 支持的货币模式:
vaultplayerpointsPlaceholderAPI占位符货币
Cart和Record不提供独立经济配置
如果你想看字段逐项说明,请继续看:
默认文件
plugins/MatrixLib/Economy/currency.yml
默认资源示例:
vault:
Mode: vault
Display-Name: "金币"
Symbol: "$"
Decimal: true
playerpoints:
Mode: playerpoints
Display-Name: "点券"
Symbol: "点"
Decimal: false
custom_points:
Mode: "%custom_points%"
Display-Name: "自定义积分"
Symbol: ""
Decimal: false
Actions:
Take:
- "console: custompoints take {player} {amount}"
Give:
- "console: custompoints give {player} {amount}"
Deny:
- "tell:&c货币不足,需要 &e{need} &c,当前为 &e{balance}"
说明:
vault是当前未定义时的默认回退货币playerpoints适合整数型点券custom_points只是示例 key,可以改成你自己的命名
货币定义字段
| 字段 | 说明 |
|---|---|
Mode | 货币类型。可写 vault、playerpoints 或 PlaceholderAPI 占位符。 |
Display-Name | 菜单和提示中显示的货币名。 |
Symbol | 可选符号。当前主要用于展示,不直接控制结算。 |
Decimal | 是否允许小数。playerpoints 一般应设为 false。 |
Actions.Take | 自定义货币扣除动作。 |
Actions.Give | 自定义货币发放动作。 |
Actions.Deny | 余额不足时执行的提示动作。 |
说明:
vault和playerpoints模式优先走插件 API- 自定义占位符货币主要依赖
Actions.Take / Give / Deny - 如果没有定义动作,就只能用于读取余额,不能安全完成结算
默认回退规则
如果业务模块在以下三个层级都没有定义货币 key:
- 商品级
- 商店级
- 模块级
那么最终会自动回退到:
vault
也就是说,不配置时默认使用 vault。
配置优先级
当前版本的货币 key 解析优先级是:
- 商品级
- 商店级
- 模块级
- 默认回退
vault
商品级
当前主要体现在 SystemShop:
# SystemShop/shops/weapon.yml
goods:
- diamond_sword
# SystemShop/goods/diamond_sword.yml
id: diamond_sword
material: 'DIAMOND_SWORD'
price: 420
currency: playerpoints
商店级
适用于带 shops/*.yml 的模块,例如:
SystemShopPlayerShopGlobalMarketAuctionTransaction
示例:
Currency:
Key: vault
说明:
- 商店级
Currency.Key是可选项 - 如果商店文件里不写,会继续回退到模块级
模块级
适用于:
- 没有
shops/*.yml的模块 - 或作为带
shops/*.yml模块的兜底值
示例:
Currency:
Key: vault
说明:
- 模块级是这条业务线的默认货币
- 当商品级和商店级都未定义时,会使用这里的值
一个完整示例
假设你想让:
SystemShop默认使用金币Auction/default.yml使用点券SystemShop/goods/diamond_sword.yml单独使用点券
可以这样写:
# SystemShop/settings.yml
Currency:
Key: vault
# SystemShop/shops/weapon.yml
Currency:
Key: vault
goods:
- diamond_sword
# SystemShop/goods/diamond_sword.yml
id: diamond_sword
material: 'DIAMOND_SWORD'
price: 420
currency: playerpoints
# Auction/shops/default.yml
Currency:
Key: playerpoints
最终效果:
- 大多数系统商店商品使用
vault diamond_sword使用playerpointsAuction/default.yml下的拍卖使用playerpoints
各模块当前支持方式
| 模块 | 支持方式 |
|---|---|
SystemShop | 商品级 currency > 商店级 Currency.Key > 模块级 SystemShop/settings.yml |
PlayerShop | 商店级 Currency.Key > 模块级 PlayerShop/settings.yml |
GlobalMarket | 商店级 Currency.Key > 模块级 GlobalMarket/settings.yml |
Auction | 商店级 Currency.Key > 模块级 Auction/settings.yml |
Transaction | 商店级 Currency.Key > 模块级 Transaction/settings.yml |
ChestShop | 模块级 ChestShop/settings.yml |
Cart | 不配置经济 |
Record | 不配置经济 |
当前不建议的写法
当前 MatrixShop 不建议把完整货币动作直接内联在商店配置里。
推荐做法是:
- 在
MatrixLib/Economy/currency.yml里统一定义货币 - 在模块、商店或商品里只写 key
也就是说,优先写:
Currency:
Key: playerpoints
而不是在每个商店文件里重复写整段货币动作。
三端同步
当前货币配置会在运行时同步以下三个文件:
plugins/MatrixLib/Economy/currency.ymlplugins/MatrixShop/Economy/currency.ymlplugins/MatrixStorage/Economy/currency.yml
推荐把 MatrixLib 视为主入口,但如果你修改了三者中的任意一份,再执行重载,也会按最新修改时间重新同步。
管理与排查
建议先执行:
/matrixshopadmin status
重点看:
Economy provider- 启动摘要中的经济系统信息
如果某种货币不可用,通常有三类原因:
- 对应依赖插件没装
currency.yml里写的模式或占位符不正确- 自定义货币动作只定义了读取,没有定义
Take / Give / Deny