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
Next revisionBoth sides next revision
zh_cn:tutorial:events [2021/09/07 03:00] solidblockzh_cn:tutorial:events [2021/09/07 03:14] – external edit 127.0.0.1
Line 8: Line 8:
   * 从 mixin 触发事件   * 从 mixin 触发事件
   * 创建一个测试实现   * 创建一个测试实现
 +
 +==== 创建回调接口 ====
 +回调接口是最需要由监听事件的事件监听器实现的,事件也会从 mixin 中通过回调接口被调用。在回调接口中,必须放置一个 Event 对象作为字段,以识别实际事件。
 +
 +对于事件实现,我们选择使用由数组支持的事件。这个数组会包含所有监听事件的事件监听器。我们的实现会依次调用事件监听器,直到其中一个不再返回 ''ActionResult.PASS'',这意味着,监听器可能会使用其返回值来要求“退出这个”、“批准这个”或者“不用在意,留给下一个事件监听器”。这种返回一个 ActionResult 值的方法,通常能够使得事件监听器能够合作。
 +
 +你需要创建一个包含 ''Event'' 实例的接口,接口需包含用于响应实现的方法。剪羊毛事件回调的基本步骤为:
 +
 +<code java [enable_line_numbers="true"]>
 +public interface SheepShearCallback {
 +
 +    Event<SheepShearCallback> EVENT = EventFactory.createArrayBacked(SheepShearCallback.class,
 +        (listeners) -> (player, sheep) -> {
 +            for (SheepShearCallback listener : listeners) {
 +                ActionResult result = listener.interact(player, sheep);
 +                
 +                if(result != ActionResult.PASS) {
 +                    return result;
 +                }
 +            }
 +
 +        return ActionResult.PASS;
 +    });
 +
 +    ActionResult interact(PlayerEntity player, SheepEntity sheep);
 +}
 +</code>
 +
 +现在再深入一点,调用了这个调用器(invoker)时,迭代所有的监听器:
 +<code java [enable_line_numbers="false"]>
 +(listeners) -> (player, sheep) -> {
 +    for (SheepShearCallback listener : listeners) {
 +</code>
 +然后在监听器中调用我们的方法(本例中,为 ''interact'')以获得响应:
 +<code java [enable_line_numbers="false"]>
 +ActionResult result = listener.interact(player, sheep);
 +</code>
 +如果监听器告知我们需要退出(''ActionResult.FAIL'')或者彻底完成(''ActionResult.SUCCESS''),回调则会返回结果并完成循环。''ActionResult.PASS'' 会移到下一个监听器,大多数情况下,如果没有再注册更多监听器,则一般会以成功结束。
 +<code java [enable_line_numbers="false"]>
 +// ....
 +    if(result != ActionResult.PASS) {
 +        return result;
 +    }
 +}
 +
 +return ActionResult.PASS;
 +</code>
 +
 +在 [[https://github.com/FabricMC/fabric|Fabric API]] 中,我们在回调类的顶部添加 Javadoc 注释,以阐明每个 ActionResult 所做了什么。在我们的例子中,可能是:
 +<code java [enable_line_numbers="false"]>
 +/**
 + * 剪羊毛时的回调。
 + * 剪羊毛并掉落物品、物品被损害之前调用。
 + * 会返回:
 + * - SUCCESS 退出后续处理过程,然后继续进行正常剪羊毛行为。
 + * - PASS 回落到后续处理过程,如果没有其他的监听器了,则默认为 SUCCESS。
 + * - FAIL 退出后续处理过程,羊毛不会被剪掉。
 +/**
 +</code>
 +
zh_cn/tutorial/events.txt · Last modified: 2023/05/04 11:13 by solidblock