分发系统 - Junye-666/RideBattleLib_NeoForge_1.21.1 GitHub Wiki

分发系统用于把服务端 / 客户端事件路由到对应骑士的处理器,避免一个巨大的监听类。

服务端处理器 IRiderServerHandler

public interface IRiderServerHandler {
    ResourceLocation riderId();

    default void onHenshinPre(@NotNull HenshinEvent.Pre event) {}
    default void onHenshinPost(@NotNull HenshinEvent.Post event) {}

    default void onSwitchPre(@NotNull FormSwitchEvent.Pre event) {}
    default void onSwitchPost(@NotNull FormSwitchEvent.Post event) {}

    default void onUnhenshinPre(@NotNull UnhenshinEvent.Pre event) {}
    default void onUnhenshinPost(@NotNull UnhenshinEvent.Post event) {}

    default void onInsert(@NotNull ItemInsertionEvent.Post event) {}
    default void onExtract(@NotNull SlotExtractionEvent.Post event) {}

    default void onSkillPre(@NotNull SkillEvent.Pre event) {}
    default void onSkillPost(@NotNull SkillEvent.Post event) {}
}

示例:

public final class PauseResumeHandler implements IRiderServerHandler {

    @Override
    public ResourceLocation riderId() {
        return ExampleBasicPack.RIDER_ID;
    }

    @Override
    public void onHenshinPre(HenshinEvent.Pre event) {
        if (ExampleBasicPack.FORM_BASE.equals(event.getFormId())) {
            RideBattleAPI.completeIn(44, event.getPlayer());
        }
    }

    @Override
    public void onSwitchPre(FormSwitchEvent.Pre event) {
        if (ExampleBasicPack.FORM_BASE.equals(event.getNewFormId())) {
            RideBattleAPI.completeIn(44, event.getPlayer());
        }
    }
}

注册: 推荐在 Pack 的 registerCommon() 中

RideBattleAPI.registerServerHandler(new PauseResumeHandler());

或:

ServerRiderDispatcher.register(new YourServerHandler());

客户端处理器 IRiderClientHandler

客户端通过 ClientRiderDispatcher 接收同步事件。

public interface IRiderClientHandler {
    ResourceLocation riderId();

    default void postHenshin(@NotNull ClientRiderContext ctx) {}
    default void postSwitch(@NotNull ClientRiderContext ctx) {}
    default void postUnhenshin(@NotNull ClientRiderContext ctx) {}
    default void onPending(@NotNull ClientRiderContext ctx) {}

    default void onDriverItemInserted(@NotNull ClientRiderContext ctx) {}
    default void onDriverItemExtracted(@NotNull ClientRiderContext ctx) {}
    default void onSkill(@NotNull ClientRiderContext ctx) {}
}

示例:

public final class ExampleClientHandler implements IRiderClientHandler {

    @Override
    public ResourceLocation riderId() {
        return ExampleBasicPack.RIDER_ID;
    }

    @Override
    public void postHenshin(ClientRiderContext ctx) {
        ctx.player().displayClientMessage(
                Component.literal("客户端收到变身完成"),
                true
        );
    }

    @Override
    public void onSkill(ClientRiderContext ctx) {
        if (ctx.skillId() != null) {
            // 播放客户端特效、HUD 动画等
        }
    }
}

注册: 推荐在 Pack 的 registerClient() 中

RideBattleAPI.registerClientHandler(new ExampleClientHandler ());

或:

ClientRiderDispatcher.register(new ExampleClientHandler ());

ClientRiderContext

public record ClientRiderContext(
        @NotNull LocalPlayer player,
        @NotNull ItemStack driverStack,
        @Nullable ResourceLocation riderId,
        @Nullable ResourceLocation currentFormId,
        @Nullable ResourceLocation pendingFormId,
        @Nullable Map<ResourceLocation, ItemStack> changedItems,
        @Nullable ResourceLocation skillId,
        @Nullable ChangeType changeType
) {
    public enum ChangeType {
        HENSHIN,
        SWITCH,
        UNHENSHIN,
        PENDING,
        DRIVER_CHANGE,
        SKILL
    }
}

客户端事件不可取消,仅用于通知、渲染、音效、HUD 更新等。