zh_cn:tutorial:events
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revisionNext revisionBoth sides next revision | ||
zh_cn:tutorial:events [2021/08/30 01:50] – created breakice | zh_cn:tutorial:events [2021/09/07 03:14] – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== 自定义事件 ====== | ====== 自定义事件 ====== | ||
- | Fabric API 提供一个允许模组对游戏内事件作出翻译的系统。事件常见用例和是/ | + | ** FIXME 本页翻译自 [[tutorial: |
- | Fabric API 为 Minecraft 代码库中的重要区域提供了事件,多个修改者可能想要找 hook。有些地方是没有 | + | |
+ | Fabric API 提供一个允许模组对游戏内事件作出反应的系统。事件(events)是满足常见用例的钩子(hooks),同时也能在钩到代码相同区域的模组之间增强兼容性、改善性能。使用事件通常就能代替 mixin。Fabric API 为 Minecraft 代码库中的重要区域提供了事件,模组作者就会需要钩到这些钩子。有些地方是没有钩子的,所以你可以选择使用 mixin,或创建你自己的事件。 | ||
在本教程中,我们将着眼于创建一个在剪羊毛时触发的事件。创建事件的过程是: | 在本教程中,我们将着眼于创建一个在剪羊毛时触发的事件。创建事件的过程是: | ||
- | * 创建事件回调接口 | + | * 创建事件回调接口(event callback interface) |
* 从 mixin 触发事件 | * 从 mixin 触发事件 | ||
* 创建一个测试实现 | * 创建一个测试实现 | ||
+ | |||
+ | ==== 创建回调接口 ==== | ||
+ | 回调接口是最需要由监听事件的事件监听器实现的,事件也会从 mixin 中通过回调接口被调用。在回调接口中,必须放置一个 Event 对象作为字段,以识别实际事件。 | ||
+ | |||
+ | 对于事件实现,我们选择使用由数组支持的事件。这个数组会包含所有监听事件的事件监听器。我们的实现会依次调用事件监听器,直到其中一个不再返回 '' | ||
+ | |||
+ | 你需要创建一个包含 '' | ||
+ | |||
+ | <code java [enable_line_numbers=" | ||
+ | public interface SheepShearCallback { | ||
+ | |||
+ | Event< | ||
+ | (listeners) -> (player, sheep) -> { | ||
+ | for (SheepShearCallback listener : listeners) { | ||
+ | ActionResult result = listener.interact(player, | ||
+ | | ||
+ | if(result != ActionResult.PASS) { | ||
+ | return result; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return ActionResult.PASS; | ||
+ | }); | ||
+ | |||
+ | ActionResult interact(PlayerEntity player, SheepEntity sheep); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 现在再深入一点,调用了这个调用器(invoker)时,迭代所有的监听器: | ||
+ | <code java [enable_line_numbers=" | ||
+ | (listeners) -> (player, sheep) -> { | ||
+ | for (SheepShearCallback listener : listeners) { | ||
+ | </ | ||
+ | 然后在监听器中调用我们的方法(本例中,为 '' | ||
+ | <code java [enable_line_numbers=" | ||
+ | ActionResult result = listener.interact(player, | ||
+ | </ | ||
+ | 如果监听器告知我们需要退出('' | ||
+ | <code java [enable_line_numbers=" | ||
+ | // .... | ||
+ | if(result != ActionResult.PASS) { | ||
+ | return result; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return ActionResult.PASS; | ||
+ | </ | ||
+ | |||
+ | 在 [[https:// | ||
+ | <code java [enable_line_numbers=" | ||
+ | /** | ||
+ | * 剪羊毛时的回调。 | ||
+ | * 剪羊毛并掉落物品、物品被损害之前调用。 | ||
+ | * 会返回: | ||
+ | * - SUCCESS 退出后续处理过程,然后继续进行正常剪羊毛行为。 | ||
+ | * - PASS 回落到后续处理过程,如果没有其他的监听器了,则默认为 SUCCESS。 | ||
+ | * - FAIL 退出后续处理过程,羊毛不会被剪掉。 | ||
+ | /** | ||
+ | </ | ||
+ |
zh_cn/tutorial/events.txt · Last modified: 2023/05/04 11:13 by solidblock