Skip to content

常见问题

LyShopReload 是什么?

LyShopReload 是一个基于 GUI 的 Minecraft 商店插件。管理员可以通过 YAML 文件创建多个商店,为商品设置展示条件、购买条件、购买货币、折扣、限购、开放时间、连续购买次数以及购买后执行的指令。

插件支持本地 YAML 玩家数据,也支持 MySQL 存储玩家的个人标记、全服标记和自定义货币数据。

打不开商店怎么办?

按以下顺序检查:

  1. 确认商店文件位于 shop 目录,并且文件内容可以正常解析。

  2. 确认商店配置中的 id 与打开指令完全一致。

  3. 确认商店的 permission 未限制当前玩家,或玩家拥有对应权限。

  4. 确认使用的是正确的打开指令:

    text
    /lshop open <商店id>
  5. 如果是管理员代替玩家打开,确认执行者为服务器管理员,并使用:

    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-tagplayer-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 不能使用 vaultpointitem,否则会产生冲突。

如果购买数量使用了计算表达式,表达式需要放在尖括号内,例如:

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

自定义货币变量为什么返回 0?

确认货币已经在 config.ymlregister-currency 中注册,并且货币 ID 拼写完全一致。

自定义货币变量格式为:

text
%lshop_currency-货币id%

例如配置了:

yaml
register-currency:
  jb:
    display: '&7需要: &b只因币x{need} / 你有{have}'
    max: 10000

对应变量为:

text
%lshop_currency-jb%

同时确认玩家数据已经成功加载。如果使用 MySQL,必须先安装 LyMySQLCore,并确认数据库连接成功;数据库未连接时,相关玩家数据功能不会正常生效。

购买货币支持哪些类型?

项目中可以确认的购买货币类型如下:

类型格式说明
Vaultvault:数量检查 Vault 经济余额
点券point:数量检查点券数量
物品 IDid:物品ID:子ID:数量检查背包及已接入仓库中的物品
物品名称item:名称:数量按物品名称匹配
物品名称与 Loreitem:名称: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-itemamount

  • give-item 为空或删除时,购买不会给予物品。
  • amount 控制展示物品和给予物品的数量,未配置时默认为 1
  • 自定义物品格式为 物品插件#物品ID

项目中确认支持的自定义物品来源包括 MythicMobsNeigeItemsSX-ItemZaphkielSX-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 默认关闭,用于避免插件执行购买后指令时再次触发命令监听器。

只有在确实需要额外触发 PlayerCommandPreprocessEventServerCommandEvent 相关处理时,才将其设置为 true。启用后可能导致其他监听器重复处理同一条指令。

连续购买如何判断次数?

商品可以分别设置以下三种连续购买上限:

配置项触发方式
right-click-max-buy-count普通右键
shift-left-click-max-buy-countShift 左键
shift-right-click-max-buy-countShift 右键

如果商品没有单独配置,对应值使用 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

个人限购标记没有刷新怎么办?

确认以下内容:

  1. 标记已经写入 player-tag
  2. 商品中的 player-limit-tag 使用了相同的标记 ID。
  3. refresh 的星期和时间格式正确。
  4. 修改后已经执行重载。

示例:

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> <次数>扣除个人标记的已购买次数

将玩家参数写为 $ 时,setgivetake 会操作全服标记:

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-tagplayer-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> <数量>

为什么管理员指令提示玩家不在线?

涉及玩家数据、限购或货币的指令会通过在线玩家对象操作。确认目标玩家当前在线,并检查玩家名称是否拼写正确。

buygivetakeset 和限购相关操作都要求目标玩家能够被服务器识别。部分指令支持使用 {online} 批量操作在线玩家。

为什么重载后玩家数据丢失?

不要在服务器运行期间直接删除或覆盖玩家数据文件,也不要在多个操作同时进行时强制终止服务器。

本地 YAML 存储会在玩家加入、退出和被踢出时加载或保存数据,并支持安全写入、备份文件和损坏恢复。使用 MySQL 时则由数据库保存玩家数据。

如果切换了存储方式,必须先确认原存储中的数据已经备份,再重启服务器完成切换。

商店商品的点击位置为什么不正确?

slot0 开始计算:

  • 第一行: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 并成功连接数据库后才会生效。