映射规则
LyMappingReload 会读取 config.yml 以及插件目录下 extra 文件夹中的所有 .yml 文件,并加载其中的 check 节点。每个映射节点用于检测玩家指定槽位中的物品或玩家状态;满足全部条件后,插件会向当前配置的属性插件写入属性,并刷新配置的药水效果。
配置文件
映射规则可以写在以下位置:
plugins/LyMappingReload/config.ymlplugins/LyMappingReload/extra/目录及其子目录中的.yml文件
插件重载时会递归读取 extra 目录中的 YAML 文件。所有文件中的映射 ID 必须保持唯一;相同 ID 后加载的数据会覆盖前面的数据。
基础结构
yaml
check:
"示例映射":
check-slot:
- "Minecraft#8"
condition:
- "name:{示例装备}"
lore-get-placeholder:
变量: "获得 <value>x玩家 等级点攻击力"
max-stack-layers: 1
attribute:
- "攻击力: eval:{%player_level% * <v.变量>:100}"
potion:
- "SPEED-1-2"
check-event:
- "second"映射节点配置
| 配置键 | 类型 | 默认值 | 说明 |
|---|---|---|---|
check | 节点 | 无 | 映射规则的根节点。 |
check.<映射ID> | 节点 | 无 | 一组独立的检测规则。映射 ID 不能重复。 |
check-slot | 字符串列表 | 使用全局 plugin-slot | 当前映射单独检测的槽位。配置后,该映射不会再使用全局槽位。 |
condition | 字符串列表 | 空列表 | 映射的检测条件。所有条件都满足后才会激活映射。 |
lore-get-placeholder | 节点 | 空节点 | 从物品 lore 中提取数字,并生成可供属性公式使用的变量。 |
max-stack-layers | 整数 | 1 | 映射最多叠加的层数。每层会重复添加一次 attribute 属性。 |
attribute | 字符串列表 | 空列表 | 激活映射后写入属性插件的属性内容。支持 PlaceholderAPI 和 eval:{} 计算。 |
potion | 字符串列表 | 空列表 | 激活映射后刷新药水效果。药水效果不会按照叠加层数重复叠加。 |
check-event | 字符串列表 | second | 当前映射使用的检测触发方式。可以同时配置多个触发方式。 |
映射节点中的尖括号占位符必须写在代码块或行内代码中,例如 <v.变量> 和 <value>。
槽位格式
未配置 check-slot 时,映射使用全局 plugin-slot。槽位写法由槽位类型和槽位参数组成,使用 # 分隔。
| 槽位类型 | 格式 | 说明 |
|---|---|---|
Minecraft | Minecraft#槽位ID | 原版玩家背包槽位,槽位 ID 为 0 至 36。 |
DragonCore | DragonCore#槽位名 | DragonCore 槽位。 |
GermPlugin | GermPlugin#槽位名 | GermPlugin 槽位。 |
APInventory | APInventory#分页ID#槽位ID | 梦星桐背包槽位,例如 APInventory#饰品#3。 |
LyInventory | LyInventory#背包ID#类型 | LyInventory 槽位。 |
LyInventoryReload | LyInventoryReload#背包ID#类型 | 离渊背包重置版槽位。 |
YeeJewelry | YeeJewelry#背包ID#槽位ID | 清守饰品背包槽位。 |
Origin#MainHand | Origin#MainHand | 玩家主手。代码同时兼容 Mainhand 写法。 |
Origin#OffHand | Origin#OffHand | 玩家副手。代码同时兼容 Offhand 写法。 |
Origin#Helmet | Origin#Helmet | 玩家头盔栏。 |
Origin#ChestPlate | Origin#ChestPlate | 玩家胸甲栏。代码检测时使用 Chestplate。 |
Origin#Legging | Origin#Legging | 玩家护腿栏。 |
Origin#Boots | Origin#Boots | 玩家靴子栏。 |
示例:
yaml
plugin-slot:
- "Minecraft#8"
- "Origin#MainHand"
- "Origin#Helmet"检测条件
condition 中的每一项都会单独计算。只有当所有条件都满足时,映射才会激活。
| 条件格式 | 说明 |
|---|---|
name:{文本} | 检测物品名称是否包含指定文本。颜色代码 & 会转换为 Minecraft 颜色代码。 |
equalsName:{文本} | 检测物品名称是否与指定文本完全匹配,不区分大小写。 |
lore:{文本} | 检测物品 lore 中是否存在包含指定文本的行。 |
equalsLore:{文本} | 检测物品 lore 中是否存在与指定文本完全匹配的行,不区分大小写。 |
permission:{权限} | 检测玩家是否拥有指定权限。 |
nopermission:{权限} | 检测玩家是否没有指定权限。 |
papi:{表达式} | 使用 PlaceholderAPI 替换表达式后进行布尔或数值比较。 |
suit:{套装文本} | 获取 %lsr_show% 的结果,并检测其中是否包含指定文本。 |
多条件计算
- 名称和 lore 条件会根据匹配到的槽位数量增加叠加层数。
- 权限、PlaceholderAPI 和套装条件满足时,每项增加一层。
- 映射的总层数达到
condition条件数量后,映射才会激活。 max-stack-layers会限制最终重复添加属性的次数。- 没有配置任何
condition时,映射会按满足一层处理。
例如,一个映射配置了两个名称条件,两个条件都匹配后才会激活;如果检测结果计算出的层数大于 max-stack-layers,属性最多按照 max-stack-layers 层添加。
Lore 数值提取
lore-get-placeholder 用于从物品 lore 中提取数字。配置值必须包含 <value>,插件会读取 <value> 对应位置的数字。
yaml
lore-get-placeholder:
变量: "获得 <value>x玩家 等级点攻击力"当 lore 中存在 获得 15x玩家 等级点攻击力 时,变量 变量 的值为 15。同一变量在多个槽位或多件物品中匹配到数字时,插件会将这些数字相加。
提取出的变量可以在属性字符串中使用 <v.变量>:
yaml
attribute:
- "攻击力: eval:{%player_level% * <v.变量>:100}"如果没有匹配到有效数字,该变量按 0 处理。只有能够转换为数字的内容才会参与计算。
属性公式
属性字符串支持 eval:{公式} 和 eval:{公式:上限}。
yaml
attribute:
- "攻击力: eval:{%player_level% * 2:100}"处理顺序如下:
- 替换
<v.变量>等 lore 数值变量。 - 使用 PlaceholderAPI 替换公式中的 PlaceholderAPI 变量。
- 计算四则运算公式。
- 如果配置了上限,限制计算结果不超过上限。
- 根据
value-number配置决定输出整数或保留两位小数。
公式支持数字、小数、加法、减法、乘法、除法和括号,例如:
yaml
attribute:
- "攻击力: eval:{(%player_level% + 10) * 2:100}"eval-max-tag 可以修改公式中用于分隔计算公式和上限的字符。默认值为 ::
yaml
eval-max-tag: ":"如果公式计算失败,该属性行不会加入本次刷新结果。
属性叠加
max-stack-layers 控制同一映射属性的最大叠加次数:
yaml
max-stack-layers: 3当条件计算出的层数为 2 时,attribute 中的每一行会添加两次;当计算出的层数为 4 时,最多按照 3 层添加。
属性的实际写入方式由 attribute-plugin 决定:
attribute-plugin | 对接类型 |
|---|---|
1 | AP2 |
2 | SX2.0 |
3 | SX3.0 |
4 | DZ,配置文件注释中列出的类型 |
5 | ILO |
6 | AP3 |
7 | lysx |
8 | as 属性 |
当前代码中实际执行属性写入的分支包括 1、2、3、5、6、7 和 8。使用对应属性插件时,还需要确保目标属性插件已安装并正常运行。
药水效果
药水效果格式如下:
yaml
potion:
- "SPEED-1-2"| 部分 | 说明 |
|---|---|
SPEED | Bukkit 药水效果名称。 |
1 | 药水等级,配置等级从 1 开始。 |
2 | 持续时间,单位为秒。 |
配置示例表示速度 I,持续 2 秒。插件会定时重新刷新映射药水效果;药水效果不会按照 max-stack-layers 重复叠加。
项目配置文件列出的药水效果名称包括:
| 名称 | 效果 |
|---|---|
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 | 着火 |
药水名称必须是 Bukkit 能识别的药水效果类型。无法识别时,插件会在控制台输出检测到未知药水的提示。
检测触发方式
check-event 值 | 触发时机 |
|---|---|
second | 定时检测,默认每秒执行一次。 |
close_inventory | 玩家关闭背包时检测。玩家加入服务器后也会延迟执行一次该类型映射的检测。 |
held_item | 玩家切换快捷栏手持槽位时检测。 |
swap_hand | 玩家切换主手和副手时检测。项目代码对该事件提供了 1.12 兼容监听器;配置注释提示 1.7 版本可能存在问题。 |
未配置 check-event 时,映射会进入默认的 second 检测流程。配置了 check-event 后,只有列表中包含的触发方式会处理该映射。
yaml
check-event:
- "second"
- "close_inventory"
- "held_item"
- "swap_hand"PlaceholderAPI
插件在 PlaceholderAPI 已启用时注册 lmr 变量扩展。映射属性可以使用 PlaceholderAPI 变量,papi:{} 条件也会在计算前进行替换。
映射属性行可以通过以下变量显示计算结果:
text
%lmr_check-映射ID:行号%其中行号从 1 开始。映射 ID 不存在或行号超出范围时返回空字符串。
papi:{} 条件示例:
yaml
condition:
- "papi:{%player_level% >= 10}"该条件会先替换 %player_level%,然后比较替换后的数值。
NBT 属性读取
全局配置中的 get-nbt-attribute 可以读取 plugin-slot 槽位内物品指定 NBT 键的字符串值,并作为属性行写入属性插件:
yaml
get-nbt-attribute:
- "a.b.c"该功能读取的是 plugin-slot,不会使用映射节点的 check-slot。项目提供了 Minecraft 1.7.10 和 1.12.2 的 NBT 处理实现;其他版本启动时会提示不支持 NBT 检测。
相关配置
| 配置键 | 说明 |
|---|---|
plugin-slot | 映射未配置 check-slot 时使用的全局检测槽位,同时也是 NBT 属性读取的槽位。 |
value-number | 为 true 时将计算结果转换为整数;为 false 时保留两位小数。 |
eval-max-tag | eval:{公式:上限} 中用于分隔公式和上限的字符,默认是 :。 |
second-update-type-async | 为 true 时,定时映射计算任务使用异步线程;为 false 时使用同步任务。异步计算可能出现属性短暂丢失后恢复的情况。 |
ilo-update-task | 对接 ILO 时的属性刷新间隔,单位为 tick,默认 20,即约 1 秒。 |
完整示例
yaml
plugin-slot:
- "Minecraft#8"
check:
"示例映射":
check-slot:
- "Minecraft#8"
condition:
- "name:{示例装备}"
- "permission:{example.mapping}"
- "papi:{%player_level% >= 10}"
lore-get-placeholder:
变量: "获得 <value>x玩家 等级点攻击力"
max-stack-layers: 2
attribute:
- "攻击力: eval:{%player_level% * <v.变量>:100}"
potion:
- "SPEED-1-2"
check-event:
- "second"
- "close_inventory"