Skip to content

触发器 ​

EmakiItem 物品能用的全部触发器如下, 各自在什么时机触发, 会往动作里注入哪些变量, 以及怎么写进物品定义

触发器就是"到某个时机, 让这件物品自动执行动作". 适合做传送卷轴, 药水, 任务物品, 右键技能道具和装备被动效果

配置格式 ​

触发器写在物品定义文件的 actions 块下, 格式为触发器名称对应动作列表:

yaml
id: town_scroll
item:
  source: minecraft-paper
  components:
    custom_name: "<aqua>回城卷轴</aqua>"
actions:
  right_click:
    - 'send_message text="<green>正在传送回城。</green>"'
    - "play_sound sound=minecraft:entity.enderman.teleport volume=1 pitch=1"
  consume:
    - "play_sound sound=minecraft:entity.player.burp volume=1 pitch=1"

NOTE

每个触发器名称对应一个动作列表. 动作语法参见 CoreLib 动作系统文档

完整触发器列表 ​

交互类 ​

触发器触发时机上下文变量
right_click玩家右键空气或方块—
right_click_air玩家右键空气—
right_click_block玩家右键方块—
left_click玩家左键空气或方块, 以及攻击实体时攻击实体时为 target, damage
left_click_air玩家左键空气—
left_click_entity玩家攻击实体target, damage
shift_left_clickShift + 左键 (空气或方块)—
shift_right_clickShift + 右键 (空气或方块)—

战斗类 ​

触发器触发时机上下文变量
attack玩家攻击实体命中target, damage
damage_dealt玩家造成的伤害结算完毕 (最终伤害大于 0)target, damage
damaged_by_entity被实体伤害attacker, damage
damaged受到非实体来源的伤害 (摔落, 火焰等)damage
kill_entity击杀非玩家实体target, damage (固定为 0)
kill_player击杀玩家target, damage (固定为 0)
death玩家死亡—

attack 看的是玩家主手物品: 近战攻击, 玩家发射的投射物命中, 以及由玩家造成的致命伤害都算作玩家攻击

damage_dealt 在 MONITOR 优先级派发, 只在最终伤害大于 0 时执行, 所以能读到被其他插件改过之后的伤害值

护甲件也能收到战斗触发器: damage_dealt, kill_entity, kill_player 除了主手武器, 还会遍历护甲槽派发 (跳过主手与副手); damaged, damaged_by_entity 除了主手物品, 也会遍历其他装备槽派发 (跳过主手). 额外派发的条件是该物品定义的 equip_slot 不是 all, 且与实际所在的槽位匹配

投射物类 ​

触发器触发时机上下文变量
shoot_bow射出弓箭projectile_type
shoot_trident掷出三叉戟projectile_type
arrow_hit箭矢命中实体projectile_type
arrow_land箭矢未命中实体projectile_type
trident_hit三叉戟命中实体projectile_type
trident_land三叉戟未命中实体projectile_type

注意, 投射物触发在命中时才读取玩家当前主手物品, 所以换手之后可能不再匹配发射时的那件物品

物品操作类 ​

触发器触发时机上下文变量
drop_item丢弃物品 (Q 键)—
shift_drop_itemShift + 丢弃物品—
swap_items交换主副手 (F 键)—
shift_swap_itemsShift + 交换主副手—
consume物品被消耗 (食物/药水)consumed_item

drop_item, swap_items, place_block 和 consume 判定的是事件涉及的那件物品, 不是你当前手上的主手物品

WARNING

写名称时必须逐字写对, 插件不提供别名兼容: actions 下的键只会被转成小写并把空格换成下划线, 没注册的名称会被不报错地忽略, 也不告警

方块类 ​

触发器触发时机上下文变量
break_block破坏方块block
place_block放置方块block

其他 ​

触发器触发时机上下文变量
sneak玩家开始潜行 (松开时不触发)—
teleport传送—
login玩家登录—
give通过 /ei give 发放物品时amount

上下文变量 ​

触发器一触发, 变量就注入动作上下文, 你在动作里用 %变量名% 引用:

yaml
actions:
  attack:
    - 'send_message text="对 %target% 造成了 %damage% 点伤害"'
  kill_entity:
    - 'send_message text="击杀了 %target%"'

下面这些基础变量, 每个触发器都会注入:

变量说明
player玩家名称
item_id物品 ID
item_trigger触发器名称
item_name物品显示名

条件与禁用状态 ​

每次触发执行前, 物品定义的 condition 都会先算一遍: 不满足时这个触发器不执行, 并发送 on_fail.message, 执行 on_fail.actions; 满足时执行 on_pass.actions

物品启用了 repair, 且主手物品处于禁用状态 (耐久归零) 时, 触发器不会执行. 详见物品修复系统

配置示例 ​

攻击吸血武器 ​

yaml
id: vampire_blade
item:
  source: minecraft-netherite_sword
  components:
    custom_name: "<dark_red>吸血之刃</dark_red>"
actions:
  attack:
    - 'send_message text="<red>对 %target% 造成 %damage% 点伤害。</red>"'
  kill_entity:
    - 'send_message text="<red>灵魂汲取:%target%</red>"'

消耗品 ​

yaml
id: health_potion_large
item:
  source: minecraft-potion
  components:
    custom_name: "<red>大型生命药水</red>"
actions:
  consume:
    - "play_sound sound=minecraft:entity.generic.drink volume=1 pitch=1"
    - 'send_message text="<green>你饮下了 %item_name%。</green>"'