配置说明
LyDragonSkillView 的配置分为主配置 config.yml 与技能配置 skills/*.yml。主配置负责数据库、属性来源、技能菜单、职业、蓝量、键位、保存周期和提示文本;技能文件负责主动技能、被动技能、等级、释放方式、冷却、蓝耗、升级条件和事件脚本。
文件结构
| 文件或目录 | 说明 |
|---|---|
plugins/LyDragonSkillView/config.yml | 主配置文件。 |
plugins/LyDragonSkillView/skills/*.yml | 技能配置目录,可以拆分为多个 YAML 文件。 |
plugins/DragonCore/Gui/*.yml | 配套的 DragonCore 服务端界面配置。 |
客户端 DragonCore/gui/LyDragonSkillView/ | 技能菜单、技能栏和读条界面使用的贴图资源。 |
skills 目录下每个文件可以配置多个技能,但技能 ID 在所有技能文件中必须全局唯一。插件只注册 type 为 active 或 passive 的技能,未知类型会被跳过。
config.yml
MySQL 数据库
yaml
mysql:
enable: false
databasename: mc2
username: mc2
password: mc1234
port: 3306
ip: 127.0.0.1MySQL 前置要求
启用 MySQL 存储前,必须安装 LyMySQLCore,并确认它已成功连接数据库。LyMySQLCore 未加载或数据库连接失败时,本插件的 MySQL 数据读取、保存和同步不会生效。
| 配置项 | 默认值 | 说明 |
|---|---|---|
mysql.enable | false | 是否启用 MySQL 存储。修改后需要重启服务器。 |
mysql.databasename | mc2 | 数据库名称。 |
mysql.username | mc2 | 数据库用户名。 |
mysql.password | mc1234 | 数据库密码。 |
mysql.port | 3306 | MySQL 服务端口。 |
mysql.ip | 127.0.0.1 | MySQL 服务地址。 |
插件连接后会创建名为 LyDragonSkillView 的数据表。数据表使用玩家名称作为唯一索引,数据正文保存在 data 字段中。
未启用 MySQL,或运行时数据库连接不可用时,循环保存会使用本地 YAML 玩家数据。
属性插件
yaml
attribute-plugin: ''attribute-plugin 用于选择职业属性的写入方式。修改后需要重启服务器。
| 可选值 | 说明 |
|---|---|
| 空字符串 | 不向属性插件写入职业属性。 |
AttributePlus | 使用 AttributePlus。 |
SX-Attribute2 | 使用 SX-Attribute 2。 |
SX-Attribute3 | 使用 SX-Attribute 3。 |
AttributeSystem | 使用 AttributeSystem。 |
ItemLoreOrigin | 使用 ItemLoreOrigin。 |
配置的插件必须已安装并正常加载,否则对应的职业属性不会生效。
技能装备数量
yaml
max-active-skill-amount: 0
max-passive-skill-amount: 0| 配置项 | 默认值 | 说明 |
|---|---|---|
max-active-skill-amount | 0 | 玩家最多可装备的主动技能数量,0 表示不限制。 |
max-passive-skill-amount | 0 | 玩家最多可装备的被动技能数量,0 表示不限制。 |
主动技能必须绑定技能栏才能释放。被动技能是否必须绑定,由技能自身的 require-bind-slot 决定。
技能菜单
yaml
skill-class:
战士:
open-condition:
- 'class:{见习战士|战士|战神}'
- 'papi:{%player_level% >= 10}'
skill:
- '示例读条技能'
- '示例主动技能'
- '示例被动技能'| 配置项 | 说明 |
|---|---|
skill-class | 技能菜单分类根节点。 |
skill-class.菜单ID | 一个独立的技能菜单,节点名称就是菜单 ID。 |
open-condition | 打开菜单前需要满足的条件列表。留空表示不限制。 |
skill | 菜单中显示的技能 ID 列表。技能 ID 必须存在于 skills/*.yml。 |
菜单 ID 可用于 /ldsv open 菜单ID。多个 open-condition 条件会共同参与判断。
菜单与技能显示条件
以下条件写法可用于菜单的 open-condition,也可用于技能的 show-condition:
| 写法 | 说明 |
|---|---|
class:{战士} | 当前职业必须为指定职业。 |
class:{见习战士|战士|战神} | 当前职业为列表中的任意一个。 |
papi:{%player_level% >= 10} | 使用 PlaceholderAPI 变量表达式判断。 |
permission:{skill.example} | 玩家必须拥有指定权限。 |
nopermission:{skill.example} | 玩家必须没有指定权限。 |
条件为空或节点不存在时,默认允许打开菜单或显示技能。
职业设置
yaml
class-setting:
战士:
tag: '&7[&6战士&7]'
attribute:
- '攻击力+1'| 配置项 | 说明 |
|---|---|
class-setting.职业ID | 职业配置节点,节点名称作为职业 ID。 |
tag | 职业显示称号。 |
attribute | 切换到该职业后写入属性插件的属性列表。 |
使用 /ldsv class 玩家 职业ID 设置职业,使用 /ldsv class 玩家 clear 清除职业。职业发生变化时,插件会更新对应的职业属性。
禁用技能的世界
yaml
disable-skill-world:
- 'world'
- 'world_nether'disable-skill-world 是世界名称黑名单。在列表中的世界里,主动技能不能释放,被动技能也不会触发;正在进行的按压释放流程也会被拦截。
世界名称按不区分大小写的方式匹配。
界面发包与数据保存
yaml
packet-interval: 300
loop-save-thread-time: 600
dragon-placeholder-interval: 1| 配置项 | 单位 | 默认值 | 说明 |
|---|---|---|---|
packet-interval | 毫秒 | 300 | DragonCore 界面操作的数据包处理间隔,用于限制高频点击。 |
loop-save-thread-time | 秒 | 600 | 在线玩家数据的循环保存间隔,填写 0 或负数可关闭循环保存。 |
dragon-placeholder-interval | tick | 1 | DragonCore HUD 变量同步间隔,20 tick 等于约 1 秒。 |
较低的 dragon-placeholder-interval 可以提高读条和技能栏界面的刷新频率,但会增加服务器与网络消耗。
蓝量基础值
yaml
default-max-mana: 100
default-regen-per-second: 2
mana-placeholder: '0'
mana-max: 0.0| 配置项 | 默认值 | 说明 |
|---|---|---|
default-max-mana | 100 | 玩家基础最大蓝量。 |
default-regen-per-second | 2 | 玩家每秒恢复的蓝量。 |
mana-placeholder | 0 | 最大蓝量百分比加成来源,可以填写 PlaceholderAPI 变量。 |
mana-max | 0.0 | 蓝量加成百分比上限,0 表示不限制。 |
百分比配置使用实际百分数,20 表示 20%,不是 0.2。
最大蓝量通常按以下方式计算:
text
基础最大蓝量 ×(1 + 蓝量加成 ÷ 100)当 default-max-mana 为 0 时,插件会直接将蓝量加成数值作为最大蓝量。属性结果必须是纯数字,可以带小数;空值、非数字和负数会按 0 处理。
冷却、蓝耗与吟唱属性
yaml
cooling-reduction-placeholder: '0'
cooling-reduction-max: 0.0
mana-reduction-placeholder: '0'
mana-reduction-max: 0.0
the-chant-accelerated-placeholder: '0'
the-chant-accelerated-max: 0.0| 配置项 | 说明 |
|---|---|
cooling-reduction-placeholder | 冷却缩减百分比来源,可以填写 PlaceholderAPI 变量。 |
cooling-reduction-max | 冷却缩减百分比上限,0 表示不限制。 |
mana-reduction-placeholder | 蓝耗缩减百分比来源,可以填写 PlaceholderAPI 变量。 |
mana-reduction-max | 蓝耗缩减百分比上限,0 表示不限制。 |
the-chant-accelerated-placeholder | 吟唱加速百分比来源,可以填写 PlaceholderAPI 变量。 |
the-chant-accelerated-max | 吟唱加速百分比上限,0 表示不限制。 |
这些属性同样使用实际百分数,例如 25 表示 25%。属性值小于 0 时按 0 处理;上限大于 0 时,超过上限的部分会被截断。
技能名称显示
yaml
skill-show-name: '{name} &f({level_result}/{level_max})'
upgrade-condition-full-level-text: '&a技能已满级'| 配置项 | 说明 |
|---|---|
skill-show-name | 技能列表中的名称格式。 |
upgrade-condition-full-level-text | 技能满级后,描述中的 {upgrade_condition} 显示文本。 |
skill-show-name 支持以下内部变量:
| 变量 | 说明 |
|---|---|
{name} | 技能显示名称。 |
{level_now} | 玩家保存的原始技能等级。 |
{level_extra} | 额外加成等级。 |
{level_result} | 原始等级与额外等级之和。 |
{level_max} | 技能配置的显示等级上限。 |
技能栏键位
yaml
show-bind-key-enable: true
bind-key:
- 'Q'
- 'R'
- 'Z'
- 'X'
- 'C'
- 'V'| 配置项 | 说明 |
|---|---|
show-bind-key-enable | 是否在界面中显示技能绑定键位名称。 |
bind-key | 注册的技能栏键位列表。列表顺序同时用于槽位下标与键位名称之间的映射。 |
同一个技能只能绑定到一个键位。修改键位名称或数量后,需要同步调整 DragonCore 技能栏界面中使用的组件和变量。
技能降级
yaml
level-down-enable: true
level-down-skill-point: 1| 配置项 | 默认值 | 说明 |
|---|---|---|
level-down-enable | true | 是否允许玩家通过界面降低技能等级。 |
level-down-skill-point | 1 | 每实际降低一级返还的技能点数量。所有技能统一使用此值。 |
技能降至 0 级后,对应的技能栏绑定会被清理。
技能排序
yaml
skill-sort-type: 'default'| 值 | 说明 |
|---|---|
default | 按菜单中 skill 列表的配置顺序显示。 |
level_down | 按玩家技能等级从高到低排序。 |
level_up | 按玩家技能等级从低到高排序。 |
消息文本
yaml
message:
释放失败-蓝量不足: '&7蓝量不足 {mana} 点, 无法释放.'
释放失败-技能冷却: '&7技能冷却中, 剩余{time}s.'
释放失败-GCD冷却: '&7公共冷却中, 稍后再尝试.'
开始释放: '&f释放技能: {skill}'
读条中断: '&c技能读条已中断'
释放完成: '&a读条完成: {skill}'消息支持 & 颜色符号。字符串中的 \n 会转换为实际换行。将某条消息设置为空字符串,可以禁止发送该条聊天消息。
| 消息键 | 可确认变量 | 触发场景 |
|---|---|---|
释放失败-蓝量不足 | {mana} | 当前蓝量不足以支付技能蓝耗。 |
释放失败-技能冷却 | {time} | 技能仍处于冷却状态。 |
释放失败-GCD冷却 | 无 | 主动技能仍处于公共冷却状态。 |
开始释放 | {skill} | 开始释放技能。 |
读条中断 | 无 | 技能读条被中断。 |
释放完成 | {skill} | 技能读条完成。 |
按压中断 | {skill}、{time} | 按压技能提前松开并中断。 |
无法绑定-不需要绑定 | 无 | 尝试绑定不要求技能栏的被动技能。 |
无法绑定-未学习 | 无 | 尝试绑定尚未学习的技能。 |
无法绑定-主动技能数量已满 | 无 | 已达到主动技能装备数量上限。 |
无法绑定-被动技能数量已满 | 无 | 已达到被动技能装备数量上限。 |
升级失败-条件不足 | {condition} | 下一级升级条件不满足。 |
升级失败-技能满级 | 无 | 技能已达到等级上限。 |
降级失败-条件不足 | 无 | 技能已经是最低等级。 |
降级失败-未启用 | 无 | level-down-enable 已关闭。 |
降级成功 | 无 | 技能降级成功。 |
升级成功 | 无 | 技能升级成功。 |
skills/*.yml
技能通用结构
yaml
火球术:
name: '火球术'
type: 'active'
texture: 'gui/LyDragonSkillView/skill.png'
simple-description: '&a主动技能'
max-level: 2
extra-level-placeholder: '0'
show-condition:
- 'papi:{%player_level% >= 10}'
skill-level:
0:
description:
- '&7尚未学习'
- '{upgrade_condition}'| 配置项 | 说明 |
|---|---|
| 技能顶层节点 | 技能 ID,必须在全部技能文件中保持唯一。 |
name | 技能显示名称,未配置时使用技能 ID。 |
type | 技能类型,仅支持 active 和 passive。 |
texture | 技能图标贴图路径。 |
simple-description | 技能列表中使用的简短描述。 |
max-level | 界面显示与升级判断使用的等级上限。未配置时按已解析的等级节点推算。 |
extra-level-placeholder | 额外技能等级来源,可以填写 PlaceholderAPI 变量。默认值为 0。 |
show-condition | 技能在菜单中的显示条件,留空表示始终显示。 |
skill-level | 各等级的具体配置。 |
skill-level.0 通常只配置未学习状态的描述。插件升级时会寻找高于当前原始等级的下一个已配置等级,因此等级节点可以被解析为数字,但建议连续配置。
额外等级不会修改玩家保存的原始等级,可以让技能运行时等级超过 max-level。界面中的原始等级、额外等级和最终等级分别使用 {level_now}、{level_extra} 和 {level_result}。
等级描述
yaml
skill-level:
1:
description:
- '&a主动技能 &b{level_result}级'
- '&7冷却: &e{result_cooldown}s&7(原{origin_cooldown}s)'
- '&7蓝耗: &b{result_mana}&7(原{origin_mana})'
- ''
- '&7升级条件:'
- '{upgrade_condition}'| 变量 | 说明 |
|---|---|
{level_now} | 原始技能等级。 |
{level_extra} | 额外加成等级。 |
{level_result} | 最终有效等级。 |
{level_max} | 技能显示等级上限。 |
{origin_cooldown} | 配置中的原始冷却。 |
{result_cooldown} | 应用冷却缩减后的冷却。 |
{origin_mana} | 配置中的原始蓝耗。 |
{result_mana} | 应用蓝耗缩减后的蓝耗。 |
{upgrade_condition} | 下一级升级条件的显示文本;满级时使用主配置中的满级文本。 |
升级条件与消耗
每个等级的 upgrade-list 表示升级到该等级时需要检查并扣除的内容。每行使用 规则|显示文本 格式,竖线后的文本用于技能描述界面。
yaml
upgrade-list:
- 'papi:{%player_level% >= 10}|&b等级大于等于10级'
- 'item:{测试技能书#3}|&b{item}x{amount}'
- 'eco:{5000}|&e金币x{amount}'
- 'point:{30}|&5点券x{amount}'
- 'skill-point:{1}|&b技能点x{amount}'| 规则 | 说明 | 相关前置 |
|---|---|---|
papi:{表达式} | 检查 PlaceholderAPI 表达式,不产生消耗。 | PlaceholderAPI |
item:{物品ID#数量} | 检查并扣除指定数量的物品。 | 对应物品配置 |
eco:{数量} | 检查并扣除经济余额。 | Vault 及经济插件 |
point:{数量} | 检查并扣除 PlayerPoints 点券。 | PlayerPoints |
skill-point:{数量} | 检查并扣除本插件技能点。 | 无 |
显示文本中的 {item} 和 {amount} 会用于展示对应物品或数量。升级前会先检查整组条件,检查通过后再执行消耗。
主动技能
主动技能结构
yaml
火球术:
type: 'active'
skill-level:
1:
active-trigger:
trigger: 'instant'
interrupt-when: []
cast-time-tick: 0
cast-trigger-count: 1
cooldown-on-cast-start: true
cast-condition: []
event:
on-cast-start: []
on-cast-finish: []
on-cast-success: []
on-cast-interrupt: []
on-cast-trigger: []
on-charge-recover: []
on-mana-consume: []
max-stack: 1
cooldown: '6000'
mana: '20'
gcd: '1200'
upgrade-list: []
description: []| 配置项 | 默认值 | 说明 |
|---|---|---|
active-trigger.trigger | instant | 主动技能释放方式。 |
active-trigger.interrupt-when | 空列表 | 可以中断读条的场景。 |
active-trigger.cast-time-tick | 0 | 读条时间,单位为 tick,支持 PlaceholderAPI 变量和四则运算表达式。 |
active-trigger.cast-trigger-count | 1 | 读条期间的分段触发次数,至少为 1。 |
active-trigger.cooldown-on-cast-start | true | 是否在开始读条时进入冷却。 |
active-trigger.cast-condition | 空列表 | 每次释放前检查的条件。 |
active-trigger.event | 空 | 技能生命周期事件脚本。 |
active-trigger.max-stack | 1 | 最大充能层数。大于 1 时作为多层充能技能。 |
active-trigger.cooldown | 0 | 技能冷却或每层充能恢复时间,单位为毫秒。 |
active-trigger.mana | 0 | 技能基础蓝耗。 |
active-trigger.gcd | 0 | 主动技能公共冷却,单位为毫秒。 |
cast-time-tick、cooldown、mana 和 gcd 可以使用字符串保存表达式。包含变量或运算时应使用引号包裹,避免 YAML 将内容解析为其他类型。
主动释放方式
trigger 值 | 说明 |
|---|---|
instant | 瞬发技能,不进行读条。 |
tap_cast | 按下一次后开始读条,读条完成后自动释放。 |
hold_cast | 按住按键读条,读条完成后自动释放;抬键用于结束按键防重复状态。 |
hold_release_cast | 按住按键读条,读条完成后还需抬起按键才释放;提前抬起会中断。 |
当非瞬发技能的读条时间小于等于 0 时,不会形成有效读条流程。
读条中断
yaml
interrupt-when:
- 'move'
- 'attack'
- 'damaged'| 值 | 说明 |
|---|---|
move | 玩家移动时中断。 |
attack | 玩家造成伤害时中断。 |
damaged | 玩家受到伤害时中断。 |
interrupt-when 只对读条技能有效。空列表表示不会因这些场景自动中断。
冷却开始时机
cooldown-on-cast-start | 说明 |
|---|---|
true | 开始释放时立即进入冷却并启动充能恢复计时。 |
false | 读条中断或成功完成后再进入冷却。仅对非瞬发读条技能有效。 |
释放条件
yaml
cast-condition:
- '{mana_now} >= 10|&c蓝量不足,至少需要10点蓝量'
- '%player_level% >= 20|&c等级不足'每行使用 条件表达式|失败提示 格式。失败提示可以省略。任意条件不满足时,本次主动释放或被动触发都会被拦截。
条件支持 PlaceholderAPI、比较表达式以及 &&、|| 逻辑运算。逻辑或必须写为 ||,避免与失败提示的单个 | 分隔符混淆。
| 内置变量 | 说明 |
|---|---|
{player} | 玩家名称。 |
{skill_id} | 当前技能 ID。 |
{skill_name} | 当前技能显示名称。 |
{skill_level} | 当前有效等级,即原始等级加额外等级。 |
{skill_base_level} | 玩家数据中的原始等级。 |
{mana_now} | 当前蓝量。 |
{mana_max} | 最大蓝量。 |
技能事件
事件节点既可以写成 YAML 列表,也可以使用 |- 编写多行脚本。
yaml
event:
on-cast-start: |-
玩家消息('&7开始释放: &6{skill_name}')
音效('ENTITY_EXPERIENCE_ORB_PICKUP')
on-cast-success: |-
MM技能('请替换为你的MM技能ID', 'damage=120')
玩家消息('&a释放成功: &6{skill_name}')| 事件节点 | 触发时机 |
|---|---|
on-cast-start | 主动技能开始释放或开始读条时。 |
on-cast-finish | 主动技能读条结束时。 |
on-cast-success | 瞬发技能成功释放,或读条技能完整完成时。 |
on-cast-interrupt | 主动技能读条被中断时。 |
on-cast-trigger | 读条时间线到达一个分段时。 |
on-charge-recover | 技能恢复一层或多层充能时。 |
on-mana-consume | 技能成功扣除蓝量后。 |
事件中可使用的变量取决于事件类型:
| 事件 | 可确认变量 |
|---|---|
| 通用释放事件 | {player}、{skill_id}、{skill_name}、{skill_level}、{skill_base_level}、{mana_now}、{mana_max} |
on-cast-trigger | {count_now}、{count_max} |
on-cast-interrupt | {count_now}、{count_max}、{elapsed}、{scale} |
on-charge-recover | {recover}、{stack_before}、{stack_now}、{stack_max} |
on-mana-consume | {mana_consume}、{mana_before}、{mana_after} |
项目示例中可以确认的脚本调用包括:
| 调用 | 说明 |
|---|---|
玩家消息('文本') | 向当前玩家发送消息。 |
全服消息('文本') | 向全服发送消息。 |
范围消息('文本', 范围) | 向指定范围内的玩家发送消息。 |
音效('音效ID') | 为当前玩家播放音效。 |
MM技能('技能ID', '键=值') | 释放 MythicMobs 技能,并可追加参数。 |
减少冷却('技能ID', '秒数') | 减少指定技能的剩余冷却。 |
增加冷却('技能ID', '秒数') | 增加指定技能的剩余冷却。 |
减少蓝量('数值') | 减少当前玩家蓝量。 |
增加蓝量('数值') | 增加当前玩家蓝量。 |
执行指令('类型', '指令') | 执行指令,类型支持 console、op、player。 |
被动技能
被动技能结构
yaml
灼焰印记:
name: '灼焰印记'
type: 'passive'
texture: 'gui/LyDragonSkillView/skill.png'
simple-description: '&6被动技能'
max-level: 2
extra-level-placeholder: '0'
require-bind-slot: false
show-condition: []
skill-level:
1:
passive-trigger:
events:
- 'attack'
condition-list: []
chance: '1.0'
cast-condition: []
event:
on-cast-success: []
on-charge-recover: []
on-mana-consume: []
max-stack: 1
cooldown: '0'
mana: '0'
upgrade-list: []
description: []| 配置项 | 默认值 | 说明 |
|---|---|---|
require-bind-slot | false | 是否必须将被动技能装备到技能栏后才会生效。该项写在技能外层,对全部等级生效。 |
passive-trigger.events | 空列表 | 被动技能监听的触发场景。 |
passive-trigger.condition-list | 空列表 | 触发场景命中后继续检查的条件。 |
passive-trigger.chance | 1.0 | 触发概率,范围为 0 到 1。 |
passive-trigger.cast-condition | 空列表 | 被动技能正式触发前检查的释放条件。 |
passive-trigger.event.on-cast-success | 空列表 | 被动触发成功后执行的脚本。 |
passive-trigger.event.on-charge-recover | 空列表 | 恢复充能时执行的脚本。 |
passive-trigger.event.on-mana-consume | 空列表 | 成功扣蓝后执行的脚本。 |
passive-trigger.max-stack | 1 | 被动技能最大充能层数。 |
passive-trigger.cooldown | 0 | 被动技能冷却或充能恢复时间,单位为毫秒。 |
passive-trigger.mana | 0 | 被动技能触发时消耗的蓝量。 |
被动技能固定按瞬发处理,不使用读条时间、读条分段、读条中断和公共冷却。
被动触发场景
events 写法 | 说明 |
|---|---|
attack | 玩家造成伤害时检测。 |
damaged | 玩家受到伤害时检测。 |
kill | 玩家完成击杀时检测。 |
cast_skill:all | 玩家释放任意技能时检测。 |
cast_skill:技能ID | 玩家释放指定技能时检测。 |
tick:5 | 每隔指定 tick 数检测一次。 |
被动技能必须已经学习。若 require-bind-slot 为 true,还必须装备到技能栏。事件、条件、概率、冷却、充能和蓝量检查全部通过后,才会执行 on-cast-success。
被动条件
yaml
condition-list:
- 'papi:{%player_level% >= 20}'
- 'permission:{skill.passive}'
- 'nopermission:{skill.disabled}'| 写法 | 说明 |
|---|---|
papi:{表达式} | 检查 PlaceholderAPI 表达式。 |
permission:{权限} | 玩家必须拥有指定权限。 |
nopermission:{权限} | 玩家必须没有指定权限。 |
condition-list 用于被动事件匹配后的额外判断;cast-condition 则与主动技能使用相同的释放条件格式,并支持失败提示文本。
配置注意事项
mysql.enable与attribute-plugin修改后需要重启服务器。skills/*.yml中的技能 ID 必须全局唯一,菜单、绑定、变量和事件引用必须使用相同 ID。- 百分比属性统一使用实际百分数,
20表示 20%。 - 时间单位并不统一:
cast-time-tick使用 tick,cooldown和gcd使用毫秒,loop-save-thread-time使用秒。 - 带 PlaceholderAPI 变量或四则运算的数值建议使用引号包裹。
bind-key调整后,需要同步修改 DragonCore 技能栏界面。skill-level.0代表未学习状态,实际释放配置应放在大于0的等级节点中。- 主动技能固定要求绑定技能栏;被动技能由
require-bind-slot决定学习后直接生效还是装备后生效。 disable-skill-world会同时阻止主动释放、按压释放完成和被动触发。