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
Last revisionBoth sides next revision
zh_cn:tutorial:events [2021/09/07 03:14] solidblockzh_cn:tutorial:events [2023/05/04 11:13] solidblock
Line 67: Line 67:
 /** /**
 </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.txt · Last modified: 2023/05/04 11:13 by solidblock