Skip to content

商店配置

商店文件放在插件目录的 shop/ 目录下。每个 YAML 文件对应一个商店,文件名不作为商店 ID,实际 ID 由文件中的 id 字段决定。

商店数据会根据 id 保存。商店正式开放后不要修改 id,否则可能导致已有购买数据无法对应。

文件结构

商店配置主要由以下部分组成:

  • 商店基础字段:商店标题、权限、界面大小、全局折扣和打开/关闭界面时执行的指令。
  • items:商品列表,每个键对应一个商品。
  • 商品购买条件、货币、限购、时间、奖励物品和购买后指令均在商品节点中配置。

商店基础字段

配置键类型默认值说明
id字符串商店 ID,用于打开商店、购买商品和保存数据。不能为空,正式使用后不要修改。
name字符串商店界面标题。不能为空,支持 & 颜色代码。
permission字符串未限制打开该商店所需的权限。删除该键后不限制权限。
size整数6商店行数。实际会限制在 1-12 之间,每行 9 个槽位。
discount字符串列表空列表商店全局折扣条件。
open-shop-command字符串列表空列表打开商店界面时执行的指令。
close-shop-command字符串列表空列表关闭商店界面时执行的指令。

size 大于 6 时,界面会超过 Minecraft 原版常见容器大小,使用前应确认服务端和客户端能够正常显示。

全局折扣

折扣格式为:

yaml
discount:
  - 'permission:{lshop.buy.7}<->0.12'

格式说明:

text
判断条件<->折扣倍率

判断条件支持 PlaceholderAPI 表达式和权限判断。倍率 1 表示原价,0.5 表示五折,0.12 表示按原价的 12% 计算。

商店全局折扣会与商品自身的 discount 一起计算。多个条件同时满足时,使用更低的折扣倍率。购买货币最终数量会按折扣计算后向上取整。

打开和关闭指令

指令前缀决定执行身份:

yaml
open-shop-command:
  - '[console]spawn %player_name%'
  - '[op]spawn %player_name%'
  - '[player]spawn %player_name%'

close-shop-command:
  - '[console]spawn %player_name%'
  - '[op]spawn %player_name%'
  - '[player]spawn %player_name%'
  • [console]:以控制台身份执行。
  • [op]:以玩家临时拥有 OP 权限的身份执行。
  • 无前缀或 [player]:以玩家身份执行。

打开或关闭指令如果会直接打开新界面,可能与当前界面切换产生冲突。

商品配置

商品配置位于 items 下。商品键是商品内部名称,商品实际显示位置由 slot 决定。

yaml
items:
  '商品1':
    slot: 0
    show-item: 'MythicMobs#测试'

商品字段

配置键类型默认值说明
slot整数商品所在槽位,从 0 开始。第一行是 0-8,第二行是 9-17,依此类推。缺少该键的商品不会载入。
show-item字符串或物品节点商品在商店界面中显示的物品。
give-item字符串空字符串购买成功后发放给玩家的物品。删除或留空时不发放物品。
amount整数1展示物品数量以及购买后发放物品的数量。
force-need-slot布尔值true是否要求玩家背包至少有一个空槽位。
show-condition字符串列表空列表商品显示条件。不满足时商品不会显示,也不能通过购买流程购买。
buy-condition字符串列表空列表购买前置条件。不满足时不能购买。
buy-currency字符串列表空列表购买时消耗的货币或物品。
buy-success-message字符串列表使用全局消息购买成功后发送给玩家的消息。配置为空列表时不会回退到全局成功消息。
buy-fail-message字符串列表使用全局消息购买失败后发送给玩家的消息。配置为空列表时不会回退到全局失败消息。
discount字符串列表空列表当前商品的折扣条件,会与商店全局折扣共同计算。
buy-command字符串列表空列表购买成功后执行的指令。
weight-command节点空节点购买成功后按权重随机执行的指令组。每个分组最多随机执行一个配置项。
continuous-buy-command字符串列表空列表连续购买完成后执行的指令,可使用 {count} 获取本次成功购买次数。
right-click-max-buy-count整数config.yml 中的 default-right-buy-count普通右键一次最多连续购买次数。
shift-left-click-max-buy-count整数config.yml 中的 default-shift-left-buy-countShift+左键一次最多连续购买次数。
shift-right-click-max-buy-count整数config.yml 中的 default-shift-right-buy-countShift+右键一次最多连续购买次数。
player-limit-tag节点空节点个人限购标记及该商品的购买上限。标记必须先在 config.ymlplayer-tag 中注册。
server-limit-tag节点空节点全服限购标记及该商品的购买上限。标记必须先在 config.ymlserver-tag 中注册。
extra-lore字符串列表空列表追加到商品展示物品 Lore 的内容。
can-be-purchased-time-start字符串无限制商品开始允许购买的时间。
can-be-purchased-time-end字符串无限制商品结束允许购买的时间。
every-day-open-time字符串00:00-23:59每天允许购买的时间段。

展示物品

物品节点

show-item 可以写成物品节点,并配置物品 ID、名称和 Lore:

yaml
show-item:
  id: '160:0'
  name: '&a按钮'
  lore:
    - ''
    - '&7这是一个简单的按钮'

物品节点支持以下字段:

字段说明
id原版物品 ID 与数据值,格式如 160:0
name展示名称,支持 PlaceholderAPI 和 & 颜色代码。
lore展示 Lore 列表,支持 PlaceholderAPI 和 & 颜色代码。

物品库格式

当使用物品库物品时,可以直接把 show-itemgive-item 写成字符串:

yaml
show-item: 'MythicMobs#测试'
give-item: 'MythicMobs#测试'

项目中确认支持的物品库前缀包括:

  • MythicMobs#
  • NeigeItems#
  • SX-Item#

是否能够正常生成物品取决于对应物品库是否已安装并正常运行。

追加 Lore

extra-lore 的普通文本会追加到展示物品 Lore 中,支持 & 颜色代码。以下占位内容会被替换为对应信息:

占位内容说明
{物品信息}追加原展示物品已有的 Lore。
{购买条件}追加 buy-condition<-> 前的显示文本。
{购买货币}追加购买货币及折扣后的实际需求数量。
{限购信息}追加个人限购、全服限购和商品时间信息。
yaml
extra-lore:
  - ''
  - '{物品信息}'
  - '{购买条件}'
  - '{购买货币}'
  - '{限购信息}'
  - '&e左键购买 &a右键连续购买'

显示条件与购买条件

条件写法

项目中确认的条件写法如下:

写法说明
papi:{%player_level% >= 0}使用 PlaceholderAPI 表达式判断。
permission:{lshop.buy}判断玩家是否拥有权限。
nopermission:{lshop.buy}判断玩家是否没有权限。

使用 PlaceholderAPI 条件时,需要安装并成功启用 PlaceholderAPI。插件会在 PlaceholderAPI 可用时注册自身变量。

show-condition

show-condition 用于控制商品是否显示。商品载入后,打开或刷新商店界面时会重新判断条件;不满足条件的商品不会显示,也不会进入购买流程。

yaml
show-condition:
  - 'papi:{%player_level% >= 0}'
  - 'permission:{lshop.show.1}'

buy-condition

每一项最多由三段组成,使用 <-> 分隔:

text
显示文本<->判断条件<->失败提示
yaml
buy-condition:
  - '&7需要: 等级大于3级才可购买<->papi:{%player_level% > 3}<->&c购买失败! 你需要等级大于3级才可购买!'
  - '&7需要: 拥有lshop.buy权限<->permission:{lshop.buy}<->&c购买失败! 你需要拥有lshop.buy权限!'
  • 第一段会在 {购买条件} 中显示。
  • 第二段是实际判断条件。
  • 第三段为条件不满足时发送给玩家的提示,可省略。

购买货币

buy-currency 默认使用冒号 : 分隔字段。分隔符可以通过 config.ymlcurrency-split-key 修改;修改后所有货币配置都必须使用新的分隔符。

购买数量支持 PlaceholderAPI 变量和四则运算表达式,例如:

yaml
buy-currency:
  - 'point:<1+(%player_level%*5)>'

折扣计算后,货币数量会向上取整。项目中确认支持以下货币或消耗类型:

写法说明依赖或数据来源
vault:1消耗 Vault 经济余额。Vault 及可用经济插件
point:1消耗 PlayerPoints 点券。PlayerPoints
coupon:1消耗优惠券数量。优惠券 API
id:1:0:1按原版物品 ID、数据值和数量消耗背包物品。无额外插件
item:&6测试:2按物品名称消耗背包物品。无额外插件
item:&6测试:&7这是lore:2按物品名称和 Lore 消耗背包物品。无额外插件
item::&7这是lore:2仅按 Lore 消耗背包物品。无额外插件
item:contain@物品名:contain@lore:2按名称和 Lore 关键词匹配。无额外插件
item:equals@物品名:equals@lore:2按名称和 Lore 完全匹配。无额外插件
tpoint:1消耗 tEconomy 点数。tEconomy
tmoney:1消耗 tEconomy 金钱。tEconomy
tylb:1消耗 tEconomy 余额类型 YLB。tEconomy
nye_货币类型:1消耗 NyEconomy 中指定类型的余额。NyEconomy
注册货币 ID:1消耗在 config.ymlregister-currency 中注册的插件货币。LyShopReload
cx:变量id:数量读取并扣除 CraftX 数字变量。CraftX

物品名称匹配

item 类型中,名称或 Lore 前可以使用以下匹配前缀:

前缀说明
contain@关键词匹配,包含指定文本即可。
equals@完全匹配指定文本。
不填写前缀按完全匹配处理。

prohibited-as-lore-for-materials 可以排除包含指定 Lore 的背包物品,使其不被统计为购买材料。该配置只对玩家背包内物品生效,不处理战利品仓库中的物品。

折扣配置

商品自身可以配置独立折扣:

yaml
discount:
  - 'permission:{lshop.buy.5}<->0.5'

商品折扣和商店全局折扣的判断方式相同。所有满足条件的折扣中,取最低倍率。购买货币按折扣后数量扣除,计算结果向上取整。

限购配置

限购标记必须先在插件 config.yml 中注册,再在商品中引用。

个人限购

yaml
player-limit-tag:
  个人每周限购标记1: 1

数字表示该玩家最多可以购买的次数。购买成功后,对应个人标记增加;标记刷新时重置为 0

全服限购

yaml
server-limit-tag:
  全服每周限购标记1: 1

数字表示全服所有玩家共享的购买上限。购买成功后,对应全服标记增加;标记刷新时重置为 0

个人标记和全服标记不能使用相同的标记 ID。全服限购商店不应同时对多个服务器开放,否则各服务器缓存可能不一致。

extra-lore 中使用 {限购信息} 时,插件会从 config.yml 对应标记的 display 配置读取显示文本,并替换:

占位符说明
{now}当前已购买次数。
{max}当前商品配置的购买上限。

购买时间

商品支持三种时间限制,可以单独使用,也可以同时配置。

配置键格式说明
can-be-purchased-time-start年-月-日-时-分-秒到达该时间后才允许购买。
can-be-purchased-time-end年-月-日-时-分-秒到达该时间后不再允许购买。
every-day-open-timeHH:mm-HH:mm每天指定时间段内允许购买。
yaml
can-be-purchased-time-start: '2022-12-3-5-25-20'
can-be-purchased-time-end: '2032-12-3-6-25-20'
every-day-open-time: '00:00-23:59'

can-be-purchased-time-startcan-be-purchased-time-end 的时间格式需要包含年、月、日、时、分、秒六段。every-day-open-time 使用 24 小时制;删除该配置时默认全天开放。

时间信息可以通过 {限购信息} 显示。显示文本由 config.yml 中以下配置控制:

  • lore-replace.open-time
  • lore-replace.can-be-purchased-time-start
  • lore-replace.can-be-purchased-time-end

购买后奖励

发放物品

配置 give-item 后,购买成功时会生成并发放指定物品;amount 控制发放数量。

yaml
give-item: 'MythicMobs#测试'
amount: 1

成功与失败消息

yaml
buy-success-message:
  - '&a购买成功。'

buy-fail-message:
  - '&c购买失败。'

当商品没有配置对应消息节点时,使用 config.yml 中的全局消息:

  • message.购买成功
  • message.购买失败
  • message.连续购买
  • message.上限

如果商品显式配置为空列表,则不会使用对应的全局消息。

普通购买指令

yaml
buy-command:
  - '[console]spawn %player_name%'
  - '[op]spawn %player_name%'
  - '[player]spawn %player_name%'

指令会先处理 PlaceholderAPI 占位符,再处理计算片段。支持以下计算片段:

写法说明
eval:{表达式}计算表达式并替换为结果。
ceil:{表达式}计算表达式并向上取整。
floor:{表达式}计算表达式并向下取整。

表达式可以使用 ~ 指定 Java 格式化模板,例如 eval:{1+2~%.0f}。指令执行是否同步由 config.ymlsync-command 控制。

权重指令

weight-command 可以配置多个独立分组。每个分组根据数字权重随机选择一条或一组指令执行;不同分组分别进行随机选择。

yaml
weight-command:
  权重组1:
    - '30#[console]tell %player_name% 权重组1的指令1'
    - '30#[op]tell %player_name% 权重组1的指令2'
    - '30#[player]tell %player_name% 权重组1的指令3'

每项格式为:

text
权重#[执行身份]指令

连续购买指令

普通右键、Shift+左键或 Shift+右键触发连续购买时,插件会在连续购买结束后执行 continuous-buy-command。其中 {count} 会替换为本次实际成功购买的次数。

yaml
continuous-buy-command:
  - '[console]tell %player_name% 本次购买了{count}次'

点击购买

商品界面支持以下点击方式:

操作说明
左键购买一次。
右键连续购买,次数上限由 right-click-max-buy-count 控制。
Shift+左键连续购买,次数上限由 shift-left-click-max-buy-count 控制。
Shift+右键连续购买,次数上限由 shift-right-click-max-buy-count 控制。

连续购买会在任意一次购买失败时停止;如果之前已经成功购买过,则按实际成功次数执行连续购买消息和 continuous-buy-command

所有商品界面点击都受 config.ymlclick-cooldown 的毫秒级冷却限制。

数据保存与 MySQL

插件默认使用 YAML 保存玩家货币和限购数据。启用 config.yml 中的 mysql.enable 后,玩家货币、个人限购标记和全服限购标记会改为使用 MySQL 保存。

使用 MySQL 存储时,必须安装 LyMySQLCore,并且 LyMySQLCore 成功连接数据库后,相关功能才会生效。MySQL 连接失败时,插件会自动卸载;服务器初始化完成前,玩家登录也可能被拒绝。

MySQL 配置修改后需要重启服务器:

yaml
mysql:
  enable: false
  databasename: mc2
  username: mc2
  password: mc1234
  port: 3306
  ip: 127.0.0.1

无论使用 YAML 还是 MySQL,插件都会保存注册货币和限购标记数据,并在玩家重新进入服务器时加载。限购刷新时间支持秒级配置;服务器检查存在时间跳过时,会根据时间戳补偿刷新点。

相关依赖

插件清单中声明的可选对接插件包括:

  • PlaceholderAPI
  • Vault
  • NeigeItems
  • SX-Item
  • MythicMobs
  • LyMySQLCore
  • SX-Attribute

不同货币类型和物品格式需要对应插件正常运行。未安装对应插件时,相关货币、变量或物品无法正常处理。