配置说明
LyMappingReload 读取插件目录下的 config.yml,并递归读取 extra/ 目录中的所有 .yml 文件。配置文件用于定义属性插件类型、检测槽位、物品条件、属性公式、药水效果、属性包和 NBT 属性读取规则。
配置文件
| 文件或目录 | 用途 |
|---|---|
config.yml | 配置属性插件、全局槽位、映射检测和属性包 |
extra/ | 存放额外的 .yml 配置文件,可定义额外的检测和属性包 |
插件重载时会重新读取 config.yml 与 extra/ 目录下的所有 .yml 文件,并清理后重新载入映射检测和属性包数据。
基础配置
attribute-plugin
yaml
attribute-plugin: 0选择属性写入目标。
| 值 | 配置注释对应类型 | 说明 |
|---|---|---|
0 | 未指定 | 不选择属性插件,默认值 |
1 | AttributePlus 2 | 使用 AttributePlus 2 的属性接口 |
2 | SX 2.0 | 使用 SX-Attribute 2.0 的属性接口 |
3 | SX 3.0 | 使用 SX-Attribute 3.0 的属性接口 |
4 | DZ_Status | 配置文件注释中标记为 DZ_Status;当前核心属性刷新代码未包含对应写入分支 |
5 | ItemLoreOrigin | 使用 ItemLoreOrigin 的属性接口 |
6 | AttributePlus 3 | 使用 AttributePlus 3 的属性接口 |
7 | lysx | 使用 Ly.attribute 的属性接口 |
8 | AttributeSystem | 使用 AttributeSystem 的属性接口 |
attribute-plugin 只负责选择属性写入方式。配置为 1、2、3、5、6、7 或 8 时,还需要安装并启用对应属性插件或提供对应接口,否则属性无法正常写入。
plugin-slot
yaml
plugin-slot:
- 'Minecraft#8'全局默认读取槽位。检测节点没有配置 check-slot,或 check-slot 为空时,使用 plugin-slot。
当玩家关闭背包或切换物品时,插件会根据检测事件重新读取这些槽位。每秒检测和 NBT 属性读取也使用全局槽位。
| 格式 | 说明 |
|---|---|
DragonCore#槽位名 | 读取 DragonCore 槽位 |
GermPlugin#槽位名 | 读取 GermPlugin 槽位 |
Minecraft#槽位编号 | 读取原版背包槽位,示例配置使用 0 至 36 范围内的槽位编号 |
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.10 和 1.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}'常见配置问题
检测节点没有生效
按以下顺序检查:
- 检测 ID 是否重复。
check-slot或plugin-slot的槽位格式是否正确。- 物品名称和 Lore 中的颜色代码是否与配置一致。
condition中的所有条件是否同时满足。attribute-plugin是否选择了正确的属性插件类型。- 对应属性插件是否已安装并启用。
- 使用
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.10 和 1.12.2。其他版本会提示不支持 NBT 检测。
同时确认 NBT 路径、全局 plugin-slot 和物品实际 NBT 结构一致。
ItemLoreOrigin 属性没有及时刷新
确认:
attribute-plugin已设置为5。- ItemLoreOrigin 已安装并启用。
ilo-update-task的单位为服务器刻,默认20约为 1 秒。
属性包到期后仍然存在
属性包监听任务每秒检查一次到期时间。玩家在线时,到期属性包会被移除并发送停用消息;玩家离线超过 30 分钟后,保存的属性包数据会被清理。