Skip to content

映射规则

LyMappingReload 会读取 config.yml 以及插件目录下 extra 文件夹中的所有 .yml 文件,并加载其中的 check 节点。每个映射节点用于检测玩家指定槽位中的物品或玩家状态;满足全部条件后,插件会向当前配置的属性插件写入属性,并刷新配置的药水效果。

配置文件

映射规则可以写在以下位置:

  • plugins/LyMappingReload/config.yml
  • plugins/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。槽位写法由槽位类型和槽位参数组成,使用 # 分隔。

槽位类型格式说明
MinecraftMinecraft#槽位ID原版玩家背包槽位,槽位 ID 为 036
DragonCoreDragonCore#槽位名DragonCore 槽位。
GermPluginGermPlugin#槽位名GermPlugin 槽位。
APInventoryAPInventory#分页ID#槽位ID梦星桐背包槽位,例如 APInventory#饰品#3
LyInventoryLyInventory#背包ID#类型LyInventory 槽位。
LyInventoryReloadLyInventoryReload#背包ID#类型离渊背包重置版槽位。
YeeJewelryYeeJewelry#背包ID#槽位ID清守饰品背包槽位。
Origin#MainHandOrigin#MainHand玩家主手。代码同时兼容 Mainhand 写法。
Origin#OffHandOrigin#OffHand玩家副手。代码同时兼容 Offhand 写法。
Origin#HelmetOrigin#Helmet玩家头盔栏。
Origin#ChestPlateOrigin#ChestPlate玩家胸甲栏。代码检测时使用 Chestplate
Origin#LeggingOrigin#Legging玩家护腿栏。
Origin#BootsOrigin#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}"

处理顺序如下:

  1. 替换 <v.变量> 等 lore 数值变量。
  2. 使用 PlaceholderAPI 替换公式中的 PlaceholderAPI 变量。
  3. 计算四则运算公式。
  4. 如果配置了上限,限制计算结果不超过上限。
  5. 根据 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对接类型
1AP2
2SX2.0
3SX3.0
4DZ,配置文件注释中列出的类型
5ILO
6AP3
7lysx
8as 属性

当前代码中实际执行属性写入的分支包括 1235678。使用对应属性插件时,还需要确保目标属性插件已安装并正常运行。

药水效果

药水效果格式如下:

yaml
potion:
  - "SPEED-1-2"
部分说明
SPEEDBukkit 药水效果名称。
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.101.12.2 的 NBT 处理实现;其他版本启动时会提示不支持 NBT 检测。

相关配置

配置键说明
plugin-slot映射未配置 check-slot 时使用的全局检测槽位,同时也是 NBT 属性读取的槽位。
value-numbertrue 时将计算结果转换为整数;为 false 时保留两位小数。
eval-max-tageval:{公式:上限} 中用于分隔公式和上限的字符,默认是 :
second-update-type-asynctrue 时,定时映射计算任务使用异步线程;为 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"