zh_cn:tutorial:events
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
zh_cn:tutorial:events [2021/09/07 03:14] – external edit 127.0.0.1 | zh_cn:tutorial:events [2023/05/04 11:13] (current) – [自定义事件] solidblock | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== 自定义事件 ====== | ====== 自定义事件 ====== | ||
- | ** FIXME 本页翻译自 [[tutorial: | ||
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: | ||
/** | /** | ||
</ | </ | ||
+ | |||
+ | ==== 从 Mixin 中触发事件 ==== | ||
+ | 我们有了基本的事件框架,但我们还需要触发它。由于我们需要让事件在玩家尝试剪羊毛时调用,我们在 '' | ||
+ | <code java [enable_line_numbers=" | ||
+ | @Mixin(SheepEntity.class) | ||
+ | public class SheepShearMixin { | ||
+ | |||
+ | @Inject(at = @At(value = " | ||
+ | private void onShear(final PlayerEntity player, final Hand hand, final CallbackInfoReturnable< | ||
+ | ActionResult result = SheepShearCallback.EVENT.invoker().interact(player, | ||
+ | | ||
+ | if(result == ActionResult.FAIL) { | ||
+ | info.cancel(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | 在这个简单的 mixin 中,我们调用了事件的调用器('' | ||
+ | |||
+ | ==== 使用监听器测试事件 ==== | ||
+ | 我们需要测试我们的事件。你可以在你的初始化方法(或者你需要的其他任何地方)注册一个监听器并在这里添加自定义的逻辑。这里是一个示例,会在绵羊的腿的位置掉落钻石而非羊毛: | ||
+ | <code java [enable_line_numbers=" | ||
+ | SheepShearCallback.EVENT.register((player, | ||
+ | sheep.setSheared(true); | ||
+ | |||
+ | // 在绵羊的位置妴钻石 | ||
+ | ItemStack stack = new ItemStack(Items.DIAMOND); | ||
+ | ItemEntity itemEntity = new ItemEntity(player.world, | ||
+ | player.world.spawnEntity(itemEntity); | ||
+ | |||
+ | return ActionResult.FAIL; | ||
+ | }); | ||
+ | </ | ||
+ | 注意这个事件还需要设置羊被手动剪,就像在返回 FAIL 的时候自动取消。我们你// | ||
+ | |||
+ | 如果你进入游戏并给绵羊剪羊毛,掉落的就会是钻石而不是羊毛。 | ||
zh_cn/tutorial/events.1630984471.txt.gz · Last modified: 2021/09/07 03:14 by 127.0.0.1