Skip to content

常见问题

右键触发了两次

event-trigger-interval 中为 right 设置触发间隔,单位为毫秒:

yaml
event-trigger-interval:
  right: 200

服务端可能在一次右键操作中产生多个交互事件。设置间隔后,同一玩家的相同交互事件在间隔时间内不会重复检测。

如果使用蹲下右键事件,可以同时配置:

yaml
event-trigger-interval:
  right: 200
  shiftright: 200

触发间隔与节点冷却不是同一种机制:

功能配置位置作用
事件触发间隔event-trigger-interval限制同一玩家检测某种交互事件的频率
节点冷却节点中的 cdcd-team限制节点成功触发后的再次使用时间

左键事件没有触发

普通左键事件使用 left,蹲下左键事件使用 shiftlet

yaml
event:
  - 'left'
  - 'shiftlet'

当前代码实际发送的蹲下左键事件名是 shiftlet,不是默认配置注释中的 shiftleft。节点填写 shiftleft 时不会匹配蹲下左键事件。

但是,event-trigger-interval 中的间隔键仍然是 shiftleft

yaml
event-trigger-interval:
  shiftleft: 200

按键没有触发

先确认对应的软前置已经成功加载:

按键来源所需前置
萌芽按键GermPlugin
龙核按键DragonCore

按键还必须写入顶层配置的 register-keys。插件加载或重载时,会向已启用的按键插件尝试注册这些键位:

yaml
register-keys:
  - 'KEY_Z'

节点中的事件格式如下:

来源事件格式示例
GermPluginGermPlugin#按键枚举名GermPlugin#KEY_Z
DragonCoreDragonCore#按键名DragonCore#Z

GermPlugin 监听按键抬起事件。DragonCore 与 GermPlugin 使用的键名格式不同,不能直接混用 KEY_ZZ

修改配置后执行:

text
/lilc reload

如果控制台没有显示对应前置已启动或尝试注册键位的信息,应先检查前置插件是否成功加载。

节点没有触发

可以使用强制触发指令绕过节点的 event 检测:

text
/lilc use [玩家] [节点]

该指令要求执行者为管理员,目标玩家必须在线,节点名称必须与 config 或额外配置中的节点 ID 完全一致。

如果强制触发仍然失败,按以下顺序检查:

  1. 节点是否在启动或重载日志中显示为“注册检测节点”。
  2. plugin-slot 是否能取得物品。
  3. 物品名称和 Lore 是否匹配。
  4. 玩家是否拥有 permission 中的全部权限。
  5. 玩家是否拥有 nopermission 中禁止拥有的权限。
  6. condition 中的全部条件是否成立。
  7. 对应的 cd-team 是否仍在冷却。
  8. chance 是否随机判定失败。

如果强制触发成功,通常说明节点内容基本有效,应继续检查事件名称、大小写、目标名称、实体类型或按键格式。

plugin-slot 留空后为什么不检测物品

这是正常行为。plugin-slot 不存在或为空列表时,节点会跳过物品检测,只根据权限、禁止权限、变量条件、冷却和几率进行判断:

yaml
plugin-slot: []

配置了多个槽位时,插件会按列表读取槽位。只要其中一个槽位中的物品同时通过名称和 Lore 检测,节点就会继续执行。

原版装备槽位没有匹配

检查槽位名称是否正确:

槽位写法
主手Origin#MainHand
副手Origin#OffHand
头盔Origin#Helmet
胸甲Origin#ChestPlate
护腿Origin#Legging
靴子Origin#Boots
原版背包槽位Minecraft#槽位编号

原版背包槽位编号使用 036。物品必须存在并带有物品元数据。如果节点配置了 namelore,对应内容也必须匹配。

不同背包插件的槽位格式不能混用。使用 DragonCore、GermPlugin、APInventory、LyInventory、LyInventoryReload、YeeJewelry 或 PXRPG 槽位时,还要确认对应插件已经安装,并确认背包、类型和槽位标识真实存在。

名称或 Lore 明明存在却无法匹配

名称和 Lore 支持以下匹配方式:

写法行为
equals@内容完整匹配
contain@内容包含关键词
不写前缀默认按包含关键词处理

示例:

yaml
name: 'equals@烈焰之剑'
lore:
  - 'contain@火焰伤害'

lore 列表使用“任意一项匹配即可”的逻辑,不要求物品同时包含配置中的全部 Lore。

配置读取时会把颜色代码中的 & 转换为 §。物品名称或 Lore 带颜色时,配置中的颜色也必须与实际内容一致。

权限条件没有按预期工作

permission 中的权限必须全部拥有,节点才会继续触发:

yaml
permission:
  - 'example.permission.one'
  - 'example.permission.two'

nopermission 的逻辑相反。玩家只要拥有其中任意一个权限,节点就会匹配失败:

yaml
nopermission:
  - 'example.disabled'

不需要权限限制时,可以删除配置或使用空列表:

yaml
permission: []
nopermission: []

权限或变量条件失败时,可以通过 condition-or-permission-match-failed-message 向玩家发送提示。物品不匹配、节点冷却或几率失败不会使用这条消息。

变量条件报错或始终不成立

condition 会先解析 PlaceholderAPI 变量和 Lore 取值变量,再计算表达式。确认服务器已经安装并成功加载 PlaceholderAPI,同时确认使用的变量扩展能够正常返回结果。

支持的表达式包括:

类型运算符或写法
数值比较><>=<=
相等比较==!=
逻辑与&&
逻辑或`
数学计算+-*/()
布尔值truefalse

字符串比较需要为两侧添加引号:

yaml
condition:
  - "'%player_world%' == 'world'"

没有比较运算符的表达式只有解析为 true 时才会成立。

Lore 取值一直是 0

检查 lore-placeholder 的格式。<value> 表示从 Lore 中截取并解析为数字的部分:

yaml
lore-placeholder:
  力量: '力量+<value>'

当物品 Lore 为 力量+15.5 时,可以在条件、冷却和指令中使用:

写法结果
{v.力量}默认按整数格式替换
{v.力量~%.1f}保留一位小数

出现以下情况时,取值会保持为 0

  • Lore 中没有找到 <value> 左侧的文本。
  • 配置在 <value> 右侧填写了边界文本,但 Lore 中不存在该文本。
  • 截取出的内容不是有效数字。
  • 实际匹配到的物品没有 Lore。
  • 变量名称与使用位置中的名称不一致。

尖括号占位符必须放在行内代码或 YAML 代码块中,例如 <value>,避免文档页面解析错误。

冷却变量一直是 0

检查节点是否配置了 cd-team,变量中的冷却组名必须与配置完全一致:

PlaceholderAPI 变量返回内容
%lilc_cd-冷却组%格式化后的剩余时间
%lilc_cdint-冷却组%四舍五入后的整数秒

如果顶层配置中的 countdown-formattrue%lilc_cd-冷却组% 和消息中的 %time 使用 mm:ss 格式;关闭后返回保留一位小数的秒数。

节点未成功触发、冷却组名称不一致、玩家尚未产生该组冷却或冷却已经结束时,变量会返回 0

冷却时间与填写的值不一致

cd 的单位是秒,并支持 PlaceholderAPI 变量、Lore 取值变量和四则运算:

yaml
cd: '10 + {v.力量} / 2'
cd-team: '技能冷却'

如果表达式使用 PlaceholderAPI 变量,应确保变量返回可参与计算的数字。无法组成有效数值表达式时,冷却计算会失败。

多个节点使用相同的 cd-team 时会共享同一组冷却。需要独立冷却时,应为节点设置不同的冷却组名称。

开启 MySQL 后玩家无法进入服务器

启用 MySQL 存储时,必须安装 LyMySQLCore,并确保数据库配置正确且连接成功。只有 LyMySQLCore 正常加载、数据库连接成功后,MySQL 冷却数据读取、保存和跨服共享功能才会生效。

相关配置位于顶层 mysql

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

mysql.enabletrue 但数据库连接尚未完成时,插件会阻止玩家登录,并提示服务器尚未加载完成。此时检查:

  • LyMySQLCore 是否已经安装并成功启用。
  • 数据库地址、端口、数据库名、用户名和密码是否正确。
  • 数据库服务是否允许服务器建立连接。
  • 控制台是否出现连接失败或数据库表初始化失败信息。

不使用 MySQL 时,将 mysql.enable 设为 false。插件会把玩家的冷却组数据保存到插件 data 目录下的 UUID YAML 文件中。

本地冷却数据文件损坏怎么办

关闭 MySQL 时,插件按玩家 UUID 保存 YAML 冷却数据。保存流程会先写入临时文件,再保留旧主文件的 .bak 备份,并替换主文件。

读取时如果主文件无法解析或含有 NUL 字符,插件会删除损坏的主文件,并尝试读取 .bak 文件恢复。主文件和备份都无法使用时,该玩家会以空冷却数据继续加载。

控制台出现数据损坏或备份恢复提示时,应检查服务器是否发生过异常关机、磁盘写入中断或存储设备故障。

跨服后冷却被重置

本地 YAML 数据只保存在当前服务器,不提供跨服共享。

需要跨服共享冷却时,应在所有相关服务器上安装 LyMySQLCore,并让 LyItemLoreCommand 连接同一个可用数据库。数据库连接成功后,玩家加载时会读取数据库中的冷却组数据,离开时会保存当前冷却组数据。

如果部分服务器仍使用 mysql.enable: false,这些服务器不会与 MySQL 中的冷却数据同步。

扣除数量不对

taketake-all 的行为不同:

配置行为
take: true扣除匹配槽位中的 1 个物品
take-all: true扣除匹配槽位中的全部物品
两项均为 false不扣除物品

只有 take-all 会在执行前统计该槽位的物品数量,并把数量写入 {amount}。使用普通 take 时,{amount} 不会表示扣除的 1 个物品,而是保持为 0

如果同时开启 taketake-all,代码会优先执行 take-all

几率失败时仍然扣除了物品

这是 fail-take 的控制行为:

yaml
fail-take: true

fail-take: true 是默认值。插件会先执行物品扣除,再进行 chance 判定,因此几率失败时物品仍然会被扣除。

不希望失败时扣除物品,应改为:

yaml
fail-take: false

关闭后,插件会先进行几率判定,只有判定成功才进入冷却、扣除物品并执行指令。

权限、禁止权限、变量条件或冷却检测失败时,不会进入扣除流程。

chance 填写多少

chance 使用 01 的数值:

数值含义
1每次都成功
0.5约 50% 成功
0.1约 10% 成功
0不会成功

删除该配置时默认值为 1

指令没有执行

普通指令和权重指令都必须包含执行身份前缀:

前缀执行方式
[console]控制台执行
[player]玩家身份执行
[op]临时以管理员身份让玩家执行

没有以上前缀的指令不会被执行。

指令执行前会依次处理 {amount}、Lore 取值变量、PlaceholderAPI 变量和 %p 玩家名称。确认替换后的内容仍然是一条有效命令,并且命令开头通常不需要填写 /

messagefail-message 等消息不显示

代码读取这些配置时使用的类型不同:

配置项代码读取类型支持替换内容
message字符串列表%cd-team%time
cd-message单个字符串%time
fail-message单个字符串%cd-team
condition-or-permission-match-failed-message单个字符串无节点专用替换

建议按以下格式配置:

yaml
message:
  - '&7冷却组 %cd-team 进入了 %time 冷却'

fail-message: '&7本次触发失败'
condition-or-permission-match-failed-message: '&7本次匹配失败'
cd-message: '&7还有 %time 秒才可以使用该物品!'

删除对应配置或填写空字符串时,不会发送该类消息。

权重指令没有按预期执行

每个 weight-command 分组会独立随机选择一项。列表项开头必须是整数权重,后面使用 # 分隔一条或多条指令:

yaml
weight-command:
  奖励组:
    - '30#[console]give %p stone 1'
    - '70#[console]give %p dirt 1#[player]say 获得奖励'

第二项被选中后,会按顺序执行 # 后面的两条指令。

常见问题包括:

  • 权重不是整数。
  • 权重与第一条指令之间缺少 #
  • 指令缺少 [console][player][op] 前缀。
  • 指令参数中直接使用 #,导致内容被拆分成多条指令。

同一次事件触发了多个节点

默认情况下,插件会遍历所有节点。同一个事件可以让多个满足条件的节点成功触发。

需要阻止同组节点继续触发时,为这些节点设置相同且非空的 mutual-exclusion-group

yaml
mutual-exclusion-group: '主动技能'

同一次事件遍历中,该互斥组内任意节点成功触发后,插件会跳过该组后续节点。互斥只影响当前这次事件检测,不等同于 cd-team 冷却组。

节点存放在并发映射中,不应依赖同一互斥组内节点的固定检查顺序。

指定方块事件没有触发

方块类型使用 Bukkit 的方块枚举名称:

yaml
event:
  - 'break:STONE'
  - 'place:STONE'

可用格式为:

事件格式
破坏指定方块break:方块枚举名
放置指定方块place:方块枚举名

方块名称通常为大写英文和下划线格式。当前版本中,帮助文本显示的方块调试分支判断条件存在错误,/lilc debug block 实际不会正常进入调试逻辑。应直接根据服务端版本对应的 Bukkit 方块类型名称配置。

指定实体名称事件没有触发

实体名称事件支持以下格式:

行为事件格式
攻击指定名称目标attack:目标名称
被指定名称目标攻击damaged:目标名称
击杀指定名称目标kill:目标名称
右键指定名称目标right:目标名称
蹲下右键指定名称目标shiftright:目标名称

实体存在自定义名称时,插件优先使用自定义名称;没有自定义名称时,会使用服务端取得的实体名称或实体类型名称。因此配置内容必须与实际事件生成的名称完全一致。

指定实体类型事件没有触发

实体类型使用 Bukkit 实体类型枚举名称,例如玩家为 PLAYER、猪为 PIG、僵尸为 ZOMBIE

yaml
event:
  - 'attack_type:PLAYER'
  - 'kill_type:ZOMBIE'
  - 'right_type:PIG'

可用格式包括:

  • attack_type:实体类型
  • damaged_type:实体类型
  • kill_type:实体类型
  • right_type:实体类型
  • shiftright_type:实体类型

damaged_type 使用的是受伤实体本身的类型。当前监听只在受伤实体为玩家时执行,因此该事件实际生成的类型是 damaged_type:PLAYER,不能用它判断攻击者的实体类型。

right:目标名称 会不会同时触发普通右键事件

右键实体时,插件会生成 right:目标名称right_type:实体类型。普通交互监听还可能生成 right 事件。

如果节点同时配置普通 right 和指定目标事件,或多个节点分别监听这些事件,同一次操作可能触发多个匹配节点。可以使用 cdevent-trigger-intervalmutual-exclusion-group 控制重复效果。

移动事件触发太频繁

move 只在玩家进入不同方块坐标时触发,不会因为同一方块内转头或小范围移动持续触发。

虽然可以配置:

yaml
event-trigger-interval:
  move: 500

但当前事件间隔检查只用于左键、右键、蹲下左键和蹲下右键交互。移动监听不会读取 move 间隔,因此该配置不能限制移动事件。

需要控制移动节点负载时,应减少监听 move 的节点数量,并通过节点条件、物品槽位或冷却限制实际执行。

tick 事件多久检测一次

插件会为所有在线玩家注册定时检测任务,初始延迟为 10 Tick,之后每 20 Tick 检测一次,通常约为每秒一次。服务器卡顿时,实际时间间隔可能延长。

event-trigger-interval 不会限制 tick。需要控制节点生效频率时,应配置 cdcd-team

PxSkillDrive 技能事件没有触发

只有服务器成功加载 PxSkillDrive 时,插件才会注册对应监听器。节点事件名为:

yaml
event:
  - 'psd_cast'

该事件在 PxSkillDrive 产生技能施放事件时触发。插件不会读取具体技能 ID,所有技能施放共用 psd_cast 事件名。

修改额外配置后没有生效

插件除了主 config.yml 外,还会递归读取插件 extra 目录下所有以 .yml 结尾的文件。修改后执行:

text
/lilc reload

额外文件的顶层结构仍需使用 config

yaml
config:
  节点名称:
    event:
      - 'right'
    commands:
      - '[console]tell %p 触发成功'

如果不同文件使用相同节点 ID,后读取的节点会覆盖先读取的同名节点。为避免结果依赖文件遍历顺序,应保证所有配置文件中的节点 ID 唯一。

重载后玩家仍处于冷却

/lilc reload 会重新加载主配置、额外配置和事件触发间隔,但不会清空内存中的玩家冷却数据。

修改 cd-team 后,旧冷却仍会保留在原冷却组名称下,直到过期或玩家数据被重新处理。新的节点只会读取当前配置指定的冷却组。

触发交互后原操作被取消

普通左键、右键、蹲下左键或蹲下右键事件中,只要至少有一个节点成功触发,插件就会取消对应的 PlayerInteractEvent

这可能阻止方块交互或物品原有的右键行为。几率失败、条件失败、冷却中或物品不匹配时,节点不算成功触发,插件不会因为该节点取消交互。

如果需要保留原版交互,应避免让该操作对应的节点成功触发,或改用不会取消交互的其他事件类型。

为什么启用 MySQL 后服务器会禁止玩家登录

插件在玩家登录前会检查自身是否完成加载。启用 MySQL 时,还会检查数据库连接是否成功:

状态登录结果
插件尚未完成验证和初始化禁止登录
mysql.enable: true 且数据库未连接禁止登录
插件初始化完成且数据库连接成功,或未启用 MySQL允许继续登录

因此,安装 LyMySQLCore 后仍然无法登录时,应先查看控制台中的数据库连接和初始化信息,而不是反复重载配置。

如何通过 API 触发节点

插件提供 LyItemLoreCommandAPI,核心方法为:

java
boolean tryTrigger(Player player, String id, String event);

参数含义如下:

参数含义
player尝试触发节点的玩家,不能为空
id节点 ID,必须已注册
event要匹配的事件名称;传入 force 时会绕过节点的 event 列表

节点不存在、玩家为 null、玩家冷却数据尚未初始化,或检测条件不满足时,方法返回 false。节点成功执行后返回 true