Skip to content

常见问题

数据库连接失败,插件功能为什么不正常?

LySkillView 使用 MySQL 保存玩家技能数据和当前蓝量。

必须安装 LyMySQLCore,并确保 LyMySQLCore 已成功连接数据库。只有数据库连接成功、数据表初始化完成,并且 LyMySQLCore 正常触发玩家数据加载与保存事件后,玩家技能数据、绑定状态、冷却时间和蓝量相关功能才会正常生效。

检查以下内容:

  1. 服务端是否已安装并加载 LyMySQLCore
  2. config.yml 中的 mysql.ipmysql.portmysql.databasenamemysql.usernamemysql.password 是否正确。
  3. MySQL 是否允许服务器所在主机连接。
  4. 控制台是否出现数据库连接成功和数据库初始化成功提示。
  5. 数据库中是否存在 lyskillview_newsave 表。
  6. LyMySQLCore 是否已经成功加载玩家数据事件,而不是只完成数据库连接。

默认配置示例:

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

插件使用 UTF-8 数据库连接。数据库连接失败时,玩家数据无法正常读取和保存,依赖玩家数据的技能释放、技能升级、技能绑定和蓝量功能也可能无法生效。

玩家数据保存了哪些内容?

LySkillView 会在 lyskillview_newsave 表中为玩家保存一条记录,数据内容以 YAML 文本保存。

已确认保存的内容包括:

数据保存内容
技能等级每个技能当前等级
技能冷却技能冷却结束时间
技能绑定技能绑定的快捷键;未绑定时保存为 null
当前蓝量玩家当前蓝量

自动释放状态保存在运行时缓存中,当前保存代码没有将其写入数据库,因此不能视为重启后自动恢复的数据。

为什么技能菜单打不开?

打开菜单时使用的菜单 ID 必须存在于 config.ymlskill-menu 下。

例如:

text
/lsv open 战士技能

对应配置:

yaml
skill-menu:
  战士技能:
    - '战士技能1'
    - '战士技能2'
    - '战士技能3'

还需要检查:

  1. 玩家数据是否已经加载完成。
  2. 技能界面.yml 是否能够被 GermPlugin 正常读取。
  3. 菜单 ID 是否完全一致,包括中文和大小写。
  4. 菜单中的技能 ID 是否与 skills 目录中 YAML 文件的顶层节点一致。
  5. 技能界面.yml 中是否存在必要的界面组件。

不存在的菜单 ID 会被直接忽略,不会打开界面。

为什么技能菜单打开后是空的?

菜单中的技能必须同时满足以下条件:

  • 技能 ID 已加入当前 skill-menu.<菜单ID> 列表。
  • 技能文件位于插件目录的 skills 目录或其子目录中。
  • 文件扩展名为 .yml
  • 技能 YAML 存在有效的顶层技能节点。
  • 技能配置包含 skill-level 节点。
  • 玩家满足全部 display-condition

菜单打开时,插件会为配置中存在但玩家数据中没有的技能创建初始数据,初始等级为 0、冷却时间为 0、没有绑定键位。

如果菜单仍然没有技能,检查控制台中的技能加载日志,以及以下配置是否一致:

yaml
skill-menu:
  战士技能:
    - '测试主动技能'
yaml
测试主动技能:
  skill-level:
    0:
      lore: []

为什么技能没有按照预期顺序显示?

技能按照 index 从小到大排序,数字越小越靠前。

yaml
测试主动技能:
  index: 100000

如果 index 小于 0 或未配置,插件会根据技能加载过程分配临时顺序。插件会递归读取 skills 目录下的 .yml 文件,因此不能依赖文件系统读取顺序。需要稳定排序时,应为每个技能配置明确的 index

为什么技能不显示?

技能显示条件配置在技能顶层的 display-condition 中。所有条件都会检查,任意一项不满足,技能就不会显示。

支持的条件格式:

格式检查内容
papi:{表达式}解析 PlaceholderAPI 变量并计算表达式
permission:{权限节点}检查玩家权限
name:{槽位<->文本}检查指定槽位物品显示名称是否包含文本
lore:{槽位<->文本}检查指定槽位物品 Lore 是否包含文本

示例:

yaml
display-condition:
  - 'papi:{%player_level% > 0}'
  - 'permission:{skill.测试技能}'
  - 'name:{GermPlugin#宠物槽位<->&6天火神龙}'
  - 'lore:{GermPlugin#宠物槽位<->&6天火神龙}'

papi 表达式支持:

  • 比较运算:><>=<===!=
  • 逻辑运算:&&||
  • 数值运算:+-*/
  • 括号:()
  • 字符串相等比较:单引号或双引号

物品名称或 Lore 条件支持哪些槽位?

项目代码确认支持以下槽位来源:

槽位格式说明
DragonCore#槽位名读取龙核缓存槽位
GermPlugin#槽位名读取萌芽槽位
Minecraft#数字槽位读取玩家原版背包数字槽位
LyInventory#文件名#槽位名读取 LyInventory 指定文件中的槽位
Origin#Mainhand读取玩家主手
Origin#Offhand读取玩家副手

名称条件检查物品显示名称是否包含指定文本,Lore 条件检查任意一行 Lore 是否包含指定文本。配置中的 & 会转换为 Minecraft 颜色符号后再比较。

使用外部插件槽位前,必须确保对应插件已加载,否则相关条件无法正常检查。

为什么快捷键注册失败?

register-skill-slot 的左侧必须是有效的萌芽按键枚举名称,例如默认配置中的 KEY_ZKEY_XKEY_CKEY_VKEY_B

右侧必须填写 技能界面.yml 中真实存在的组件名:

yaml
register-skill-slot:
  'KEY_Z': '技能槽位1'
  'KEY_X': '技能槽位2'

对应界面组件:

yaml
技能界面:
  技能槽位1:
    type: button

按键名称无效时,控制台会提示快捷键注册失败。组件不存在时,控制台会提示检查技能界面中的对应组件名。

修改 register-skill-slot 后,需要重新加载插件,使快捷键、技能、界面和 HUD 重新注册。

为什么按下快捷键没有释放技能?

按键事件由 GermPlugin 发送。请依次检查:

检查项要求
按键注册按键已配置在 register-skill-slot
按键事件GermPlugin 能够正常发送客户端按键事件
技能类型技能的 trigger-mode 必须为 主动
技能等级当前技能等级必须大于 0
技能绑定玩家已将技能绑定到对应槽位
显示条件技能仍满足 display-condition
释放条件当前满足该等级的 cast-condition
冷却状态技能不处于自身冷却或公共冷却中
蓝量当前蓝量不少于缩减后的实际蓝耗
对接技能mythicmobs-skill 指向的技能真实存在
玩家数据玩家数据已经完成加载

按键配置和 PlaceholderAPI 变量使用的名称不同。配置中使用完整按键名,例如 KEY_Z;变量和自动释放权限省略 KEY_,例如 %lsv_Z:skill%lsv.autocast.Z

为什么技能无法绑定到快捷键?

只有主动技能可以绑定快捷键:

  • trigger-mode 必须严格配置为 主动
  • 技能等级必须大于 0
  • 玩家数据中必须存在该技能。
  • register-skill-slot 指向的界面组件必须存在。

被动技能绑定时,会发送 message.passive-skill-cannot-bind-to-key 配置的提示。

同一个按键只能绑定一个技能。绑定新技能时,原本绑定到该按键的技能会被解除绑定。

为什么已经绑定的技能被自动解绑?

打开技能菜单时,插件会重新检查当前菜单中可以显示的技能。如果已绑定技能不在当前可显示技能列表中,其绑定会被清除。

常见原因包括:

  • 技能未加入当前 skill-menu.<菜单ID> 列表。
  • 玩家不再满足 display-condition
  • 玩家权限被移除。
  • PlaceholderAPI 条件结果发生变化。
  • 槽位物品名称或 Lore 不再满足条件。
  • 技能 ID 被修改或对应 YAML 文件被移除。

为什么技能名称中的等级没有替换?

技能菜单会处理 skill-name 中的以下内容:

内容含义
{level}玩家当前技能等级
{max}技能最大等级
PlaceholderAPI 变量按玩家上下文解析

示例:

yaml
skill-name:
  - '&6天火暴动 &7({level}/{max})'
  - '&b主动技能'

等级详情应写入对应等级的 lore。等级替换只针对技能名称文本。

为什么技能无法升级?

升级目标是当前等级的下一级。以下情况会导致升级失败:

  • 不存在当前等级的下一级节点。
  • 下一级的 condition 未全部满足。
  • 背包中缺少 need-item 要求的物品。
  • 玩家数据尚未加载。
  • 技能 ID 不存在或技能配置加载失败。

升级条件支持与 display-conditioncast-condition 相同的 papipermissionnamelore 格式。

need-item 的格式为 物品显示名称#数量

yaml
need-item:
  - '&6测试技能书#3'

升级时只检查玩家原版背包的前 36 个槽位,并按物品显示名称匹配。满足条件后,插件会扣除物品、提升技能等级、执行 run-command,刷新可用技能缓存,并发送升级成功消息。

为什么满级后仍然无法继续升级?

技能最大等级根据 skill-level 中从 0 开始连续存在的等级节点计算。

yaml
skill-level:
  0:
    lore: []
  1:
    lore: []
  2:
    lore: []

此时最大等级为 2。当前等级不存在下一级节点时,插件会发送 message.skill-level-is-max 配置的提示。

等级编号应从 0 开始连续配置,不要跳过中间等级。

为什么升级条件满足了,物品仍然不够?

need-item 只检查玩家原版背包的 035 号槽位,并按物品显示名称进行不区分大小写的精确匹配。

检查以下内容:

  • 物品必须有自定义显示名称。
  • 配置名称与物品实际显示名称必须一致。
  • 颜色代码必须一致。
  • 数量必须写成 名称#数量
  • 多个同名物品可以累计数量。
  • 末影箱、装备栏和外部插件槽位不会被统计。

condition 中的 namelore 槽位条件与 need-item 是两套不同机制:前者只检查条件,后者会在升级成功时扣除原版背包中的物品。

为什么升级后的命令没有执行?

只有升级成功后,当前等级的 run-command 才会执行。命令由控制台执行,并先解析玩家的 PlaceholderAPI 变量。

yaml
run-command:
  - 'tell %player_name% 技能升级完成'

命令内容不需要添加 /。升级条件或物品条件未满足时,命令不会执行。

为什么技能释放失败?

常见原因如下:

原因处理方式
技能冷却中等待技能冷却结束
公共冷却中等待同组技能的公共冷却结束
蓝量不足提高当前蓝量或检查耗蓝缩减配置
cast-condition 不满足检查权限、变量和物品条件
技能未激活确认技能等级大于 0 且满足显示条件
技能未绑定在技能界面中重新绑定主动技能
对接技能不存在检查 MythicMobs、SkillAPI 或 Planners 中的技能 ID
玩家数据未加载先确认 LyMySQLCore 已完成玩家数据加载

当前等级应至少包含有效的 mythicmobs-skillcooldownmana 和相关条件列表。

为什么释放条件失败后蓝量发生了变化?

主动快捷键和被动事件的检查顺序不同。

主动快捷键会先检查冷却和 cast-condition,再检查并扣除蓝量。攻击、受击、左右键等被动事件会在蓝量检查后扣除蓝量,再检查 cast-condition

因此,被动技能的 cast-condition 应尽量与 display-condition 保持一致,避免技能已经进入可触发列表,但在释放阶段又因条件失败。

为什么技能冷却时间与配置值不同?

cooldown 的单位是毫秒,读取时会先解析 PlaceholderAPI 变量,再计算表达式。

实际冷却会应用 cooling-reduction-placeholder 返回的百分比,并受 cooling-reduction-max 限制:

text
实际冷却 = 配置冷却 × (1 - 冷却缩减百分比)

主动快捷键技能还会受到当前等级 gcd 的影响。如果技能自身冷却短于本次公共冷却,技能冷却结束时间会延长到公共冷却结束时间。

为什么冷却缩减或耗蓝缩减不生效?

检查以下配置:

yaml
mana-reduction-placeholder: ''
mana-reduction-max: 75
cooling-reduction-placeholder: ''
cooling-reduction-max: 75

对应变量留空时,缩减功能不生效。填写后,PlaceholderAPI 必须返回可解析的数字,例如 20 表示缩减 20%

返回值超过上限时,会按配置上限计算。返回空文本、非数字或无法解析时,插件会在控制台提示属性变量异常,并按 0 处理。

代码只限制缩减值的最大上限,不会自动将负数修正为 0。应确保变量返回 0 到对应上限之间的数字。

为什么 cooldown 表达式没有生效?

cooldown 支持 PlaceholderAPI 变量和以下运算:

  • 加法 +
  • 减法 -
  • 乘法 *
  • 除法 /
  • 括号 ()

示例:

yaml
cooldown: '%player_level% * 100 + 500'

表达式最终必须得到数字。解析失败时,技能读取会使用默认冷却 1000 毫秒。

为什么公共冷却没有生效?

公共冷却需要同时配置技能等级中的 gcdconfig.yml 中的 gcd-group

yaml
gcd-group:
  战士技能:
    - '战士技能1'
    - '战士技能2'
yaml
战士技能1:
  skill-level:
    1:
      gcd: 1500

检查以下事项:

  • gcd 单位是毫秒。
  • 触发技能的技能 ID 位于至少一个分组中。
  • 分组内技能 ID 与技能 YAML 顶层节点一致。
  • 同一个技能可以出现在多个分组中。
  • 未配置 gcd 时默认为 0
  • 被动技能事件触发不会处理 gcd-group

为什么设置了 GCD 后技能自身冷却也变长了?

主动快捷键释放时,插件会比较技能自身冷却结束时间和本次 GCD 结束时间。如果自身冷却更短,会将该技能冷却结束时间提升到 GCD 结束时间。

因此,主动技能的最终剩余冷却至少可能等于本次 gcd

为什么主动技能插件对接失败?

mythicmobs-skill 会根据前缀选择释放方式:

配置格式对接目标
技能 IDMythicMobs
SkillAPI#技能 IDSkillAPI
Planners#技能 IDPlanners

示例:

yaml
mythicmobs-skill: 'SkillAPI#火球术'

检查目标插件是否已经加载,以及技能 ID 是否存在。

  • MythicMobs 技能不存在时,会提示 MythicMobs技能[技能ID]不存在
  • SkillAPI 要求玩家数据中已经拥有指定技能。
  • Planners 要求其 API 能够查找到指定技能。

plugin.yml 将 MythicMobs、SkillAPI 和 Planners 声明为软依赖,不代表这些插件会自动安装。

为什么被动技能没有触发?

被动技能只遍历玩家当前已激活的技能,并要求技能等级大于 0、满足 display-condition、不在冷却中、蓝量足够且满足 cast-condition

项目代码确认的事件触发格式如下:

格式触发时机
ATTACK#几率玩家造成伤害时尝试触发
DAMAGED#几率玩家受到伤害时尝试触发
LEFT#几率玩家左键空气或方块时尝试触发
RIGHT#几率玩家右键空气或方块时尝试触发

几率按 0100 使用。例如:

yaml
trigger-mode: 'ATTACK#25'

表示玩家造成伤害时,以约 25% 的概率尝试触发技能。

当前监听代码读取 # 后的几率,因此不要只填写 LEFTRIGHT,应使用完整的 LEFT#几率RIGHT#几率 格式。

为什么 TIME#几率 被动技能没有触发?

示例技能配置注释列出了 TIME#几率 格式,项目中也存在被动技能定时任务。但当前项目证据没有包含该定时任务的完整触发实现,因此无法确认其扫描间隔和附加限制。

可以先检查:

  • trigger-mode 是否严格写为 TIME#数字
  • 技能等级是否大于 0
  • 技能是否满足 display-condition
  • 当前蓝量是否足够。
  • 技能是否处于冷却中。
  • cast-condition 是否满足。
  • 插件重载后被动技能任务是否正常启动。

为什么被动技能频繁提示蓝量不足?

攻击、受击、左右键被动触发会先按配置几率尝试触发,再检查蓝量。蓝量不足时会发送 message.skill-cast-fail-from-mana 配置的提示。

如果玩家同时拥有多个高频被动技能,同一次操作可能遍历多个技能。可以通过降低触发几率、增加冷却、减少蓝耗或收紧显示条件控制触发频率。

为什么蓝量一直是 0

检查以下配置和状态:

  1. 玩家数据是否已经通过 LyMySQLCore 加载。
  2. player-mana-recovery-interval 是否为有效的正整数秒数。
  3. player-mana-recovery-value 是否大于 0
  4. player-mana-recovery-placeholder 是否返回有效数字。
  5. %lsv_mana% 是否在玩家上下文中解析。

玩家首次创建蓝量数据时,当前蓝量从 0 开始,之后由回蓝任务恢复,并在保存时写入数据库。

为什么最大蓝量或回蓝量与预期不同?

相关配置:

yaml
player-max-mana-default: 100
player-max-mana-placeholder: ''
player-mana-recovery-interval: 1
player-mana-recovery-value: 1
player-mana-recovery-placeholder: ''

玩家数据首次加载时,player-max-mana-placeholderplayer-mana-recovery-placeholder 按百分比参与计算。玩家关闭 Inventory 界面或触发主副手交换时,插件重新读取两个变量,并将结果作为固定值直接加到基础值上。

因此,同一个变量在首次加载和后续刷新时的计算方式不同。配置时应注意这一行为。变量留空时,只使用默认最大蓝量和基础回蓝值。

为什么修改属性装备后最大蓝量没有立即刷新?

代码会在以下事件中重新计算最大蓝量和每次回蓝量:

  • 玩家关闭原版物品栏或其他 Inventory 界面。
  • 玩家触发主副手交换事件。

只移动物品但没有触发这些事件时,不一定会立即刷新。完成装备变更后,可以关闭背包触发重新计算。

为什么当前蓝量超过最大值后被减少?

PlayerManaData 会将当前蓝量限制在 0 到最大蓝量之间。

当最大蓝量降低时,如果当前蓝量超过新的最大值,当前蓝量会自动降到新的最大值。数据库加载蓝量时也会执行相同限制。

自动释放为什么打不开?

玩家需要拥有对应键位的权限:

text
lsv.autocast.键位

例如 Z 键:

text
lsv.autocast.Z

自动释放变量为:

text
%lsv_Z:autocast%

开启时返回 enable,关闭时返回 disable

还需要确认:

  • 键位已经配置在 register-skill-slot 中。
  • 玩家已经将有效的主动技能绑定到该键位。
  • 权限中的键位使用省略 KEY_ 后的名称。

为什么自动释放变量始终返回 disable

自动释放变量检查的是运行时缓存中的短键位名,例如 Z,不是 KEY_Z

检查以下内容:

  • 使用 %lsv_Z:autocast%,不要写成 %lsv_KEY_Z:autocast%
  • 玩家拥有 lsv.autocast.Z 权限。
  • 自动释放功能已经成功切换为开启状态。
  • PlaceholderAPI 已加载并成功注册 LySkillView 扩展。

为什么 PlaceholderAPI 变量没有解析?

PlaceholderAPI 是软依赖。只有服务端启用了 PlaceholderAPI,LySkillView 才会注册标识符为 lsv 的变量扩展。

检查以下内容:

  1. PlaceholderAPI 是否已经加载。
  2. LySkillView 是否正常启用。
  3. 变量是否带有完整的 %
  4. 技能 ID 和键位名称是否正确。
  5. 变量是否在玩家上下文中解析。

没有玩家上下文时,扩展会返回空文本。

LySkillView 支持哪些 PlaceholderAPI 变量?

玩家蓝量变量

变量说明
%lsv_mana%当前蓝量
%lsv_maxmana%最大蓝量

技能变量

变量说明
%lsv_level:技能ID%玩家技能等级
%lsv_mana:技能ID%当前等级实际蓝耗,已应用耗蓝缩减
%lsv_cooldown:技能ID%当前等级实际冷却,已应用冷却缩减,单位为秒,保留一位小数

键位变量

变量中的键位省略 KEY_,例如 KEY_Z 对应 Z

变量说明
%lsv_Z:skill%Z 键绑定的技能 ID
%lsv_Z:icon%Z 键绑定技能的图标路径
%lsv_Z:cd%Z 键绑定技能的剩余冷却,单位毫秒
%lsv_Z:cdsecond%Z 键绑定技能的剩余冷却,单位秒,保留一位小数
%lsv_Z:cdmax%Z 键绑定技能当前等级的基础冷却,单位毫秒
%lsv_Z:autocast%Z 键自动释放状态

X、C、V、B 等已注册键位使用相同格式。

当前选中技能变量

变量无选中技能时的默认值
%lsv_target_skill_level%0
%lsv_target_skill_max_level%0
%lsv_target_skill_name%空文本
%lsv_target_skill_icon%空文本
%lsv_target_skill_id%空文本

这些变量只有在玩家打开 LySkillView 技能界面并点击选择技能后,才会读取当前选中技能。关闭技能界面后,当前选中技能缓存会被清除。

为什么键位变量返回默认贴图或 null

键位没有绑定技能时,变量返回值如下:

变量未绑定时返回
%lsv_Z:skill%null
%lsv_Z:icon%default-slot-texture 配置的路径
%lsv_Z:cd%0
%lsv_Z:cdsecond%0
%lsv_Z:cdmax%0

如果键位没有配置在 register-skill-slot 中,无法进入正常的键位数据读取逻辑,变量可能最终返回 null

为什么 %lsv_Z:cdmax% 没有应用冷却缩减?

%lsv_Z:cdmax% 返回当前等级配置计算出的基础冷却毫秒数,不会应用 cooling-reduction-placeholder

变量含义
%lsv_Z:cdmax%当前等级配置表达式计算出的基础冷却,单位毫秒
%lsv_cooldown:技能ID%应用玩家冷却缩减后的冷却,单位秒

制作冷却遮罩时,应根据需要选择对应变量。

为什么 HUD 冷却遮罩显示异常?

默认 技能栏.yml 使用键位冷却变量持续刷新,并通过剩余冷却与最大冷却的比例计算遮罩高度。

检查以下内容:

  • %lsv_键位:cd%%lsv_键位:cdmax% 是否能正常解析。
  • 技能是否已经绑定到该键位。
  • 技能栏.yml 中的组件名是否一致。
  • 冷却贴图路径是否存在。
  • cdmax 是否为 0
  • HUD 更新表达式中的变量名是否正确。

示例配置中的 C 键冷却高度表达式使用了 %lsv_Ccd%,该写法缺少冒号。应改为:

yaml
- "update<->图标C冷却图片@height@h*0.09*(%lsv_C:cd%/%lsv_C:cdmax%)"

为什么 HUD 图标无法显示?

HUD 图标变量来自已绑定技能的 skill-icon。没有绑定技能时使用 default-slot-texture

检查:

  • skill-icon 是否为萌芽能够读取的有效贴图路径。
  • default-slot-texture 是否有效。
  • 技能栏.yml 是否刷新了对应键位的 icon 变量。
  • HUD 组件是否使用正确的 %lsv_键位:icon%
  • 技能是否仍满足显示条件并保持绑定状态。

修改技能配置后,玩家数据没有对应技能怎么办?

打开技能菜单时,插件会为配置中存在但玩家数据中缺少的技能创建默认数据,初始等级为 0、冷却为 0、未绑定按键。

如果新技能仍未出现,检查:

  • 技能文件是否位于 plugins/LySkillView/skills 或其子目录。
  • 文件扩展名是否为 .yml
  • 顶层技能 ID 是否有效且不重复。
  • skill-level.0 是否存在。
  • skill-menu 是否加入该技能 ID。
  • 玩家是否满足 display-condition

修改技能 ID 后,旧数据会怎样?

技能 ID 是技能 YAML 的顶层节点,也是玩家数据、菜单列表、GCD 分组、变量和绑定关系使用的标识。

直接修改技能 ID 后,数据库中的旧 ID 不会自动改名。旧数据找不到对应技能配置时,会被部分逻辑跳过;新 ID 会被视为新的技能数据,默认等级为 0

修改技能 ID 前,应同步处理:

  • skill-menu 中的技能 ID。
  • gcd-group 中的技能 ID。
  • 配置和界面中引用该 ID 的变量。
  • 外部插件中引用该技能的内容。
  • 数据库中的历史玩家数据。

为什么重载后玩家状态没有立即完全刷新?

重载流程会重新读取配置、连接数据库、加载技能文件、读取萌芽界面和 HUD、注册快捷键、启动被动任务、注册 HUD,并刷新缩减变量和回蓝任务。

但在线玩家的技能数据缓存、已激活技能缓存和绑定状态不一定会像重新进服一样完整重建。重载后如果出现显示、绑定或数据状态不一致,可以让玩家重新进入服务器,使数据通过 LyMySQLCore 的加载事件重新初始化。

为什么循环保存没有运行?

loop-save-thread-time 的单位是 tick,配置为 0 时表示不使用该功能。

yaml
loop-save-thread-time: 6000

项目配置注释说明 1200 tick 约为一分钟,因此 6000 tick 约为五分钟。

如果循环保存没有按预期运行,应确认:

  • 配置值是否为有效的非负数。
  • LyMySQLCore 是否正常工作。
  • 玩家离线保存是否正常。
  • 插件关闭保存是否正常。
  • 控制台是否出现数据库错误。

为什么关闭服务器时出现保存失败?

插件关闭时会遍历缓存中的玩家技能数据,并将技能等级、冷却结束时间、绑定键位和当前蓝量写入数据库。

常见原因包括:

  • 数据库连接已提前关闭。
  • MySQL 服务不可用。
  • 数据库用户没有查询、插入或更新权限。
  • 数据表不存在或结构异常。
  • 玩家名称为空。
  • 玩家数据引用了已删除的技能。

应优先检查保存失败堆栈和数据库连接状态。必须确保 LySkillView 保存完成前,数据库服务和 LyMySQLCore 不要提前关闭或卸载。

为什么消息中的颜色没有显示?

message 下的插件提示会将 & 转换为 Minecraft 颜色符号。

yaml
message:
  skill-cooling: '&f[&e技能系统&f] &7技能冷却中,剩余&6{time}&7秒!'

检查 YAML 引号是否完整,以及消息是否仍位于正确的 message 节点下。

已确认的消息变量包括:

消息键支持变量
skill-cooling{time}
skill-cast-fail-from-mana{mana}

没有代码证据表明其他消息支持额外的花括号变量。

哪些问题应先查看控制台?

以下问题通常会产生控制台提示:

  • MySQL 连接或数据库初始化失败。
  • 快捷键名称无效。
  • 快捷键对应的技能界面组件不存在。
  • 技能配置加载异常。
  • 冷却缩减或耗蓝缩减变量不是数字。
  • 最大蓝量或回蓝变量解析失败。
  • 玩家数据读取或保存失败。
  • 对接技能释放失败。

排查时应先定位最早出现的 LySkillView 错误,再处理后续由数据未加载引起的连锁问题。