分发系统 - 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 更新等。