Table of Contents

监听事件

在本教程中,你会学到:

  1. 理解事件和回调
  2. 对已有的事件注册回调

事件

事件是用存储并调用回调的 net.fabricmc.fabric.api.event.Event 的实例代表的,通常回调有单个事件实例,存储在回调接口的 EVENT 静态字段中,但也有其他的形式。例如,ClientTickEvents 将几个有关的事件分组在一起。

回调

每个事件都有对应的回调接口,通常命名为 EventNameCallback。回调是通过在事件接口调用 register() 来注册的,调用时需要一个回调接口实例作为参数。

Fabric API 中的回调接口

Fabric API 提供的所有事件回调接口可以在 net.fabricmc.fabric.api.event 包中找到。本教程底部提供了部分存在的回调的列表。

自定义回调

虽然 Fabric API 已经提供了许多事件,你还是可以制作你自己的事件,请参考events

实例

此例注册一个 AttackBlockCallback,玩家击打不能徒手挖掘掉落的方块时,会受到伤害。会返回 ActionResult.PASS 因为还需要调用其他的回调。关于其他值的含义,请参考你的 IDE 中 AttackBlockCallback 的 JavaDoc。

  1. public class ExampleMod implements ModInitializer {
  2. [...]
  3.  
  4. @Override
  5. public void onInitialize() {
  6. AttackBlockCallback.EVENT.register((player, world, hand, pos, direction) -> {
  7. BlockState state = world.getBlockState(pos);
  8. /* 手动的旁观者检查是必要的,因为 AttackBlockCallbacks 会在旁观者检查之前应用 */
  9. if (state.isToolRequired() && !player.isSpectator() &&
  10. player.getMainHandStack().isEmpty()) {
  11. player.damage(DamageSource.field_5869, 1.0F);
  12. }
  13. return ActionResult.PASS;
  14. });
  15. }
  16. }

Fabric API 事件

玩家交互事件

玩家:AttackBlockCallback / AttackEntityCallback / UseBlockCallback / UseEntityCallback / UseItemCallback

玩家(客户端):ClientPickBlockApplyCallback / ClientPickBlockCallback / ClientPickBlockGatherCallback

注册表事件

BlockConstructedCallback / ItemConstructedCallback

RegistryEntryAddedCallback / RegistryEntryRemovedCallback / RegistryIdRemapCallback

战利品事件

LootTableLoadingCallback

关于使用 LootTableLoadingCallback 的例子,请参考此教程

世界事件

WorldTickCallback

服务器事件

ServerStartCallback / ServerStopCallback / ServerTickCallback

网络事件

C2SPacketTypeCallback / S2CPacketTypeCallback