Skip to content

技能触发器 ​

生物定义 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 动作管道字符串, 格式为:

[选择器 |] 动作名 [参数=值 ...]

常用选择器 ​

选择器来源说明
selfCoreLib触发这个事件的生物自己 (管道里的施法者)
targetEmakiMobs当前事件的目标实体 (on_target, on_damage_give)
killerEmakiMobs击杀这只生物的实体 (on_death)
victimEmakiMobs被这只生物击杀的实体 (on_kill)
attackerEmakiMobs攻击这只生物的实体 (on_damage_take)
nearby radius=<n> include_players=trueCoreLib半径范围内的实体.玩家默认会被排除: 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_idstring是无已加载的生物定义 id (区分大小写)要召唤的生物定义; 缺失或者空白时按配置错误 (INVALID_CONFIG) 返回, 没注册的 id 也一样按配置错误返回
countint否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 文档