Skip to content

常见问题

插件启动后没有任何映射属性

按以下顺序检查:

  1. 确认插件已经完成验证并正常启动。核心功能会在验证通过后初始化。
  2. 检查 attribute-plugin 是否与服务器实际使用的属性插件一致。值为 0 时不会向任何属性插件写入属性。
  3. 检查对应属性插件是否已经安装并成功启用。
  4. 检查检测节点是否已被加载。插件会读取 config.ymlextra 目录内所有以 .yml 结尾的文件。
  5. 检查检测节点中的 condition、槽位格式和属性格式。
  6. 执行 /lmr reload 重新载入配置。

attribute-plugin 支持的编号以配置文件注释为准:

属性插件
1AttributePlus 2
2SX-Attribute 2.0
3SX-Attribute 3.0
4DZ
5ItemLoreOrigin
6AttributePlus 3
7LyAttribute
8AttributeSystem

项目代码中没有发现编号 4 对应的属性写入逻辑。将 attribute-plugin 设置为 4 时,映射结果可能不会实际写入属性插件。

检测条件已经满足,但属性没有生效

同一个检测节点中的 condition 需要全部通过,才会添加该节点的属性。重点检查以下内容:

检测格式检查内容
name:{文本}物品名称是否包含指定文本
equalsName:{文本}物品名称是否与指定文本完全一致
lore:{文本}任意一行 Lore 是否包含指定文本
equalsLore:{文本}任意一行 Lore 是否与指定文本完全一致
permission:{权限}玩家是否拥有指定权限
nopermission:{权限}玩家是否没有指定权限
papi:{表达式}PlaceholderAPI 替换后的表达式是否成立
suit:{套装文本}%lsr_show% 的结果是否包含指定文本

名称和 Lore 条件支持使用 & 颜色代码。插件检测时会将其转换为 Minecraft 颜色符号。

如果节点写了 check-slot,会优先使用该节点自己的槽位列表;只有未配置或列表为空时,才会使用全局 plugin-slot

没有配置条件时会发生什么

condition 不存在或为空时,检测会直接视为通过。节点仍会按照 check-event 的刷新方式计算属性。

如果不希望节点无条件生效,请至少配置一个有效条件。

修改配置后没有生效

使用管理员身份执行:

text
/lmr reload

重载会重新读取 config.yml,并递归读取 plugins/LyMappingReload/extra 目录内的所有 .yml 文件。映射检测和属性包数据会先清空,再根据当前文件重新注册。

重载配置不会保留已被配置删除的检测定义。多个文件中使用相同检测 ID 或属性包 ID 时,后加载的数据可能覆盖先加载的数据,因此所有 ID 应保持唯一。

extra 目录中的配置没有加载

检查以下项目:

  • 文件扩展名必须是 .yml,大小写不敏感。
  • 文件必须位于 plugins/LyMappingReload/extra 或其子目录中。
  • 文件需要同时包含可读取的 checkattribute-group 配置节。当前加载逻辑会分别读取这两个配置节。
  • YAML 缩进必须正确,列表项前需要使用 -
  • 修改后需要执行 /lmr reload

槽位中的物品一直检测不到

先检查槽位字符串的段数和名称。插件根据 # 拆分槽位:

槽位来源格式
原版背包槽位Minecraft#槽位编号
龙之核心槽位DragonCore#槽位名
GermPlugin 槽位GermPlugin#槽位名
APInventory 槽位APInventory#分页ID#槽位编号
LyInventory 槽位LyInventory#背包ID#槽位类型
LyInventoryReload 槽位LyInventoryReload#背包ID#槽位类型
YeeJewelry 槽位YeeJewelry#背包ID#槽位ID
原版主手Origin#MainHand
原版副手Origin#OffHand
原版头盔Origin#Helmet
原版胸甲Origin#ChestPlate
原版护腿Origin#Legging
原版靴子Origin#Boots

使用第三方背包槽位时,对应插件必须已经安装并可正常提供物品数据。槽位编号还必须在对应背包的有效范围内。

原版主手或副手槽位报错

Origin#MainHandOrigin#OffHand 使用了新版 Bukkit 的主副手接口。项目同时包含 1.7.10 支持代码,但旧版本服务端没有副手机制,相关槽位和 swap_hand 检测不适用于 1.7.10。

旧版本服务器应避免配置副手槽位和主副手交换事件。

关闭背包或切换物品后没有立即刷新

检查检测节点的 check-event

触发时机
second每秒检测
close_inventory玩家关闭背包时检测
held_item玩家切换快捷栏槽位时检测
swap_hand玩家交换主手和副手物品时检测

删除 check-event 或将其配置为空时,该节点会由每秒检测任务处理。

held_item 只有在新旧快捷栏槽位不同时才会执行对应的事件检测。swap_hand 依赖服务端提供主副手交换事件,不适用于没有副手机制的版本。

每秒检测时出现短暂属性丢失或波动

second-update-type-async: true 会让每秒计算任务在异步线程运行,以降低主线程压力。部分属性插件或物品槽位接口不适合异步访问,可能出现属性短暂丢失、恢复延迟或读取结果波动。

可以改为:

yaml
second-update-type-async: false

修改后执行 /lmr reload。关闭异步检测后,计算会在主线程执行,稳定性通常更高,但大量检测节点可能增加主线程负担。

属性刷新后触发了物品切换相关逻辑

每秒检测完成并且实际向属性插件写入了新属性时,插件会模拟触发一次玩家当前快捷栏槽位到当前槽位的 PlayerItemHeldEvent,用于通知其他插件刷新相关数据。

这个模拟事件的新旧槽位相同。LyMappingReload 自己的 held_item 监听会忽略这种事件,但其他监听该事件的插件仍可能执行自己的逻辑。

属性重复叠加或叠加层数不正确

max-stack-layers 限制单个检测节点最多添加多少层属性,默认值为 1

物品名称和 Lore 条件会统计匹配数量。多个槽位或多行 Lore 同时命中时,可能增加计算出的层数,最终层数不会超过 max-stack-layers

如果只希望属性最多添加一次,请设置:

yaml
max-stack-layers: 1

同时避免在同一个物品的多行 Lore 中重复出现用于检测的相同文本。

PlaceholderAPI 条件始终不成立

papi:{...} 会先通过 PlaceholderAPI 替换变量,再计算表达式。请确认:

  • PlaceholderAPI 已安装并成功启用。
  • 表达式使用的变量扩展已经安装。
  • 变量能够为当前玩家返回有效内容。
  • 数值比较的两侧是合法数字或四则运算公式。
  • 字符串相等或不等比较时,字符串使用成对的单引号或双引号。

支持的逻辑和比较运算符包括:

类型运算符
`
&&
大于、大于等于>>=
小于、小于等于<<=
等于、不等于==!=

数值公式支持 +-*/。非法数值公式会在控制台输出“非法公式”。

eval:{...} 没有生成属性

检查公式是否符合以下要求:

  • 公式只能使用数字、PlaceholderAPI 变量、括号和 +-*/
  • PlaceholderAPI 变量替换后必须形成可计算的表达式。
  • 上限分隔符必须与 eval-max-tag 一致,默认是 :
  • eval:{公式:上限} 只能包含一个用于分隔上限的标记。

公式计算出现异常时,该条属性会被跳过,不会加入最终属性列表。

公式结果为什么没有小数

value-number 控制公式结果格式:

配置结果
true转换为整数,小数部分直接舍去
false保留两位小数

例如公式结果为 12.75 时,开启后得到 12,关闭后得到 12.75

公式上限没有生效

默认写法为:

text
eval:{公式:上限}

如果修改了 eval-max-tag,公式也必须使用新的分隔符。上限只会限制超过上限的结果,不会限制低于上限的结果。

例如:

yaml
eval-max-tag: ':'

对应公式:

text
攻击力: eval:{%player_level% * 2:100}

Lore 取值一直是 0

确认 lore-get-placeholder 的文本可以匹配物品 Lore,并且 <value> 所在位置确实是纯数值。

yaml
lore-get-placeholder:
  等级点: '获得 <value>x玩家等级点攻击力'

对应 Lore 中位于“获得 ”和“x玩家等级点攻击力”之间的内容必须能够直接转换为数字。无法转换的内容会被忽略;所有槽位都没有取得有效数字时,该变量会被设置为 0

属性公式中的引用格式是 <v.变量名>。变量名必须与 lore-get-placeholder 下的节点名完全一致:

yaml
attribute:
  - '攻击力: eval:{<v.等级点> * 2}'

Lore 中有多行或多个物品匹配时如何取值

插件会扫描当前检测使用的所有槽位,并累计所有成功提取出的数值。

例如两个槽位分别取得 58,则 <v.变量名> 的结果为 13.0。如果同一个物品有多行 Lore 符合相同模板,也会累计这些数值。

如需只读取一个数值,请缩小 check-slot 范围,并确保模板只会匹配一行 Lore。

Lore 模板以 <value> 结尾时能否读取

可以。模板中 <value> 右侧没有文本时,插件会读取左侧文本之后直到该行 Lore 末尾的内容。

yaml
lore-get-placeholder:
  数值: '攻击力:<value>'

Lore 末尾不能附带无法转换为数字的字符,否则该行会被忽略。

变量显示为空

PlaceholderAPI 变量的属性行数从 1 开始。以下情况会返回空文本:

  • 检测 ID 或属性包 ID 不存在。
  • 行数小于等于 0
  • 行数超过该节点的属性行数。
  • 请求变量时没有玩家对象。

检测属性变量格式为 %lmr_check-检测ID:行数%,属性包变量格式为 %lmr_group-属性包ID:行数%

变量返回的是经过公式计算后的完整属性行,不只是数值。

PlaceholderAPI 未安装时会发生什么

插件仅在检测到 PlaceholderAPI 已启用时注册 %lmr_...% 变量扩展。

同时,papi:{...} 条件和 eval:{...} 中的 PlaceholderAPI 变量也依赖 PlaceholderAPI。配置使用了这些功能时,应安装 PlaceholderAPI 以及对应变量扩展。

药水效果报错或没有生效

药水格式必须包含药水类型、等级和持续时间:

text
药水类型-等级-持续时间

例如:

yaml
potion:
  - 'SPEED-1-2'

检查以下项目:

  • 药水类型必须是当前服务端版本可识别的 Bukkit 药水效果名称。
  • 三个字段必须使用 - 分隔。
  • 等级和持续时间必须填写整数。
  • 等级从 1 开始填写。
  • 检测条件必须成立。
  • 对应检测事件必须实际执行。

未知药水类型会在控制台输出 lmr检测到未知的药水报错。不同 Minecraft 版本可用的药水名称可能不同,应以当前服务端支持的 Bukkit 名称为准。

药水效果会按照叠加层数重复添加吗

不会。max-stack-layers 只控制属性列表的叠加次数,药水效果不会按层数重复添加。

药水效果会在检测节点通过时刷新。如果玩家已经拥有同类效果,插件会根据当前效果等级决定是否移除并重新应用。

NBT 属性没有读取到

get-nbt-attribute 只读取 plugin-slot 指定物品中的 NBT 字符串值,并将读取结果作为属性行加入最终属性列表。

项目只为以下服务端版本提供了 NBT 实现:

  • Minecraft 1.7.10,对应 v1_7_R4
  • Minecraft 1.12.2,对应 v1_12_R1

其他版本启动时会提示当前游戏版本不支持 NBT 检测。此时应删除或留空 get-nbt-attribute,不要依赖该功能。

此外,当前读取逻辑针对单行字符串类型 NBT。NBT 键不存在、值不是字符串属性行或槽位没有物品时,都不会产生属性。

NBT 路径写成 a.b.c 为什么读取不到

get-nbt-attribute 调用的是顶层 NBT 字符串读取方法,代码不会按 . 逐层进入复合标签。因此,虽然默认配置注释给出了 a.b.c 形式,实际属性读取仅能确认支持顶层字符串键。

如果需要读取 NBT 属性,请优先使用物品根 NBT 下的字符串键,并在目标服务端版本上验证结果。

属性包添加后没有效果

检查以下内容:

  1. 属性包 ID 是否存在于 attribute-group 中。
  2. 目标玩家是否在线。单个玩家必须在线才能通过命令添加。
  3. attribute-plugin 是否正确。
  4. 属性包的 attribute 是否能正常计算。
  5. 插件是否已经完成初始化。

添加命令为:

text
/lmr add 玩家 属性包ID

为所有在线玩家添加时,玩家位置使用 *

text
/lmr add * 属性包ID

重复添加同一个属性包会覆盖该玩家原有的同 ID 属性包,并重新计算结束时间。

属性包时间结束后仍显示属性

属性包状态每秒检查一次,过期数据会在监听任务中移除。实际属性还需要等待下一次属性计算和刷新,因此可能存在短暂延迟。

如果长时间没有移除,请检查:

  • 玩家是否在线。
  • 属性插件是否正常接受刷新。
  • 是否又执行了添加同 ID 属性包的命令。
  • 是否有同名映射检测产生了相似属性。

玩家离线后属性包会永久保存吗

不会。属性包数据只保存在内存中,没有数据库或本地持久化文件。

代码会在玩家离线一段时间后清理其属性包数据。服务器重启或插件重新加载后,也不应将属性包视为永久保存的数据。属性包适合临时属性效果,不适合作为永久玩家数据存储。

属性包启用或结束消息没有颜色

enable-messagedisable-message 支持 & 颜色代码,发送前会转换为 Minecraft 颜色符号。

如果不需要消息,可以删除对应配置项。未配置时不会发送消息。

ItemLoreOrigin 属性刷新不及时

attribute-plugin 设置为 5 时,插件会通过 ItemLoreOrigin 的虚拟物品 Lore 写入属性。刷新间隔由 ilo-update-task 控制,单位为 tick,20 tick 约为 1 秒。

yaml
ilo-update-task: 20

间隔过大时,属性变化会延迟;间隔过小会增加刷新频率。ItemLoreOrigin 还必须已经安装并成功启用,否则对应属性写入功能不会初始化。

玩家退出后重新进入,属性没有立即恢复

玩家加入后,插件会延迟 20 tick 执行一次相关刷新。加入后的短时间内可能暂时看不到属性。

加入刷新主要处理配置了 close_inventory 的检测节点和当前内存中的属性包。由 second 处理的节点会等待每秒检测任务重新计算。

配置中的属性修改后仍显示旧结果

插件会记录上次实际写入属性插件的属性快照。只有当前计算结果发生变化时,才会再次写入属性插件。

执行 /lmr reload 后,如果新旧最终计算结果完全相同,不会产生额外刷新。若结果确实不同但仍显示旧值,请检查属性插件本身是否正确覆盖同一来源 LyMappingReload 的旧属性。

控制台出现未知药水错误后插件停止刷新

先删除或修正对应检测节点中的错误 potion。药水配置需要直接拆分并转换等级、持续时间,字段缺失或数字格式错误可能影响该次检测任务。

建议每条药水配置都严格使用:

yaml
potion:
  - 'SPEED-1-2'

不要省略等级或持续时间,也不要在数字位置填写单位。

重载命令或属性包命令没有反应

/lmr reload/lmr add 玩家 属性包ID 和无参数帮助信息都要求命令发送者是服务器管理员,即 isOp() 返回 true

项目证据中没有定义独立权限节点。非管理员执行时不会收到权限不足提示,也不会执行对应操作。

控制台可以执行重载和为在线玩家添加属性包;指定单个玩家时,该玩家必须在线。