事件辅助系统 - Junye-666/RideBattleLib_NeoForge_1.21.1 GitHub Wiki
分发系统是更加便捷及解耦的事件监听辅助系统。它的核心职责是将游戏事件(变身、形态切换、技能触发、驱动器物品变化等)路由至对应骑士的处理器,让每个骑士只需在自身处理器类中关注自身的业务逻辑,从而避免大型监听类及重构单个骑士时大量改动/影响其它骑士。
分发系统采用 “注册中心 + 事件转发器 + 处理器接口” 的三层架构,并针对客户端和服务端分别设计了独立的分发通道,以适配 NeoForge 的双端模型。
IRiderServerHandler
服务端处理器接收的是 NeoForge 事件实例。使用逻辑同事件监听
实现:
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) {}
}
在监听commonSetup()中通过ServerRiderDispatchers注册
public static void commonSetup(FMLCommonSetupEventevent) {
ServerRiderDispatchers.register(new AgitoClientHandler());
}
IRiderClientHandler
客户端分发器通过 ClientRiderSyncManager 接收网络包,构造 ClientRiderContext,然后分发到对应的 IRiderClientHandler。
实现:
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 onDriverChanged(@NotNull ClientRiderContext ctx) {}
default void onSkill(@NotNull ClientRiderContext ctx) {}
}
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
) {}
在监听onClientSetup()中通过ClientRiderDispatcher注册
public static void onClientSetup(FMLClientSetupEvent event) {
ClientRiderDispatcher.register(new AgitoClientHandler());
}