简体中文
技能触发器
生物定义 actions 能绑定的全部触发器, 以及每条动作能用到的上下文变量如下
生物定义里的 actions 节点把触发器和 CoreLib 动作管道绑在一起. 动作由 EmakiCoreLib 的动作管道执行 (CoreLib 是硬依赖), 不需要安装 EmakiSkills. 旧键 skills 仍会作为兼容回退被读取, 读取时会提示 WARN, 建议尽快迁移过来
触发器列表
| 触发器 | 触发时机 | 上下文对象 |
|---|---|---|
on_spawn | 生物刷出时 (在 MobFactory 里, Boss 血条与模型挂载之后立刻执行) | — |
on_death | 生物死亡时 | killer (击杀者, 只在有存活的击杀者时才提供) |
on_target | 生物锁定新目标时 | target (只在目标非空时提供) |
on_damage_give | 这只生物作为攻击者造成伤害时 | target (只在挨打的是生物实体时才提供) |
on_damage_take | 这只生物受到伤害时 | attacker (只在攻击它的是生物实体时才提供) |
on_kill | 这只生物击杀某个实体时 | victim (被击杀的实体) |
on_shoot | 这只生物射出弹射物时 | — |
on_explode | 这只生物爆炸时 (比如苦力怕) | — |
on_teleport | 这只生物传送时 | — |
on_transform | 这只生物变形时 (比如僵尸猪灵变身) | — |
on_health_threshold_<百分比> | 生物血量第一次降到这个百分比或者更低时 | — |
"上下文对象"这一列的对象由 EmakiMobs 通过 CoreLib 的动作上下文键传进去; 没提供时, 对应的源段 (比如 killer) 会返回空结果, 那条动作行就不会被执行. 这里没有伤害量对象 (on_damage_give / on_damage_take 都不提供 damage), 需要伤害数值的话请改用 CoreLib 的其他手段
血量阈值触发器
on_health_threshold_<百分比> 的百分比档位固定为五档, 只有以下五个键名会被触发:
on_health_threshold_90
on_health_threshold_75
on_health_threshold_50
on_health_threshold_25
on_health_threshold_10写其他数字 (如 on_health_threshold_80) 不会报错, 但永远不触发
每个档位对同一只生物只会触发一次. 生物受到伤害时按 90 → 10 的顺序检查, 一次伤害跨过好几个档位时, 被跨过的档位会在同一次伤害里依次触发. 阈值按 当前生命值 / 最大生命值属性值 算, 最大生命值属性缺失或者不是正数时就不做阈值检查
NOTE
血量阈值是跟着伤害事件一起检测的, 所以 on_damage_take 和命中的阈值触发器会同时执行
动作字符串格式
每个触发器对应一组 CoreLib 动作管道字符串, 格式为:
[选择器 |] 动作名 [参数=值 ...]常用选择器
| 选择器 | 来源 | 说明 |
|---|---|---|
self | CoreLib | 触发这个事件的生物自己 (管道里的施法者) |
target | EmakiMobs | 当前事件的目标实体 (on_target, on_damage_give) |
killer | EmakiMobs | 击杀这只生物的实体 (on_death) |
victim | EmakiMobs | 被这只生物击杀的实体 (on_kill) |
attacker | EmakiMobs | 攻击这只生物的实体 (on_damage_take) |
nearby radius=<n> include_players=true | CoreLib | 半径范围内的实体.玩家默认会被排除: include_players 默认是 false, 只写 type=player 选不出任何目标, 必须显式加上 include_players=true |
EmakiMobs 注册的四个选择器 (target / killer / victim / attacker) 都依赖上面列的上下文对象: 只有对应触发器的事件里真的有这个对象时, 才能解析出目标
动作示例
yaml
actions:
on_spawn:
# 向附近 20 格内所有玩家发送消息
- "nearby radius=20 include_players=true | send_message text='<red>精英僵尸降临!'"
# 在自身位置播放粒子效果
- "self | spawn_particle particle=FLAME count=30 offset_x=0 offset_y=1 offset_z=0"
on_death:
# 向击杀者给予经验
- "killer | give_exp amount=80"
# 向附近玩家广播消息
- "nearby radius=50 include_players=true | send_message text='<green>精英僵尸已被击败!'"
on_damage_give:
# 对被攻击目标施加减速效果
- "target | give_potion_effect type=SLOWNESS level=1 duration=3s"
on_damage_take:
# 受伤时在自身位置产生火焰粒子
- "self | spawn_particle particle=FLAME count=10 offset_x=0 offset_y=1 offset_z=0"
on_target:
# 锁定目标时播放音效
- "self | play_sound sound=minecraft:entity.skeleton.ambient volume=1.0 pitch=0.7"EmakiMobs 注册的源段与动作段
除了 CoreLib 自带的内容, EmakiMobs 还向动作系统注册了 8 个段 (启动日志里会输出注册数量和期望值 8): 4 个源段 attacker / killer / victim / target, 4 个动作段 summon_mob / mob_play_animation / mob_stop_animation / mob_set_model. 动作行编译失败时, 控制台会输出 技能编译错误: mob=<id> trigger=<触发器> line=<行号> reason=<原因>, 这一行被跳过, 同个触发器里的其他行继续执行
summon_mob — 召唤生物定义
在目标位置召唤一只 EmakiMobs 生物定义
| 参数 | 类型 | 必填 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|---|
mob_id | string | 是 | 无 | 已加载的生物定义 id (区分大小写) | 要召唤的生物定义; 缺失或者空白时按配置错误 (INVALID_CONFIG) 返回, 没注册的 id 也一样按配置错误返回 |
count | int | 否 | 1 | ≥ 1 (小于 1 按 1 处理) | 召唤的数量; 会在目标位置逐个生成 |
yaml
actions:
on_damage_take:
# 在自身位置召唤两只火焰守卫
- "self | summon_mob mob_id=fire_guardian count=2"
on_health_threshold_50:
# 半血时在击杀者位置召唤一只随从
- "killer | summon_mob mob_id=boss_minion"这条动作要求目标能解析出位置 (执行域是位置区域). 目标没有位置时返回 skipped; 全部召唤都失败时返回 INTERNAL_ERROR
模型动作段
mob_play_animation, mob_stop_animation, mob_set_model 的参数与行为见实体模型与动画的"动作段"一节
NOTE
动作字符串的完整语法和所有可用动作都由 EmakiCoreLib 提供. 各动作及其参数的格式请参阅 CoreLib 文档