技能配置
技能文件放在插件目录的 skills/ 文件夹中。插件会读取该目录下的所有 YAML 文件,每个文件可以配置多个技能。
每个顶层节点都是一个唯一的技能 ID。技能 ID会用于技能菜单、玩家等级数据、快捷键绑定、技能释放、PlaceholderAPI 变量和公共冷却分组。
基础配置
yaml
测试主动技能:
index: 100000
skill-name:
- '&6天火暴动 &7({level}/{max})'
- '&b主动技能'
skill-icon: 'local<->textures/misc/LySkillView/lyskillview(1).png'
display-condition: []
trigger-mode: '主动'
skill-level:
0:
lore:
- '技能尚未激活'
1:
mythicmobs-skill: '测试主动技能1级'
cooldown: 1000
mana: 5
condition: []
need-item: []
run-command: []
cast-condition: []
cast-command: []
gcd: 1500
lore:
- '当前技能等级:1'| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
index | 整数 | 自动分配 | 技能排序值,数字越小越靠前。填写非负数时使用配置值,省略或填写负数时由插件自动分配 |
skill-name | 字符串列表 | 无 | 技能菜单中的名称,支持多行 |
skill-icon | 字符串 | 无 | 技能图标路径,同时用于技能菜单、技能槽位和相关变量 |
display-condition | 字符串列表 | 空列表 | 技能显示和进入当前可用技能缓存时需要满足的条件 |
trigger-mode | 字符串 | 无 | 技能触发方式,可设置为主动技能或被动触发方式 |
skill-level | 节点 | 无 | 技能等级配置,子节点名称必须是整数 |
技能名称
技能菜单生成技能名称时会处理以下内容:
| 内容 | 说明 |
|---|---|
{level} | 当前玩家的技能等级 |
{max} | 技能最大等级 |
| PlaceholderAPI 变量 | 按查看菜单的玩家解析 |
& 颜色代码 | 转换为 Minecraft 颜色代码 |
yaml
skill-name:
- '&6天火暴动 &7({level}/{max})'
- '&b主动技能'技能图标
skill-icon 使用萌芽资源路径,例如:
yaml
skill-icon: 'local<->textures/misc/LySkillView/lyskillview(1).png'技能图标会用于以下位置:
- 技能菜单中的技能图标。
- 已绑定技能槽位的图标。
lsv_按键:icon变量返回的图标路径。- 当前选中技能图标变量返回的图标路径。
技能排序
插件会读取所有 skills/ 文件中的技能,并按照 index 从小到大排序。
填写非负数时使用配置的排序值:
yaml
index: 100000省略 index 或填写负数时,插件会在加载过程中自动分配排序值。
技能 ID必须唯一。不同技能文件中如果出现相同的顶层节点名称,后加载的数据可能覆盖先加载的数据,因此不要重复使用技能 ID。
显示条件
display-condition 决定技能是否显示在技能菜单中,也决定技能是否进入玩家当前可用技能缓存。
同一技能配置多个条件时,玩家必须同时满足全部条件。未配置该字段或填写空列表时,不额外限制技能显示。
yaml
display-condition:
- 'papi:{%player_level% > 0}'
- 'permission:{skill.测试技能}'| 格式 | 检查内容 |
|---|---|
papi:{表达式} | 使用 PlaceholderAPI 变量解析后检查表达式 |
permission:{权限节点} | 检查玩家是否拥有指定权限 |
name:{槽位<->名称} | 检查指定槽位中的物品名称 |
lore:{槽位<->描述} | 检查指定槽位中的物品 Lore |
物品条件可以使用萌芽槽位标识:
yaml
display-condition:
- 'name:{GermPlugin#宠物槽位<->&6天火神龙}'
- 'lore:{GermPlugin#宠物槽位<->&6天火神龙}'检查条件前会移除条件中的空格。name 和 lore 条件中的 & 会转换为 Minecraft 颜色代码后再匹配。
触发方式
trigger-mode 决定技能通过快捷键主动释放,还是在事件发生时自动尝试释放。
| 写法 | 类型 | 触发时机 |
|---|---|---|
主动 | 主动技能 | 玩家按下已注册的萌芽快捷键 |
LEFT#几率 | 被动技能 | 玩家左键点击空气或方块 |
RIGHT#几率 | 被动技能 | 玩家右键点击空气或方块 |
TIME#几率 | 被动技能 | 插件每秒尝试一次 |
DAMAGED#几率 | 被动技能 | 玩家受到实体伤害 |
ATTACK#几率 | 被动技能 | 玩家对实体造成伤害 |
几率以 100 为总值:
yaml
trigger-mode: 'ATTACK#25'该配置表示玩家造成伤害时,有 25/100 的几率尝试触发技能。
被动触发方式必须包含 #几率,例如左键触发应写为 LEFT#100,不能只写 LEFT。
主动技能
主动技能只有在玩家技能等级大于 0 时才能绑定到快捷键。
yaml
trigger-mode: '主动'同一快捷键只能绑定一个技能。绑定新技能时,该快捷键上原有技能会解除绑定。
被动技能
被动技能不能绑定到快捷键。插件会遍历玩家当前可用、技能等级大于 0 且满足显示条件的被动技能。
被动技能触发时会检查:
- 配置的触发几率。
- 技能自身冷却。
- 玩家当前蓝量和耗蓝缩减。
- 当前等级的
cast-condition。 - 当前等级的技能来源和
cast-command。
被动技能不会处理 gcd-group 公共冷却分组。
等级配置
skill-level 下的子节点名称必须是整数。建议从 0 开始连续配置,例如 0、1、2,不要跳过中间等级。
插件通过是否存在当前等级加一的节点判断能否升级。玩家当前为 1 级时,必须存在 skill-level.2 才能继续升级。
yaml
skill-level:
0:
lore:
- '技能尚未激活'
1:
mythicmobs-skill: '测试主动技能1级'
cooldown: 1000
mana: 5
condition: []
need-item: []
run-command: []
cast-condition: []
cast-command: []
gcd: 1500
lore:
- '技能已激活'0级
0 级表示技能尚未激活。该等级只读取 lore,不会读取技能来源、冷却、蓝耗、升级条件或释放条件。
yaml
0:
lore:
- '这是一个尚未激活的技能'
- ''
- '激活技能需要满足指定条件'1级及以上
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mythicmobs-skill | 字符串 | 无 | 当前等级释放的外部技能 ID |
cooldown | 字符串或数字 | 1000 | 技能自身冷却,单位为毫秒,支持 PlaceholderAPI 变量和四则运算 |
mana | 整数 | 0 | 当前等级的基础蓝耗 |
condition | 字符串列表 | 空列表 | 从上一级升级到当前等级时需要满足的条件 |
need-item | 字符串列表 | 空列表 | 升级成功时检查并扣除的物品 |
run-command | 字符串列表 | 空列表 | 升级成功后由控制台执行的指令 |
cast-condition | 字符串列表 | 空列表 | 每次释放技能前检查的条件 |
cast-command | 字符串列表 | 空列表 | 技能释放时由控制台执行的指令 |
gcd | 长整数 | 0 | 主动按键释放时使用的公共冷却,单位为毫秒 |
lore | 字符串列表 | 空列表 | 当前等级在技能界面中显示的描述 |
技能来源
mythicmobs-skill 的写法决定插件调用的技能系统。
| 写法 | 调用目标 |
|---|---|
技能ID | MythicMobs 技能 |
SkillAPI#技能ID | SkillAPI 技能 |
Planners#技能ID | Planners 技能 |
yaml
skill-level:
1:
mythicmobs-skill: '测试主动技能1级'
2:
mythicmobs-skill: 'SkillAPI#测试技能'
3:
mythicmobs-skill: 'Planners#测试技能'SkillAPI 和 Planners 技能释放时,会传入玩家当前的 LySkillView 技能等级。
对应的技能插件必须已经安装并正常加载,否则该来源无法正常释放。插件声明的软依赖包括 MythicMobs、SkillAPI 和 Planners。
冷却时间
cooldown 的单位是毫秒。配置可以是固定数字,也可以包含 PlaceholderAPI 变量和算术表达式。
支持的内容:
| 内容 | 说明 |
|---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
() | 括号 |
| 小数 | 计算后转换为整数毫秒 |
| PlaceholderAPI 变量 | 先解析变量,再计算表达式 |
yaml
cooldown: '1000'yaml
cooldown: '1000 + (%player_level% * 50)'玩家最终获得的冷却时间还会受到 config.yml 中冷却缩减变量和缩减上限影响。
如果冷却内容无法解析为有效数字,插件本次读取会使用 1000 毫秒。
蓝耗与回蓝
mana 是技能的基础蓝耗:
yaml
mana: 5实际扣除蓝量会根据 config.yml 中的耗蓝缩减变量计算,并转换为整数。玩家当前蓝量不足时,技能不会释放。
蓝量相关配置位于 config.yml:
| 配置项 | 默认值 | 说明 |
|---|---|---|
player-max-mana-default | 100 | 玩家默认最大蓝量 |
player-max-mana-placeholder | 空字符串 | 最大蓝量属性变量。留空时不使用属性加成 |
player-mana-recovery-interval | 1 | 回蓝间隔,单位为秒 |
player-mana-recovery-value | 1 | 每次恢复的蓝量 |
player-mana-recovery-placeholder | 空字符串 | 回蓝加成属性变量。留空时不使用属性加成 |
mana-reduction-placeholder | 空字符串 | 耗蓝缩减属性变量。留空时不生效 |
mana-reduction-max | 75 | 耗蓝缩减上限,单位为百分比 |
主动按键技能会先检查 cast-condition,再检查并扣除蓝量。
被动技能的实现会先检查并扣除蓝量,再检查 cast-condition。因此被动技能的释放条件应避免在正常触发期间频繁失败。
升级条件
condition 配置在目标等级下,表示从上一级升级到该等级时必须满足的要求。
条件格式与 display-condition 相同:
yaml
condition:
- 'papi:{%player_level% >= 10}'
- 'permission:{skill.测试技能.upgrade}'| 格式 | 检查内容 |
|---|---|
papi:{表达式} | PlaceholderAPI 表达式是否成立 |
permission:{权限节点} | 玩家是否拥有指定权限 |
name:{槽位<->名称} | 指定槽位是否存在名称匹配的物品 |
lore:{槽位<->描述} | 指定槽位是否存在 Lore 匹配的物品 |
升级流程如下:
- 检查当前等级加一的配置是否存在。
- 检查目标等级的
condition。 - 检查目标等级的
need-item。 - 扣除
need-item中配置的物品。 - 将玩家技能等级增加一级。
- 以控制台身份执行目标等级的
run-command。 - 刷新玩家当前可用技能缓存。
- 发送升级成功或失败消息。
所有 condition 和 need-item 要求都满足后,升级才会成功。
升级物品
need-item 是升级目标等级时需要检查并扣除的物品列表。
yaml
need-item: []空列表表示升级时不需要扣除物品。
项目证据未提供 need-item 列表项的完整物品格式。配置具体物品时,应沿用技能文件中已经确认的写法。
升级指令
run-command 在升级成功后由控制台执行。执行前会解析目标玩家的 PlaceholderAPI 变量。
yaml
run-command:
- 'tell %player_name% 技能升级成功'指令内容不要添加开头的 /。
释放条件
cast-condition 在技能每次释放时检查,支持与 display-condition 相同的四种格式。
yaml
cast-condition:
- 'papi:{%player_health% > 5}'
- 'permission:{skill.测试技能.cast}'同一等级配置多个释放条件时,必须全部满足。任意条件失败都会终止本次释放,并发送 config.yml 中的技能释放失败消息。
| 字段 | 作用 |
|---|---|
display-condition | 决定技能是否显示,以及是否进入玩家当前可用技能缓存 |
cast-condition | 技能已经可用后,决定本次触发是否允许继续释放 |
condition | 决定玩家能否从上一级升级到当前等级 |
释放指令
cast-command 在技能成功进入冷却后由控制台执行,并解析目标玩家的 PlaceholderAPI 变量。
yaml
cast-command:
- 'tell %player_name% 你触发了测试技能'指令内容不要添加开头的 /。
cast-command 与 mythicmobs-skill 可以同时配置。插件会执行配置的控制台指令,并继续调用对应的外部技能。
公共冷却
gcd 的单位是毫秒,只在正常的主动按键释放流程中处理。
yaml
gcd: 1500技能必须同时加入 config.yml 的 gcd-group 分组,公共冷却分组才会影响同组技能。
yaml
gcd-group:
战士技能:
- '战士技能1'
- '战士技能2'
- '战士技能3'当一个主动技能成功触发时:
- 当前技能先进入自身冷却。
- 如果自身冷却短于
gcd,当前技能冷却会延长到gcd。 - 插件查找所有包含当前技能的公共冷却组。
- 组内技能当前冷却短于本次
gcd时,会被延长到本次公共冷却结束时间。 - 一个技能可以同时存在于多个分组,命中的所有分组都会被处理。
被动技能不会触发公共冷却分组。自动释放任务调用的无提示释放流程也不会处理公共冷却分组。
技能描述
lore 是当前等级在技能界面中显示的描述列表。每个等级可以配置不同内容。
yaml
lore:
- '这是一个普通的测试主动技能'
- '冷却时间:&6%lsv_cooldown:测试主动技能%秒'
- '蓝耗:&6%lsv_mana:测试主动技能%'
- ''
- '当前等级:1'技能描述中可以使用 LySkillView 提供的 PlaceholderAPI 变量,例如技能等级、当前等级蓝耗和当前等级冷却。
技能菜单与快捷键
技能菜单由 技能界面.yml 配置,技能侧边栏由 技能栏.yml 配置。两个文件都会在插件目录中自动生成。
config.yml 中的 register-skill-slot 用于注册萌芽快捷键和对应的技能槽位:
yaml
register-skill-slot:
'KEY_Z': '技能槽位1'
'KEY_X': '技能槽位2'
'KEY_C': '技能槽位3'
'KEY_V': '技能槽位4'
'KEY_B': '技能槽位5'| 配置项 | 说明 |
|---|---|
register-skill-slot.KEY_Z | 注册 KEY_Z 快捷键,并绑定到配置文件中的 技能槽位1 组件 |
register-skill-slot.KEY_X | 注册 KEY_X 快捷键,并绑定到 技能槽位2 组件 |
register-skill-slot.KEY_C | 注册 KEY_C 快捷键,并绑定到 技能槽位3 组件 |
register-skill-slot.KEY_V | 注册 KEY_V 快捷键,并绑定到 技能槽位4 组件 |
register-skill-slot.KEY_B | 注册 KEY_B 快捷键,并绑定到 技能槽位5 组件 |
技能槽位组件名称必须存在于 技能界面.yml 中,否则快捷键注册检查会失败。
玩家在技能菜单中选中技能后,点击对应技能槽位即可绑定。主动技能等级为 0 时不能绑定,被动技能始终不能绑定。
未绑定技能时,槽位使用 config.yml 中的 default-slot-texture:
yaml
default-slot-texture: 'local<->textures/gui/技能视图/slot.png'独立技能菜单
config.yml 中的 skill-menu 用于定义独立技能菜单及其包含的技能:
yaml
skill-menu:
战士技能:
- '战士技能1'
- '战士技能2'
- '战士技能3'菜单 ID是 skill-menu 下的节点名称。菜单中的技能 ID必须与技能文件中的顶层节点名称完全一致。
通过 lsv open 打开独立技能菜单时,只会显示该菜单列出的技能,并继续检查每个技能的 display-condition。
自动释放
自动释放功能按已绑定的主动技能槽位工作。插件每秒检查一次玩家启用的自动释放按键,并尝试释放对应技能。
自动释放会检查:
- 玩家是否拥有该按键的自动释放权限。
- 玩家是否开启了该按键的自动释放状态。
- 技能是否已绑定到该按键。
- 技能自身冷却。
cast-condition。- 当前蓝量。
旁观者模式玩家不会执行自动释放检查。
每个快捷键的自动释放权限格式为:
text
lsv.autocast.Z其中 Z 对应 KEY_Z 去掉 KEY_ 后的按键名称。
PlaceholderAPI 变量
插件注册的变量前缀为 lsv。使用格式为 %lsv_变量%。
玩家技能变量
| 变量 | 返回内容 |
|---|---|
%lsv_level:技能ID% | 玩家指定技能等级 |
%lsv_mana:技能ID% | 玩家当前等级的实际技能蓝耗,已应用耗蓝缩减 |
%lsv_cooldown:技能ID% | 玩家当前等级的实际技能冷却,已应用冷却缩减,单位为秒 |
玩家蓝量变量
| 变量 | 返回内容 |
|---|---|
%lsv_mana% | 玩家当前蓝量 |
%lsv_maxmana% | 玩家最大蓝量 |
当前选中技能变量
这些变量在技能菜单选中技能后返回对应数据。没有选中技能时使用默认返回值。
| 变量 | 无选中技能时的返回值 | 说明 |
|---|---|---|
%lsv_target_skill_level% | 0 | 当前选中技能等级 |
%lsv_target_skill_max_level% | 0 | 当前选中技能最大等级 |
%lsv_target_skill_name% | 空字符串 | 当前选中技能名称,多行名称使用换行拼接 |
%lsv_target_skill_icon% | 空字符串 | 当前选中技能图标路径 |
%lsv_target_skill_id% | 空字符串 | 当前选中技能 ID |
快捷键变量
变量中的按键名称不需要添加 KEY_。例如 Z 对应 KEY_Z。
| 变量 | 返回内容 |
|---|---|
%lsv_Z:autocast% | 返回 enable 或 disable,表示该按键的自动释放状态 |
%lsv_Z:skill% | 返回该槽位绑定的技能 ID,没有绑定时返回 null |
%lsv_Z:icon% | 返回该槽位技能图标路径,没有绑定时返回默认槽位贴图 |
%lsv_Z:cd% | 返回该槽位技能剩余冷却,单位为毫秒 |
%lsv_Z:cdmax% | 返回该槽位技能当前等级的最大冷却,单位为毫秒 |
%lsv_Z:cdsecond% | 返回该槽位技能剩余冷却,单位为秒,保留一位小数 |
Z 可以替换为配置在 register-skill-slot 中的其他按键,例如 X、C、V 或 B。
相关指令
插件注册命令为 lsv。代码中的管理类指令要求执行者拥有管理员权限,代码实际使用的是 Bukkit 的 isOp() 检查。
| 指令 | 执行者 | 说明 |
|---|---|---|
/lsv reload | OP | 重载插件配置、技能文件、界面文件和快捷键设置 |
/lsv open <技能菜单ID> | 玩家 | 打开指定的独立技能菜单 |
/lsv try-levelup <玩家> <技能> | OP | 尝试升级指定玩家的技能,技能参数支持 PlaceholderAPI 解析 |
/lsv try-bind <玩家> <技能> <键位> | OP | 尝试将指定玩家的技能绑定到快捷键,键位不带 KEY_ |
/lsv reset <玩家> <技能> | OP | 将指定玩家的指定技能等级设置为 0 |
/lsv reset <玩家> all | OP | 将指定玩家的技能等级设置为 0 |
/lsv mana <玩家> <蓝量> | OP | 恢复指定玩家蓝量。大于 1 时按固定数值恢复,0 到 1 时按最大蓝量比例恢复 |
/lsv takecd <玩家> <技能> <模式> <值> | OP | 扣除指定玩家技能冷却,技能参数支持 PlaceholderAPI 解析 |
/lsv autocast <玩家> <键位> | OP | 切换指定玩家指定按键的自动释放状态,键位不带 KEY_ |
/lsv load-old-data | OP | 将旧版数据转换为新版数据格式 |
takecd 的模式如下:
| 模式 | 说明 |
|---|---|
second | 按秒数减少当前冷却 |
allrate | 按总冷却时间的百分比减少冷却 |
nowrate | 按当前剩余冷却时间的百分比减少冷却 |
takecd 的值范围为 0 到 100。
玩家数据与数据库
玩家技能等级、技能绑定键位、技能冷却结束时间和当前蓝量会保存到 MySQL。
必须安装 LyMySQLCore,并确保 LySkillView 成功连接数据库后,玩家数据读取与保存功能才会生效。
插件通过 config.yml 中的 mysql 节点连接数据库:
yaml
mysql:
databasename: mc2
username: mc2
password: mc1234
port: 3306
ip: 127.0.0.1| 配置项 | 默认值 | 说明 |
|---|---|---|
mysql.databasename | mc2 | 数据库名称 |
mysql.username | mc2 | 数据库用户名 |
mysql.password | mc1234 | 数据库密码 |
mysql.port | 3306 | 数据库端口 |
mysql.ip | 127.0.0.1 | 数据库地址 |
玩家数据会在 LyMySQLCore 的玩家数据加载事件中读取,在玩家数据保存事件中写入。插件还会在关闭时保存当前缓存数据。
loop-save-thread-time 用于配置循环保存线程的间隔,单位为 tick:
yaml
loop-save-thread-time: 6000填写 0 或更小的值时不启动该循环保存功能。
完整配置示例
yaml
测试主动技能:
index: 100000
skill-name:
- '&6天火暴动 &7({level}/{max})'
- '&b主动技能'
skill-icon: 'local<->textures/misc/LySkillView/lyskillview(1).png'
display-condition:
- 'papi:{%player_level% > 0}'
- 'permission:{skill.测试技能}'
trigger-mode: '主动'
skill-level:
0:
lore:
- '这是一个普通的测试主动技能'
- ''
- '技能尚未激活'
1:
mythicmobs-skill: '测试主动技能1级'
cooldown: 1000
mana: 5
condition: []
need-item: []
run-command: []
cast-condition: []
cast-command:
- 'tell %player_name% 你触发了天火暴动'
gcd: 1500
lore:
- '这是一个普通的测试主动技能'
- '冷却时间:&6%lsv_cooldown:测试主动技能%秒'
- '蓝耗:&6%lsv_mana:测试主动技能%'
- ''
- '当前1级'
2:
mythicmobs-skill: '测试主动技能2级'
cooldown: 500
mana: 5
condition: []
need-item: []
run-command: []
cast-condition: []
cast-command:
- 'tell %player_name% 你触发了天火暴动'
gcd: 1500
lore:
- '这是一个普通的测试主动技能'
- '冷却时间:&6%lsv_cooldown:测试主动技能%秒'
- '蓝耗:&6%lsv_mana:测试主动技能%'
- ''
- '当前2级,技能已满级'
测试被动技能:
index: 100001
skill-name:
- '&6天火之怒 &7({level}/{max})'
- '&6被动技能'
skill-icon: 'local<->textures/misc/LySkillView/lyskillview(1).png'
display-condition:
- 'papi:{%player_level% > 0}'
trigger-mode: 'ATTACK#100'
skill-level:
0:
lore:
- '这是一个尚未激活的被动技能'
1:
mythicmobs-skill: '测试被动技能1级'
cooldown: 1000
mana: 5
condition: []
need-item: []
run-command: []
cast-condition: []
cast-command:
- 'tell %player_name% 你触发了天火之怒'
gcd: 0
lore:
- '攻击实体时尝试触发'
- '技能拥有独立冷却和蓝耗'配置注意事项
- 技能 ID必须唯一,并与技能菜单、公共冷却分组、变量和指令中的技能 ID完全一致。
skill-level建议从0开始连续配置,避免跳过等级节点。0级只用于显示未激活技能的lore。- 主动技能必须将
trigger-mode设置为主动,否则不能绑定到快捷键。 - 被动触发格式必须包含
#几率,例如LEFT#100、TIME#20。 cooldown和gcd的单位都是毫秒。condition配置在目标等级下,表示升级到该等级需要满足的条件。cast-condition每次释放都会检查,不等同于技能显示条件。need-item的具体物品格式应沿用项目中已经确认的配置写法。- 公共冷却分组只对正常主动按键释放生效,被动技能和自动释放不会触发分组公共冷却。
- PlaceholderAPI 变量只有在 PlaceholderAPI 已安装并正常加载时才会解析。
- 使用萌芽快捷键、技能菜单和技能界面时,需要确保
GermPlugin已安装并正常加载。 - 使用 MythicMobs、SkillAPI 或 Planners 技能来源时,需要安装对应技能插件。
- 玩家技能等级、绑定键位、冷却结束时间和当前蓝量存储在 MySQL。必须安装
LyMySQLCore,并确保数据库连接成功后,玩家数据读取与保存功能才会生效。