User Tools

Site Tools


zh_cn:tutorial:events

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
zh_cn:tutorial:events [2021/09/07 03:14] solidblockzh_cn:tutorial:events [2023/05/04 11:13] (current) – [自定义事件] solidblock
Line 1: Line 1:
 ====== 自定义事件 ====== ====== 自定义事件 ======
-** FIXME 本页翻译自 [[tutorial:events]],翻译需要完善。** 
  
 Fabric API 提供一个允许模组对游戏内事件作出反应的系统。事件(events)是满足常见用例的钩子(hooks),同时也能在钩到代码相同区域的模组之间增强兼容性、改善性能。使用事件通常就能代替 mixin。Fabric API 为 Minecraft 代码库中的重要区域提供了事件,模组作者就会需要钩到这些钩子。有些地方是没有钩子的,所以你可以选择使用 mixin,或创建你自己的事件。 Fabric API 提供一个允许模组对游戏内事件作出反应的系统。事件(events)是满足常见用例的钩子(hooks),同时也能在钩到代码相同区域的模组之间增强兼容性、改善性能。使用事件通常就能代替 mixin。Fabric API 为 Minecraft 代码库中的重要区域提供了事件,模组作者就会需要钩到这些钩子。有些地方是没有钩子的,所以你可以选择使用 mixin,或创建你自己的事件。
  
 在本教程中,我们将着眼于创建一个在剪羊毛时触发的事件。创建事件的过程是: 在本教程中,我们将着眼于创建一个在剪羊毛时触发的事件。创建事件的过程是:
-  * 创建事件回调接口(event callback interface)+  * 创建事件回调接口
   * 从 mixin 触发事件   * 从 mixin 触发事件
   * 创建一个测试实现   * 创建一个测试实现
Line 67: Line 66:
 /** /**
 </code> </code>
 +
 +==== 从 Mixin 中触发事件 ====
 +我们有了基本的事件框架,但我们还需要触发它。由于我们需要让事件在玩家尝试剪羊毛时调用,我们在 ''SheepEntity#interactMod'' 中,当 ''dropItems'' 调用的时候(即羊可以被剪且玩家拿着剪刀),调用事件调用器。
 +<code java [enable_line_numbers="false"]>
 +@Mixin(SheepEntity.class)
 +public class SheepShearMixin {
 +
 +    @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/passive/SheepEntity;dropItems()V"), method = "interactMob", cancellable = true)
 +    private void onShear(final PlayerEntity player, final Hand hand, final CallbackInfoReturnable<Boolean> info) {
 +        ActionResult result = SheepShearCallback.EVENT.invoker().interact(player, (SheepEntity) (Object) this);
 +        
 +        if(result == ActionResult.FAIL) {
 +            info.cancel();
 +        }
 +    }
 +}
 +</code>
 +在这个简单的 mixin 中,我们调用了事件的调用器(''SheepShearCallback.EVENT.invoker().[...]''),它会调用所有活动的监听器来看看应该做什么,然后根据这个招架一个 ActionResult。如果结果为 FAIL,我们不剪羊毛、掉落物品或者损害玩家的物品(''info.cancel();'')。**确保你在 mixins.json 文件中注册的这个 mixin!**
 +
 +==== 使用监听器测试事件 ====
 +我们需要测试我们的事件。你可以在你的初始化方法(或者你需要的其他任何地方)注册一个监听器并在这里添加自定义的逻辑。这里是一个示例,会在绵羊的腿的位置掉落钻石而非羊毛:
 +<code java [enable_line_numbers="false"]>
 +SheepShearCallback.EVENT.register((player, sheep) -> {
 +    sheep.setSheared(true);
 +
 +    // 在绵羊的位置妴钻石
 +    ItemStack stack = new ItemStack(Items.DIAMOND);
 +    ItemEntity itemEntity = new ItemEntity(player.world, sheep.x, sheep.y, sheep.z, stack);
 +    player.world.spawnEntity(itemEntity);
 +
 +    return ActionResult.FAIL;
 +});
 +</code>
 +注意这个事件还需要设置羊被手动剪,就像在返回 FAIL 的时候自动取消。我们你//不需要//取消这个事件,确保你返回了 ''PASS'' 从而其他的监听器也可以操作。如果不遵守这个不成文规则,可能影响其他模组开发者对此模组的兼容性。
 +
 +如果你进入游戏并给绵羊剪羊毛,掉落的就会是钻石而不是羊毛。
  
zh_cn/tutorial/events.1630984470.txt.gz · Last modified: 2021/09/07 03:14 by solidblock