配置说明
LyGalaxyDecomposition 的配置由主配置文件 config.yml 和规则目录 rule 组成:
| 文件或目录 | 用途 |
|---|---|
config.yml | 设置默认物品库、产物入库顺序、全局条件、额外按钮、分解界面和提示消息 |
rule/*.yml | 定义物品匹配条件、分解产物、规则命令和产物命令 |
插件会递归读取 rule 目录及其子目录中的 .yml 文件。执行 /lyfj reload 时,会重新读取主配置、全部规则文件、额外按钮和外部插件连接状态。
如果重载发现阻止加载的错误,本次配置不会生效,原有规则、按钮、全局条件和入库顺序继续运行。只有警告时允许完成重载。
主配置字段
config.yml 顶层只允许使用以下字段。填写其它顶层字段会导致重载失败。
| 配置项 | 类型 | 说明 |
|---|---|---|
item-provider | 字符串 | 未在产物 ID 中指定物品库前缀时使用的默认物品库 |
delivery-order | 字符串列表 | 分解产物的入库目标和尝试顺序 |
global-condition | 字符串列表 | 所有分解规则匹配前必须满足的全局条件 |
extra-button | 配置节点 | 界面底部的额外按钮,可不配置 |
gui | 配置节点 | 分解界面的标题、物品和产物预览设置 |
open-decomposition-slot | 整数 | 开放的分解输入槽位数量 |
message | 配置节点 | 分解结果、失败和物品返还提示 |
除 extra-button 外,删除普通配置项或将其设为 null 时,插件会在运行时使用内置默认值。删除 extra-button、将其设为 null 或不配置任何按钮表示禁用额外按钮。
默认物品库
item-provider
当规则产物没有填写物品库前缀时,插件使用 item-provider 指定的物品库创建产物。
yaml
item-provider: 'MythicMobs'支持的物品库如下:
| 配置名称 | 对应插件 | 说明 |
|---|---|---|
MythicMobs | MythicMobs 或 LyItemSave | 支持 MythicMobs 4、MythicMobs 5;只有 LyItemSave 时使用其 MythicMobs 4 兼容接口 |
LyItemSave | MythicMobs 或 LyItemSave | 与 MythicMobs 名称互通 |
AzureFlow | AzureFlow | 使用 AzureFlow 物品 ID |
NeonFlash | NeonFlash | 使用 NeonFlash 物品 ID |
SX-Item | SX-Item | 使用 SX-Item 物品 ID |
NeigeItems | NeigeItems | 使用 NeigeItems 物品 ID,并传入当前玩家 |
OriginAttribute | OriginAttribute | 使用 OriginAttribute 物品 ID,并传入当前玩家 |
配置为空字符串、缺失或为 null 时,默认使用 MythicMobs。
物品库名称查找不区分大小写。对应插件未安装、未启用或适配器初始化失败时,引用该物品库的规则无法通过重载校验。
规则产物可以使用 物品库@物品ID 格式覆盖默认物品库:
yaml
result:
- 'MythicMobs@分解材料 1 1'
- 'NeigeItems@稀有碎片 1-3 0.25'@ 后的内容是对应物品库内部使用的物品 ID。
产物入库顺序
delivery-order
delivery-order 决定产物生成后依次尝试进入哪些位置。
yaml
delivery-order:
- LyLootsWarehouse
- LyWarehouse
- inventory支持的入库目标如下:
| 配置值 | 实际目标 | 生效条件 |
|---|---|---|
inventory | 玩家背包 | 始终可用 |
LyLootsWarehouse | LyLootsWareHouse 战利品仓库 | 已安装并启用 LyLootsWareHouse,且仓库接口接受该产物 |
LyWarehouse | LyWarehouse 仓库 | 已安装并启用 LyWarehouse,且仓库接口接受该物品 |
SpaceRingPlus | 灵魂空间 | 已安装并启用提供接口的 YeeCore |
StarStorage | StarStorage 默认仓库 | 已安装并启用 StarStorage,玩家仓库数据已加载且物品允许存放 |
配置规则:
- 列表按照从上到下的顺序处理。
- 配置值不区分大小写,加载后会转换为正式名称。
- 同一个入库目标不能重复配置。
- 不支持的目标、非字符串内容或重复目标会导致重载失败。
- 未安装、未启用、初始化失败或当前无法接收物品的外部仓库会被跳过。
inventory可以接收部分数量,背包无法容纳的剩余数量会继续尝试后续目标。- 外部仓库接口按完整剩余物品栈尝试接收;返回失败时继续尝试下一个目标。
- 全部目标处理后仍有剩余产物时,剩余物品会掉落在玩家当前位置。
- 列表缺失、为
null或为空列表时,默认只尝试inventory。
仅使用玩家背包:
yaml
delivery-order:
- inventory优先进入外部仓库,失败后进入背包:
yaml
delivery-order:
- StarStorage
- LyLootsWarehouse
- inventory结果消息中的 {amount} 同时包含数量和实际入库位置,例如 2(已进入背包)。如果同一项产物由多个位置接收,位置名称会使用顿号连接。全部目标均未接收时,会显示产物已进入玩家位置。
全局条件
global-condition
全局条件会在每条分解规则的自身条件之前判断。物品必须先通过全部全局条件,才会继续匹配 rule 目录中的规则。
yaml
global-condition:
- "!lore('已绑定', contains)"
- "!permission('lydecomposition.bypass')"条件组合规则:
- 多行条件之间为 AND,每一行都必须成立。
- 同一行顶层使用
||表示 OR,任意一个分支成立即可。 - 函数前添加
!表示取反;连续添加多个!时会依次反转结果。 - 每行必须是非空字符串。
- 条件表达式中的括号和单引号必须完整闭合。
- 函数中的字符串参数使用单引号。
- 单引号字符串内需要表示单引号时,可连续填写两个单引号。
global-condition为空列表时不增加全局限制。
允许使用的条件函数包括:
| 函数 | 用途 |
|---|---|
hasname() | 判断物品是否存在自定义名称 |
haslore() | 判断物品是否存在 Lore |
name() | 匹配物品名称 |
lore() | 匹配物品 Lore |
material() | 匹配材质、旧版数字 ID 和 Data |
permission() | 判断玩家权限 |
papi() | 替换 PlaceholderAPI 变量后判断表达式 |
hasnbt() | 判断指定 NBT 节点是否存在 |
nbt() | 比较指定 NBT 节点的值 |
使用 papi() 条件时必须安装并启用 PlaceholderAPI,否则重载失败。使用 hasnbt() 或 nbt() 时,当前服务端版本必须存在可用的 NBT 适配器,否则重载失败。
额外按钮
extra-button
额外按钮显示在分解界面最下方,共有 0 至 8 九个可配置位置。编号对应底部区域从左到右的槽位索引。
每个按钮允许使用以下字段:
| 配置项 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
action | 字符串 | 是 | 无 | 按钮动作,只能填写 put、get 或 command |
item | 字符串 | 是 | 无 | 按钮显示物品,使用 Bukkit 物品格式 |
name | 字符串 | 是 | 无 | 按钮显示名称,支持 & 颜色代码 |
lore | 字符串列表 | 否 | 空列表 | 按钮 Lore,支持 & 颜色代码 |
cooldown | 非负整数 | 否 | 0 | 当前按钮每次成功交互后的独立冷却,单位为毫秒 |
condition | 字符串列表 | put 必填 | 空列表 | 一键放入物品时使用的条件 |
command | 字符串列表 | 否 | 空列表 | command 动作按顺序执行的命令 |
按钮编号必须是 0 至 8 的整数。以下问题会导致重载失败:
- 按钮编号不是整数或超出范围。
- 按钮内容不是配置节点。
- 包含不支持的按钮字段。
action、item或name为空。action不是put、get或command。item无法创建显示物品。lore不是列表。cooldown不是非负整数。- 动作与
condition、command字段的组合不符合要求。
不同按钮分别记录冷却。cooldown: 0 或不配置 cooldown 表示无冷却。玩家在冷却期间再次点击会收到固定的冷却提示。
put 动作
put 会扫描玩家背包前 36 个槽位,将同时满足以下要求的物品移动到开放输入槽位:
- 满足按钮自身的全部
condition。 - 满足当前全局条件。
- 能够匹配至少一条当前生效的分解规则。
放入时会优先合并输入区域内的相似物品栈,再使用空输入槽位。输入区域装满后停止处理。
yaml
extra-button:
0:
action: 'put'
condition:
- "lore('&7品质: &a一般', contains)"
- "!lore('已绑定', contains)"
item: '160:5'
name: '&7一键放入&a一般&7品质装备'
lore:
- '&7点击后放入全部符合条件的装备'
cooldown: 500put 配置限制:
- 必须配置非空的
condition字符串列表。 - 不能配置
command。 - 条件语法与全局条件和规则条件相同。
- 条件使用
papi()或 NBT 函数时,对应功能必须可用。
get 动作
get 会取回当前界面的全部输入物品。玩家背包无法容纳的物品会掉落在玩家当前位置,并发送 message.inv-max。
yaml
extra-button:
8:
action: 'get'
item: '160:7'
name: '&c一键取回全部装备'
lore:
- '&7点击后取回全部输入物品'
cooldown: 500get 不能配置 condition 或 command。
玩家正常关闭分解界面时,也会自动返还输入区域中的物品。每个界面只会执行一次关闭返还。
command 动作
command 会按配置顺序执行 command 列表中的非空命令。
yaml
extra-button:
6:
action: 'command'
item: '160:1'
name: '&c执行指令'
lore:
- '&7点击后执行配置指令'
cooldown: 1000
command:
- '[console]say %player_name% 点击了分解界面按钮'
- '[op]say %player_name% 执行了临时OP指令'
- 'say %player_name% 执行了玩家指令'命令执行身份:
| 格式 | 执行身份 |
|---|---|
[console]指令 | 控制台 |
[op]指令 | 玩家临时获得 OP 后执行,完成后恢复原 OP 状态 |
指令 | 玩家 |
执行身份前缀不区分大小写。命令支持 PlaceholderAPI 变量;未安装 PlaceholderAPI 时保留原始文本。命令内容不要包含开头的 /。
command 配置限制:
- 不能配置
condition。 command可以省略或留空,此时按钮不运行命令。- 配置
command时必须使用字符串列表。 - 列表内只能填写非空字符串。
[console]或[op]后必须存在实际命令内容。- 单条命令执行异常时会记录警告,不影响列表中其它命令继续执行。
分解界面
gui
分解界面固定为 54 格,分为输入区域、操作区域、产物预览区域和额外按钮区域。
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
gui.title | 字符串 | 物品分解 | 界面标题,支持 & 颜色代码 |
gui.fill-item | 字符串 | 160:0 | 未开放槽位、分隔区域、空预览区域和未配置按钮位置使用的填充物品 |
gui.fill-name | 字符串 | &7上方放入要分解的物品 | 填充物品名称,支持 & 颜色代码 |
gui.button-item | 字符串 | 145:2 | 分解按钮显示物品 |
gui.button-name | 字符串 | &e点击分解 | 分解按钮名称,支持 & 颜色代码 |
gui.button-lore | 字符串列表 | 见下方配置 | 分解按钮 Lore,支持 & 颜色代码 |
gui.preview-refresh-interval | 数字 | 10 | 产物预览刷新请求的检测间隔,单位为 tick,运行时最小为 1 |
gui.lore-add | 字符串列表 | 见下方配置 | 追加到每个预览产物 Lore 末尾的内容 |
完整配置结构:
yaml
gui:
title: '物品分解'
fill-item: '160:0'
fill-name: '&7上方放入要分解的物品'
button-item: '145:2'
button-name: '&e点击分解'
button-lore:
- ''
- '&7下方显示第一个可分解物品的产物预览'
- ''
- '&a左键分解首个物品栈 &7| &a右键分解全部物品栈'
preview-refresh-interval: 10
lore-add:
- ''
- '&a出现几率: {chance}'
- '&a产物数量: {min} - {max}'界面布局
| 区域 | 槽位 | 说明 |
|---|---|---|
| 输入区域 | 0 至 17 | 实际开放数量由 open-decomposition-slot 决定 |
| 分隔区域 | 18 至 26 | 使用填充物品,其中槽位 22 为分解按钮 |
| 产物预览 | 27 至 44 | 最多显示 18 个预览产物 |
| 额外按钮 | 45 至 53 | 对应 extra-button.0 至 extra-button.8 |
玩家只能向开放的输入槽位放入物品。未开放输入槽位、分隔区域、产物预览和额外按钮区域不能作为普通容器槽位使用。
分解按钮操作
| 操作 | 效果 |
|---|---|
| 左键 | 查找并完整分解输入区域内第一个可分解的物品栈 |
| 右键 | 按输入槽位顺序分解全部可分解物品栈 |
分解按钮使用固定的 1000 毫秒点击冷却,不能通过配置修改。
如果一个物品同时匹配多条规则,全部匹配规则都会参与本次分解。每消耗一个输入物品,插件都会分别计算各规则的产物和命令。
外部插件可以通过分解前置事件取消单个物品的分解。被取消或执行失败时,输入物品不会按成功结果扣除。
产物预览
预览系统会从输入区域中查找第一个能够匹配规则的物品,并展示其全部匹配规则中的可发放产物:
- 预览不会进行概率随机。
- 预览不会发放物品、消耗输入物品或执行任何命令。
give-item: false的规则不会生成产物预览。- 预览物品显示数量使用产物最大数量,但不会超过该物品的最大堆叠数量。
- 最多显示前 18 个成功创建的产物。
- 不存在、格式错误或物品库无法创建的产物不会显示。
- 输入物品变化后会请求刷新。
- 刷新请求按照
gui.preview-refresh-interval指定的间隔检测。 - 配置值小于
1时按1tick 处理。
gui.lore-add 支持以下内置占位符:
| 占位符 | 说明 |
|---|---|
{chance} | 产物概率,显示为保留两位小数的百分比 |
{min} | 最小产物数量 |
{max} | 最大产物数量 |
输入槽位数量
open-decomposition-slot
设置界面顶部允许玩家放入物品的槽位数量。
yaml
open-decomposition-slot: 18运行时有效范围为 1 至 18:
- 小于
1时按1处理。 - 大于
18时按18处理。 - 未配置或为
null时默认为18。 - 界面打开后,本次界面使用的槽位数量保持不变。
- 重载后的槽位数量会在玩家重新打开界面时应用。
消息设置
message
yaml
message:
inv-max: '&c背包已满,剩余物品已掉落在你的位置'
success: '&a分解完成'
result: '&f分解 [{name}&f] 获得了: {item}x{amount}'
fail: '&c没有可分解物品,或背包还需要 &6{slot} &c个空位'
execution-error: '&c分解失败:&6{reason}'| 配置项 | 触发时机 | 支持内容 |
|---|---|---|
message.inv-max | 关闭界面或使用 get 按钮返还输入物品时,背包无法容纳全部物品 | & 颜色代码 |
message.success | 一次点击完成了至少一个物品的分解,且批量过程未被错误中断 | & 颜色代码 |
message.result | 每项实际生成的产物完成入库后 | {name}、{item}、{amount}、& 颜色代码 |
message.fail | 输入区域没有可分解物品,或执行返回背包空间不足状态 | {slot}、& 颜色代码 |
message.execution-error | 单个物品分解返回非成功状态 | {reason}、& 颜色代码 |
message.result 占位符:
| 占位符 | 说明 |
|---|---|
{name} | 被分解物品的显示名称;没有可用来源名称时显示通用物品名称 |
{item} | 产物的显示名称;没有自定义名称时使用 Bukkit 材质名称 |
{amount} | 产物数量和实际进入位置,例如 3(已进入背包) |
message.fail 中的 {slot} 是执行结果要求的额外槽位数量。当前界面没有匹配到可分解物品时,该值为 0。
message.execution-error 中的 {reason} 是执行状态对应的简体中文原因,例如分解系统尚未就绪、输入物品无效、没有匹配规则、被外部插件取消、配置错误或执行异常。
规则文件
规则文件位于插件数据目录的 rule 文件夹。插件会递归读取该目录及其子目录内所有以 .yml 结尾的文件,并按照完整文件路径忽略大小写排序后加载。
规则文件最外层直接填写规则 ID:
yaml
'分解规则示例':
condition:
- "name('&a额外规则示例') || name('额外规则', contains)"
- "lore('武器', contains) || lore('防具', contains)"
- "!lore('已绑定', contains)"
- "material('276:0')"
commands:
- '[console]say %player_name% 触发了分解规则示例'
give-item: true
result:
- 'MythicMobs@分解产物1 1-2 0.5'
- 'MythicMobs@分解产物2 2 1'规则字段
每条规则只允许使用以下字段。其它字段会导致重载失败。
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
condition | 字符串列表 | 无 | 当前规则的匹配条件,必须至少配置一行 |
give-item | 布尔值 | true | 是否根据 result 生成并发放产物 |
commands | 字符串列表 | 空列表 | 规则执行成功后运行的命令 |
result | 字符串列表 | 空列表 | 分解产物和产物级命令定义 |
规则要求:
- 规则 ID 在全部规则文件中必须唯一。
- 单个物品可以同时匹配多条规则,匹配结果会叠加。
condition必须至少包含一行有效条件。- 全局条件会先于规则自身的
condition判断。 give-item: false时不生成产物,但仍会执行commands。give-item: true但未配置result时只产生重载警告,不阻止加载。- 产物格式错误、产物物品库不可用或规则 ID 重复时会导致重载失败。
规则命令
规则的 commands 与额外命令按钮使用相同的执行身份:
yaml
commands:
- '[console]say %player_name% 完成了分解'
- '[op]say %player_name% 触发了临时OP命令'
- 'say %player_name% 触发了玩家命令'| 格式 | 执行身份 |
|---|---|
[console]指令 | 控制台 |
[op]指令 | 玩家临时获得 OP 后执行,完成后恢复原状态 |
指令 | 玩家 |
规则命令会在产物生成和入库流程后,按照匹配规则的加载顺序执行。命令支持 PlaceholderAPI 变量。单条命令执行失败时会记录警告,不会撤销已经发放的产物,也不会使本次分解变为失败状态。
产物格式
result 中每行的基础格式为:
text
物品ID 数量或数量范围 概率示例:
yaml
result:
- 'MythicMobs@材料A 2 1'
- 'NeigeItems@材料B 1-3 0.5'| 部分 | 格式 | 说明 |
|---|---|---|
| 物品 ID | 物品库@物品ID 或 物品ID | 不写物品库时使用 item-provider |
| 固定数量 | 正整数,如 2 | 每次命中生成固定数量 |
| 数量范围 | 最小值-最大值 | 命中后在包含两端的范围内随机数量 |
| 概率 | 0 至 1 | 0 表示不会出现,1 表示必定出现 |
产物会先进行概率判断,再随机数量并创建物品。物品库无法创建产物时,本次单个物品分解返回配置错误,调用方不应扣除输入物品。
产物命令
每项产物可以从第四段开始追加一个或多个命令。每条命令必须单独放在 {} 中:
text
物品ID 数量或数量范围 概率 {命令1} {命令2}yaml
result:
- 'MythicMobs@稀有材料 1-2 0.25 {[console]say %player_name% 获得了稀有材料} {[op]say 第二条命令}'
- 'NeigeItems@普通材料 2 1 {say 我获得了普通材料}'产物命令规则:
- 只有该项产物通过概率判断、成功创建并完成入库后才会执行。
- 多条命令按照配置中的填写顺序执行。
- 支持
[console]、[op]和无前缀玩家身份。 - 支持 PlaceholderAPI 变量;PlaceholderAPI 不可用时保留原始文本。
- 产物命令在
message.result发送后执行。 - 单条产物命令执行失败时会记录警告,不会撤销已经发放的产物。
完整规则示例:
yaml
'带产物命令的分解规则':
condition:
- "material('DIAMOND_SWORD')"
- "!lore('已绑定', contains)"
give-item: true
result:
- 'MythicMobs@钻石碎片 1-3 1 {[console]say %player_name% 分解出钻石碎片}'
- 'MythicMobs@稀有核心 1 0.1 {[console]say %player_name% 获得了稀有核心}'
commands:
- '[console]say %player_name% 完成了一次钻石剑分解'条件格式
主配置的 global-condition、额外按钮的 condition 和规则文件的 condition 使用相同语法。
条件组合
yaml
condition:
- "name('&a普通装备') || name('普通装备', contains, ignoreColor)"
- "lore('武器', contains) || lore('防具', contains)"
- "!lore('已绑定', contains)"
- "permission('lydecomposition.use')"以上配置表示:
- 名称完整等于绿色“普通装备”,或者忽略颜色后名称包含“普通装备”。
- 任意一行 Lore 包含“武器”或“防具”。
- 所有 Lore 均不能包含“已绑定”。
- 玩家必须拥有配置中的权限节点。
名称与 Lore
| 条件 | 说明 |
|---|---|
hasname() | 物品存在自定义名称 |
haslore() | 物品存在 Lore |
name('文本') | 名称完整匹配,保留颜色 |
name('文本', equals) | 名称完整匹配 |
name('文本', contains) | 名称包含文本 |
name('文本', startsWith) | 名称以文本开头 |
name('文本', endsWith) | 名称以文本结尾 |
name('文本', ignoreColor) | 忽略颜色后完整匹配 |
name('文本', contains, ignoreColor) | 忽略颜色后判断是否包含文本 |
lore('文本') | 任意一行 Lore 完整匹配 |
lore('文本', equals) | 任意一行 Lore 完整匹配 |
lore('文本', contains) | 任意一行 Lore 包含文本 |
lore('文本', startsWith) | 任意一行 Lore 以文本开头 |
lore('文本', endsWith) | 任意一行 Lore 以文本结尾 |
lore('文本', ignoreColor) | 忽略颜色后完整匹配任意一行 Lore |
lore('文本', contains, ignoreColor) | 忽略颜色后判断任意一行 Lore 是否包含文本 |
name() 和 lore() 的匹配方式只允许 equals、contains、startsWith 和 endsWith。可追加 ignoreColor 忽略颜色代码。
目标文本中的 & 颜色代码会在匹配前转换为服务端颜色符号。文本匹配区分字符大小写;只有 NBT 条件支持单独配置 ignoreCase。
材质与权限
| 条件 | 说明 |
|---|---|
material('276:0') | 匹配旧版数字物品 ID 和 Data |
material('276') | 只匹配旧版数字物品 ID |
material('DIAMOND_SWORD') | 匹配 Bukkit 材质名称 |
material('minecraft:diamond_sword') | 匹配带 minecraft: 命名空间的材质名称 |
permission('权限节点') | 玩家拥有指定权限 |
材质名称匹配不区分大小写。条件前添加 ! 可以反转结果:
yaml
condition:
- "!permission('lydecomposition.bypass')"PlaceholderAPI 条件
papi() 会先替换玩家变量,再判断括号内的完整表达式。
yaml
condition:
- "papi(%player_level% >= 5 && %player_level% <= 10)"
- "papi(%player_class% == '战士' || %player_class% == '骑士')"支持的比较运算符:
| 运算符 | 说明 |
|---|---|
== | 双方都是数字时比较数值,否则比较完整文本 |
!= | 双方都是数字时比较数值,否则比较完整文本 |
> | 数字大于 |
>= | 数字大于等于 |
< | 数字小于 |
<= | 数字小于等于 |
表达式规则:
&&的优先级高于||。- 范围运算符只在两侧都能转换为数字时成立。
==和!=在两侧都能转换为数字时按数值比较,否则按文本比较。- 没有比较运算符时,表达式内容必须等于
true,忽略大小写。 - 文本值可以使用单引号包裹。
- 使用
papi()时必须安装并启用 PlaceholderAPI。
NBT 条件
NBT 键使用单引号包裹,并支持使用点号访问嵌套节点。目标键必须存在,nbt() 才可能匹配成功。
| 条件 | 说明 |
|---|---|
hasnbt('lyfj.a.b.c') | 存在指定 NBT 节点 |
nbt('lyfj.a.b.c', 'sword') | NBT 值完整等于文本,默认使用 equals |
nbt('lyfj.attribute.level', 5) | NBT 值转换为字符串后完整等于 5 |
nbt('lyfj.a.b.c', 'bound', !=) | NBT 值不等于目标文本 |
nbt('lyfj.a.b.c', 'swo', contains) | NBT 值包含目标文本 |
nbt('lyfj.a.b.c', 'sword', startsWith) | NBT 值以目标文本开头 |
nbt('lyfj.a.b.c', 'sword', endsWith) | NBT 值以目标文本结尾 |
nbt('lyfj.a.b.c', 'SWORD', equals, ignoreCase) | 忽略英文大小写完整匹配 |
nbt('lyfj.attribute.level', 5, >) | NBT 数值大于 5 |
nbt('lyfj.attribute.level', 5, >=) | NBT 数值大于等于 5 |
nbt('lyfj.attribute.level', 10, <) | NBT 数值小于 10 |
nbt('lyfj.attribute.level', 10, <=) | NBT 数值小于等于 10 |
NBT 文本匹配支持:
| 参数 | 说明 |
|---|---|
equals | 完整匹配,默认方式 |
!= | 不等于目标文本 |
contains | 包含目标文本 |
startsWith | 以目标文本开头 |
endsWith | 以目标文本结尾 |
ignoreCase | 忽略英文大小写,可与文本匹配方式组合 |
数值比较支持 >、>=、<、<=。只有实际值和目标值都能转换为数字时才会成立。
NBT 条件依赖对应服务端版本的 NBT 适配器。当前项目包含以下适配版本:
1.7.101.8.81.11.21.12.21.13.21.14.41.15.21.16.51.17.11.18.21.19.21.19.41.20.11.20.21.20.3
未提供对应 NBT 适配器的服务端版本不能加载使用 hasnbt() 或 nbt() 的条件。
旧版规则转换
/lyfj convert 用于将旧版 LyDecompositionReload 规则转换为当前规则格式。该操作只读取旧版数据目录,不会修改旧版配置。
转换读取位置:
| 路径 | 说明 |
|---|---|
plugins/LyDecompositionReload/config.yml | 读取 decomposition-set 节点中的旧版主规则 |
plugins/LyDecompositionReload/extra | 递归读取子目录内的全部 .yml 额外规则 |
转换结果固定写入:
text
plugins/LyGalaxyDecomposition/rule/旧版转换/旧版配置转换.yml如果转换文件已经存在,覆盖前会创建固定备份文件:
text
plugins/LyGalaxyDecomposition/rule/旧版转换/旧版配置转换.yml.bak转换完成后,插件会自动执行一次当前配置重载。转换文件已生成但重载失败时,当前运行中的规则保持不变。
转换内容
| 旧版内容 | 当前格式 |
|---|---|
| 数字 ID 和 Data | 转换为 material() 条件 |
| 名称匹配 | 转换为 name() 条件 |
| Lore 匹配 | 转换为 lore() 条件 |
give | 转换为 give-item |
commands | 转换为当前规则命令格式 |
物品#数量#百分比 | 转换为空格分隔的物品、数量和 0 至 1 概率 |
%p | 转换为 %player_name% |
[player] | 移除前缀,使用玩家身份执行 |
旧版无物品库前缀的产物会明确添加 MythicMobs@ 前缀。旧版产物概率按照百分比除以 100 转换;小于 0 的概率按 0 处理,大于 100 的概率按 100 处理并产生警告。
旧版产物命令也会转换为当前 {命令} 格式。旧版产物命令没有执行身份前缀时,会按旧版行为添加 [console] 前缀。
转换生成的规则 ID 会添加 旧版_ 前缀。规则 ID 中的英文点号会替换为全角点号,转换后发生重复时会追加递增编号。
转换文件使用 UTF-8 无 BOM 编码写入。旧版输入文件可以是 UTF-8,也可以带有 UTF-8 BOM。
重载校验
执行 /lyfj reload 时会校验以下内容:
- 主配置 YAML 和规则文件 YAML 是否能够正常读取。
- 主配置根节点是否包含不支持的字段。
- 每条规则是否包含不支持的字段。
delivery-order是否为列表。delivery-order是否只包含字符串、支持的目标和不重复的目标。global-condition是否为字符串列表。- 全局条件、规则条件和
put按钮条件的基础语法。 - 条件中的括号和单引号是否完整闭合。
- 条件函数名称是否受支持。
papi()条件需要的 PlaceholderAPI 是否可用。- NBT 条件需要的服务端 NBT 适配器是否可用。
- 规则 ID 是否重复。
- 规则是否至少配置一行条件。
- 产物定义格式是否正确。
- 产物引用的物品库是否存在并已启用。
- 额外按钮编号、节点类型、字段和动作是否正确。
- 额外按钮显示物品是否能够创建。
- 额外按钮冷却是否为非负整数。
- 额外按钮的
condition、command是否符合对应动作要求。
阻止重载的常见错误:
| 错误 | 结果 |
|---|---|
| YAML 无法读取或格式错误 | 本次重载失败 |
| 主配置或规则包含未知字段 | 本次重载失败 |
| 规则 ID 重复 | 本次重载失败 |
规则没有有效 condition | 本次重载失败 |
| 条件语法错误 | 本次重载失败 |
papi() 或 NBT 条件依赖不可用 | 本次重载失败 |
| 产物格式错误 | 本次重载失败 |
| 产物物品库不可用 | 本次重载失败 |
| 额外按钮配置错误 | 本次重载失败 |
give-item: true 但没有 result | 只产生警告,允许重载 |
重载失败时,控制台会输出全部错误,指令发送者也会收到错误列表。重载成功时,会显示加载的规则数量、额外按钮数量和警告数量。