Skip to content

配置说明

LyMappingReload 读取插件目录下的 config.yml,并递归读取 extra/ 目录中的所有 .yml 文件。配置文件用于定义属性插件类型、检测槽位、物品条件、属性公式、药水效果、属性包和 NBT 属性读取规则。

配置文件

文件或目录用途
config.yml配置属性插件、全局槽位、映射检测和属性包
extra/存放额外的 .yml 配置文件,可定义额外的检测和属性包

插件重载时会重新读取 config.ymlextra/ 目录下的所有 .yml 文件,并清理后重新载入映射检测和属性包数据。

基础配置

attribute-plugin

yaml
attribute-plugin: 0

选择属性写入目标。

配置注释对应类型说明
0未指定不选择属性插件,默认值
1AttributePlus 2使用 AttributePlus 2 的属性接口
2SX 2.0使用 SX-Attribute 2.0 的属性接口
3SX 3.0使用 SX-Attribute 3.0 的属性接口
4DZ_Status配置文件注释中标记为 DZ_Status;当前核心属性刷新代码未包含对应写入分支
5ItemLoreOrigin使用 ItemLoreOrigin 的属性接口
6AttributePlus 3使用 AttributePlus 3 的属性接口
7lysx使用 Ly.attribute 的属性接口
8AttributeSystem使用 AttributeSystem 的属性接口

attribute-plugin 只负责选择属性写入方式。配置为 1235678 时,还需要安装并启用对应属性插件或提供对应接口,否则属性无法正常写入。

plugin-slot

yaml
plugin-slot:
  - 'Minecraft#8'

全局默认读取槽位。检测节点没有配置 check-slot,或 check-slot 为空时,使用 plugin-slot

当玩家关闭背包或切换物品时,插件会根据检测事件重新读取这些槽位。每秒检测和 NBT 属性读取也使用全局槽位。

格式说明
DragonCore#槽位名读取 DragonCore 槽位
GermPlugin#槽位名读取 GermPlugin 槽位
Minecraft#槽位编号读取原版背包槽位,示例配置使用 036 范围内的槽位编号
APInventory#分页标识#槽位编号读取 APInventory 指定分页的槽位
LyInventory#背包标识#槽位标识读取 LyInventory 背包槽位
LyInventoryReload#背包标识#槽位标识读取 LyInventoryReload 背包槽位
YeeJewelry#背包标识#槽位标识读取 YeeJewelry 饰品背包槽位
Origin#MainHand读取原版主手
Origin#OffHand读取原版副手
Origin#Helmet读取原版头盔
Origin#ChestPlate读取原版胸甲
Origin#Legging读取原版护腿
Origin#Boots读取原版靴子

示例:

yaml
plugin-slot:
  - 'DragonCore#饰品栏'
  - 'Minecraft#8'
  - 'Origin#MainHand'
  - 'Origin#OffHand'

不同槽位类型需要对应插件提供接口。配置中使用的插件未安装或未启用时,对应槽位无法读取。

NBT 属性读取

get-nbt-attribute

yaml
get-nbt-attribute:
  #- 'a.b.c'

plugin-slot 指定槽位中的物品读取 NBT 字符串属性,并将读取结果作为属性行写入所选属性插件。

配置值为 NBT 节点路径列表:

yaml
get-nbt-attribute:
  - 'a.b.c'
  - 'custom.attribute'

当前实现只读取字符串类型的 NBT 值。NBT 检测实现仅针对 Minecraft 1.7.101.12.2 提供适配;其他版本启动时会提示当前版本不支持 NBT 检测。

NBT 属性读取使用全局 plugin-slot,不会读取检测节点中的 check-slot

刷新与计算

ilo-update-task

yaml
ilo-update-task: 20

仅在 attribute-plugin 配置为 5 且 ItemLoreOrigin 已启用时生效,用于设置 ItemLoreOrigin 属性物品的刷新间隔。

单位为服务器刻:

配置值说明
20默认值,约为 1 秒
更大的值刷新间隔更长
更小的值刷新间隔更短

second-update-type-async

yaml
second-update-type-async: true

控制每秒检测任务是否使用异步线程。

说明
true使用异步线程执行每秒检测,默认配置为 true
false使用同步线程执行每秒检测

异步检测可以减少主线程计算压力,但属性计算与属性刷新之间可能出现短暂不同步的情况。

该配置只影响每秒检测任务。关闭背包、切换快捷栏和切换主副手等事件仍会通过对应事件处理器执行。

event-update-attribute

yaml
event-update-attribute: false

控制是否停止插件内部的周期性属性刷新任务。该配置未出现在默认配置文件中,属于可选配置项。

说明
false启用每秒属性刷新任务
true不启动内部周期性属性刷新任务,属性主要依靠登录、关闭背包、切换快捷栏和切换主副手等事件刷新

value-number

yaml
value-number: true

控制 eval 计算结果的格式。

说明
true将计算结果转换为整数
false保留两位小数

eval-max-tag

yaml
eval-max-tag: ':'

设置 eval:{公式:上限} 中公式和上限之间使用的分隔符。

默认配置下:

yaml
attribute:
  - '攻击力: eval:{%player_level% * 2:10}'

其中 : 前面的内容为计算公式,后面的内容为上限。上限本身也支持四则运算。

如果修改了分隔符,公式必须使用新的分隔符:

yaml
eval-max-tag: '|'

check:
  示例:
    attribute:
      - '攻击力: eval:{%player_level% * 2|10}'

计算支持整数、小数以及 +-*/ 和括号。

映射检测

映射检测写在 check 节点下。每个检测 ID 必须唯一;多个配置文件中使用相同 ID 时,后载入的数据会覆盖同名数据。

yaml
check:
  '内裤1':
    check-slot:
      - 'Minecraft#8'
    condition:
      - 'name:{&c789的内裤}'
    attribute:
      - '攻击力: eval:{%player_level% * 2}'

check.<检测ID>.check-slot

yaml
check:
  '内裤1':
    check-slot:
      - 'Minecraft#8'

设置当前检测使用的槽位。格式与 plugin-slot 相同。

如果该节点存在并且包含槽位,则当前检测使用这里的槽位,不使用全局 plugin-slot。如果未配置或列表为空,则使用全局 plugin-slot

check.<检测ID>.condition

yaml
condition:
  - 'name:{&c789的内裤}'
  - 'equalsName:{&c789的内裤+1}'
  - 'lore:{&c789的内裤}'
  - 'equalsLore:{&c789的内裤+1}'
  - 'permission:{789.不穿}'
  - 'nopermission:{789.必须穿}'
  - 'papi:{%player_level% >= 10}'
  - 'suit:{套装标识}'

所有条件都满足后,检测才会添加属性。物品名称和 Lore 条件会按照当前检测的槽位逐个检查,并累计匹配层数。

条件格式说明
name:{文本}模糊匹配物品显示名称,名称包含指定文本时匹配
equalsName:{文本}完整匹配物品显示名称
lore:{文本}模糊匹配 Lore 行,Lore 行包含指定文本时匹配
equalsLore:{文本}完整匹配 Lore 行
permission:{权限节点}玩家拥有指定权限时匹配
nopermission:{权限节点}玩家没有指定权限时匹配
papi:{表达式}先解析 PlaceholderAPI 占位符,再判断表达式
suit:{套装标识}读取 %lsr_show% 的结果,包含指定文本时匹配

颜色代码可以在配置中使用 &,插件会转换为 Minecraft 颜色代码。例如:

yaml
condition:
  - 'name:{&c红色物品}'

如果没有配置任何条件,检测会按一层属性处理。

papi 表达式

papi 条件会先替换 PlaceholderAPI 占位符,然后支持数值比较、字符串比较、逻辑与和逻辑或。

yaml
condition:
  - 'papi:{%player_level% >= 10}'
  - 'papi:{%player_level% >= 10 && %player_level% < 50}'
  - 'papi:{%player_level% < 10 || %player_level% >= 50}'

支持的比较运算符包括:

运算符说明
>大于
>=大于或等于
<小于
<=小于或等于
==等于
!=不等于
&&同时满足
`

check.<检测ID>.lore-get-placeholder

yaml
lore-get-placeholder:
  变量: '获得 <value>x玩家等级点攻击力'

从检测槽位中的物品 Lore 读取数字,并保存为可供属性公式替换的变量。

<value> 表示需要提取的数字位置:

yaml
lore-get-placeholder:
  变量: '攻击力:<value>'

插件会查找包含左侧文本的 Lore 行,并提取左侧文本与右侧文本之间的数字。没有右侧文本时,数字会读取到该行末尾。

同名变量在多个槽位或多行 Lore 中匹配到数字时,会累加所有数字。未读取到数字的变量按 0 计算。

attribute 中使用变量:

yaml
lore-get-placeholder:
  变量: '攻击力:<value>'
attribute:
  - '攻击力: eval:{<v.变量> * 2}'

虽然变量读取配置写在某个检测节点下,但读取时会扫描当前检测使用的槽位中的物品。

check.<检测ID>.max-stack-layers

yaml
max-stack-layers: 1

设置同一检测最多叠加的属性层数。检测条件匹配到的层数超过该值时,按该值计算。

例如:

yaml
max-stack-layers: 2

表示最多叠加两层属性。未配置时默认值为 1

check.<检测ID>.attribute

yaml
attribute:
  - '攻击力: eval:{%player_level% * <v.变量>:10}'

设置检测成功后写入属性插件的属性行列表。

属性值支持:

  • 直接填写数字。
  • 使用 eval:{公式} 计算数值。
  • 使用 PlaceholderAPI 占位符。
  • 使用 lore-get-placeholder 定义的 <v.变量名>
  • 使用 eval:{公式:上限} 限制最大值。

示例:

yaml
attribute:
  - '攻击力: eval:{%player_level% * 2}'
  - '防御力: eval:{10 + <v.变量>}'

当检测条件匹配多层时,属性行会按照匹配层数重复添加,但最多不超过 max-stack-layers

使用 PlaceholderAPI 变量需要安装并启用 PlaceholderAPI。PlaceholderAPI 未启用时,插件不会注册 lmr 变量扩展,公式中的外部变量也无法正常替换。

check.<检测ID>.potion

yaml
potion:
  - 'SPEED-1-2'

设置检测成功后给予的药水效果。格式为:

text
药水效果名-等级-持续时间
部分说明
药水效果名Bukkit 药水效果名称,例如 SPEED
等级药水等级,从 1 开始填写
持续时间持续时间,代码中按药水效果时长字段处理;每秒检测路径会将该值转换为刻数

默认配置中使用:

yaml
potion:
  - 'SPEED-1-2'

表示速度效果 1 级、持续 2 秒。

支持的药水效果名称包括:

名称效果
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饱和
FIRE着火

药水效果每秒刷新一次,不会通过检测层数叠加多个相同效果。配置了不存在的药水效果时,控制台会输出错误信息。

check.<检测ID>.check-event

yaml
check-event:
  - 'second'
  - 'close_inventory'
  - 'held_item'
  - 'swap_hand'

设置当前检测的触发方式。

触发时机
second每秒检测一次
close_inventory玩家关闭背包后检测
held_item玩家切换快捷栏槽位后检测
swap_hand玩家切换主手和副手后检测

未配置 check-event 时,默认使用 second 检测逻辑。

swap_hand 使用单独的事件监听器处理,项目中提供了 1.12 版本对应的事件实现;旧版本使用时可能存在兼容性问题。

属性包

属性包写在 attribute-group 节点下。属性包不会根据物品槽位自动激活,需要通过插件命令为玩家添加。

yaml
attribute-group:
  '属性包1':
    time: 5
    enable-message: '你激活了属性包1'
    disable-message: '你的属性包已过期'
    attribute:
      - '攻击力: eval:{%player_level% + 1 * 2.5:10}'

attribute-group.<属性包ID>.time

yaml
time: 5

设置属性包持续时间,单位为秒。属性包到期后会从玩家身上移除,并发送 disable-message

未配置时,代码默认使用 100 秒。

attribute-group.<属性包ID>.enable-message

yaml
enable-message: '你激活了属性包1'

玩家获得属性包时发送的消息。可以使用 & 颜色代码。

不需要消息时可以删除该节点或留空。

attribute-group.<属性包ID>.disable-message

yaml
disable-message: '你的属性包已过期'

属性包到期时发送的消息。可以使用 & 颜色代码。

不需要消息时可以删除该节点或留空。

attribute-group.<属性包ID>.attribute

yaml
attribute:
  - '攻击力: eval:{%player_level% + 1 * 2.5:10}'

设置属性包激活期间写入属性插件的属性行。计算方式与映射检测中的 attribute 相同,但属性包公式不使用物品 Lore 变量。

属性包支持 PlaceholderAPI 占位符、四则运算和上限计算。

属性包数据会在玩家离线后继续保留一段时间。代码会清理最后在线时间超过 1800000 毫秒,即 30 分钟的玩家属性包数据。

配置示例

下面的示例包含全局槽位、条件检测、Lore 数值读取、属性公式、药水效果和检测事件:

yaml
attribute-plugin: 1

get-nbt-attribute:
  - 'custom.attack'

ilo-update-task: 20
second-update-type-async: true
value-number: true
eval-max-tag: ':'

plugin-slot:
  - 'Minecraft#8'

check:
  '内裤1':
    check-slot:
      - 'Minecraft#8'
    condition:
      - 'name:{&c789的内裤}'
      - 'lore:{攻击力:}'
      - 'permission:{789.不穿}'
      - 'papi:{%player_level% >= 10}'
    lore-get-placeholder:
      变量: '攻击力:<value>'
    max-stack-layers: 1
    attribute:
      - '攻击力: eval:{%player_level% * <v.变量>:10}'
    potion:
      - 'SPEED-1-2'
    check-event:
      - 'second'
      - 'close_inventory'
      - 'held_item'
      - 'swap_hand'

attribute-group:
  '属性包1':
    time: 5
    enable-message: '你激活了属性包1'
    disable-message: '你的属性包已过期'
    attribute:
      - '攻击力: eval:{%player_level% + 1 * 2.5:10}'

常见配置问题

检测节点没有生效

按以下顺序检查:

  1. 检测 ID 是否重复。
  2. check-slotplugin-slot 的槽位格式是否正确。
  3. 物品名称和 Lore 中的颜色代码是否与配置一致。
  4. condition 中的所有条件是否同时满足。
  5. attribute-plugin 是否选择了正确的属性插件类型。
  6. 对应属性插件是否已安装并启用。
  7. 使用 papi 条件或公式时,PlaceholderAPI 是否已安装并启用。

没有配置 check-slot 时读取哪里

使用全局 plugin-slot。只有当前检测配置了非空的 check-slot 时,才会覆盖全局槽位。

eval 计算结果与预期不同

检查以下配置:

  • eval-max-tag 是否与公式中的上限分隔符一致。
  • value-number 是否开启了整数转换。
  • 公式中的 PlaceholderAPI 占位符是否能返回数字。
  • <v.变量名> 是否与 lore-get-placeholder 中的变量名完全一致。
  • Lore 提取规则中的 <value> 前后文本是否能匹配实际 Lore。

NBT 属性没有读取到

get-nbt-attribute 只读取字符串类型的 NBT 值,并且当前实现只适配 Minecraft 1.7.101.12.2。其他版本会提示不支持 NBT 检测。

同时确认 NBT 路径、全局 plugin-slot 和物品实际 NBT 结构一致。

ItemLoreOrigin 属性没有及时刷新

确认:

  • attribute-plugin 已设置为 5
  • ItemLoreOrigin 已安装并启用。
  • ilo-update-task 的单位为服务器刻,默认 20 约为 1 秒。

属性包到期后仍然存在

属性包监听任务每秒检查一次到期时间。玩家在线时,到期属性包会被移除并发送停用消息;玩家离线超过 30 分钟后,保存的属性包数据会被清理。