常见问题
插件启动后提示初始化失败
先检查控制台输出的配置错误,再修正 config.yml 和 rule 目录中的规则文件。修正后由 OP 执行:
text
/lyfj reload分解系统尚未成功初始化时,除 /lyfj reload 和 /lyfj convert 外的功能不可用,并会提示“分解系统尚未初始化完成”。
重载成功后会显示已加载的规则数量、额外按钮数量和警告数量。警告不会阻止配置生效,但仍建议根据输出逐项处理。
重载失败会清空当前规则吗
不会。
重载过程中只要发现阻止配置生效的错误,本次读取的数据就不会替换当前运行数据。已经成功加载过的规则、额外按钮和其他配置会继续生效。
重载失败时,指令会列出发现的错误。修正全部错误后再次执行:
text
/lyfj reload为什么修改配置后没有生效
插件不会因为文件内容发生变化而自动重载。修改 config.yml 或 rule 目录中的规则文件后,需要由 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)"该规则要求:
- 物品名称包含“普通装备”。
- 任意一行 Lore 包含“武器”或“防具”。
- 所有 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 下的 lyfj、attribute 和 level。
排查时注意:
hasnbt('路径')只判断路径是否存在。nbt('路径', '值')默认使用字符串完整匹配。- 数字 NBT 会转换为字符串,并移除
b、s、L、f、d等类型后缀。 equals和!=按转换后的字符串内容比较。contains、startsWith、endsWith按字符串内容比较。>、>=、<、<=只在实际值和目标值都能转换为数字时生效。ignoreCase只用于忽略英文大小写。!hasnbt('路径')表示该路径不能存在。
yaml
condition:
- "hasnbt('lyfj.attribute.level')"
- "nbt('lyfj.attribute.level', 5, >=)"
- "nbt('lyfj.attribute.type', 'SWORD', equals, ignoreCase)"如果中间节点不是可继续读取的 NBT Compound,或任意一级节点不存在,整条路径都无法匹配。
为什么没有生成分解产物
依次检查以下内容:
- 输入物品是否成功匹配至少一条规则。
- 规则中的
give-item是否为true。 result是否使用了正确格式。- 产物使用的物品库是否已安装、启用并成功连接。
- 产物 ID 是否在对应物品库中存在。
- 固定数量或数量范围是否合法。
- 产物几率是否在
0到1之间。
产物前三段格式为:
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。可配置的物品库名称包括:
MythicMobsLyItemSaveAzureFlowNeonFlashSX-ItemNeigeItemsOriginAttribute
MythicMobs 与 LyItemSave 名称互通。只要其中一个能够提供兼容接口,产物中使用这两个前缀都可以访问同一个实际物品来源。
配置了物品库,但产物仍然创建失败
物品库属于可选依赖。只有对应插件已经安装、启用且适配器初始化成功时,相关产物才可以创建。
建议检查:
- 插件名称是否正确,包括
SX-Item中的连字符。 item-provider是否填写了支持的名称。- 显式产物前缀是否使用
物品库@物品ID格式。 - 外部物品插件是否在 LyGalaxyDecomposition 初始化或重载时处于启用状态。
- 物品 ID 是否确实存在于目标物品库中。
- MythicMobs 的实际版本是否能够被对应适配器连接。
未找到物品库、适配器初始化失败或创建物品时发生异常,都会导致对应产物无法生成。
外部插件状态会在插件重载时重新检测。安装、卸载或重新启用依赖后,应执行 /lyfj reload。
产物没有进入指定仓库
确认对应仓库插件已经启用,并检查 delivery-order 中的名称。
| 配置名称 | 依赖插件与目标 |
|---|---|
inventory | 玩家背包 |
LyLootsWarehouse | LyLootsWareHouse 提供的仓库 |
LyWarehouse | LyWarehouse 仓库 |
SpaceRingPlus | YeeCore 提供的对应仓库 |
StarStorage | StarStorage 仓库 |
插件会按照列表顺序逐个尝试。当前目标无法完全接收时,剩余数量会继续尝试下一个目标;未安装、未启用、初始化失败或无法正常调用的目标会被跳过。全部目标处理后仍有剩余时,剩余物品会掉落在玩家位置。
delivery-order 留空时,默认进入玩家背包。背包无法容纳的剩余物品会掉落在玩家位置。
背包空间不足时为什么不能继续分解
分解执行会检查本次产物的接收情况。无法安全继续处理时,执行结果会返回背包空间不足,并通过 message.fail 中的 {slot} 显示所需空位数量。
批量分解过程中一旦遇到空间不足,当前批量操作会停止。已经成功处理的物品不会恢复,尚未处理的输入物品会保留在界面中。
如果配置了外部仓库,应同时检查 delivery-order 中的目标是否安装、启用并能正常接收物品。
关闭分解界面后,未分解物品去了哪里
关闭界面时,插件会将开放输入槽位中的物品返还到玩家背包,并确保同一次关闭只执行一次返还。
背包无法容纳的剩余物品会掉落在玩家当前位置,并发送 message.inv-max 消息。预览区域、分解按钮和额外按钮不是输入槽位,玩家不能向这些槽位放入物品。
左键和右键点击分解按钮有什么区别
| 操作 | 行为 |
|---|---|
| 左键 | 分解输入区域内首个可分解物品栈 |
| 右键 | 按输入槽位顺序批量处理全部可分解物品栈 |
每次点击分解按钮存在 1 秒操作冷却。冷却期间再次点击会提示“请1秒后再尝试”。双击收集和向非输入槽位拖拽物品会被阻止。
如果输入区域前面的物品不能分解,插件会继续查找后续槽位中的首个可分解物品。
为什么输入区域中的某些物品没有被分解
分解按钮只处理能够匹配规则的物品。不能匹配任何规则的物品会保留在输入区域中。
左键每次只处理首个可分解物品栈;右键最多按当前开放输入槽位数量继续查找和处理。遇到背包空间不足、配置错误或执行异常时,本次批量处理会提前停止。
单个物品栈会按物品数量逐个执行分解。已经成功处理的物品会立即从输入槽位扣除;发生中断时,未处理的数量会继续保留。
额外按钮没有显示
删除 extra-button 或将其留空表示不启用额外按钮。
额外按钮只能使用界面底部的 0 到 8 号位置。按钮需要配置与动作对应的有效内容;配置错误可能导致重载失败。
action | 作用 | 条件限制 |
|---|---|---|
put | 将玩家背包中符合条件且能够分解的物品放入输入槽位 | 需要配置 condition |
get | 取回全部输入物品 | 不能配置 condition |
command | 按顺序执行 command 列表 | 不能配置 condition |
按钮显示物品由 item、name 和 lore 控制。按钮只响应左键和右键。
一键放入按钮为什么没有移动物品
put 按钮只会移动同时满足以下两项要求的物品:
- 满足按钮自身的
condition。 - 能够匹配至少一条分解规则。
按钮从玩家背包前 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.yml的decomposition-set。 - 递归读取旧版
extra目录中的.yml文件。 - 不会修改旧版原始配置。
- 转换完成后会自动重载当前插件。
旧版主配置不存在,或旧版 config.yml 与 extra 目录中没有找到 decomposition-set 规则时,转换会失败。
转换后的旧版规则保存在哪里
转换结果固定写入当前插件数据目录:
text
rule/旧版转换/旧版配置转换.yml如果该文件已经存在,覆盖前会生成固定备份文件:
text
rule/旧版转换/旧版配置转换.yml.bak写入时使用 UTF-8 无 BOM,并优先通过临时文件进行原子替换。转换成功后,指令会显示转换规则数量、读取的旧版 extra 文件数量、生成文件路径和警告。
旧版规则转换后会发生哪些变化
转换工具会进行以下处理:
- 旧版规则 ID 添加
旧版_前缀。 - 规则 ID 中的英文点
.会替换为全角点.,避免被 Bukkit 当作配置路径。 - 转换后的规则 ID 冲突时会追加递增编号。
- 旧版
id转换为material(...)条件。 - 旧版
name、lore、containsName和containsLore转换为当前文本条件。 - 旧版
give转换为give-item。 - 旧版
%p玩家变量转换为%player_name%。 - 旧版
[player]规则命令会移除前缀,按玩家身份执行。 - 旧版无物品库前缀的产物会添加
MythicMobs@。 - 旧版百分比概率会除以 100,转换为当前
0到1的概率。
旧版产物格式:
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 的有效范围是 1 到 18。分解界面创建时会固定本次界面的输入槽位数量。
修改该配置并重载后,已经打开的旧界面不会改变其创建时的槽位数量。关闭并重新打开界面后才会使用新的设置。
产物预览刷新太慢或过于频繁
调整 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.fail 或 message.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 为目标。