套装配置
套装配置用于定义部件匹配规则、展示文本、属性层数和药水效果。插件会统计指定槽位中已匹配的部件数量,并按照当前数量启用对应层数。
套装可以写在主配置 config.yml 中,也可以拆分到插件目录下的 extra 文件夹。每个配置文件都必须以 suit: 作为根节点。
配置文件位置
| 位置 | 说明 |
|---|---|
plugins/LySuitReload/config.yml | 主配置文件,可直接在 suit: 下定义套装 |
plugins/LySuitReload/extra/*.yml | 额外套装文件,插件会递归读取其中的 YAML 文件 |
plugins/LySuitReload/extra/示例套装.yml | 插件生成的示例文件,加载时会被跳过 |
如需使用示例文件,请复制或重命名后再修改。不同文件中的套装 ID 也不要重复,重复 ID 会互相覆盖。
只有 plugin-slot 中配置的槽位会参与物品匹配。套装规则正确但始终无法激活时,应先检查对应装备槽位是否已经加入扫描列表。
完整结构
yaml
suit:
'套装1':
permission: ''
papi:
- '%player_level% >= 0'
set:
测试头盔: 'name=测试头盔'
测试衣服: 'lore=测试衣服'
测试裤子: 'nbt=a.b.c=测试裤子'
复合部件: 'name=远古;lore=套装;permission=suit.vip'
lore:
- '&6测试套装 [<now>/<max>]'
- '<state-测试头盔>测试头盔'
- '<state-测试衣服>测试衣服'
- '<state-测试裤子>测试裤子'
- '&7当前激活 &6<now-layer>件 &7套装属性:'
- '<sx>'
- '&7达到 &6<next-layer>件 &7可获得属性:'
- '<next-sx>'
sx:
1:
- '攻击力+1'
2:
- '攻击力+2'
effect:
1:
- 'SPEED-1'
2:
- 'SPEED-2'套装字段
| 字段 | 是否必需 | 说明 |
|---|---|---|
permission | 否 | 套装级权限配置。当前代码存在读取位置异常,详见下方说明 |
papi | 否 | 套装整体 PlaceholderAPI 条件,列表内条件必须全部满足 |
set | 是 | 套装部件及其匹配规则 |
lore | 是 | 套装信息的显示模板 |
sx | 否 | 不同激活层数对应的属性文本 |
effect | 否 | 不同激活层数对应的药水效果 |
set 和 lore 会被直接读取,配置套装时应保留这两个节点。sx 与 effect 可以按实际需要省略。
套装 ID
suit 下的每个子节点都是一个套装 ID:
yaml
suit:
'烈焰套装':
set: {}
lore: []套装 ID 会用于:
- 区分不同套装的数据。
- PlaceholderAPI 变量指定目标套装。
- DragonCore 鼠标物品提示识别套装。
- 查询当前套装已匹配的部件数量。
ID 必须保持唯一,并与变量中填写的 ID 完全一致。
套装级权限
配置格式为:
yaml
suit:
'套装1':
permission: 'suit.vip'留空或删除时表示不进行套装级权限限制。
当前版本注意
项目版本 1.1.3 的代码从 YAML 根节点读取 permission,没有按 suit.套装ID.permission 读取。因此,示例位置中的套装级 permission 在当前代码中可能不会生效。这属于当前实现的读取问题,不能通过调整套装节点写法可靠解决。
如需权限参与部件激活,可以使用 set 规则中的 permission=权限节点 或 nopermission=权限节点。这两种部件条件在当前匹配逻辑中会被实际处理。
套装整体 PAPI 条件
papi 用于限制整个套装是否参与匹配。列表内任意条件不满足时,该套装本次不会激活任何部件。
yaml
suit:
'等级套装':
papi:
- '%player_level% >= 30'
- '%player_health% > 0'该功能需要 PlaceholderAPI。表达式会先替换变量,再进行条件判断。
支持的表达式内容如下:
| 类型 | 写法 |
|---|---|
| 大于 | > |
| 小于 | < |
| 大于等于 | >= |
| 小于等于 | <= |
| 等于 | == |
| 不等于 | != |
| 逻辑与 | && |
| 逻辑或 | || |
| 数学运算 | +、-、*、/、括号 |
| 布尔值 | true,不区分大小写 |
数值条件示例:
yaml
papi:
- '%player_level% >= 30 && %player_health% > 0'
- '%player_level% * 2 >= 60'字符串相等比较时,两侧都应使用引号:
yaml
papi:
- '"%player_world%" == "world"'部件匹配
set 下的键是部件 ID,值是该部件的匹配规则。
yaml
set:
烈焰头盔: 'name=烈焰头盔'
烈焰胸甲: 'lore=烈焰套装'部件 ID 会用于 <state-部件ID> 展示占位,因此修改部件 ID 时也要同步修改 lore 中的对应内容。
匹配类型
| 写法 | 检测对象 | 判断方式 |
|---|---|---|
name=文本 | 物品显示名 | 显示名包含指定文本时匹配 |
lore=文本 | 物品 Lore | 任意一行 Lore 包含指定文本时匹配 |
nbt=路径=值 | 物品 NBT | 指定路径的字符串值与目标值完全一致时匹配 |
papi=条件 | 玩家变量 | PlaceholderAPI 条件成立时匹配 |
permission=权限 | 玩家权限 | 玩家拥有指定权限时匹配 |
nopermission=权限 | 玩家权限 | 玩家没有指定权限时匹配 |
name 和 lore 使用包含匹配,不要求物品文本完全相同。配置中的 & 颜色代码会在加载时转换为 Minecraft 颜色符号,因此可以在匹配文本中使用颜色代码。
多条件匹配
同一部件可以使用英文分号 ; 连接多个条件。所有条件都满足后,该部件才会激活。
yaml
set:
远古头盔: 'name=远古;lore=套装;permission=suit.vip'条件前后的空白会被移除,以下写法也可以正常解析:
yaml
set:
远古头盔: 'name=远古; lore=套装; permission=suit.vip'空条件、未知条件类型或格式错误的 NBT 条件会使整条部件规则无效,并在控制台输出警告。
纯玩家条件部件
部件规则可以只包含 papi、permission 或 nopermission:
yaml
set:
VIP加成: 'permission=suit.vip'
高等级加成: 'papi=%player_level% >= 50'这类规则不依赖物品。玩家满足条件后,该部件会直接计入当前套装数量。
部件计数规则
- 每个部件 ID 最多计入一次。
- 多个物品同时满足同一个部件规则时,仍然只计算一个部件。
- 同一个物品可以同时满足多个不同的部件规则。
- 部件数量等于当前已命中的不同部件 ID 数量。
- 未加入
plugin-slot的装备不会参与name、lore和nbt匹配。
如果不同部件必须由不同物品激活,应为每件物品设置能够互相区分的名称、Lore 或 NBT 条件。
NBT 匹配
NBT 规则格式为 nbt=路径=值:
yaml
set:
特殊装备: 'nbt=a.b.c=目标值'其中:
| 部分 | 说明 |
|---|---|
a.b.c | 使用英文句点分隔的嵌套 NBT 路径 |
目标值 | 最后一层节点必须匹配的字符串值 |
NBT 路径中的中间节点必须是复合标签,最后一个节点必须是字符串标签,并且字符串内容需要完整相等。
目标值中可以继续包含等号。插件只将 nbt= 后出现的第一个等号作为路径和值的分隔符。
yaml
set:
特殊装备: 'nbt=item.data=type=fire'以上规则读取的路径是 item.data,目标值是 type=fire。
NBT 版本限制
当前代码只为以下服务端版本初始化 NBT 检测实现:
| 服务端版本 | NBT 匹配 |
|---|---|
1.7.10 | 支持 |
1.12.2 | 支持 |
| 其他版本 | 不支持,控制台会提示当前版本不支持 NBT 检测 |
在其他版本中,name、lore 和玩家条件仍可使用,但 nbt 条件不会成功匹配。
展示文本
lore 是套装信息的显示模板:
yaml
lore:
- '&6烈焰套装 [<now>/<max>]'
- '<state-烈焰头盔>烈焰头盔'
- '<state-烈焰胸甲>烈焰胸甲'
- '&7当前生效层数: &6<now-layer>'
- '<sx>'
- '&7下一属性层数: &6<next-layer>'
- '<next-sx>'文本中的 & 会在加载时转换为 Minecraft 颜色符号。
展示占位
| 占位 | 说明 |
|---|---|
<now> | 当前已激活的部件数量 |
%now | 当前已激活的部件数量,与 <now> 作用相同 |
<max> | set 下定义的部件总数 |
<state-部件ID> | 根据指定部件是否激活,替换为已收集或未收集前缀 |
<now-layer> | 当前实际使用的 sx 层数 |
<next-layer> | 从当前部件数量之后查找到的下一项 sx 层数 |
<sx> | 展开当前层数的全部属性文本 |
<next-sx> | 展开下一层的全部属性文本 |
<state-部件ID> 中的部件 ID 必须与 set 下的键完全一致:
yaml
set:
烈焰头盔: 'name=烈焰头盔'
lore:
- '<state-烈焰头盔>烈焰头盔'已激活和未激活状态的替换内容由主配置中的 have-item-replace 与 no-item-replace 控制。
属性列表占位限制
<sx> 和 <next-sx> 只有在单独占据整行时才会展开为多行属性:
yaml
lore:
- '&7当前属性:'
- '<sx>'
- '&7下一层属性:'
- '<next-sx>'不要将它们与其他文本写在同一行:
yaml
lore:
- '&7当前属性: <sx>'以上写法不会展开属性列表。
当当前部件数量尚未达到任何 sx 层数时,<sx> 会显示 §7无。如果没有找到可用的下一层属性,<next-sx> 不会插入内容。
属性层数
sx 按激活部件数量设置属性文本。层数键必须是整数:
yaml
sx:
1:
- '攻击力+1'
3:
- '攻击力+5'
- '生命值+100'插件不要求每一级都配置。当前激活数量为 2 时,会使用不大于 2 的最高配置层,即第 1 层;当前激活数量达到 3 时,使用第 3 层。
| 已激活部件数 | 实际使用层数 | 生效内容 |
|---|---|---|
0 | 无 | 不下发套装属性 |
1 | 1 | 攻击力+1 |
2 | 1 | 攻击力+1 |
3 或更多 | 3 | 攻击力+5、生命值+100 |
sx 中的字符串会原样交给主配置 attribute-plugin 指定的属性插件解析。具体属性格式由对应属性插件决定,LySuitReload 不解析属性名称和数值。
属性任务每 40 Tick 检查一次在线玩家。玩家的最终属性列表没有变化时,插件会跳过重复下发。
下一层计算
<next-layer> 会从当前已激活部件数量之后,查找下一个存在于 sx 中的层数。
yaml
sx:
1:
- '攻击力+1'
4:
- '攻击力+8'当前拥有 2 个部件时,下一层为 4,<next-sx> 会展开第 4 层内容。
如果后续没有找到更高的 sx 层数,内部数值会保留为当前部件数量。仅当 sx 中正好存在该数值时,<next-sx> 才会继续显示对应内容。
药水效果
effect 按激活部件数量设置持续获得的药水效果:
yaml
effect:
1:
- 'SPEED-1'
2:
- 'SPEED-2'格式为:
text
药水类型-数值插件会选择不大于当前部件数量的最高 effect 层。药水层数独立根据 effect 节点计算,不要求 sx 中存在相同层数。
yaml
sx:
1:
- '攻击力+1'
effect:
3:
- 'SPEED-1'以上配置中,属性在 1 件时生效,药水效果在 3 件时生效。
效果数值
配置中的数字会直接作为 Bukkit 药水效果的 amplifier 参数传入。按照 Bukkit 的等级计算方式,0 对应游戏内 I 级,1 对应游戏内 II 级。
yaml
effect:
1:
- 'SPEED-0'以上配置对应速度 I。
药水任务每 40 Tick 执行一次,每次添加持续 60 Tick 的效果。玩家已有同类型且等级更高的效果时,套装效果不会覆盖它;已有等级不高于套装配置时,会移除后重新应用套装效果。
配置中列出的药水类型
| 类型 | 含义 |
|---|---|
SPEED | 速度 |
FAST_DIGGING | 急迫 |
SLOW_DIGGING | 挖掘疲劳 |
INCREASE_DAMAGE | 力量 |
HEAL | 瞬间治疗 |
HARM | 瞬间伤害 |
JUMP | 跳跃提升 |
CONFUSION | 反胃 |
REGENERATION | 生命回复 |
DAMAGE_RESISTANCE | 抗性提升 |
FIRE_RESISTANCE | 防火 |
WATER_BREATHING | 水下呼吸 |
INVISIBILITY | 隐身 |
BLINDNESS | 失明 |
NIGHT_VISION | 夜视 |
HUNGER | 饥饿 |
WEAKNESS | 虚弱 |
POISON | 中毒 |
WITHER | 凋零 |
HEALTH_BOOST | 生命提升 |
ABSORPTION | 吸收 |
SATURATION | 饱和 |
药水名称会通过 Bukkit 的 PotionEffectType.getByName 查找。名称无效、格式不是 类型-数字 或数字无法解析时,控制台会输出 药剂错误。
示例配置还列出了 FIRE,但代码仍将其作为药水类型查找,没有单独实现着火逻辑。若当前服务端不存在该药水类型,该配置会报错,不应将其作为稳定效果使用。
状态刷新
物品匹配结果会在以下事件发生时刷新:
- 玩家进入服务器。
- 玩家关闭背包或其他物品栏界面。
- 玩家切换手持快捷栏槽位。
- 支持副手的版本中,玩家交换主手与副手物品。
物品读取和 NBT 快照在主线程完成,套装匹配计算会异步执行。连续触发刷新时,旧计算结果不会覆盖较新的结果。
如果外部背包插件直接修改槽位物品,但没有触发上述事件,套装状态可能不会立即更新。此时通常需要关闭一次物品栏或切换手持槽位来触发刷新。
多文件套装
额外套装文件与主配置使用相同结构:
yaml
suit:
'套装2':
set:
测试头盔: 'name=测试2头盔'
测试衣服: 'lore=测试2衣服'
lore:
- '&6测试套装 [<now>/<max>]'
- '<state-测试头盔>测试头盔'
- '<state-测试衣服>测试衣服'
- '<sx>'
sx:
1:
- '攻击力+1'
2:
- '攻击力+2'
effect:
2:
- 'SPEED-0'插件重载时会先读取主配置,再递归读取 extra 目录中的 .yml 文件。只有文件扩展名为 .yml 的文件会被加载。
配置检查
套装无法激活时,可以依次检查:
- 套装是否位于
suit:节点下。 - 套装 ID 是否与变量、展示配置中的 ID 一致。
set和lore节点是否存在。- 目标装备所在槽位是否已经加入
plugin-slot。 name和lore的匹配文本是否包含正确的颜色代码。- 多条件规则是否全部满足,是否混入空条件或未知条件。
- 使用
papi时是否安装 PlaceholderAPI,表达式替换后是否仍然有效。 - 使用
nbt时服务端是否为1.7.10或1.12.2,NBT 路径和字符串值是否完全一致。 sx与effect的层数键是否为整数。- 药水格式是否为有效的
药水类型-数字。 - 修改配置后是否执行
/lsr reload重新加载。
/lsr reload 仅允许服务器管理员执行。插件没有为该命令定义独立权限节点。