Skip to content

套装配置

套装配置用于定义部件匹配规则、展示文本、属性层数和药水效果。插件会统计指定槽位中已匹配的部件数量,并按照当前数量启用对应层数。

套装可以写在主配置 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不同激活层数对应的药水效果

setlore 会被直接读取,配置套装时应保留这两个节点。sxeffect 可以按实际需要省略。

套装 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=权限玩家权限玩家没有指定权限时匹配

namelore 使用包含匹配,不要求物品文本完全相同。配置中的 & 颜色代码会在加载时转换为 Minecraft 颜色符号,因此可以在匹配文本中使用颜色代码。

多条件匹配

同一部件可以使用英文分号 ; 连接多个条件。所有条件都满足后,该部件才会激活。

yaml
set:
  远古头盔: 'name=远古;lore=套装;permission=suit.vip'

条件前后的空白会被移除,以下写法也可以正常解析:

yaml
set:
  远古头盔: 'name=远古; lore=套装; permission=suit.vip'

空条件、未知条件类型或格式错误的 NBT 条件会使整条部件规则无效,并在控制台输出警告。

纯玩家条件部件

部件规则可以只包含 papipermissionnopermission

yaml
set:
  VIP加成: 'permission=suit.vip'
  高等级加成: 'papi=%player_level% >= 50'

这类规则不依赖物品。玩家满足条件后,该部件会直接计入当前套装数量。

部件计数规则

  • 每个部件 ID 最多计入一次。
  • 多个物品同时满足同一个部件规则时,仍然只计算一个部件。
  • 同一个物品可以同时满足多个不同的部件规则。
  • 部件数量等于当前已命中的不同部件 ID 数量。
  • 未加入 plugin-slot 的装备不会参与 namelorenbt 匹配。

如果不同部件必须由不同物品激活,应为每件物品设置能够互相区分的名称、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 检测

在其他版本中,namelore 和玩家条件仍可使用,但 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-replaceno-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不下发套装属性
11攻击力+1
21攻击力+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 的文件会被加载。

配置检查

套装无法激活时,可以依次检查:

  1. 套装是否位于 suit: 节点下。
  2. 套装 ID 是否与变量、展示配置中的 ID 一致。
  3. setlore 节点是否存在。
  4. 目标装备所在槽位是否已经加入 plugin-slot
  5. namelore 的匹配文本是否包含正确的颜色代码。
  6. 多条件规则是否全部满足,是否混入空条件或未知条件。
  7. 使用 papi 时是否安装 PlaceholderAPI,表达式替换后是否仍然有效。
  8. 使用 nbt 时服务端是否为 1.7.101.12.2,NBT 路径和字符串值是否完全一致。
  9. sxeffect 的层数键是否为整数。
  10. 药水格式是否为有效的 药水类型-数字
  11. 修改配置后是否执行 /lsr reload 重新加载。

/lsr reload 仅允许服务器管理员执行。插件没有为该命令定义独立权限节点。