trigger_type(触发器)
触发器匹配器决定技能、突破条件与事件规则响应哪些运行时事件。内置信号匹配器每个条目写死一个信号 id,派发到这一步时回答「到的是不是这个信号」;mxt:js 是例外,它的信号由定义自己给出。type 写在触发器对象上,取值是下面列出的 id 之一,命名空间固定 mxt;整族由固有注册表 mxt:trigger_type 分派,数据包只能选用,不能新增。
触发器对象写在事件规则的 trigger 字段下,技能与突破条件把一组触发器写在 triggers 数组里:
{"type": "mxt:triggered", "triggers": [{"type": "mxt:item_use"}]}除 mxt:js 外,这些匹配器都不带字段,整个条目就是 {"type": ...} 这一层。
mxt:tick
实体周期性 tick。
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
| — | — | — | 没有字段。 |
{"type": "mxt:tick"}mxt:attack
实体攻击了另一个实体。
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
| — | — | — | 没有字段。 |
{"type": "mxt:attack"}mxt:hurt
实体受到伤害。
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
| — | — | — | 没有字段。 |
{"type": "mxt:hurt"}mxt:kill
实体击杀了另一个实体。
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
| — | — | — | 没有字段。 |
{"type": "mxt:kill"}mxt:block_break
实体破坏了一个方块。
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
| — | — | — | 没有字段。 |
{"type": "mxt:block_break"}mxt:block_use
实体使用了一个方块。
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
| — | — | — | 没有字段。 |
{"type": "mxt:block_use"}mxt:item_use
实体完成了一次物品使用。
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
| — | — | — | 没有字段。 |
{"type": "mxt:item_use"}mxt:equip
实体的装备发生了变化。
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
| — | — | — | 没有字段。 |
{"type": "mxt:equip"}mxt:death
实体死亡。
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
| — | — | — | 没有字段。 |
{"type": "mxt:death"}mxt:breakthrough
实体完成了一次突破。
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
| — | — | — | 没有字段。 |
{"type": "mxt:breakthrough"}mxt:progression_level
某个所有者达到新的进度等级。一次晋升提交之后才发布,所以反应方读到的是新等级。
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
| — | — | — | 没有字段。 |
{"type": "mxt:progression_level"}mxt:js
由服务端脚本回调决定的匹配器。
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
signal | Identifier | 必填 | 该匹配器监听的信号 id;订阅以它为索引 |
id | String | 必填 | 用 MxtTriggers.matcher 注册的回调 id |
params | Object | {} | 传给回调的任意 JSON |
{"type": "mxt:triggered", "triggers": [{"type": "mxt:js", "signal": "example:pill_taken", "id": "example:on_pill"}]}这是数据包响应自定义信号 id 的唯一途径:服务端脚本用 MxtTriggers.publish 发出信号,然后要么让脚本自己订阅它,要么在技能、事件规则或某个数值的突破条件里声明这个触发器。回调只决定到达订阅的那个信号算不算命中,所以回调缺失或抛异常时永远不会匹配。见 KubeJS API 参考。
移植的原版触发器
这一族的条目同样属于 mxt:trigger_type,每个对应一个原版进度的触发器,沿用原版 id,判定交给原版自己的实例代码,所以字段与原版逐字一致——原版进度里那段 conditions 可以整段复制过来。区别只在外层:原版把参数包在 conditions 里,这里没有那层包装,字段直接与 type 同级(原版 player_killed_entity 写 entity + killing_blow,这里同样是这两个字段)。
左列的 type 一律是 mxt: 命名空间,原版触发器名只用来对照。
信号 / type | 原版触发器 | 读取的字段 |
|---|---|---|
mxt:consume_item | minecraft:consume_item | player、item |
mxt:brewed_potion | minecraft:brewed_potion | player、potion |
mxt:tame_animal | minecraft:tame_animal | player、entity |
mxt:bred_animals | minecraft:bred_animals | player、parent、partner、child |
mxt:villager_trade | minecraft:villager_trade | player、villager、item |
mxt:used_totem | minecraft:used_totem | player、item |
mxt:started_riding | minecraft:started_riding | player |
mxt:changed_dimension | minecraft:changed_dimension | player、from、to |
mxt:effects_changed | minecraft:effects_changed | player、effects、source |
mxt:lightning_strike | minecraft:lightning_strike | player、lightning、bystander |
mxt:player_hurt_entity | minecraft:player_hurt_entity | player、damage、entity |
mxt:entity_hurt_player | minecraft:entity_hurt_player | player、damage |
mxt:player_killed_entity | minecraft:player_killed_entity | player、entity、killing_blow |
mxt:entity_killed_player | minecraft:entity_killed_player | player、entity、killing_blow |
mxt:shot_crossbow | minecraft:shot_crossbow | player、item |
mxt:player_interacted_with_entity | minecraft:player_interacted_with_entity | player、item、entity |
mxt:fishing_rod_hooked | minecraft:fishing_rod_hooked | player、rod、entity、item |
mxt:thrown_item_picked_up_by_player | minecraft:thrown_item_picked_up_by_player | player、item、entity |
mxt:enter_block | minecraft:enter_block | player、block、state |
mxt:location | minecraft:location | player |
mxt:slept_in_bed | minecraft:slept_in_bed | player |
mxt:levitation | minecraft:levitation | player、distance、duration |
mxt:using_item | minecraft:using_item | player、item |
mxt:fall_from_height | minecraft:fall_from_height | player、start_position、distance |
mxt:fall_after_explosion | minecraft:fall_after_explosion | player、start_position、distance、cause |
mxt:ride_entity_in_lava | minecraft:ride_entity_in_lava | player、start_position、distance |
mxt:nether_travel | minecraft:nether_travel | player、start_position、distance |
mxt:inventory_changed | minecraft:inventory_changed | player、slots、items |
mxt:filled_bucket | minecraft:filled_bucket | player、item |
mxt:item_durability_changed | minecraft:item_durability_changed | player、item、durability、delta |
player、entity、victim 这类字段沿用原版的写法:既可以是一段战利品条件列表([{"condition": "minecraft:entity_properties", "entity": "this", "predicate": {...}}],多项表示全部满足),也可以直接写实体谓词({"type": "minecraft:zombie"})。既然是战利品条件,模组自己的条件也能写进去,例如 {"condition": "mxt:realm", "realm": "mxt:foundation"}。下面三条照抄自原版进度,只去掉了 conditions 那一层:
{"type": "mxt:consume_item", "item": {"items": "minecraft:golden_apple"}}{
"type": "mxt:player_killed_entity",
"entity": [{"condition": "minecraft:entity_properties", "entity": "this", "predicate": {"type": "minecraft:breeze"}}]
}{"type": "mxt:changed_dimension", "to": "minecraft:the_nether"}这些信号由模组自己的钩子发布,因此可重复、只在运行时存在(原版同一时刻的 criterion 是某个玩家某条进度上的一次性布尔值,还会写进存档),并且和内置信号一样能被事件规则、技能触发器与突破条件共用。信号只对它原本服务的那个玩家发布(原版的进度触发器也只认玩家),所以带实体谓词的字段总能拿到求值需要的上下文。
三条是时机的差别:
mxt:changed_dimension在传送之前发布(原版在传送完成后记账,而 NeoForge 只提供传送前的事件);mxt:tame_animal在驯服落地之前发布(原版在写回驯服标记之后),读驯服状态自身(nbt、flags)的谓词会看到旧值。mxt:effects_changed在一 tick 结束时发布,这样effects描述的就是变化后的效果集合;同一 tick 内的多次变化合并成一次。mxt:fishing_rod_hooked只覆盖"钓上战利品"那一次(原版对"钩住实体"另发一次,NeoForge 没有对应事件),而且事件只带鱼钩不带鱼竿,鱼竿按玩家双手推断。
伤害类信号除了判定用的 damage,还额外提供 original_damage、blocked(1/0)与 blocked_damage 给公式使用;mxt:consume_item 提供 use_duration,mxt:levitation 提供 duration(已持续的 tick 数)。
其中 11 条原版自己就在轮询(每 tick 或落地时比较),移植方式就是照抄那段比较,所以节奏与原版一致:mxt:location 每 20 tick 一次;mxt:using_item 在使用物品期间每 tick 一次;mxt:levitation 在效果存续期间每 tick 一次;mxt:ride_entity_in_lava 在载具进入岩浆后每 tick 一次;mxt:fall_from_height 在开始下落时记起点、落地时发布;mxt:fall_after_explosion 同样在起跳时判断,因此只对风弹一类真正带冲量的爆炸成立,与原版一致;mxt:nether_travel 在进入下界时记位置、回到主世界时发布;mxt:inventory_changed 与 mxt:slept_in_bed 分别在背包格子变化、睡着那一刻发布。
mxt:enter_block 是这一族里唯一的近似:原版测的是该 tick 的移动路径与方块内部形状的相交,所以站在水里不动也会每 tick 重复触发;这里测的是玩家碰撞箱新覆盖到的方块——液体算,无碰撞的草与火把不算。"走进去"这个时机一致,但站住不动不会重复触发。需要持续效果就用 mxt:tick,或给规则加 cooldown。
mxt:filled_bucket 看"空桶被非空物品替换",mxt:item_durability_changed 看"同一物品的损伤值上升"(修复不触发,与原版一致)。判定仍走原版实例:实例拿到的是变化前的那份堆,所以 delta 用原版算法时受损为负(写 {"max": -1}),durability 是变化后的剩余耐久。代价是这两条比原版更宽:从箱子里取出一个装满的桶、或用命令直接改背包,也会被认作"装满了桶"。
原版还有两条有意不移植:summoned_entity 需要的"是谁摆下这一块"只存在于方块代码内部,拼起来会张冠李戴;cured_zombie_villager 的起因玩家不对外暴露。