LyDecompositionReload
LyDecompositionReload 是一款基于 GUI 的物品分解插件。玩家将物品放入分解界面后,插件会按照物品数字 ID、子 ID、显示名称、Lore 和禁止分解 Lore 匹配规则,再根据配置发放随机产物并执行命令。
分解规则支持写入主配置,也可以拆分到插件目录下的 extra 文件夹。插件会递归读取该目录中的所有 .yml 文件。
插件信息
| 项目 | 内容 |
|---|---|
| 插件名 | LyDecompositionReload |
| 版本 | 1.1.1 |
| 作者 | Liyuan |
| 主命令 | /lyfj |
| Java 版本 | Java 8 |
| Bukkit API 声明 | 1.13 |
| 编译使用的服务端 API | Paper 1.16.5-R0.1-SNAPSHOT |
| 插件软依赖 | MythicMobs |
版本说明
项目使用 Paper 1.16.5-R0.1-SNAPSHOT 编译,并在代码中加入了旧版数字 ID、子 ID 和英文材质名兼容逻辑。plugin.yml 声明的 API 版本为 1.13,项目文件没有提供完整的实测 Minecraft 版本范围。使用其他服务端版本前,应自行测试材质读取、物品库和界面行为。
依赖与物品库
MythicMobs
未使用带前缀的物品 ID,且没有启用其他全局物品库时,插件会从 MythicMobs 读取分解产物。代码兼容 MythicMobs 4 的读取方式以及较新版本的 MythicBukkit API。
如果分解产物直接填写 MythicMobs 物品 ID,应安装对应版本的 MythicMobs。
其他物品库
产物物品 ID 可以使用带前缀的格式:
text
物品库前缀@物品ID当前代码中包含以下读取方式:
| 物品库 | 指定格式 | 全局配置开关 | 读取失败时的处理 |
|---|---|---|---|
| AzureFlow | AzureFlow@物品ID | AzureFlow | 回退到 MythicMobs |
| NeonFlash | NeonFlash@物品ID | 无 | 直接调用 NeonFlash 读取 |
| SX-Item | SX-Item@物品ID | SX-Item | 回退到 MythicMobs |
| NeigeItems | neigeItems@物品ID | neigeItems | 回退到 MythicMobs |
| OriginAttribute | originAttribute@物品ID | originAttribute | 回退到 MythicMobs |
| MythicMobs | 直接填写物品 ID | 无 | 默认来源或回退来源 |
全局开关的读取优先级为:AzureFlow、SX-Item、neigeItems、originAttribute。启用全局开关后,未带前缀的产物会优先从对应物品库读取。
警告
只应开启服务器中已经安装并且 API 兼容的物品库。带前缀的物品格式会直接调用对应物品库 API;物品库不存在、物品 ID 错误或 API 不兼容时,产物可能无法生成。
PlaceholderAPI
以下功能会调用 PlaceholderAPI:
papi:{表达式}额外条件。- 产物格式中附加的控制台命令。
使用这些功能时,需要安装 PlaceholderAPI,并安装表达式中所使用变量对应的扩展。
LyLootsWareHouse
启用 is-save-to-lylootswarehouse 后,插件会检查 LyLootsWareHouse 是否启用,以及仓库 API 中是否存在对应物品 ID。检查通过时,产物会直接存入玩家仓库;否则会正常发放到玩家背包。
核心功能
| 功能 | 说明 |
|---|---|
| GUI 分解 | 使用 54 格界面放入物品、预览产物并执行分解 |
| 多规则匹配 | 同一个物品可以匹配多条规则,匹配到的规则会依次执行 |
| 数字 ID 匹配 | 支持物品数字 ID和子 ID |
| 名称匹配 | 支持显示名称完整匹配或包含匹配 |
| Lore 匹配 | 支持任意一行 Lore 完整匹配或包含匹配 |
| 禁止分解 Lore | Lore 中包含指定关键词的物品不会被识别为可分解物品 |
| 随机产物 | 支持固定数量、数量范围和概率 |
| 额外条件 | 支持 PlaceholderAPI 表达式、权限、无权限和随机概率条件 |
| 概率调整 | 额外结果可以增加、减少或覆盖当前规则的产物概率修正值 |
| 规则命令 | 支持以玩家、控制台或临时 OP 身份执行命令 |
| 产物命令 | 产物成功生成后可以执行附加的 PlaceholderAPI 控制台命令 |
| 快捷放入 | 根据 Lore 关键词批量放入玩家背包中的物品 |
| 快捷取回 | 将分解区域内的全部物品返还到玩家背包 |
| 自动返还 | 关闭界面时自动返还尚未分解的物品 |
| 多文件规则 | 自动递归读取 extra 目录中的所有 .yml 文件 |
| 仓库存入 | 可将产物直接存入 LyLootsWareHouse |
| Java API | 提供根据 ItemStack 查询全部匹配分解规则的接口 |
指令
plugin.yml 只声明了 /lyfj 命令,没有声明权限节点。权限判断使用 Bukkit 的 OP 状态。
| 指令 | 执行者 | 权限要求 | 说明 |
|---|---|---|---|
/lyfj | 任意命令发送者 | OP 才显示帮助 | 显示可用子命令 |
/lyfj open | 玩家 | 无权限节点限制 | 打开分解界面 |
/lyfj reload | 玩家或控制台 | 必须为 OP | 重载配置、分解规则和额外按钮 |
未通过 OP 判断时,插件不会执行对应操作。open 还要求执行者是玩家。
Tab 补全仅向 OP 返回 open 和 reload。
分解界面
界面固定为 54 格,标题由 gui.title 配置。默认区域如下:
| 槽位 | 用途 |
|---|---|
0-17 | 待分解物品区域,实际开放数量由 open-decomposition-slot 决定 |
18-26 | 分隔区域,22 号槽位为分解按钮 |
27-44 | 产物预览区域 |
45-53 | 额外按钮区域,对应配置索引 0-8 |
open-decomposition-slot 最大支持 18。未开放的上方槽位会显示填充物品。
分解按钮
| 点击方式 | 行为 |
|---|---|
| 左键 | 查找第一个可分解槽位,并处理该槽位中的整组物品 |
| 非左键点击 | 最多循环处理开放槽位数量次,每次查找当前第一个可分解槽位并处理整组物品 |
每处理一个物品,插件会按照该物品匹配到的全部规则执行产物概率计算。分解按钮和额外按钮都有 1 秒点击冷却。
其他界面行为
- 分解区域以外的顶部容器槽位不可直接修改。
- 界面禁止拖拽。
- 物品放入、取出或移动后会刷新产物预览。
- 预览内容来自分解区域中第一个可分解物品。
- 预览会列出该物品匹配到的全部规则产物。
- 预览数量范围显示最大数量,实际分解时仍会重新随机计算。
物品匹配机制
插件会遍历当前加载的全部分解规则。一个物品可以同时匹配多条规则,所有匹配规则都会参与实际分解。
同一条规则中的有效匹配条件需要全部满足。未配置或使用默认值的条件不参与限制。
| 配置项 | 匹配方式 |
|---|---|
id | 使用 数字ID:子ID 格式匹配物品数字 ID 和子 ID;ID 与子 ID 大于 0 时才参与限制 |
name | 匹配物品显示名称 |
lore | 匹配物品 Lore 中的任意一行 |
containsName | true 为名称包含匹配,false 为名称完整匹配 |
containsLore | true 为 Lore 包含匹配,false 为 Lore 完整匹配 |
示例:
yaml
decomposition-set:
'钻石剑分解':
id: '276:0'
name: '&b强化钻石剑'
lore: '&7可分解'
containsName: false
containsLore: true
give: true
result:
- '材料#1-2#100'规则加载时会将名称、Lore 和禁止分解 Lore 中的 & 颜色代码转换为 Minecraft 颜色代码。配置带颜色的内容时,应按照物品实际显示文本填写。
禁止分解 Lore
prohibit-decomposition-lore 是全局禁止列表。物品任意一行 Lore 包含其中一个关键词时,该物品不会匹配任何分解规则。
yaml
prohibit-decomposition-lore:
- '已绑定'分解规则
分解规则可以写在主配置的 decomposition-set 下,也可以写在 extra 目录中任意 .yml 文件的 decomposition-set 下。
规则字段
| 配置键 | 类型 | 默认值 | 说明 |
|---|---|---|---|
id | 字符串 | 0:0 | 物品数字 ID 和子 ID,格式为 数字ID:子ID |
name | 字符串 | 空字符串 | 物品显示名称匹配文本 |
lore | 字符串 | 空字符串 | 任意一行 Lore 的匹配文本 |
containsName | 布尔值 | false | 是否对名称使用包含匹配 |
containsLore | 布尔值 | false | 是否对 Lore 使用包含匹配 |
give | 布尔值 | true | 是否发放 result 中的产物 |
commands | 字符串列表 | 空列表 | 每次执行规则时执行的命令 |
extra-condition | 配置段 | 无 | 额外条件组 |
result | 字符串列表 | 空列表 | 产物配置 |
规则名称只作为配置节点标识使用,不会单独参与物品匹配。规则必须位于 decomposition-set 下。
规则命令
commands 中的命令根据前缀决定执行身份:
| 前缀 | 执行身份 | 说明 |
|---|---|---|
[console] | 控制台 | 去除前缀后由控制台执行 |
[op] | 玩家临时 OP | 临时给予玩家 OP,执行后恢复原状态 |
| 无前缀 | 玩家 | 由玩家身份执行 |
规则命令支持 %p,执行时会替换为玩家名称。
yaml
commands:
- '[console]bc %p 分解了物品'
- '[player]say %p 完成分解'
- '[op]某个需要OP的命令 %p'[player] 不是特殊解析前缀,代码会按普通玩家命令处理;文档中的写法仅用于表达执行身份。
分解产物
基础格式如下:
yaml
result:
- '物品ID#数量#概率'
- '物品ID#最小数量-最大数量#概率'| 部分 | 说明 |
|---|---|
物品ID | 物品库中的物品 ID,可携带物品库前缀 |
数量 | 固定发放数量 |
最小数量-最大数量 | 在指定范围内随机生成数量 |
概率 | 以 100 为基准的概率,支持小数 |
示例:
yaml
result:
- '铁锭#2#100'
- '钻石#1-3#25.5'
- 'MythicItem@强化材料#1#50'数量范围为闭区间,实际数量会在最小值和最大值之间随机生成。每个产物独立进行概率判断。
产物附加命令
产物字符串可以继续使用 # 添加控制台命令:
yaml
result:
- '材料#1-2#100#say %player_name% 完成了一次分解'产物通过概率判断并成功读取后,附加命令会先经过 PlaceholderAPI 替换,再由控制台执行。
give: false 会关闭该规则的产物发放,但该规则配置的 commands 以及额外条件中已经执行的命令仍可能执行。
额外条件
额外条件写在规则的 extra-condition 下。每个条件组包含 condition 和 result:
yaml
extra-condition:
'等级条件':
condition:
- 'papi:{%player_level% >= 10}'
- 'permission:{lyfj.use}'
result:
- '$msg:{&a条件通过}'
- '$addChance:{10}'同一个条件组中的所有条件都必须通过,该组的结果才会加入处理结果。多个条件组可以同时生效并叠加结果。
条件格式
| 格式 | 说明 |
|---|---|
papi:{表达式} | 先替换 PlaceholderAPI 变量,再计算表达式 |
permission:{权限} | 玩家拥有指定权限时通过 |
nopermission:{权限} | 玩家没有指定权限时通过 |
roll:{概率} | 以 100 为基准进行随机判断 |
papi 表达式支持 >、<、>=、<= 和 ==,多个判断可以使用 && 连接。
yaml
condition:
- 'papi:{%player_level% >= 10 && %player_level% < 50}'
- 'permission:{lyfj.decompose}'条件结果格式
| 格式 | 说明 |
|---|---|
$continue | 跳过当前结果,继续处理其他结果 |
$return | 立即终止当前分解规则 |
$msg:{文本} | 向玩家发送消息,支持 & 颜色代码 |
$addChance:{数值} | 增加当前规则的概率修正值 |
$takeChance:{数值} | 减少当前规则的概率修正值 |
$setChance:{数值} | 将当前规则的概率修正值设为指定数值 |
$consoleCmd:{指令} | 以控制台身份执行指令,支持 %p |
$playerCmd:{指令} | 以玩家身份执行指令 |
$opCmd:{指令} | 临时给予玩家 OP 后执行指令,再恢复原状态 |
概率修正值会加到当前规则每一项产物的基础概率上。
额外按钮
界面底部支持 0-8 共 9 个额外按钮。按钮配置位于主配置的 extra-button 下。
| 配置键 | 类型 | 说明 |
|---|---|---|
extra-button.<索引>.type | 字符串 | 按钮操作类型 |
extra-button.<索引>.item | 字符串 | 按钮显示物品,使用数字 ID 和子 ID |
extra-button.<索引>.name | 字符串 | 按钮显示名称 |
extra-button.<索引>.lore | 字符串列表 | 按钮 Lore |
索引必须在 0-8 范围内。
快捷放入
格式为:
yaml
extra-button:
0:
type: 'put:&7品质: &a一般'
item: '160:5'
name: '&7一键放入一般品质物品'
lore:
- '[点我]'put: 后的内容会作为 Lore 关键词。插件检查玩家背包前 36 个槽位,将 Lore 任意一行包含该关键词的物品放入分解区域。
快捷取回
yaml
extra-button:
8:
type: 'get'
item: '160:7'
name: '&7一键取回全部物品'
lore: []get 会尝试将分解区域内的物品全部放回玩家背包。背包无法接收时,会保留无法取出的物品并停止继续处理。
返还与背包空间
执行分解前,插件会根据当前匹配到的规则中 result 条目数量检查玩家背包空槽。空槽不足时会取消操作,并发送 message.fail。
分解过程中,插件还会在每次处理物品前再次检查空槽数量。检查使用的是产物条目数量,不是最终产物堆叠后的精确槽位数量。
关闭界面时,插件会将开放分解槽位中的剩余物品返还到玩家背包。
| 配置 | 行为 |
|---|---|
drop-near: true | 背包无法接收的物品掉落在玩家当前位置,并发送 message.inv-max |
drop-near: false | 不执行满背包掉落处理 |
配置项总览
物品库开关
| 配置键 | 默认值 | 说明 |
|---|---|---|
LyEntryReload | false | 配置文件中存在此开关,但当前提供的物品读取代码没有使用它 |
neigeItems | false | 启用未带前缀物品的 NeigeItems 优先读取 |
originAttribute | false | 启用未带前缀物品的 OriginAttribute 优先读取 |
AzureFlow | false | 启用未带前缀物品的 AzureFlow 优先读取 |
SX-Item | false | 启用未带前缀物品的 SX-Item 优先读取 |
界面配置
| 配置键 | 类型 | 说明 |
|---|---|---|
gui.title | 字符串 | 界面标题 |
gui.fill-item | 字符串 | 填充区域物品,使用数字 ID 和子 ID |
gui.fill-name | 字符串 | 填充物品名称 |
gui.button-item | 字符串 | 分解按钮物品 |
gui.button-name | 字符串 | 分解按钮名称 |
gui.button-lore | 字符串列表 | 分解按钮 Lore |
gui.lore-add | 字符串列表 | 追加到预览产物 Lore 的文本 |
open-decomposition-slot | 整数 | 开放的分解槽位数量,最大为 18 |
gui.lore-add 支持以下替换内容:
| 占位符 | 内容 |
|---|---|
%chance% | 产物基础概率,预览时格式化为两位小数 |
%min% | 产物最小数量 |
%max% | 产物最大数量 |
消息配置
| 配置键 | 说明 |
|---|---|
message.inv-max | 关闭界面时背包已满的提示 |
message.success | 分解完成提示 |
message.result | 获得产物提示 |
message.fail | 分解失败或背包空间不足提示 |
消息中的替换内容:
| 占位符 | 内容 |
|---|---|
%name | 被分解物品的显示名称;没有显示名称时使用材质名称 |
%item | 获得产物的显示名称;没有显示名称时使用材质名称 |
%amount | 获得数量;存入仓库时会附加仓库提示 |
%slot | 当前分解预检查需要的空槽数量 |
示例:
yaml
message:
inv-max: '&c背包已满,待分解物品掉落在地。'
success: '&a分解完毕!'
result: '&f分解%name获得了%item x %amount'
fail: '&7分解失败,请查看是否有物品可分解或背包不足%slot格'其他配置
| 配置键 | 默认值 | 说明 |
|---|---|---|
drop-near | true | 关闭界面返还物品时,背包已满是否掉落在地 |
prohibit-decomposition-lore | 空列表 | 包含指定 Lore 关键词的物品禁止分解 |
is-save-to-lylootswarehouse | false | 是否尝试将产物存入 LyLootsWareHouse |
extra-button | 空配置段 | 配置底部快捷按钮 |
decomposition-set | 配置段 | 主配置中的分解规则 |
配置文件加载
插件重载时会执行以下操作:
- 重载主配置文件。
- 设置全局禁止分解 Lore。
- 清空并重新加载主配置中的
decomposition-set。 - 递归读取
plugins/LyDecompositionReload/extra中的所有.yml文件。 - 加载这些文件中的
decomposition-set。 - 清空并重新加载
extra-button。
同名规则 ID 后加载的内容会覆盖先加载的内容,因为规则使用规则名称作为 Map 键保存。额外规则文件中的配置路径仍然必须以 decomposition-set 开头。
Java API
插件公开 LyDecompositionAPI 接口:
java
List<Decomposition> getDecompositionResult(ItemStack item);可以通过插件主类的静态方法获取 API:
java
LyDecompositionAPI api = Start.getAPI();
List<Decomposition> rules = api.getDecompositionResult(itemStack);该方法会返回指定物品匹配到的全部 Decomposition 规则。传入 null 时返回空列表。
API 当前只提供规则查询,不提供公开的单条规则添加、删除或重载方法。
机制说明
规则执行顺序
- 从分解槽位中查找第一个可分解物品。
- 查询该物品匹配到的全部分解规则。
- 按匹配结果依次执行每条规则。
- 每条规则先计算额外条件结果。
- 根据条件结果修改概率、发送消息或执行命令。
- 对规则中的每个产物独立进行概率判断。
- 创建产物并发放到背包,或在满足条件时存入仓库。
- 执行规则中的
commands。
预览与实际分解
预览只展示第一个可分解物品的产物。预览中的概率和数量范围来自规则配置,不会提前消耗物品,也不会提前执行额外条件结果。
实际点击分解时,插件会重新计算额外条件、概率和随机数量。因此预览内容不代表本次分解一定获得的最终结果。
常见问题
为什么物品无法匹配规则?
检查以下内容:
id是否使用正确的数字 ID 和子 ID。name是否与物品显示名称完全一致,或是否开启了containsName。lore是否位于物品任意一行 Lore 中,或是否开启了containsLore。- 物品 Lore 是否包含
prohibit-decomposition-lore中的禁止关键词。 - 配置中的颜色代码是否与物品实际显示内容一致。
- 规则是否位于
decomposition-set下,并且重载是否成功。
为什么产物读取失败?
检查物品 ID 的来源:
- 带前缀的物品 ID 是否使用了正确格式,例如
SX-Item@物品ID。 - 对应物品库是否安装并正常运行。
- 全局物品库开关是否开启。
- MythicMobs 是否安装,或默认物品 ID 是否实际存在。
- 物品库 API 是否与当前服务端版本兼容。
为什么预览和实际结果不同?
预览只显示配置中的产物、概率和数量范围。实际分解时会重新执行额外条件和随机判断,产物还可能因为概率未通过而不生成。
为什么关闭界面后物品没有正常返还?
检查 drop-near 配置。drop-near: true 时,背包无法接收的物品会掉落在玩家当前位置;设置为 false 时,插件不会执行满背包掉落处理。
为什么点击按钮没有反应?
检查以下内容:
- 是否距离上一次分解或按钮点击不足 1 秒。
- 分解按钮是否位于
22号槽位。 - 执行
/lyfj open的发送者是否为玩家。 - 插件是否已经完成启动验证并注册 GUI 监听器。
为什么分解提示背包空间不足?
插件会按照匹配规则中的产物条目数量检查背包空槽,并在每次处理物品前再次检查。即使最终产物可以堆叠,也可能因为配置中的产物条目数量较多而触发空间不足提示。
页面导航
| 页面 | 内容 |
|---|---|
| 配置说明 | 主配置、界面、消息、快捷按钮、分解规则和额外条件 |
| 常见问题 | 物品匹配、物品库、背包空间、预览和产物排查 |
| 更新日志 | 插件与文档的更新记录 |