Skip to content

背包配置

背包配置文件放在 plugins/LyInventory/inventory 目录中。每个 YAML 文件定义一个独立背包,包括界面标题、界面大小、打开限制、固定展示物品和可保存装备的功能槽位。

插件重载时会覆盖 示例背包.yml,并且不会将该文件载入为正式背包。创建背包时需要先复制该文件、重命名,再编辑复制后的文件。

完整结构

yaml
id: 'equipment'
title: '&6装备背包'
size: 6
permission: ''
condition: []

default-set:
  边框:
    id: '160:0'
    name: ' '
    lore:
      - '&7边界'
    command: []
    slot: '0-8,45-53'

slot-set:
  头盔:
    slot: 22
    id: '160:9'
    name: ' '
    lore:
      - '&7头盔槽位'
      - '&7解锁状态: {unlock}'
    replace-condition:
      - 'lore:{类型:头盔}<->&7该槽位只可放入头盔。'
    click-command: []
    replace-command: []
    take-out-command: []
    unlock-condition: []
    unlock-command: []
    attribute-condition: []
    take-out-condition: []
    attribute-rate: 1.0
    mapping-slot: ''

背包配置需要直接从 id 开始,不要在最外层额外添加文件名或背包名称节点。

背包基础配置

yaml
id: 'equipment'
title: '&6装备背包'
size: 6
permission: ''
condition: []
配置项类型默认值说明
id字符串背包唯一 ID,用于指令、变量、API、玩家数据和外部槽位映射
title字符串离渊背包背包界面标题,支持使用 & 颜色符
size整数6背包行数,实际读取时会限制在 16
permission字符串空字符串玩家打开自己的背包时需要的权限,删除或留空表示不限制
condition字符串列表空列表打开背包时需要满足的条件

size 表示行数,不是槽位总数。界面槽位总数等于 size × 9,例如 size: 6 会创建 54 格界面,有效槽位编号为 053

每个正式背包都需要填写非空且不重复的 id。背包 ID 会写入玩家存档;修改已经投入使用的 ID 后,旧 ID 下保存的装备和解锁记录不会自动转移到新 ID。

打开权限

permission 只在玩家打开自己的背包时检查。管理员查看其他玩家背包时不会使用目标背包的该项权限进行限制。

yaml
permission: 'inventory.equipment'

不需要权限时可以删除该项或留空:

yaml
permission: ''

打开条件

yaml
condition:
  - 'papi:{%player_level% >= 10}'
  - 'permission:{inventory.equipment}'

示例配置确认支持以下打开条件:

条件格式说明
papi:{表达式}检测 PlaceholderAPI 变量表达式
permission:{权限}玩家拥有指定权限时通过
nopermission:{权限}玩家没有指定权限时通过

列表中的条件需要全部满足。任意条件不满足时,插件会阻止打开背包。

使用 papi 条件或 %变量% 时需要安装 PlaceholderAPI。

默认物品

default-set 用于放置边框、说明、按钮、玩家信息等固定物品。默认物品不会保存玩家装备,只负责展示内容、执行点击指令和刷新当前界面。

yaml
default-set:
  边框:
    id: '160:0'
    name: ' '
    lore:
      - '&7边界'
    command:
      - 'tell %player_name% 你点击了边框'
    slot: '0-8,9,17,18,26,27,35,36,44,45-53'

  玩家信息:
    id: '160:2'
    name: '&6玩家信息'
    lore:
      - ''
      - '&7名字: %player_name%'
      - '&7等级: %player_level%'
      - '&7世界: %player_world%'
      - ''
      - '&a点击刷新'
    command:
      - 'tell %player_name% 你刷新了玩家信息'
    slot: '23'
配置项类型说明
节点名称字符串当前默认物品的配置名称,只用于区分同一文件中的不同物品
id字符串展示物品 ID,项目示例使用旧版 数字ID:子ID 格式
name字符串展示名称,支持 & 颜色符
lore字符串列表展示说明,支持 & 颜色符和 PlaceholderAPI 变量
command字符串列表玩家点击默认物品后执行的指令
slot字符串物品占用的界面槽位,支持单个槽位、多个槽位和连续范围

默认物品槽位

default-set.*.slot 使用从 0 开始的界面槽位编号。多个值使用英文逗号分隔,连续范围使用半角减号连接。

写法对应槽位
'23'仅槽位 23
'0,8,45,53'槽位 0、8、45、53
'0-8'槽位 0 至 8,包含两端
'0-8,45-53'第一行和最后一行

配置的槽位应处于当前背包范围内。例如 6 行背包的有效槽位为 053

默认物品指令

command 中的指令会先解析 PlaceholderAPI 变量,再由控制台执行。直接填写命令内容,不要添加 /,也不要添加 [console][op][player] 前缀。

yaml
command:
  - 'tell %player_name% 你点击了按钮'

点击默认物品后,插件会重新构建当前背包中的默认物品和未装备物品的功能槽位。名称、Lore、变量和 {unlock} 状态会随之刷新。

查看其他玩家背包时,默认物品指令不会由查看者代替背包主人执行。

功能槽位

slot-set 定义真正保存玩家装备的功能槽位。每个子节点名称就是槽位 ID,会用于玩家数据、变量、API、条件引用和外部界面映射。

yaml
slot-set:
  头盔:
    slot: 22
    id: '160:9'
    name: ' '
    lore:
      - '&7头盔槽位'
      - '&7解锁状态: {unlock}'
    replace-condition:
      - 'lore:{类型:头盔}<->&7该槽位只可放入头盔。'
    click-command:
      - 'tell %player_name% 你点击了头盔槽位'
    replace-command:
      - 'tell %player_name% 你将装备放入了头盔槽位'
    take-out-command:
      - 'tell %player_name% 你从头盔槽位取出了装备'
    unlock-condition:
      - 'permission:{unlock.头盔}'
    unlock-command:
      - 'tell %player_name% 你解锁了头盔槽位'
    attribute-condition:
      - 'permission:{unlock.头盔}'
    take-out-condition:
      - 'permission:{takeout.头盔}'
    attribute-rate: 1.0
    mapping-slot: ''
配置项类型默认值说明
节点名称字符串槽位 ID,需要在全部背包配置中保持唯一
slot整数0功能槽位在原版背包界面中的位置,只能填写一个槽位编号
id字符串160:0槽位没有装备时显示的物品 ID
name字符串空字符串空槽位的显示名称
lore字符串列表空列表空槽位的显示说明,可使用 {unlock} 和 PlaceholderAPI 变量
replace-condition字符串列表空列表放入或替换装备时需要满足的条件
click-command字符串列表空列表玩家点击功能槽位时执行的指令
replace-command字符串列表空列表成功放入或替换装备后执行的指令
take-out-command字符串列表空列表成功取出装备后执行的指令
unlock-condition字符串列表空列表解锁槽位需要满足的条件,可包含资源扣除项
unlock-command字符串列表空列表槽位成功解锁后执行的指令
attribute-condition字符串列表空列表当前装备属性参与加载时需要满足的条件
take-out-condition字符串列表空列表取出或替换已有装备时需要满足的条件
attribute-rate小数1.0当前槽位的属性 Lore 数值倍率
mapping-slot字符串空字符串GermPlugin 槽位的 Identity,用于匹配萌芽界面槽位

项目示例明确要求槽位 ID 全局不可重复。不要在两个背包中使用相同的 slot-set 节点名称,否则玩家数据、API、条件引用或外部槽位映射可能指向错误的槽位。

slot-set.*.slot 只能填写一个整数,不能填写 '0-8' 等范围。不同功能槽位也不应占用同一个界面位置。

空槽位显示

槽位没有装备时,界面显示该槽位配置的 idnamelore。装备物品后,界面改为显示玩家实际放入的物品。

lore 支持 {unlock}

槽位状态替换内容
已解锁§a已解锁
未解锁§7未解锁
yaml
lore:
  - '&7头盔槽位'
  - '&7解锁状态: {unlock}'

{unlock} 只用于空槽位物品的 Lore,不会写入玩家已经装备的物品。

放入条件

replace-condition 控制物品能否放入当前槽位。普通点击放入、替换已有装备、Shift 自动装备和 DragonCore 映射槽位操作都会使用该条件。

yaml
replace-condition:
  - 'lore:{类型:头盔}<->&7该槽位只可放入头盔。'
  - 'nolore:{未绑定}<->&c未绑定装备不能穿戴。'

可用物品条件

条件格式说明
papi:{表达式}检测 PlaceholderAPI 变量表达式
permission:{权限}玩家必须拥有指定权限
nopermission:{权限}玩家必须没有指定权限
name:{内容}物品名称包含指定内容
lore:{整行内容}物品 Lore 包含指定完整行
nolore:{整行内容}物品 Lore 不包含指定完整行
all-only-name:{名称#数量}全部 LyInventory 背包中,同名物品数量必须小于指定数量
all-only-lore:{Lore#数量}全部 LyInventory 背包中,包含指定 Lore 的物品数量必须小于指定数量
only-name:{背包ID#名称#数量}指定背包中,同名物品数量必须小于指定数量
only-lore:{背包ID#Lore#数量}指定背包中,包含指定 Lore 的物品数量必须小于指定数量
sz-type:{类型}检测 DragonArmourers 时装类型
hasNbt:{节点}检测物品是否存在指定 NBT 节点,需要 LyCore
nbtCheck:{表达式}读取 NBT 节点并执行表达式判断,需要 LyCore

名称、Lore 和条件文本需要与物品实际内容一致。物品含有彩色文本时,应在配置中写入对应颜色符。

DragonArmourers 类型

sz-type 示例确认支持以下时装类型:

类型时装部位
outfit套装
head帽子
chest衣服
legs裤子
feet鞋子
wings翅膀
sword武器或副手
bow

使用 sz-type 前需要安装 DragonArmourers。

同名装备互斥

only-name 条件中的名称参数可以填写固定名称,也可以使用字面量 <item> 代表当前准备装备物品的名称。

yaml
replace-condition:
  - 'only-name:{equipment#<item>#1}'

该配置表示 equipment 背包中,与当前物品同名的装备数量必须小于 1<item> 只适用于 only-name 系列条件,它不是 PlaceholderAPI 变量,必须按原样填写并放在代码字符串中。

NBT 条件

NBT 多层节点使用英文句点分隔。

yaml
replace-condition:
  - 'hasNbt:{装备.品质.等级}'
  - 'nbtCheck:&#123;&#123;装备.强化} >= 3}'

hasNbtnbtCheck 是 LyCore 联动条件。未安装 LyCore 时不要配置这两类条件。

多条件表达式

单条放入条件支持使用 && 表示“并且”,使用 || 表示“或者”。

yaml
replace-condition:
  - 'lore:{类型:头盔}||lore:{类型:帽子}<->&7该槽位只可放入头盔或帽子。'
  - 'lore:{类型:头盔}&&lore:{品质:优秀}<->&7该槽位只可放入优秀品质的头盔。'

可以使用 <-> 在条件末尾添加失败提示。分隔符左侧是检测内容,右侧是发送给玩家的消息,消息支持变量。

yaml
replace-condition:
  - 'permission:{equipment.use}<->&c你没有穿戴该装备的权限。'

全局穿戴限制

功能槽位的 replace-condition 通过后,插件还会继续执行主配置中的全局限制:

主配置作用
check-put-on-condition从指定 Lore 中读取数值,再将数值代入全局条件
anti-equip-item-lore物品包含指定完整 Lore 行时禁止装备

因此,物品满足当前槽位的 replace-condition,不代表一定可以装备。只要全局穿戴条件或禁止 Lore 检测失败,插件仍会拒绝该物品。

全局穿戴限制的配置方式见 主配置

槽位解锁

unlock-condition 控制功能槽位的永久解锁状态。成功解锁后,槽位 ID 会加入该玩家、该背包的解锁列表,并随玩家数据保存。

yaml
unlock-condition:
  - 'permission:{unlock.头盔}'
  - 'papi:{%player_level% >= 10}'
  - 'item:{解锁石#1}'
  - 'eco:{100}'
  - 'point:{100}'
条件格式说明解锁成功后是否扣除
papi:{表达式}检测 PlaceholderAPI 变量表达式
permission:{权限}玩家必须拥有指定权限
nopermission:{权限}玩家必须没有指定权限
item:{物品名称#数量}按名称检查玩家原版背包中的物品数量
eco:{数量}检查 Vault 经济余额
point:{数量}检查 PlayerPoints 点券余额

插件会先检查全部解锁条件。只有所有条件都通过后,才会扣除 itemecopoint 对应资源,并记录解锁状态。

使用不同资源条件前需要安装对应插件:

条件需要的插件或服务
papiPlaceholderAPI
ecoVault,以及可用的经济插件
pointPlayerPoints

空解锁条件

空解锁条件的行为由主配置 unlock-empty-condition-slot 决定。

配置值行为
true玩家打开背包时,自动把没有解锁条件的槽位标记为已解锁,不执行 unlock-command
false打开背包时不自动记录;玩家点击未解锁槽位时仍会按空条件尝试解锁

不需要额外条件的槽位可以删除 unlock-condition,或写为空列表:

yaml
unlock-condition: []

解锁指令

yaml
unlock-command:
  - 'tell %player_name% 你解锁了头盔槽位'

unlock-command 只在玩家成功执行槽位解锁操作时触发。主配置自动解锁空条件槽位时不会触发该指令。

指令会解析 PlaceholderAPI 变量并由控制台执行。

属性生效条件

attribute-condition 控制槽位内物品的 Lore 是否交给主配置选定的属性插件处理。条件不满足时,装备仍保存在槽位中,但该装备的属性 Lore 不会参与 LyInventory 的属性加载。

yaml
attribute-condition:
  - 'permission:{attribute.头盔}'
  - 'papi:{%player_level% >= 10}'
  - 'hasName:{equipment#项链#远古}'
  - 'hasLore:{equipment#项链#套装:远古}'
条件格式说明
papi:{表达式}检测 PlaceholderAPI 变量表达式
permission:{权限}玩家必须拥有指定权限
nopermission:{权限}玩家必须没有指定权限
hasName:{背包ID#槽位ID#关键字}指定槽位中装备的名称必须包含关键字
hasLore:{背包ID#槽位ID#关键字}指定槽位中装备的任意 Lore 行必须包含关键字

hasNamehasLore 会读取指定玩家已经加载的目标背包缓存。目标背包不存在、目标槽位没有装备,或装备不包含指定内容时,条件失败。

名称和 Lore 关键字支持 PlaceholderAPI 变量及 & 颜色符。参数使用 # 分隔为背包 ID、槽位 ID和关键字三部分。

取出条件

take-out-condition 控制玩家能否取出已有装备。使用鼠标替换已有装备时,也会先检查取出条件,因为替换操作需要把旧装备交还给玩家。

yaml
take-out-condition:
  - 'permission:{takeout.头盔}'
  - 'papi:{%player_level% >= 10}'
条件格式说明
papi:{表达式}检测 PlaceholderAPI 变量表达式
permission:{权限}玩家必须拥有指定权限
nopermission:{权限}玩家必须没有指定权限

任意条件不满足时,插件会阻止取出或替换,并发送主配置 message.not-take-out 的消息。

删除该项或配置为空列表表示不增加取出限制:

yaml
take-out-condition: []

槽位指令

功能槽位支持四组指令:

配置项执行时机
click-command玩家点击功能槽位时
replace-command物品成功放入空槽位,或成功替换已有装备后
take-out-command已有装备成功取出后
unlock-command槽位成功解锁后
yaml
click-command:
  - 'tell %player_name% 你点击了头盔槽位'
replace-command:
  - 'tell %player_name% 你装备了头盔'
take-out-command:
  - 'tell %player_name% 你取下了头盔'
unlock-command:
  - 'tell %player_name% 你解锁了头盔槽位'

这些指令会解析 PlaceholderAPI 变量并由控制台执行。直接填写命令内容,不需要 / 或执行身份前缀。

普通界面中,只有背包主人能够触发功能槽位的配置指令。其他玩家查看背包时不能代替背包主人装备、取出或解锁物品;非 OP 玩家也不能操作他人的背包内容。

属性倍率

yaml
attribute-rate: 0.5

attribute-rate 需要在主配置中启用 attribute-rate-enable 才会参与计算。未填写时默认为 1.0

数值效果
1.0按原数值加载属性
0.5按原数值的 50% 加载属性
2.0按原数值的 200% 加载属性

倍率处理只会选择同时满足以下条件的 Lore 行:

  1. Lore 行包含主配置 attribute-rate-key 中的属性关键字。
  2. 移除关键字后,剩余文本中存在可以计算的数字。
  3. 当前槽位的 attribute-condition 已通过。
yaml
attribute-rate-enable: true
attribute-rate-key:
  - '物理伤害'
  - '生命上限'

符合条件的数字会乘以槽位倍率,并格式化为两位小数。&§ 颜色代码后的数字不会作为属性数值计算。

启用倍率功能后,倍率不等于 1.0 的槽位只会提交命中属性关键字且包含数字的 Lore 行。没有命中关键字的 Lore 行不会加入该槽位的倍率属性列表。

未启用倍率功能时,符合 attribute-condition 的装备会按原 Lore 内容交给属性插件。

装备事件与 Lore 替换

玩家通过原版背包界面成功放入或替换装备前,插件会触发装备事件。事件中的物品可以被其他插件取消或修改。

主配置 lore-replace 也通过该装备事件工作。配置键与物品 Lore 完整行相同时,插件会在装备写入槽位前替换该行,并支持解析 PlaceholderAPI 变量。

yaml
lore-replace:
  '&c装备后绑定': '&6已绑定: &a%player_name%'

该功能按完整 Lore 行匹配,不是包含匹配。通过 API 直接设置槽位物品时不会触发装备事件,因此不会自动执行该 Lore 替换流程。

物品数量限制

待装备物品的堆叠数量不能大于 1。普通点击、替换、Shift 自动装备以及外部映射槽位操作都会进行数量检测。

尝试装备整组物品时,插件会拒绝操作并发送主配置 message.equip-item-amount-too-large 的消息。

该限制只影响装备操作,不影响空槽位的展示物品数量。

Shift 快捷操作

原版背包界面支持 Shift+左键快捷装备和快捷取出。

Shift 自动装备

玩家在原版背包区域 Shift+左键物品时,插件会按界面槽位编号从小到大查找可用功能槽位。目标槽位必须同时满足:

  • 当前没有装备物品。
  • 已经解锁。
  • 待装备物品数量不大于 1
  • 满足槽位 replace-condition
  • 满足主配置中的全局穿戴限制。
  • 装备事件没有被其他插件取消。

成功后,物品会写入第一个匹配的槽位,并执行该槽位的 replace-command

Shift 自动取出

玩家在 LyInventory 界面中 Shift+左键已装备物品时,插件会检查:

  • 玩家原版背包存在空位。
  • 当前槽位满足 take-out-condition

通过后,装备会放回玩家原版背包,功能槽位恢复为空槽位物品,并执行 take-out-command

所有 Shift 操作都会受到主配置 click-cooldown 的限制。

打开时重新检查装备

主配置 check-replace-condition-on-open 启用后,玩家打开背包前会重新使用各槽位的 replace-condition 和全局穿戴限制检查已经装备的物品。

yaml
check-replace-condition-on-open: true

不再符合条件的装备会尝试退回背包主人的原版背包,并恢复对应空槽位物品。如果原版背包没有空位,该装备会继续保留在功能槽位中。

该检查只处理仍存在对应槽位配置的装备。存档中存在但当前背包配置已经删除的槽位 ID,不会在此流程中自动迁移或退回。

点击冷却

默认物品点击、功能槽位点击、放入、取出、替换、Shift 操作和 DragonCore 映射操作会使用主配置中的统一冷却时间。

主配置说明
click-cooldown操作冷却时间,单位为毫秒
click-cooldown-message冷却未结束时发送的消息

冷却按执行操作的玩家记录。数值过大会让连续装备和界面刷新产生明显等待。

DragonCore 槽位映射

启用主配置 dragoncore-slot-mapping-enable 后,插件会接管符合以下格式的 DragonCore 槽位:

text
lyinv_背包ID_槽位ID

例如背包 ID 为 equipment、槽位 ID 为 头盔

yaml
identifier: 'lyinv_equipment_头盔'

DragonCore 标识直接由背包 ID 和槽位 ID 组成,不读取功能槽位中的 mapping-slot

DragonCore 映射会同步玩家已经装备的物品,并接管对应槽位的解锁、放入、替换、取出、点击指令和属性刷新。相关操作同样会检查物品数量、replace-conditiontake-out-condition 和点击冷却。

dragoncore-slot-mapping-enable 修改后需要重启服务器才能完成监听注册。

当前映射监听使用英文下划线拆分背包 ID 与槽位 ID。需要使用 DragonCore 映射时,背包 ID 和槽位 ID 不应包含英文下划线 _,否则标识可能无法被正确解析。

GermPlugin 槽位映射

mapping-slot 用于匹配 GermPlugin 界面槽位的 Identity。

yaml
slot-set:
  头盔:
    slot: 22
    mapping-slot: 'equipment_head'

插件检测到 GermPlugin 后,会遍历全部背包的功能槽位,查找 mapping-slot 与萌芽槽位 Identity 相同的配置。匹配成功后,插件会接管该槽位事件,并使用功能槽位的解锁条件、放入条件和配置指令。

不同功能槽位不应填写相同的 mapping-slot。监听会按已加载配置查找第一个匹配项,重复 Identity 无法可靠确定目标背包和槽位。

mapping-slot 只用于 GermPlugin,不影响原版背包槽位和 DragonCore 标识。

数据保存关系

玩家数据按“背包 ID + 槽位 ID”保存以下内容:

  • 功能槽位中的装备物品。
  • 已经解锁的槽位 ID 列表。
  • DragonArmourers 当前展示使用的背包 ID。

未启用 MySQL 时,玩家数据保存到 plugins/LyInventory/data/玩家UUID.yml。启用 MySQL 后,只有安装 LyMySQLCore、数据库配置正确并且 LyInventory 成功建立数据库连接时,MySQL 存储及对应的安全加载、保存流程才会生效;连接未成功时不能将相关功能视为可用。

修改背包 ID 或槽位 ID 会改变数据键,插件不会自动把旧名称下的装备和解锁记录迁移到新名称。正式服修改这些 ID 前应先处理已有玩家数据。

相关主配置

以下主配置会直接影响背包和功能槽位行为,完整说明见 主配置

配置项对背包配置的影响
dragoncore-slot-mapping-enable启用 DragonCore 的 lyinv_背包ID_槽位ID 映射
attribute-plugin指定接收背包装备 Lore 的属性插件
attribute-rate-enable决定 attribute-rate 是否参与属性计算
attribute-rate-key指定需要执行倍率计算的 Lore 属性关键字
anti-equip-item-lore包含指定完整 Lore 行的物品禁止装备
check-put-on-condition根据装备 Lore 中读取的数值执行全局穿戴条件
lore-replace物品通过装备事件放入槽位前,按完整 Lore 行进行替换
click-cooldown点击、放入、取出、替换和界面刷新的操作冷却,单位为毫秒
click-cooldown-message操作仍处于冷却时发送的消息
unlock-empty-condition-slot决定空解锁条件槽位是否在打开背包时自动解锁
check-replace-condition-on-open打开背包时重新检查已装备物品的放入条件
message.inventory-full玩家原版背包已满时的提示
message.unlock-fail解锁条件不足时的提示
message.unlock-success槽位成功解锁时的提示
message.not-unlocked-yet尝试向未解锁槽位放入物品时的提示
message.anti-equip-item-lore物品包含禁止穿戴 Lore 时的提示
message.equip-item-amount-too-large尝试装备堆叠物品时的提示
message.not-take-out取出条件不足时的提示

配置注意事项

  • 不要直接修改 示例背包.yml。该文件每次重载都会被覆盖,也不会作为正式背包载入。
  • 每个正式背包都需要独立且非空的 id
  • size 填写行数,插件会将其限制在 16
  • default-set.*.slot 支持多个槽位和连续范围,slot-set.*.slot 只能填写一个整数。
  • 全部背包中的功能槽位 ID 必须保持唯一。
  • 默认物品和功能槽位应避免占用同一个界面位置。
  • 配置指令由控制台执行,不要添加 / 或执行身份前缀。
  • 使用 PlaceholderAPI 表达式或变量前需要安装 PlaceholderAPI。
  • 使用 eco 解锁条件前需要安装 Vault,并提供可用的经济服务。
  • 使用 point 解锁条件前需要安装 PlayerPoints。
  • 使用 hasNbtnbtCheck 条件前需要安装 LyCore。
  • 使用 sz-type 条件前需要安装 DragonArmourers。
  • 功能槽位一次只能装备一件物品,堆叠数量大于 1 的物品会被拒绝。
  • 修改背包 ID 或槽位 ID 会改变玩家数据键,已有数据不会自动迁移。
  • DragonCore 映射使用下划线拆分标识,映射所用的背包 ID 和槽位 ID 不应包含英文下划线。
  • GermPlugin 的 mapping-slot 应保持唯一,避免多个功能槽位映射到相同 Identity。