常见问题
LyShopReload 是什么?
LyShopReload 是一个基于 GUI 的 Minecraft 商店插件。管理员可以通过 YAML 文件创建多个商店,为商品设置展示条件、购买条件、购买货币、折扣、限购、开放时间、连续购买次数以及购买后执行的指令。
插件支持本地 YAML 玩家数据,也支持 MySQL 存储玩家的个人标记、全服标记和自定义货币数据。
打不开商店怎么办?
按以下顺序检查:
确认商店文件位于
shop目录,并且文件内容可以正常解析。确认商店配置中的
id与打开指令完全一致。确认商店的
permission未限制当前玩家,或玩家拥有对应权限。确认使用的是正确的打开指令:
text/lshop open <商店id>如果是管理员代替玩家打开,确认执行者为服务器管理员,并使用:
text/lshop open <商店id> <玩家>
商店 id 用于指令和数据存储。商店正式开放后不要修改 id,否则可能导致原有数据无法对应。
为什么提示商店不存在?
通常是商店 id 不一致导致的。
例如配置为:
yaml
id: '示例'则打开时必须使用:
text
/lshop open 示例文件名、商店名称和商店 id 不是同一个字段,指令使用的是 id。
为什么玩家看不到某个商品?
检查商品的 show-condition。
商品只有在所有展示条件都满足时才会显示。插件支持权限条件、无权限条件和 PlaceholderAPI 条件:
yaml
show-condition:
- 'permission:{lshop.show.1}'
- 'nopermission:{lshop.show.2}'
- 'papi:{%player_level% >= 0}'如果条件中使用了 PlaceholderAPI 变量,必须安装并正常启用 PlaceholderAPI,且对应变量能够返回有效内容。
为什么商品显示了但无法购买?
购买时会同时检查多个条件,任意一项不满足都可能导致购买失败。重点检查:
buy-condition是否满足。buy-currency中的货币或物品数量是否足够。server-limit-tag或player-limit-tag是否达到上限。can-be-purchased-time-start是否已经到达。can-be-purchased-time-end是否已经超过。every-day-open-time当前是否处于开放时间内。force-need-slot是否要求背包存在空位。- 商品展示条件是否仍然满足。
购买条件格式为:
yaml
buy-condition:
- '&7需要: 等级大于3级才可购买<->papi:{%player_level% > 3}<->&c购买失败! 你需要等级大于3级才可购买!'
- '&7需要拥有权限<->permission:{lshop.buy}<->&c你没有购买权限!'<-> 前为界面显示内容,中间为检测条件,最后为购买失败时显示的内容。
为什么购买条件中的 PlaceholderAPI 表达式不生效?
确认以下内容:
- 已安装 PlaceholderAPI。
- 使用的变量能够被 PlaceholderAPI 正常解析。
- 条件格式以
papi:{开始,并以}结束。 - 表达式中的比较符号和数值格式正确。
插件会先解析 PlaceholderAPI 变量,再判断数值、字符串或布尔条件。支持 >, <, >=, <=, ==, !=,也支持使用 && 和 || 组合条件。
为什么商品价格显示不正确?
检查 buy-currency 的格式以及 config.yml 中对应的 lore-replace 配置。
常见货币格式包括:
yaml
buy-currency:
- 'vault:1'
- 'point:1'
- 'id:1:0:1'
- 'jb:5'
- 'cx:变量id:数量'其中:
vault使用 Vault 经济余额。point使用点券数据。id使用物品数字 ID 和子 ID。jb等注册货币使用register-currency中的货币 ID。cx使用外部变量货币,并且需要在lore-replace中配置对应显示文本。
自定义货币 ID 不能使用 vault、point 或 item,否则会产生冲突。
如果购买数量使用了计算表达式,表达式需要放在尖括号内,例如:
yaml
buy-currency:
- 'point:<1+(%player_level%*5)>'自定义货币变量为什么返回 0?
确认货币已经在 config.yml 的 register-currency 中注册,并且货币 ID 拼写完全一致。
自定义货币变量格式为:
text
%lshop_currency-货币id%例如配置了:
yaml
register-currency:
jb:
display: '&7需要: &b只因币x{need} / 你有{have}'
max: 10000对应变量为:
text
%lshop_currency-jb%同时确认玩家数据已经成功加载。如果使用 MySQL,必须先安装 LyMySQLCore,并确认数据库连接成功;数据库未连接时,相关玩家数据功能不会正常生效。
购买货币支持哪些类型?
项目中可以确认的购买货币类型如下:
| 类型 | 格式 | 说明 |
|---|---|---|
| Vault | vault:数量 | 检查 Vault 经济余额 |
| 点券 | point:数量 | 检查点券数量 |
| 物品 ID | id:物品ID:子ID:数量 | 检查背包及已接入仓库中的物品 |
| 物品名称 | item:名称:数量 | 按物品名称匹配 |
| 物品名称与 Lore | item:名称:Lore:数量 | 同时匹配名称和 Lore |
| 注册货币 | 货币ID:数量 | 使用 register-currency 注册的货币 |
cx 变量 | cx:变量ID:数量 | 使用外部数字变量 |
物品名称和 Lore 支持 contain@ 关键词匹配以及 equals@ 完全匹配。未指定前缀时,按完全匹配处理。
为什么扣除不到仓库里的物品?
名称和 Lore 匹配类物品会检查背包,并根据已启用的插件接入对应仓库。数字 ID 物品也会检查背包及已接入的仓库。
同时确认:
- 物品名称、Lore 的颜色代码和文本完全匹配。
contain@与equals@的使用方式正确。- 物品没有命中
prohibited-as-lore-for-materials中的禁止关键词。
prohibited-as-lore-for-materials 只影响背包内物品的材料统计,不适用于战利品仓库。
为什么购买后没有给予物品?
检查商品的 give-item 和 amount:
give-item为空或删除时,购买不会给予物品。amount控制展示物品和给予物品的数量,未配置时默认为1。- 自定义物品格式为
物品插件#物品ID。
项目中确认支持的自定义物品来源包括 MythicMobs、NeigeItems、SX-Item、Zaphkiel 和 SX-Attribute。对应插件未安装、物品 ID 不存在或物品读取失败时,控制台会输出错误信息。
为什么购买后指令没有执行?
检查商品的 buy-command,并确认指令前缀正确:
yaml
buy-command:
- '[console]spawn %player_name%'
- '[op]spawn %player_name%'
- '[player]spawn %player_name%'支持的执行者类型为:
| 前缀 | 执行者 |
|---|---|
[console] | 控制台 |
[op] | 临时以管理员身份执行的玩家 |
[player] | 玩家自身 |
如果需要在购买一次或连续购买后额外执行指令,可以配置 continuous-buy-command。其中 {count} 会替换为本次连续购买成功的次数。
为什么购买后指令被重复处理?
config.yml 中的 comman-event 默认关闭,用于避免插件执行购买后指令时再次触发命令监听器。
只有在确实需要额外触发 PlayerCommandPreprocessEvent 或 ServerCommandEvent 相关处理时,才将其设置为 true。启用后可能导致其他监听器重复处理同一条指令。
连续购买如何判断次数?
商品可以分别设置以下三种连续购买上限:
| 配置项 | 触发方式 |
|---|---|
right-click-max-buy-count | 普通右键 |
shift-left-click-max-buy-count | Shift 左键 |
shift-right-click-max-buy-count | Shift 右键 |
如果商品没有单独配置,对应值使用 config.yml 中的默认值:
yaml
default-right-buy-count: 1
default-shift-left-buy-count: 1
default-shift-right-buy-count: 1连续购买会在货币不足、购买条件不满足、达到限购或其他购买条件失败时停止。
为什么点击商品没有反应?
检查以下配置和状态:
- 商品所在槽位是否正确。
- 商品是否满足
show-condition。 - 是否仍处于点击冷却时间内。
- 商品是否已经达到购买上限。
- 当前是否处于商品开放时间。
点击冷却由 click-cooldown 控制,单位为毫秒:
yaml
click-cooldown: 200全服限购次数不准怎么办?
全服限购标记不建议同时在多个服务器开放同一个限购商店。
每个服务器的缓存不同,多个服务器同时购买或保存数据时,标记数量可能出现不一致。项目配置已经明确要求:带有全服限购标签的商店只在一个服务器开放。
另外,使用全服限购标记前必须先在 server-tag 中注册,并在重载后再正式使用:
yaml
server-tag:
全服每周限购标记1:
display: '&e全服每周购买上限: {now}/{max}'
refresh:
- '1#0:0:0'商品中再通过 server-limit-tag 引用:
yaml
server-limit-tag:
全服每周限购标记1: 1个人限购标记没有刷新怎么办?
确认以下内容:
- 标记已经写入
player-tag。 - 商品中的
player-limit-tag使用了相同的标记 ID。 refresh的星期和时间格式正确。- 修改后已经执行重载。
示例:
yaml
player-tag:
个人每周限购标记1:
display: '&e个人每周购买上限: {now}/{max}'
refresh:
- '1#0:0:0'yaml
player-limit-tag:
个人每周限购标记1: 1刷新时间格式为 星期几#时:分:秒。例如 3#12:30:05 表示星期三 12:30:05 刷新。如果需要每天刷新,需要为一周的七天分别配置刷新时间。将 refresh 设置为空列表时,不配置自动刷新时间。
如何手动调整限购次数?
管理员可以使用以下指令操作限购标记:
| 指令 | 作用 |
|---|---|
/lshop limit clear <玩家> | 将该玩家所有带刷新时间的个人标记设置为 0 |
/lshop limit set <玩家> <标记ID> <次数> | 设置个人标记的已购买次数 |
/lshop limit give <玩家> <标记ID> <次数> | 增加个人标记的已购买次数 |
/lshop limit take <玩家> <标记ID> <次数> | 扣除个人标记的已购买次数 |
将玩家参数写为 $ 时,set、give 和 take 会操作全服标记:
text
/lshop limit set $ <标记ID> <次数>
/lshop limit give $ <标记ID> <次数>
/lshop limit take $ <标记ID> <次数>标记设置为 0 时,相当于刷新该标记。指令中的次数表示已经购买的数量。
为什么开放时间判断不正确?
商品支持三类时间限制:
| 配置项 | 作用 | 格式 |
|---|---|---|
can-be-purchased-time-start | 到达指定时间后开放购买 | 年-月-日-时-分-秒 |
can-be-purchased-time-end | 到达指定时间后结束购买 | 年-月-日-时-分-秒 |
every-day-open-time | 每天固定时段开放购买 | HH:mm-HH:mm |
全局时间显示格式由 time-format 控制:
yaml
time-format: 'yyyy年MM月dd日 HH:mm:ss'删除对应商品时间配置即可取消该项限制。
修改 mysql.enable 后为什么没有变化?
mysql.enable 只在插件初始化时决定使用哪种存储方式。修改后必须重启服务器,不能只依赖运行中的重载。
启用 MySQL 时,必须同时满足以下条件:
- 已安装 LyMySQLCore。
- LyMySQLCore 已成功连接数据库。
mysql下的数据库名、用户名、密码、端口和 IP 配置正确。
只有 LyMySQLCore 已安装且数据库连接成功后,MySQL 相关的数据加载、保存和限购功能才会生效。数据库尚未初始化完成时,玩家登录可能会被阻止。
MySQL 连接失败怎么办?
检查 config.yml 中的连接配置:
yaml
mysql:
enable: true
databasename: mc2
username: mc2
password: mc1234
port: 3306
ip: 127.0.0.1然后确认:
- LyMySQLCore 已安装并正常启用。
- 数据库服务正在运行。
- 数据库地址和端口可以从服务器连接。
- 数据库名称、用户名和密码正确。
- 修改后已重启服务器。
插件连接成功后会初始化玩家标记、全服标记和货币数据所需的数据表。
为什么重载后配置没有生效?
确认修改的是实际加载的配置文件,并检查 YAML 缩进和键名。
以下修改通常需要特别注意:
- 新增
server-tag或player-tag后,需要重载插件。 - 修改
shop文件后,需要重载插件才能重新读取商店。 - 修改
mysql.enable后必须重启服务器。 - 示例商店文件中的部分内容会在重载时重新生成或覆盖,不应把该文件作为长期自定义配置保存。
管理员可以使用:
text
/lshop reload重载指令要求执行者为管理员。
如何关闭当前商店界面?
玩家可以执行:
text
/lshop close该指令会关闭当前打开的 GUI。
如何打开调试模式?
管理员可以执行:
text
/lshop debug调试模式开启后,相关调试数据会输出到控制台。也可以在配置中设置默认状态:
yaml
debug: false为什么控制台没有显示货币变动提示?
检查 hide-currency-message:
yaml
hide-currency-message: false设置为 true 时,会隐藏控制台显示的货币获取消息。
如果是管理员通过货币指令修改数据,还需要确认 hide-command-tips 的配置。该选项用于隐藏货币操作指令的提示信息。
为什么自定义货币有上限?
register-currency 中的 max 用于设置注册货币的上限:
yaml
register-currency:
jb:
max: 10000货币达到上限后,继续增加不会超过该值。请确认货币 ID 与配置中的注册项一致。
如何手动调整玩家自定义货币?
管理员可以使用以下指令:
| 指令 | 作用 |
|---|---|
/lshop give <玩家> <货币ID> <数量> | 增加货币 |
/lshop take <玩家> <货币ID> <数量> | 扣除货币 |
/lshop set <玩家> <货币ID> <数量> | 设置货币数量 |
数量支持 min-max 范围格式,也支持包含 PlaceholderAPI 变量的计算表达式。
使用 {online} 作为玩家参数时,会对当前在线玩家执行操作:
text
/lshop give {online} <货币ID> <数量>为什么管理员指令提示玩家不在线?
涉及玩家数据、限购或货币的指令会通过在线玩家对象操作。确认目标玩家当前在线,并检查玩家名称是否拼写正确。
buy、give、take、set 和限购相关操作都要求目标玩家能够被服务器识别。部分指令支持使用 {online} 批量操作在线玩家。
为什么重载后玩家数据丢失?
不要在服务器运行期间直接删除或覆盖玩家数据文件,也不要在多个操作同时进行时强制终止服务器。
本地 YAML 存储会在玩家加入、退出和被踢出时加载或保存数据,并支持安全写入、备份文件和损坏恢复。使用 MySQL 时则由数据库保存玩家数据。
如果切换了存储方式,必须先确认原存储中的数据已经备份,再重启服务器完成切换。
商店商品的点击位置为什么不正确?
slot 从 0 开始计算:
- 第一行:
0-8 - 第二行:
9-17 - 第三行:
18-26 - 第四行:
27-35 - 第五行:
36-44 - 第六行:
45-53
商品的 slot 必须位于商店 size 对应的范围内。商店行数支持 1-12,超过 6 行时会突破 Minecraft 原版界面限制,使用时需要自行确认服务端兼容性。
为什么 force-need-slot 开启后无法购买?
当商品配置如下时:
yaml
force-need-slot: true玩家背包必须至少有一个空位才能购买。即使商品本身可以堆叠,只要没有空位,购买也可能被阻止。
哪些插件属于可选依赖?
plugin.yml 中声明的软依赖包括:
- PlaceholderAPI
- Vault
- NeigeItems
- SX-Item
- MythicMobs
- LyMySQLCore
- SX-Attribute
实际使用对应功能时,仍需安装并正确配置相关插件。尤其是 MySQL 存储,必须安装 LyMySQLCore 并成功连接数据库后才会生效。