Skip to content

常见问题

插件启动后提示初始化失败

先检查控制台输出的配置错误,再修正 config.ymlrule 目录中的规则文件。修正后由 OP 执行:

text
/lyfj reload

分解系统尚未成功初始化时,除 /lyfj reload/lyfj convert 外的功能不可用,并会提示“分解系统尚未初始化完成”。

重载成功后会显示已加载的规则数量、额外按钮数量和警告数量。警告不会阻止配置生效,但仍建议根据输出逐项处理。

重载失败会清空当前规则吗

不会。

重载过程中只要发现阻止配置生效的错误,本次读取的数据就不会替换当前运行数据。已经成功加载过的规则、额外按钮和其他配置会继续生效。

重载失败时,指令会列出发现的错误。修正全部错误后再次执行:

text
/lyfj reload

为什么修改配置后没有生效

插件不会因为文件内容发生变化而自动重载。修改 config.ymlrule 目录中的规则文件后,需要由 OP 执行:

text
/lyfj reload

如果重载失败,新配置不会生效,当前运行中的旧配置会继续使用。请根据指令返回的错误逐项检查。

已经打开的分解界面还会保留创建时固定的输入槽位数量。修改 open-decomposition-slot 后,需要关闭并重新打开界面。

如何查看当前加载的规则

OP 可以执行:

text
/lyfj list [页码]

规则列表每页显示 8 条,并显示每条规则的条件数量和产物数量。页码必须是有效的正整数,且不能超过当前总页数。

如果规则没有出现在列表中,通常表示对应文件未被读取,或本次重载因配置错误而失败。

物品没有匹配任何规则

先由 OP 手持目标物品执行:

text
/lyfj test

也可以检测指定在线玩家的主手物品:

text
/lyfj test [玩家]

检测时重点检查:

  • 物品是否先满足 global-condition 中的全部全局条件。
  • 规则 condition 中的每一行是否都成立。
  • 同一行使用 || 连接的条件是否至少有一个成立。
  • 条件前的 ! 是否造成了取反。
  • 名称和 Lore 中的颜色符、空格与完整文本是否一致。
  • 名称和 Lore 使用的是完整匹配、包含匹配、开头匹配还是结尾匹配。
  • material(...) 使用的数字 ID、Data 或材质名称是否正确。
  • permission(...) 检查的玩家是否实际拥有对应权限。
  • papi(...) 使用的变量是否能够正常解析。
  • NBT 条件指定的键或点号路径是否真实存在。

/lyfj test 只会列出最终成功匹配的规则,不会逐项显示条件失败原因。

为什么部分条件满足了,物品仍然不能分解

多行条件之间是 AND 关系,每一行都必须返回 true。同一行中的 || 才表示 OR 关系。

yaml
condition:
  - "name('普通装备', contains)"
  - "lore('武器', contains) || lore('防具', contains)"
  - "!lore('已绑定', contains)"

该规则要求:

  1. 物品名称包含“普通装备”。
  2. 任意一行 Lore 包含“武器”或“防具”。
  3. 所有 Lore 都不能包含“已绑定”。

任意一行失败,整条规则都不会匹配。此外,所有规则匹配前还必须先满足 config.yml 中的全部 global-condition

一个物品可以同时匹配多条规则吗

可以。插件会获取物品匹配到的全部规则,而不是只使用第一条规则。

执行分解时,各匹配规则中启用发放的产物都会参与生成,各规则配置的 commands 也会加入执行队列。因此,排查产物重复、命令重复执行或一次分解获得多组奖励时,应先使用 /lyfj test 检查物品是否同时匹配了多条规则。

名称或 Lore 明明相同,为什么仍然匹配失败

默认的 name(...)lore(...) 使用完整匹配并保留颜色。文本看起来相同,不代表颜色符、空格和完整内容相同。

比较方式作用
equals完整匹配,默认方式
contains包含指定文本
startsWith以指定文本开头
endsWith以指定文本结尾
ignoreColor忽略颜色后完整匹配
contains, ignoreColor忽略颜色后进行包含匹配

例如:

yaml
condition:
  - "name('普通装备', contains, ignoreColor)"
  - "lore('品质', contains, ignoreColor)"

hasname()haslore() 有什么区别

hasname() 只判断物品是否存在自定义名称,haslore() 只判断物品是否存在 Lore,不检查具体内容。

使用 ! 可以取反:

yaml
condition:
  - "!hasname()"
  - "!haslore()"

这表示物品不能存在自定义名称,也不能存在 Lore。

material(...) 应该填写数字 ID 还是材质名称

规则支持数字 ID、数字 ID 与 Data,也支持材质名称。例如:

yaml
condition:
  - "material('276:0')"
yaml
condition:
  - "material('DIAMOND_SWORD')"

数字 ID 和 Data 主要用于旧版本服务端。材质名称需要与当前服务端实际存在的 Bukkit 材质名称对应。

配置了 permission(...),为什么仍然不匹配

permission('权限节点') 检查执行分解的玩家是否拥有指定权限。前置 ! 表示玩家不能拥有该权限。

yaml
condition:
  - "permission('lydecomposition.use')"
  - "!permission('lydecomposition.bypass')"

这里的权限节点由规则作者自行填写。项目没有为 /lyfj 的管理子命令声明独立权限节点,管理指令直接检查发送者是否为 OP。

配置了 papi(...) 条件但无法加载

使用 papi(...) 条件时必须安装并启用 PlaceholderAPI。插件检测不到 PlaceholderAPI 时,会把使用该条件的规则视为配置错误,导致本次重载失败。

完整判断表达式必须写在 papi(...) 内,例如:

yaml
condition:
  - "papi(%player_level% >= 5)"
  - "papi(%player_level% >= 5 && %player_level% <= 10)"
  - "papi(%player_class% == '战士' || %player_class% == '骑士')"

额外按钮、规则命令和产物命令也支持 PlaceholderAPI 变量。PlaceholderAPI 不可用时,命令中的普通文本仍可保留,但变量不会被替换;规则中的 papi(...) 条件则不能通过配置校验。

NBT 条件始终无法匹配

NBT 条件要求指定键或点号路径真实存在。路径中的每一级节点都必须存在,例如 lyfj.attribute.level 表示依次读取根 NBT 下的 lyfjattributelevel

排查时注意:

  • hasnbt('路径') 只判断路径是否存在。
  • nbt('路径', '值') 默认使用字符串完整匹配。
  • 数字 NBT 会转换为字符串,并移除 bsLfd 等类型后缀。
  • equals!= 按转换后的字符串内容比较。
  • containsstartsWithendsWith 按字符串内容比较。
  • >>=<<= 只在实际值和目标值都能转换为数字时生效。
  • ignoreCase 只用于忽略英文大小写。
  • !hasnbt('路径') 表示该路径不能存在。
yaml
condition:
  - "hasnbt('lyfj.attribute.level')"
  - "nbt('lyfj.attribute.level', 5, >=)"
  - "nbt('lyfj.attribute.type', 'SWORD', equals, ignoreCase)"

如果中间节点不是可继续读取的 NBT Compound,或任意一级节点不存在,整条路径都无法匹配。

为什么没有生成分解产物

依次检查以下内容:

  1. 输入物品是否成功匹配至少一条规则。
  2. 规则中的 give-item 是否为 true
  3. result 是否使用了正确格式。
  4. 产物使用的物品库是否已安装、启用并成功连接。
  5. 产物 ID 是否在对应物品库中存在。
  6. 固定数量或数量范围是否合法。
  7. 产物几率是否在 01 之间。

产物前三段格式为:

text
物品ID 固定数量或数量范围 几率

例如:

yaml
result:
  - 'MythicMobs@分解产物1 1-2 0.5'
  - 'MythicMobs@分解产物2 2 1'

give-item: false 时不会发放 result 中的产物,但规则配置的 commands 仍会执行。

产物后面可以配置命令吗

可以。产物定义的前三段为必填内容,从第四段开始可以追加命令。每条命令必须分别放在一组 {} 中,并按填写顺序执行。

yaml
result:
  - 'MythicMobs@分解产物1 1-2 0.5 {[console]say %player_name% 获得了分解产物} {[op]say 第二条命令}'

产物命令支持以下执行身份:

前缀执行身份
[console]控制台执行
[op]玩家临时以 OP 身份执行
无前缀玩家身份执行

花括号必须成对,每条命令必须使用独立的 {} 包裹。命令中可以使用 PlaceholderAPI 变量,但只有 PlaceholderAPI 可用时才会替换。

产物预览存在,但实际没有获得全部预览物品

预览不会执行随机、命令或物品发放。预览展示的是匹配规则中能够成功创建的产物定义,并附加配置的几率和数量范围。

实际分解时仍会按每条产物的几率进行随机,因此预览中出现的低几率产物不一定会在每次分解中获得。

为什么产物没有出现在预览区域

预览只处理当前输入区域内第一个可分解物品的产物,并按照 gui.preview-refresh-interval 定期刷新。

可能原因包括:

  • 输入物品没有匹配任何规则。
  • 匹配规则设置了 give-item: false
  • 产物定义格式错误。
  • 对应物品库不可用。
  • 产物 ID 不存在,无法创建预览物品。
  • preview-refresh-interval 配置过大,界面尚未自动刷新。

预览数量会受到物品自身最大堆叠数量限制,但 Lore 中显示的 {min}{max} 来自产物配置的数量范围。

未填写物品库前缀时会使用哪个物品库

未使用 物品库@物品ID 格式时,插件会读取 config.yml 中的 item-provider

item-provider 留空时会回退到 MythicMobs。可配置的物品库名称包括:

  • MythicMobs
  • LyItemSave
  • AzureFlow
  • NeonFlash
  • SX-Item
  • NeigeItems
  • OriginAttribute

MythicMobsLyItemSave 名称互通。只要其中一个能够提供兼容接口,产物中使用这两个前缀都可以访问同一个实际物品来源。

配置了物品库,但产物仍然创建失败

物品库属于可选依赖。只有对应插件已经安装、启用且适配器初始化成功时,相关产物才可以创建。

建议检查:

  • 插件名称是否正确,包括 SX-Item 中的连字符。
  • item-provider 是否填写了支持的名称。
  • 显式产物前缀是否使用 物品库@物品ID 格式。
  • 外部物品插件是否在 LyGalaxyDecomposition 初始化或重载时处于启用状态。
  • 物品 ID 是否确实存在于目标物品库中。
  • MythicMobs 的实际版本是否能够被对应适配器连接。

未找到物品库、适配器初始化失败或创建物品时发生异常,都会导致对应产物无法生成。

外部插件状态会在插件重载时重新检测。安装、卸载或重新启用依赖后,应执行 /lyfj reload

产物没有进入指定仓库

确认对应仓库插件已经启用,并检查 delivery-order 中的名称。

配置名称依赖插件与目标
inventory玩家背包
LyLootsWarehouseLyLootsWareHouse 提供的仓库
LyWarehouseLyWarehouse 仓库
SpaceRingPlusYeeCore 提供的对应仓库
StarStorageStarStorage 仓库

插件会按照列表顺序逐个尝试。当前目标无法完全接收时,剩余数量会继续尝试下一个目标;未安装、未启用、初始化失败或无法正常调用的目标会被跳过。全部目标处理后仍有剩余时,剩余物品会掉落在玩家位置。

delivery-order 留空时,默认进入玩家背包。背包无法容纳的剩余物品会掉落在玩家位置。

背包空间不足时为什么不能继续分解

分解执行会检查本次产物的接收情况。无法安全继续处理时,执行结果会返回背包空间不足,并通过 message.fail 中的 {slot} 显示所需空位数量。

批量分解过程中一旦遇到空间不足,当前批量操作会停止。已经成功处理的物品不会恢复,尚未处理的输入物品会保留在界面中。

如果配置了外部仓库,应同时检查 delivery-order 中的目标是否安装、启用并能正常接收物品。

关闭分解界面后,未分解物品去了哪里

关闭界面时,插件会将开放输入槽位中的物品返还到玩家背包,并确保同一次关闭只执行一次返还。

背包无法容纳的剩余物品会掉落在玩家当前位置,并发送 message.inv-max 消息。预览区域、分解按钮和额外按钮不是输入槽位,玩家不能向这些槽位放入物品。

左键和右键点击分解按钮有什么区别

操作行为
左键分解输入区域内首个可分解物品栈
右键按输入槽位顺序批量处理全部可分解物品栈

每次点击分解按钮存在 1 秒操作冷却。冷却期间再次点击会提示“请1秒后再尝试”。双击收集和向非输入槽位拖拽物品会被阻止。

如果输入区域前面的物品不能分解,插件会继续查找后续槽位中的首个可分解物品。

为什么输入区域中的某些物品没有被分解

分解按钮只处理能够匹配规则的物品。不能匹配任何规则的物品会保留在输入区域中。

左键每次只处理首个可分解物品栈;右键最多按当前开放输入槽位数量继续查找和处理。遇到背包空间不足、配置错误或执行异常时,本次批量处理会提前停止。

单个物品栈会按物品数量逐个执行分解。已经成功处理的物品会立即从输入槽位扣除;发生中断时,未处理的数量会继续保留。

额外按钮没有显示

删除 extra-button 或将其留空表示不启用额外按钮。

额外按钮只能使用界面底部的 08 号位置。按钮需要配置与动作对应的有效内容;配置错误可能导致重载失败。

action作用条件限制
put将玩家背包中符合条件且能够分解的物品放入输入槽位需要配置 condition
get取回全部输入物品不能配置 condition
command按顺序执行 command 列表不能配置 condition

按钮显示物品由 itemnamelore 控制。按钮只响应左键和右键。

一键放入按钮为什么没有移动物品

put 按钮只会移动同时满足以下两项要求的物品:

  1. 满足按钮自身的 condition
  2. 能够匹配至少一条分解规则。

按钮从玩家背包前 36 个槽位中查找物品,并尝试先合并到相似物品栈,再放入空闲的开放输入槽位。输入区域已满时,剩余物品会保留在玩家背包中。

按钮条件同样遵循“同一行 || 为 OR,多行之间为 AND”的规则,并且物品仍需满足全局条件和至少一条分解规则。

额外按钮提示冷却中

cooldown 的单位为毫秒,不同按钮的冷却互不影响。填写 0 或不设置冷却表示无冷却。

玩家在冷却结束前再次点击同一个按钮时,会提示“按钮冷却中,请稍后再试”。额外按钮只响应左键和右键,其他点击类型不会执行按钮动作。

command 按钮、规则命令或产物命令没有执行

指令支持以下执行身份:

前缀执行身份
[console]控制台执行
[op]玩家临时以 OP 身份执行
无前缀玩家身份执行

检查以下内容:

  • 指令内容是否为空。
  • 是否错误地在命令开头添加了 /
  • 执行身份是否拥有目标命令所需条件。
  • 目标命令是否由服务端中已启用的插件注册。
  • PlaceholderAPI 变量是否能够正常解析。
  • 产物命令是否分别使用完整的 {} 包裹。

规则命令会在产物处理后执行。规则设置 give-item: false 不会阻止规则 commands 执行。

普通玩家执行 /lyfj 为什么没有显示帮助

普通玩家可使用 /lyfj open 打开自己的分解界面。其他管理子命令由 OP 使用,普通玩家执行时不会获得管理帮助。

指令用途使用限制
/lyfj查看管理帮助OP
/lyfj help查看管理帮助OP
/lyfj open打开自己的分解界面玩家
/lyfj open [玩家]为指定在线玩家打开界面OP 或控制台
/lyfj test [玩家]检测自己或指定在线玩家的主手物品OP;控制台必须指定玩家
/lyfj list [页码]分页查看已加载规则OP
/lyfj reload重载配置、规则、按钮和外部插件连接状态OP
/lyfj convert转换旧版 LyDecompositionReload 规则并自动重载OP

项目中没有为这些指令声明独立权限节点,管理功能直接检查执行者是否为 OP。

控制台可以打开分解界面吗

控制台不能使用不带玩家参数的 /lyfj open,因为该用法只能由玩家执行。

控制台可以指定一名在线玩家:

text
/lyfj open [玩家]

目标玩家必须在线,并且名称需要能够被精确查找到。

控制台可以检测玩家物品吗

可以,但必须指定在线玩家:

text
/lyfj test [玩家]

不指定玩家时,该用法只能由游戏内玩家执行。检测目标是玩家当前主手物品;手中为空气或没有物品时不会进行规则匹配。

如何转换旧版 LyDecompositionReload 配置

由 OP 执行:

text
/lyfj convert

转换工具只读取服务端 plugins/LyDecompositionReload 目录中的旧版数据:

  • 读取旧版 config.ymldecomposition-set
  • 递归读取旧版 extra 目录中的 .yml 文件。
  • 不会修改旧版原始配置。
  • 转换完成后会自动重载当前插件。

旧版主配置不存在,或旧版 config.ymlextra 目录中没有找到 decomposition-set 规则时,转换会失败。

转换后的旧版规则保存在哪里

转换结果固定写入当前插件数据目录:

text
rule/旧版转换/旧版配置转换.yml

如果该文件已经存在,覆盖前会生成固定备份文件:

text
rule/旧版转换/旧版配置转换.yml.bak

写入时使用 UTF-8 无 BOM,并优先通过临时文件进行原子替换。转换成功后,指令会显示转换规则数量、读取的旧版 extra 文件数量、生成文件路径和警告。

旧版规则转换后会发生哪些变化

转换工具会进行以下处理:

  • 旧版规则 ID 添加 旧版_ 前缀。
  • 规则 ID 中的英文点 . 会替换为全角点 ,避免被 Bukkit 当作配置路径。
  • 转换后的规则 ID 冲突时会追加递增编号。
  • 旧版 id 转换为 material(...) 条件。
  • 旧版 namelorecontainsNamecontainsLore 转换为当前文本条件。
  • 旧版 give 转换为 give-item
  • 旧版 %p 玩家变量转换为 %player_name%
  • 旧版 [player] 规则命令会移除前缀,按玩家身份执行。
  • 旧版无物品库前缀的产物会添加 MythicMobs@
  • 旧版百分比概率会除以 100,转换为当前 01 的概率。

旧版产物格式:

text
物品ID#数量或数量范围#百分比#可选命令

会转换为:

text
物品库@物品ID 数量或数量范围 0到1概率 {可选命令}

旧版产物命令如果没有执行身份前缀,会按旧行为补充 [console]。旧版 [player] 产物命令会转换为无前缀的玩家命令。

旧版规则出现重复 ID 时如何处理

旧版转换按读取顺序收集规则。发现重复规则 ID 时,后读取的旧版规则会覆盖先读取的同名规则,并产生警告。

转换为当前规则 ID 后如果再次发生冲突,转换工具会追加 _2_3 等递增编号,确保输出 ID 唯一。

转换完成后应查看 /lyfj convert 返回的全部警告,并使用 /lyfj list 确认实际加载结果。

转换完成但自动重载失败怎么办

转换文件仍会保留,但当前运行规则不会被替换。指令会提示“转换文件已生成,但自动重载失败,当前运行规则保持不变”,并列出重载错误。

修正生成文件中的问题后执行:

text
/lyfj reload

转换警告不会阻止文件生成,但自动重载错误会阻止新规则生效。

可以反复执行 /lyfj convert

可以,但每次都会重新读取旧版目录,并覆盖固定的转换文件。已有转换文件会先复制为 .bak 备份。

如果已经手动修改 rule/旧版转换/旧版配置转换.yml,再次转换会覆盖这些修改。需要保留手动调整时,应先将规则移动到其他规则文件或自行备份。

旧版哪些异常配置会被跳过

转换工具会对无法安全转换的内容产生警告,常见情况包括:

  • decomposition-set 下的规则不是配置节点。
  • 旧版 id 不是有效的数字 ID 与 Data 格式。
  • 仅配置了 Data,但没有有效数字 ID。
  • 命令为空。
  • 产物不足三段。
  • 产物物品 ID 为空。
  • 数量不是正整数或有效的正整数范围。
  • 产物概率无法解析。
  • 产物命令为空或花括号不平衡。

旧版概率小于 0 时会按 0 转换,大于 100 时会按 100 转换,并产生警告。

为什么输入槽位数量与配置不一致

open-decomposition-slot 的有效范围是 118。分解界面创建时会固定本次界面的输入槽位数量。

修改该配置并重载后,已经打开的旧界面不会改变其创建时的槽位数量。关闭并重新打开界面后才会使用新的设置。

产物预览刷新太慢或过于频繁

调整 gui.preview-refresh-interval。该配置单位为 tick,最小值为 1

输入槽位发生点击、拖拽、额外按钮操作或分解操作时,界面也会请求刷新预览。数值过大时,自动刷新反馈会变慢;数值过小时,检测频率会提高。

配置项删除后为什么仍然使用原来的功能

extra-button 外,删除任意主配置项时,插件会使用默认配置中对应的值补全。因此,删除配置键通常不代表关闭功能。

extra-button 是例外:删除该节点或将其留空表示不启用额外按钮。

规则文件应该放在哪里

规则文件放在插件数据目录的 rule 文件夹中,并使用 .yml.yaml 扩展名。插件重载时会读取规则文件。

每个文件的最外层直接填写规则 ID:

yaml
'分解规则示例':
  condition:
    - "material('DIAMOND_SWORD')"
  commands: []
  give-item: true
  result:
    - 'MythicMobs@分解产物 1 1'

规则 ID 可以自定义,但不能重复。默认规则资源为 rule/额外配置.yml;文件不存在时,插件会尝试从插件资源中释放默认文件。

为什么新增规则后提示规则 ID 重复

所有已读取规则文件中的最外层规则 ID 共用同一个规则集合。即使两条规则位于不同文件,只要 ID 相同,也会发生冲突。

应为每条规则设置唯一 ID,再重新执行:

text
/lyfj reload

如果重复 ID 来自旧版转换文件,应同时检查 rule/旧版转换/旧版配置转换.yml 和其他现有规则文件。

为什么界面中的物品无法拖入某些槽位

只有界面创建时开放的输入槽位允许玩家放入和取出物品。以下区域会被保护:

  • 产物预览区域。
  • 分解按钮。
  • 底部额外按钮。
  • 其他非输入填充槽位。

向非输入槽位拖拽物品会被取消,双击收集操作也会被阻止。这些限制用于避免玩家取走界面按钮或预览物品。

为什么分解成功后没有发送成功消息

message.success 只有在本次操作实际处理了物品,并且没有因背包空间不足或执行错误中断时才会发送。

右键批量分解期间如果中途失败,已经成功处理的物品不会恢复,但本次不会发送完整成功消息。具体错误会通过 message.failmessage.execution-error 返回。

如果从配置中删除 message.success,插件不会发送该成功提示。

为什么错误消息中的 {slot} 显示为 0

message.fail 同时用于“没有可分解物品”和“背包空间不足”。没有找到任何可分解物品时,所需空位数量为 0,因此 {slot} 会显示为 0

可以在消息文本中同时说明两种情况,例如默认配置:

yaml
message:
  fail: '&c没有可分解物品,或背包还需要 &6{slot} &c个空位'

服务器版本是否支持 NBT 条件

项目包含以下服务端 NMS 适配版本:

  • 1.7.10
  • 1.8.8
  • 1.11.2
  • 1.12.2
  • 1.13.2
  • 1.14.4
  • 1.15.2
  • 1.16.5
  • 1.17.1
  • 1.18.2
  • 1.19.2
  • 1.19.4
  • 1.20.1
  • 1.20.2
  • 1.20.3

NBT 条件依赖与当前服务端版本匹配的适配器。项目证据中未包含 1.9、1.10、1.20.4 及更高版本的适配模块,不应将这些版本视为已经确认支持。

1.17.1 及更高版本的对应 NMS 模块使用 Java 17;较低版本模块以 Java 8 为目标。