Skip to content

LyDecompositionReload

LyDecompositionReload 是一款基于 GUI 的物品分解插件。玩家将物品放入分解界面后,插件会按照物品数字 ID、子 ID、显示名称、Lore 和禁止分解 Lore 匹配规则,再根据配置发放随机产物并执行命令。

分解规则支持写入主配置,也可以拆分到插件目录下的 extra 文件夹。插件会递归读取该目录中的所有 .yml 文件。

插件信息

项目内容
插件名LyDecompositionReload
版本1.1.1
作者Liyuan
主命令/lyfj
Java 版本Java 8
Bukkit API 声明1.13
编译使用的服务端 APIPaper 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

当前代码中包含以下读取方式:

物品库指定格式全局配置开关读取失败时的处理
AzureFlowAzureFlow@物品IDAzureFlow回退到 MythicMobs
NeonFlashNeonFlash@物品ID直接调用 NeonFlash 读取
SX-ItemSX-Item@物品IDSX-Item回退到 MythicMobs
NeigeItemsneigeItems@物品IDneigeItems回退到 MythicMobs
OriginAttributeoriginAttribute@物品IDoriginAttribute回退到 MythicMobs
MythicMobs直接填写物品 ID默认来源或回退来源

全局开关的读取优先级为:AzureFlowSX-ItemneigeItemsoriginAttribute。启用全局开关后,未带前缀的产物会优先从对应物品库读取。

警告

只应开启服务器中已经安装并且 API 兼容的物品库。带前缀的物品格式会直接调用对应物品库 API;物品库不存在、物品 ID 错误或 API 不兼容时,产物可能无法生成。

PlaceholderAPI

以下功能会调用 PlaceholderAPI:

  • papi:{表达式} 额外条件。
  • 产物格式中附加的控制台命令。

使用这些功能时,需要安装 PlaceholderAPI,并安装表达式中所使用变量对应的扩展。

LyLootsWareHouse

启用 is-save-to-lylootswarehouse 后,插件会检查 LyLootsWareHouse 是否启用,以及仓库 API 中是否存在对应物品 ID。检查通过时,产物会直接存入玩家仓库;否则会正常发放到玩家背包。

核心功能

功能说明
GUI 分解使用 54 格界面放入物品、预览产物并执行分解
多规则匹配同一个物品可以匹配多条规则,匹配到的规则会依次执行
数字 ID 匹配支持物品数字 ID和子 ID
名称匹配支持显示名称完整匹配或包含匹配
Lore 匹配支持任意一行 Lore 完整匹配或包含匹配
禁止分解 LoreLore 中包含指定关键词的物品不会被识别为可分解物品
随机产物支持固定数量、数量范围和概率
额外条件支持 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 返回 openreload

分解界面

界面固定为 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 中的任意一行
containsNametrue 为名称包含匹配,false 为名称完整匹配
containsLoretrue 为 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 下。每个条件组包含 conditionresult

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不执行满背包掉落处理

配置项总览

物品库开关

配置键默认值说明
LyEntryReloadfalse配置文件中存在此开关,但当前提供的物品读取代码没有使用它
neigeItemsfalse启用未带前缀物品的 NeigeItems 优先读取
originAttributefalse启用未带前缀物品的 OriginAttribute 优先读取
AzureFlowfalse启用未带前缀物品的 AzureFlow 优先读取
SX-Itemfalse启用未带前缀物品的 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-neartrue关闭界面返还物品时,背包已满是否掉落在地
prohibit-decomposition-lore空列表包含指定 Lore 关键词的物品禁止分解
is-save-to-lylootswarehousefalse是否尝试将产物存入 LyLootsWareHouse
extra-button空配置段配置底部快捷按钮
decomposition-set配置段主配置中的分解规则

配置文件加载

插件重载时会执行以下操作:

  1. 重载主配置文件。
  2. 设置全局禁止分解 Lore。
  3. 清空并重新加载主配置中的 decomposition-set
  4. 递归读取 plugins/LyDecompositionReload/extra 中的所有 .yml 文件。
  5. 加载这些文件中的 decomposition-set
  6. 清空并重新加载 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 当前只提供规则查询,不提供公开的单条规则添加、删除或重载方法。

机制说明

规则执行顺序

  1. 从分解槽位中查找第一个可分解物品。
  2. 查询该物品匹配到的全部分解规则。
  3. 按匹配结果依次执行每条规则。
  4. 每条规则先计算额外条件结果。
  5. 根据条件结果修改概率、发送消息或执行命令。
  6. 对规则中的每个产物独立进行概率判断。
  7. 创建产物并发放到背包,或在满足条件时存入仓库。
  8. 执行规则中的 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 监听器。

为什么分解提示背包空间不足?

插件会按照匹配规则中的产物条目数量检查背包空槽,并在每次处理物品前再次检查。即使最终产物可以堆叠,也可能因为配置中的产物条目数量较多而触发空间不足提示。

页面导航

页面内容
配置说明主配置、界面、消息、快捷按钮、分解规则和额外条件
常见问题物品匹配、物品库、背包空间、预览和产物排查
更新日志插件与文档的更新记录