配置说明
LyGalaxyMapped 根据物品快照、玩家状态和临时标签计算标签层数,再按映射需求和组内优先级选择生效映射,最终刷新属性、药水效果和状态消息。
配置文件位置
| 文件 | 用途 |
|---|---|
plugins/LyGalaxyMapped/config.yml | 主配置,只定义属性插件、检测间隔和全局物品槽位。 |
plugins/LyGalaxyMapped/mapped/*.yml | 标签和映射配置目录,会递归读取当前目录及子目录中的全部 .yml 文件。 |
插件首次加载时会将默认示例保存为 mapped/示例配置.yml,已有文件不会被覆盖。一个 mapped 配置文件可以同时包含 tag-check 和 mapped 节点。
tag-check 和 mapped 只从 mapped 目录读取,写入主配置 config.yml 不会生效。多个文件中的标签 ID 或映射 ID 重复时,文件会按路径排序读取,保留先读取的配置,后读取的重复配置会被忽略。
主配置文件
当前主配置结构如下:
yaml
attribute-plugin: 'AttributePlus'
thread-running-interval: 20
plugin-slot:
- 'Origin#MainHand'
- 'Origin#OffHand'
- 'Origin#Helmet'
- 'Origin#ChestPlate'
- 'Origin#Legging'
- 'Origin#Boots'attribute-plugin
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
attribute-plugin | 字符串 | AttributePlus | 指定接收生效映射属性的属性插件。配置匹配不区分大小写。 |
支持的配置值:
| 配置值 | 要求 |
|---|---|
AttributePlus | 对应属性插件必须已安装并成功启用。 |
AttributeSystem | 对应属性插件必须已安装并成功启用。 |
SX-Attribute | 对应属性插件必须已安装并成功启用。 |
SX-Attribute2 | 对应属性插件必须已安装并成功启用。 |
SX-Attribute3 | 对应属性插件必须已安装并成功启用。 |
ItemLoreOrigin | ItemLoreOrigin 必须已安装并成功启用。同步间隔固定为 20 tick。 |
属性插件未安装、未启用或配置值不受支持时,属性写入不会生效。选择 ItemLoreOrigin 时没有额外的同步间隔配置项。
thread-running-interval
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
thread-running-interval | 整数 | 20 | 标签、映射、属性和药水结果的检测周期,单位为 tick,最小值为 1。 |
该配置不控制物品快照任务。全局物品快照任务固定每 10 tick 处理一次被标记的玩家。未单独设置药水持续时间时,药水默认持续时间会根据该检测间隔计算,且至少为 2 秒。
plugin-slot
plugin-slot 是全局物品扫描槽位列表。没有单独配置 check-slot 的标签,以及 Lore 动态变量提取,都会使用该列表。
| 写法 | 说明 |
|---|---|
Minecraft#槽位ID | 读取原版背包中的数字槽位。 |
Origin#MainHand | 读取原版主手。 |
Origin#OffHand | 读取原版副手。旧版本没有副手方法时返回空值。 |
Origin#Helmet | 读取原版头盔槽位。 |
Origin#ChestPlate | 读取原版胸甲槽位。 |
Origin#Legging | 读取原版护腿槽位。 |
Origin#Boots | 读取原版鞋子槽位。 |
DragonCore#槽位名 | 读取 DragonCore 槽位。 |
GermPlugin#槽位名 | 读取 GermPlugin 槽位。 |
APInventory#分页ID#槽位ID | 读取 APInventory 指定分页的数字槽位。 |
LyInventory#背包ID#槽位名 | 读取 LyInventory 指定背包的槽位。 |
LyInventoryReload#背包ID#槽位名 | 读取 LyInventoryReload 指定背包的槽位。 |
YeeJewelry#背包ID#槽位ID | 读取 YeeJewelry 指定背包的槽位。 |
每项都必须使用完整槽位配置字符串。使用外部背包插件的格式时,对应插件必须提供可读取的槽位物品。
tag-check 标签配置
tag-check 必须写在 plugins/LyGalaxyMapped/mapped/ 目录中的 YAML 文件内,用于将物品条件、玩家条件和玩家状态转换为标签层数。
基本结构如下:
yaml
tag-check:
'火焰':
condition:
1:
- 'lore(''元素:火焰'')'
- 'nbt(''lgm.element'', ''fire'')'
2:
- 'permission(''lgm.先天霜火圣体'')'
max-point: -1标签节点
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
tag-check | 节点 | 空 | 标签配置根节点。 |
tag-check.<标签ID> | 节点 | 无 | 定义一个标签及其检测规则。标签 ID 可自定义。 |
tag-check.<标签ID>.condition | 节点或字符串列表 | 空 | 定义标签条件。推荐使用数字权重节点。 |
tag-check.<标签ID>.condition.<权重> | 字符串列表 | 空 | 每条条件命中一次时增加的层数。数字是层数权重,不是条件编号。 |
tag-check.<标签ID>.check-slot | 字符串列表 | 使用全局 plugin-slot | 为当前标签单独指定物品扫描槽位。 |
tag-check.<标签ID>.max-point | 整数 | -1 | 限制最终标签层数。小于 0 表示不限制。 |
tag-check.<标签ID>.point | 整数 | 1 | 使用简化列表写法时,每条条件命中的层数。 |
condition 支持数字权重写法和简化列表写法。
带权重写法:
yaml
condition:
1:
- 'lore(''元素:火焰'')'
2:
- 'permission(''lgm.先天霜火圣体'')'简化列表写法:
yaml
condition:
- 'permission(''lgm.先天霜火圣体'')'
point: 2带权重写法中,同一个权重下的每一条字符串条件都会独立统计命中次数。例如 3 件物品满足权重为 1 的 Lore 条件,就增加 3 层;同一件物品同时满足多条条件时,各条条件仍然分别累计,不进行物品去重。
物品条件按扫描槽位统计命中次数。权限、PlaceholderAPI 和玩家状态条件每次只判断一次,不会按照物品槽位重复计算。
标签层数会在所有条件累计完成后再应用 max-point 限制。
check-slot
check-slot 的写法与 plugin-slot 相同。配置后,当前标签的物品条件只扫描该列表;未配置或列表为空时,使用全局 plugin-slot。
check-slot 只改变物品条件的扫描范围,不会让 permission、nopermission、papi、world、time、gamemode 或 weather 条件按槽位重复计算。
条件表达式
条件使用函数式写法,不支持旧版的 lore:{...}、nbt:{...} 和 permission:{...} 格式。函数参数使用单引号,多个参数使用逗号分隔。
| 条件 | 写法 | 说明 |
|---|---|---|
| 名称包含 | name('文本') | 物品显示名称包含文本,默认使用 contains 匹配。 |
| 名称包含 | name('文本', contains) | 物品显示名称包含文本。 |
| 名称完整匹配 | name('文本', equals) | 物品显示名称完整匹配文本。 |
| Lore 包含 | lore('文本') | 任意一行 Lore 包含文本,默认使用 contains 匹配。 |
| Lore 包含 | lore('文本', contains) | 任意一行 Lore 包含文本。 |
| Lore 完整匹配 | lore('文本', equals) | 任意一行 Lore 完整匹配文本。 |
| NBT 字符串或数值 | nbt('路径', '值') | 默认完整匹配 NBT 标量值。数值也可以不加引号。 |
| 玩家权限 | permission('权限节点') | 玩家拥有权限时命中一次。 |
| 无玩家权限 | nopermission('权限节点') | 玩家没有权限时命中一次。 |
| PlaceholderAPI | papi(比较表达式) | 根据 PlaceholderAPI 展开结果判断。需要 PlaceholderAPI 已安装并启用。 |
| 世界 | world('世界名') | 玩家当前世界名称匹配时命中一次。 |
| 时间 | time('day') 或 time('night') | day 为 0 到 11999,night 为 12000 到 23999。 |
| 游戏模式 | gamemode('模式') | 玩家当前游戏模式匹配时命中一次。 |
| 天气 | weather('clear')、weather('rain')、weather('thunder') | 判断当前世界天气,storm 是 thunder 的同义写法。 |
文本条件中的 & 会转换为 Minecraft 颜色码后再进行匹配。
NBT 比较方式
| 写法 | 说明 |
|---|---|
nbt('路径', '值', equals) | 字符串完整匹配。默认方式。 |
nbt('路径', '值', !=) | 字符串不等于。 |
nbt('路径', '值', contains) | 字符串包含。 |
nbt('路径', '值', startsWith) | 字符串以目标文本开头。 |
nbt('路径', '值', endsWith) | 字符串以目标文本结尾。 |
nbt('路径', 5, >) | NBT 数值大于目标值。 |
nbt('路径', 5, >=) | NBT 数值大于或等于目标值。 |
nbt('路径', 5, <) | NBT 数值小于目标值。 |
nbt('路径', 5, <=) | NBT 数值小于或等于目标值。 |
nbt('路径', 'TEXT', ignoreCase) | 忽略英文大小写进行完整匹配。 |
nbt('路径', 'TEXT', equals, ignoreCase) | 忽略英文大小写进行完整匹配。 |
数值比较要求物品 NBT 实际值和目标值都可以转换为数字。ignoreCase 可以和其他比较方式组合使用。
条件组合
- 同一条字符串条件中,顶层
||表示 OR,任意一侧成立即可。 - 在函数前添加
!表示取反,例如!lore('已绑定')。 &&和比较运算符用于papi的 PlaceholderAPI 比较表达式。papi支持==、!=、>、>=、<、<=、&&和||。
yaml
condition:
1:
- 'lore(''元素:火焰'') || nbt(''lgm.element'', ''fire'')'
- '!lore(''已绑定'')'
2:
- 'papi(%player_level% >= 5 && %player_level% <= 10)'
- 'permission(''lgm.vip'') || papi(%player_level% >= 30)'同一权重下的多条条件不是多行 AND。只有同一条字符串中的 || 才表示条件分支。
mapped 映射配置
mapped 必须写在 plugins/LyGalaxyMapped/mapped/ 目录中的 YAML 文件内。它根据标签层数选择动态构筑。同一个 group-id 中只会有一条映射生效,不同 group-id 的映射可以同时生效。
映射节点
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mapped | 节点 | 空 | 映射配置根节点。 |
mapped.<映射ID> | 节点 | 无 | 定义一条动态映射。映射 ID 可自定义。 |
mapped.<映射ID>.group-id | 字符串 | 当前映射 ID | 当前映射所属的组。相同组内的映射互相选择。 |
mapped.<映射ID>.group-priority | 整数 | 0 | 当前映射在组内的优先级,数值越大越优先。 |
mapped.<映射ID>.require | 节点 | 空 | 激活所需的标签层数,多个标签必须同时满足。 |
mapped.<映射ID>.exclude | 节点 | 空 | 排斥标签层数,任意标签达到配置层数时当前映射不生效。 |
mapped.<映射ID>.lore-get-placeholder | 节点 | 空 | 从全局 plugin-slot 快照的物品 Lore 中提取动态数值。 |
mapped.<映射ID>.attribute | 字符串列表 | 空列表 | 当前映射提供的属性行。 |
mapped.<映射ID>.potion | 字符串列表 | 空列表 | 当前映射提供的药水效果。 |
mapped.<映射ID>.start-message | 字符串列表 | 空列表 | 映射开始生效时发送的消息。 |
mapped.<映射ID>.end-message | 字符串列表 | 空列表 | 映射结束生效时发送的消息。 |
映射选择规则如下:
require中的每个标签都必须达到指定层数。exclude中任意标签达到指定层数后,当前映射被排斥。- 相同
group-id中,选择满足条件且group-priority最高的映射。 - 同组优先级相同时,按映射 ID 的字典顺序选择较早的一条。
- 同组低优先级映射的属性和药水不会与高优先级映射叠加。
- 不同组的映射可以同时生效。
yaml
mapped:
'霜火共鸣1级':
group-id: '霜火共鸣'
group-priority: 1
require:
'火焰': 1
'冰霜': 1
exclude:
'夜间': 1
lore-get-placeholder:
'变量id': '获得 <value>x玩家 等级点攻击力'
attribute:
- '火属性伤害: {var.变量id}'
- '火焰层数伤害: <{tag.火焰}*2>'
- '冰属性伤害: 20'
- '元素穿透: 10'
potion:
- 'SPEED:1'
start-message:
- '&7你触发了 &a{id}'
end-message:
- '&7你的 &a{id} &7消失了'require 与 exclude
yaml
require:
'火焰': 2
'冰霜': 2
exclude:
'夜间': 1require 是同时满足关系,上例要求 火焰 和 冰霜 都至少达到 2 层。
exclude 是排斥关系,上例中 夜间 达到 1 层后,当前映射不会生效。通过外部 API 添加的临时标签也会参与最终标签层数计算,因此会影响 require 和 exclude。
lore-get-placeholder
lore-get-placeholder 的键是变量 ID,值是 Lore 提取模板。模板使用 <value> 标记需要读取的数字。
yaml
lore-get-placeholder:
'变量id': '获得 <value>x玩家 等级点攻击力'
attribute:
- '火属性伤害: {var.变量id}'如果 Lore 为 获得 12x玩家 等级点攻击力,变量 变量id 的值为 12。同一个变量在多个物品或多行 Lore 中命中时会累加;未命中的变量按 0 处理。
提取范围使用全局 plugin-slot 快照,没有单独的槽位配置项。模板中的 & 会转换为 Minecraft 颜色码。
attribute
attribute 是字符串列表,每一行代表一条属性配置,并会提交给 attribute-plugin 指定的属性插件。
| 写法 | 说明 |
|---|---|
{var.变量ID} | 读取当前映射的 Lore 动态变量,未知变量替换为 0。 |
{tag.标签ID} | 读取本次计算得到的标签层数,包含装备标签和临时标签,未知标签替换为 0。 |
<表达式> | 计算尖括号中的四则运算表达式,支持加、减、乘、除和括号。 |
PlaceholderAPI 占位符会在尖括号公式计算前展开。
yaml
attribute:
- '火属性伤害: {var.变量id}'
- '火焰层数伤害: <{tag.火焰}*2>'
- '火属性伤害: <%player_level%*2>'当前配置模型直接在映射节点中读取 attribute,不读取独立的 attribute-group、effect 或 resonance 节点,也不支持旧版 eval:{...} 公式格式。
potion
药水配置格式如下:
yaml
potion:
- 'SPEED:1'
- 'JUMP:2:10'| 格式 | 说明 |
|---|---|
类型:等级 | 使用根据 thread-running-interval 计算出的默认持续时间,至少持续 2 秒。 |
类型:等级:秒数 | 指定正整数持续秒数。无效或非正数值会使用默认持续时间。 |
配置等级按 1 起算,内部会转换为 Bukkit 药水等级。同一玩家的多个生效映射提供相同药水类型时,等级更高的效果优先;等级相同则持续时间更长的效果优先。无效药水类型、无法解析的等级或缺少必要分段时,会跳过当前药水行。
当前示例使用的药水类型包括:
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。
start-message 与 end-message
yaml
start-message:
- '&7你触发了 &a{id}'
end-message:
- '&7你的 &a{id} &7消失了'&颜色码会转换为 Minecraft 颜色码。{id}会替换为当前映射 ID。- PlaceholderAPI 启用时,消息发送前会展开 PlaceholderAPI 占位符。
- 映射首次进入生效状态时发送
start-message。 - 映射离开生效状态时发送
end-message。 - 同组映射切换时,先发送旧映射的
end-message,再发送新映射的start-message。 - 空消息列表或空消息行不会发送。
重载配置
修改主配置或 mapped 目录中的 YAML 文件后,使用以下指令重新读取:
| 指令 | 执行限制 | 说明 |
|---|---|---|
/lgm reload | 仅 OP | 重载 config.yml 和 mapped 目录中的配置,并重新计算在线玩家状态。 |
重载过程中会清理旧属性和本插件管理的药水效果,再按新配置重新计算。
配置注意事项
- 主配置只读取
attribute-plugin、thread-running-interval和plugin-slot等运行参数;tag-check与mapped必须放在mapped目录中的.yml文件内。 - 当前只读取新版
tag-check和mapped节点,不兼容旧版check和attribute-group,也不读取独立的effect、resonance节点。 tag-check.condition中的数字是每次命中的层数权重,不是条件编号。- 同一权重下的多条条件独立累计,不是多行 AND。
mapped.require中的多个标签需要同时达到要求。exclude中任意标签达到对应层数后,当前映射不会生效。- 同组映射只保留一条,不同组映射可以同时生效。
- 使用 PlaceholderAPI 条件、属性占位符或消息占位符时,需要 PlaceholderAPI 已安装并启用。
- 使用外部背包槽位时,对应背包插件必须能够提供该槽位物品。