Skip to content

技能配置

技能文件放在插件目录的 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天火神龙}'

检查条件前会移除条件中的空格。namelore 条件中的 & 会转换为 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 开始连续配置,例如 012,不要跳过中间等级。

插件通过是否存在当前等级加一的节点判断能否升级。玩家当前为 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 的写法决定插件调用的技能系统。

写法调用目标
技能IDMythicMobs 技能
SkillAPI#技能IDSkillAPI 技能
Planners#技能IDPlanners 技能
yaml
skill-level:
  1:
    mythicmobs-skill: '测试主动技能1级'
  2:
    mythicmobs-skill: 'SkillAPI#测试技能'
  3:
    mythicmobs-skill: 'Planners#测试技能'

SkillAPI 和 Planners 技能释放时,会传入玩家当前的 LySkillView 技能等级。

对应的技能插件必须已经安装并正常加载,否则该来源无法正常释放。插件声明的软依赖包括 MythicMobsSkillAPIPlanners

冷却时间

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-default100玩家默认最大蓝量
player-max-mana-placeholder空字符串最大蓝量属性变量。留空时不使用属性加成
player-mana-recovery-interval1回蓝间隔,单位为秒
player-mana-recovery-value1每次恢复的蓝量
player-mana-recovery-placeholder空字符串回蓝加成属性变量。留空时不使用属性加成
mana-reduction-placeholder空字符串耗蓝缩减属性变量。留空时不生效
mana-reduction-max75耗蓝缩减上限,单位为百分比

主动按键技能会先检查 cast-condition,再检查并扣除蓝量。

被动技能的实现会先检查并扣除蓝量,再检查 cast-condition。因此被动技能的释放条件应避免在正常触发期间频繁失败。

升级条件

condition 配置在目标等级下,表示从上一级升级到该等级时必须满足的要求。

条件格式与 display-condition 相同:

yaml
condition:
  - 'papi:{%player_level% >= 10}'
  - 'permission:{skill.测试技能.upgrade}'
格式检查内容
papi:{表达式}PlaceholderAPI 表达式是否成立
permission:{权限节点}玩家是否拥有指定权限
name:{槽位<->名称}指定槽位是否存在名称匹配的物品
lore:{槽位<->描述}指定槽位是否存在 Lore 匹配的物品

升级流程如下:

  1. 检查当前等级加一的配置是否存在。
  2. 检查目标等级的 condition
  3. 检查目标等级的 need-item
  4. 扣除 need-item 中配置的物品。
  5. 将玩家技能等级增加一级。
  6. 以控制台身份执行目标等级的 run-command
  7. 刷新玩家当前可用技能缓存。
  8. 发送升级成功或失败消息。

所有 conditionneed-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-commandmythicmobs-skill 可以同时配置。插件会执行配置的控制台指令,并继续调用对应的外部技能。

公共冷却

gcd 的单位是毫秒,只在正常的主动按键释放流程中处理。

yaml
gcd: 1500

技能必须同时加入 config.ymlgcd-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%返回 enabledisable,表示该按键的自动释放状态
%lsv_Z:skill%返回该槽位绑定的技能 ID,没有绑定时返回 null
%lsv_Z:icon%返回该槽位技能图标路径,没有绑定时返回默认槽位贴图
%lsv_Z:cd%返回该槽位技能剩余冷却,单位为毫秒
%lsv_Z:cdmax%返回该槽位技能当前等级的最大冷却,单位为毫秒
%lsv_Z:cdsecond%返回该槽位技能剩余冷却,单位为秒,保留一位小数

Z 可以替换为配置在 register-skill-slot 中的其他按键,例如 XCVB

相关指令

插件注册命令为 lsv。代码中的管理类指令要求执行者拥有管理员权限,代码实际使用的是 Bukkit 的 isOp() 检查。

指令执行者说明
/lsv reloadOP重载插件配置、技能文件、界面文件和快捷键设置
/lsv open <技能菜单ID>玩家打开指定的独立技能菜单
/lsv try-levelup <玩家> <技能>OP尝试升级指定玩家的技能,技能参数支持 PlaceholderAPI 解析
/lsv try-bind <玩家> <技能> <键位>OP尝试将指定玩家的技能绑定到快捷键,键位不带 KEY_
/lsv reset <玩家> <技能>OP将指定玩家的指定技能等级设置为 0
/lsv reset <玩家> allOP将指定玩家的技能等级设置为 0
/lsv mana <玩家> <蓝量>OP恢复指定玩家蓝量。大于 1 时按固定数值恢复,01 时按最大蓝量比例恢复
/lsv takecd <玩家> <技能> <模式> <值>OP扣除指定玩家技能冷却,技能参数支持 PlaceholderAPI 解析
/lsv autocast <玩家> <键位>OP切换指定玩家指定按键的自动释放状态,键位不带 KEY_
/lsv load-old-dataOP将旧版数据转换为新版数据格式

takecd 的模式如下:

模式说明
second按秒数减少当前冷却
allrate按总冷却时间的百分比减少冷却
nowrate按当前剩余冷却时间的百分比减少冷却

takecd 的值范围为 0100

玩家数据与数据库

玩家技能等级、技能绑定键位、技能冷却结束时间和当前蓝量会保存到 MySQL。

必须安装 LyMySQLCore,并确保 LySkillView 成功连接数据库后,玩家数据读取与保存功能才会生效。

插件通过 config.yml 中的 mysql 节点连接数据库:

yaml
mysql:
  databasename: mc2
  username: mc2
  password: mc1234
  port: 3306
  ip: 127.0.0.1
配置项默认值说明
mysql.databasenamemc2数据库名称
mysql.usernamemc2数据库用户名
mysql.passwordmc1234数据库密码
mysql.port3306数据库端口
mysql.ip127.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#100TIME#20
  • cooldowngcd 的单位都是毫秒。
  • condition 配置在目标等级下,表示升级到该等级需要满足的条件。
  • cast-condition 每次释放都会检查,不等同于技能显示条件。
  • need-item 的具体物品格式应沿用项目中已经确认的配置写法。
  • 公共冷却分组只对正常主动按键释放生效,被动技能和自动释放不会触发分组公共冷却。
  • PlaceholderAPI 变量只有在 PlaceholderAPI 已安装并正常加载时才会解析。
  • 使用萌芽快捷键、技能菜单和技能界面时,需要确保 GermPlugin 已安装并正常加载。
  • 使用 MythicMobs、SkillAPI 或 Planners 技能来源时,需要安装对应技能插件。
  • 玩家技能等级、绑定键位、冷却结束时间和当前蓝量存储在 MySQL。必须安装 LyMySQLCore,并确保数据库连接成功后,玩家数据读取与保存功能才会生效。