映射 LyMappingReload
LyMappingReload 用于把装备槽位、物品名称、物品 Lore、权限、PlaceholderAPI 表达式和套装状态映射为属性或药水效果。玩家满足检测条件时获得对应效果,不再满足时移除映射属性。
插件可用于制作饰品属性、装备组合加成、权限属性、等级条件属性、套装效果和限时属性包。它还能从物品 Lore 中提取数值,将结果代入属性公式,或读取物品 NBT 中保存的单行字符串属性。
插件信息
| 项目 | 内容 |
|---|---|
| 插件名 | LyMappingReload |
| 插件版本 | 1.1.3 |
| 作者 | Liyuan |
| Java 版本 | Java 8 |
| 主命令 | /lmr |
| 配置目录 | plugins/LyMappingReload/ |
| 主配置 | config.yml |
| 扩展配置 | extra/ 目录内的所有 .yml 文件 |
支持版本
项目明确提供了以下 NBT 实现:
| Minecraft 版本 | NBT 读取状态 |
|---|---|
1.7.10 | 已提供 v1_7_R4 实现 |
1.12.2 | 已提供 v1_12_R1 实现 |
| 其他版本 | 插件会提示当前版本不支持 NBT 检测 |
上述版本范围只用于说明项目中能够确认的 NBT 适配。项目没有提供完整的服务器版本支持列表,因此不能据此确认其他功能在所有 Minecraft 版本上的兼容性。
swap_hand 检测依赖主副手交换事件,配置示例同时注明该检测在旧版本中可能存在兼容问题。
依赖与对接
插件声明的软依赖
plugin.yml 中声明了以下软依赖。没有使用对应功能时,不要求全部安装。
| 插件 | 用途 |
|---|---|
PlaceholderAPI | 解析条件和属性公式中的变量,并注册 %lmr_...% 变量 |
DZ_Status | 配置模板中保留了 DZ 属性类型编号 |
AttributePlus | 接收插件计算出的属性文本 |
SX-Attribute | 支持 SX-Attribute 2.0 和 3.0 接口 |
ItemLoreOrigin | 通过虚拟物品 Lore 写入属性 |
APInventory | 读取 APInventory 指定背包和槽位中的物品 |
LyInventory | 读取 LyInventory 背包槽位中的物品 |
GermPlugin | 读取萌芽槽位中的物品 |
涉及 papi:{...} 条件、eval:{...} 中的 PAPI 变量或 %lmr_...% 变量时,需要安装并正常加载 PlaceholderAPI。
代码中存在的其他槽位对接
| 对接 | 槽位前缀 | 说明 |
|---|---|---|
| 原版背包 | Minecraft | 按背包槽位编号读取物品 |
| 原版装备栏 | Origin | 读取主手、副手和盔甲槽位 |
| 龙之核心 | DragonCore | 按龙核槽位名读取缓存物品 |
| LyInventory 重置版 | LyInventoryReload | 按背包 ID 和类型读取物品 |
| YeeJewelry | YeeJewelry | 按背包 ID 和槽位 ID 读取饰品 |
使用这些槽位类型时,需要服务器安装并正确配置对应插件。它们不一定全部出现在 plugin.yml 的软依赖列表中。
属性插件
attribute-plugin 决定计算结果写入哪个属性插件。当前项目能够从配置和属性刷新代码中确认以下编号:
| 编号 | 配置注释中的类型 | 当前代码状态 |
|---|---|---|
0 | 不指定 | 不会向属性插件写入映射属性 |
1 | AP2 | 存在属性写入实现 |
2 | SX2.0 | 存在 SX-Attribute 2.0 写入实现 |
3 | SX3.0 | 存在 SX-Attribute 3.0 写入实现 |
4 | DZ | 配置模板保留该编号,但当前属性刷新代码中没有对应写入分支 |
5 | ILO | 存在 ItemLoreOrigin 写入实现 |
6 | AP3 | 存在属性写入实现 |
7 | lysx | 存在 LyAttribute 写入实现 |
8 | as 属性 | 存在 AttributeSystem 写入实现 |
属性插件必须与 attribute-plugin 的编号对应并成功加载,否则映射条件仍可计算,但属性结果不会正常写入目标插件。
主要功能
| 功能 | 说明 |
|---|---|
| 多槽位读取 | 可读取原版背包、原版装备栏、龙核、萌芽、APInventory、LyInventory、LyInventoryReload 和 YeeJewelry 槽位 |
| 名称检测 | 支持物品名称模糊匹配和完整匹配 |
| Lore 检测 | 支持 Lore 行模糊匹配和完整匹配 |
| 权限检测 | 可要求玩家拥有或不拥有指定权限 |
| PAPI 条件 | 支持数值比较、字符串相等判断以及 &&、` |
| 套装检测 | 通过 %lsr_show% 的返回内容判断指定套装状态 |
| 属性映射 | 条件满足时写入属性,不满足时移除该检测节点产生的属性 |
| 属性公式 | eval:{...} 支持整数、小数、括号以及 +、-、*、/ 运算 |
| 公式上限 | 可在公式中附加最大值,分隔符由 eval-max-tag 设置 |
| Lore 数值提取 | 从指定槽位物品的 Lore 中提取数字,并通过 v 变量代入属性公式 |
| 条件堆叠 | 按匹配到的条件或物品数量重复添加属性,并受 max-stack-layers 限制 |
| 药水效果 | 条件满足时添加固定等级和持续时间的 Bukkit 药水效果 |
| 限时属性包 | 通过命令为玩家添加带持续时间的独立属性组 |
| NBT 属性读取 | 从全局槽位物品的 NBT 键读取单行字符串,并直接作为属性文本写入 |
| 事件刷新 | 支持每秒、关闭背包、切换快捷栏和交换主副手时重新检测 |
| 扩展配置 | 自动递归加载 extra/ 目录中的所有 .yml 文件 |
| 变量预览 | 可通过 PlaceholderAPI 获取映射节点或属性包计算后的指定属性行 |
| 变更检测 | 计算结果与上次刷新结果一致时,不重复写入属性插件 |
映射机制
每个 check 子节点是一条独立映射规则。插件会按该节点的槽位和条件计算匹配层数:
- 节点配置了
check-slot时,只使用该节点的槽位。 - 没有配置
check-slot时,使用全局plugin-slot。 - 所有条件达到要求后,计算
attribute中的属性公式。 - 属性根据匹配层数重复添加,但不会超过
max-stack-layers。 - 条件不再成立时,移除该检测节点产生的属性。
- 配置了
potion时,在对应检测事件触发期间刷新药水效果。
未配置任何 condition 的节点会被视为可激活节点。不同检测节点和属性包产生的属性会合并后统一写入所选属性插件。
检测条件
| 格式 | 作用 |
|---|---|
name:{文本} | 物品名称包含指定文本 |
equalsName:{文本} | 物品名称与指定文本完整匹配,忽略大小写 |
lore:{文本} | 任意 Lore 行包含指定文本 |
equalsLore:{文本} | Lore 行与指定文本完整匹配,忽略大小写 |
permission:{权限} | 玩家必须拥有指定权限 |
nopermission:{权限} | 玩家必须没有指定权限 |
papi:{表达式} | 解析 PlaceholderAPI 变量后判断表达式 |
suit:{套装文本} | %lsr_show% 的结果必须包含指定文本 |
颜色符号可使用 &,检测时会转换为 Minecraft 颜色符号。
papi 表达式支持 >、<、>=、<=、==、!=、&& 和 ||。数值两侧可使用四则运算;字符串相等判断应使用成对的单引号或双引号。
槽位格式
| 槽位来源 | 格式 |
|---|---|
| 原版背包 | Minecraft#槽位编号 |
| 龙之核心 | DragonCore#槽位名 |
| GermPlugin | GermPlugin#槽位名 |
| APInventory | APInventory#分页ID#槽位编号 |
| LyInventory | LyInventory#背包ID#类型 |
| LyInventory 重置版 | LyInventoryReload#背包ID#类型 |
| YeeJewelry | YeeJewelry#背包ID#槽位ID |
| 主手 | Origin#MainHand |
| 副手 | Origin#OffHand |
| 头盔 | Origin#Helmet |
| 胸甲 | Origin#ChestPlate |
| 护腿 | Origin#Legging |
| 靴子 | Origin#Boots |
原版背包配置示例使用 0 至 36 的槽位编号;APInventory 配置示例使用 0 至 53 的槽位编号。实际可用范围仍取决于对应背包插件和背包结构。
刷新事件
| 事件值 | 触发方式 |
|---|---|
second | 每秒检测一次 |
close_inventory | 玩家加入后的首次延迟刷新,以及关闭背包时检测 |
held_item | 玩家切换快捷栏槽位时检测 |
swap_hand | 玩家交换主手和副手物品时检测 |
删除 check-event 或保留空列表时,该节点默认参加每秒检测。插件可通过 second-update-type-async 控制每秒计算使用异步还是同步任务。
属性公式
属性行可以直接填写目标属性插件能够识别的文本,也可以使用 eval:{公式} 动态计算数值。
yaml
attribute:
- '攻击力: eval:{%player_level% * 2}'
- '生命值: eval:{%player_level% + 10:100}'默认使用 : 分隔公式和上限。例如 eval:{公式:100} 表示结果最大为 100。如果属性格式本身需要冒号,可通过 eval-max-tag 更换分隔符。
value-number: true 时,计算结果转换为整数;设置为 false 时,结果保留两位小数。
Lore 数值提取
lore-get-placeholder 使用 value 标记需要提取的数字。提取结果会扫描当前映射使用的全部槽位,并累计所有成功解析的数值。
yaml
lore-get-placeholder:
等级点: '获得 <value>x玩家等级点攻击力'
attribute:
- '攻击力: eval:{%player_level% * <v.等级点>:100}'如果没有找到对应 Lore,或提取内容不能转换为数字,该变量按 0 处理。变量引用格式为 v 前缀,例如 <v.等级点>;在普通 Markdown 文本中应始终使用代码格式包裹该写法。
药水效果
药水格式为 药水类型-等级-持续时间。每秒检测中的持续时间按秒转换为游戏刻,并会定期刷新;药水等级在写入 Bukkit 效果时会转换为从 0 开始的内部等级。
yaml
potion:
- 'SPEED-1-2'
- 'INCREASE_DAMAGE-2-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 | 配置模板中列出的着火类型,是否可用取决于服务端 Bukkit 药水类型 |
填写服务端无法识别的药水类型时,控制台会输出未知药水错误。
属性包
attribute-group 用于定义可通过命令发放的限时属性。每个属性包包含持续时间、启用消息、失效消息和属性列表。
time的单位为秒。- 同一玩家再次获得相同 ID 的属性包时,会覆盖原记录并重新计算结束时间。
- 属性包到期后自动移除,并发送
disable-message。 - 玩家离线后,内存数据会暂时保留;代码中的实际清理判断为离线约 30 分钟后删除该玩家的属性包数据。
- 属性包没有数据库持久化实现,服务器重启后不会从数据库恢复。
属性包的完整配置见属性包。
NBT 属性读取
get-nbt-attribute 可从 plugin-slot 中的物品读取指定 NBT 键。读取到的值会直接加入 nbt_attribute 属性来源。
yaml
get-nbt-attribute:
- 'attribute'
- 'custom-data'当前读取实现只取得物品根 NBT 下对应键的字符串值。配置注释说明该功能用于单行字符串属性。虽然 NBT 工具中还存在嵌套路径检测方法,但 get-nbt-attribute 的实际读取流程没有按点号递归读取嵌套节点。
该功能只在项目明确适配的 1.7.10 和 1.12.2 上有可确认的 NBT 实现。
指令
插件没有在 plugin.yml 中注册独立权限节点。现有命令逻辑直接要求命令发送者为服务器管理员。
| 指令 | 使用要求 | 说明 |
|---|---|---|
/lmr | OP | 显示插件内置命令提示 |
/lmr reload | OP | 重载主配置,并重新读取 extra/ 下的映射与属性包配置 |
/lmr add 玩家 属性包ID | OP,目标在线 | 给指定玩家添加属性包;相同 ID 会强制覆盖 |
/lmr add * 属性包ID | OP | 给所有在线玩家添加属性包 |
目标玩家不在线时,指定玩家发放会失败。属性包 ID 不存在时,命令会返回失败消息。
PlaceholderAPI 变量
安装 PlaceholderAPI 后,插件注册变量标识符 lmr。
| 变量 | 返回内容 |
|---|---|
%lmr_check-检测ID:行数% | 返回指定映射节点计算后的第几行属性 |
%lmr_group-属性包ID:行数% | 返回指定属性包计算后的第几行属性 |
行数从 1 开始。节点不存在、属性包不存在或行数超出范围时返回空文本。变量只负责计算和显示配置中的属性行,不代表玩家当前一定满足该映射条件或持有该属性包。
完整说明见插件变量。
配置文件加载
重载时,插件会清空已注册的映射和属性包定义,然后递归读取:
plugins/LyMappingReload/extra/中的所有.yml文件;plugins/LyMappingReload/config.yml。
扩展文件可以包含 check 和 attribute-group 节点。不同文件使用相同 ID 时,后加载的数据会覆盖管理器中已有的同名数据,因此各文件中的检测 ID 和属性包 ID 应保持唯一。
页面索引
| 页面 | 内容 |
|---|---|
| 配置说明 | 全局配置、属性插件、槽位、计算和刷新设置 |
| 映射规则 | 检测节点、条件、Lore 取值、属性、药水和检测事件 |
| 属性包 | 限时属性包配置、覆盖机制和命令发放 |
| 插件变量 | PlaceholderAPI 变量格式与返回规则 |
| 常见问题 | 属性不生效、槽位读取、公式、NBT 和兼容性排查 |
| 更新日志 | 文档整理记录 |