From d95b8ff0499368e85e575a7aa6d3cea7e4ae5efc Mon Sep 17 00:00:00 2001 From: C-H716 <1536152356@qq.com> Date: Wed, 10 Sep 2025 13:12:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B3=A8=E5=86=8C=E7=B1=BB?= =?UTF-8?q?=EF=BC=8C=E6=98=8E=E7=A1=AE=E7=B1=BB=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/extendedae_plus/ExtendedAEPlus.java | 62 +++++++++++++------ .../client/ClientModelEvents.java | 2 +- .../extendedae_plus/client/ClientProxy.java | 25 +++----- 3 files changed, 55 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/extendedae_plus/ExtendedAEPlus.java b/src/main/java/com/extendedae_plus/ExtendedAEPlus.java index bdb0611..a7fa4fd 100644 --- a/src/main/java/com/extendedae_plus/ExtendedAEPlus.java +++ b/src/main/java/com/extendedae_plus/ExtendedAEPlus.java @@ -1,28 +1,24 @@ package com.extendedae_plus; import appeng.menu.locator.MenuLocators; +import com.extendedae_plus.client.ClientProxy; import com.extendedae_plus.config.ModConfigs; -import com.extendedae_plus.init.ModBlockEntities; -import com.extendedae_plus.init.ModBlocks; -import com.extendedae_plus.init.ModCreativeTabs; -import com.extendedae_plus.init.ModItems; -import com.extendedae_plus.init.ModMenuTypes; +import com.extendedae_plus.init.*; import com.extendedae_plus.menu.locator.CuriosItemLocator; import com.extendedae_plus.network.ModNetwork; -import net.minecraftforge.client.ConfigScreenHandler; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.ModelEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.config.ModConfig; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraft.resources.ResourceLocation; - -import com.extendedae_plus.client.ClientProxy; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; /** * ExtendedAE Plus 主mod类 @@ -36,20 +32,23 @@ public class ExtendedAEPlus { public ExtendedAEPlus() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); - + // 在客户端尽早注册内置模型,保证首次资源加载前映射已建立(仿照 AE2 的 AppEngClient 构造期注册) - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> ClientProxy::init); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> ClientProxy::initBuiltInModels); // 注册mod初始化事件 modEventBus.addListener(this::commonSetup); - + // 注册方块与方块实体 ModBlocks.BLOCKS.register(modEventBus); ModBlockEntities.BLOCK_ENTITY_TYPES.register(modEventBus); ModItems.ITEMS.register(modEventBus); + + // 在注册阶段将创造模式标签页放入注册表 ModCreativeTabs.TABS.register(modEventBus); + ModMenuTypes.MENUS.register(modEventBus); - + // 注册到Forge事件总线 MinecraftForge.EVENT_BUS.register(this); @@ -57,9 +56,9 @@ public class ExtendedAEPlus { ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, ModConfigs.COMMON_SPEC); // 客户端侧延迟注册:在 FMLClientSetupEvent 阶段执行(包含 MenuScreens 绑定等) - modEventBus.addListener((FMLClientSetupEvent e) -> ClientProxy.onClientSetup(e)); + // 由下面的 ClientModEvents 负责在客户端总线上接收事件并委派 } - + /** * 通用初始化设置 */ @@ -78,4 +77,31 @@ public class ExtendedAEPlus { public static ResourceLocation id(String path) { return new ResourceLocation(MODID, path); } + + /** + * 客户端专用事件订阅类。 + * 完成客户端相关的延迟注册操作(如菜单界面绑定、渲染器注册、模型加载等),确保这些操作只在客户端执行,避免服务端崩溃。 + */ + @Mod.EventBusSubscriber( + modid = ExtendedAEPlus.MODID, + bus = Mod.EventBusSubscriber.Bus.MOD, + value = Dist.CLIENT + ) + public static class ClientModEvents { + @SubscribeEvent + public static void onClientSetup(final FMLClientSetupEvent event) { + // 直接在此处执行客户端一次性注册(UI/屏幕/渲染器绑定) + // 注册客户端配置界面 + ClientProxy.registerConfigScreen(); + // 菜单 -> 屏幕 绑定 + ClientProxy.registerMenuScreens(); + } + + @SubscribeEvent + public static void onRegisterGeometryLoaders(final ModelEvent.RegisterGeometryLoaders evt) { + try { + ClientProxy.initBuiltInModels(); + } catch (Exception ignored) {} + } + } } diff --git a/src/main/java/com/extendedae_plus/client/ClientModelEvents.java b/src/main/java/com/extendedae_plus/client/ClientModelEvents.java index c867034..fa441d1 100644 --- a/src/main/java/com/extendedae_plus/client/ClientModelEvents.java +++ b/src/main/java/com/extendedae_plus/client/ClientModelEvents.java @@ -22,6 +22,6 @@ public final class ClientModelEvents { event.register(ExtendedAEPlus.id("block/crafting/64x_accelerator_formed_v2")); event.register(ExtendedAEPlus.id("block/crafting/256x_accelerator_formed_v2")); event.register(ExtendedAEPlus.id("block/crafting/1024x_accelerator_formed_v2")); - ClientProxy.init(); + ClientProxy.initBuiltInModels(); } } diff --git a/src/main/java/com/extendedae_plus/client/ClientProxy.java b/src/main/java/com/extendedae_plus/client/ClientProxy.java index 55f9e5f..8b7fb46 100644 --- a/src/main/java/com/extendedae_plus/client/ClientProxy.java +++ b/src/main/java/com/extendedae_plus/client/ClientProxy.java @@ -4,13 +4,12 @@ import appeng.client.render.crafting.CraftingCubeModel; import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.client.render.crafting.EPlusCraftingCubeModelProvider; import com.extendedae_plus.client.screen.GlobalProviderModesScreen; -import com.extendedae_plus.init.ModMenuTypes; import com.extendedae_plus.content.crafting.EPlusCraftingUnitType; import com.extendedae_plus.hooks.BuiltInModelHooks; +import com.extendedae_plus.init.ModMenuTypes; +import net.minecraft.client.gui.screens.MenuScreens; import net.minecraftforge.client.ConfigScreenHandler; import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; -import net.minecraft.client.gui.screens.MenuScreens; /** * 客户端模型注册,将 formed 模型注册为内置模型。 @@ -20,7 +19,10 @@ public final class ClientProxy { private static boolean REGISTERED = false; - public static void init() { + /** + * 注册内置模型(formed 模型等)。可被 ModelEvent 或启动阶段直接调用。 + */ + public static void initBuiltInModels() { if (REGISTERED) return; REGISTERED = true; // 注册四种形成态模型为内置模型 @@ -46,17 +48,10 @@ public final class ClientProxy { } /** - * 客户端设置阶段:延迟执行需要访问注册对象的客户端注册。 + * 将菜单类型与对应的屏幕绑定。 */ - public static void onClientSetup(final FMLClientSetupEvent event) { - event.enqueueWork(() -> { - // 确保在首次资源加载前完成内置模型注册(REGISTERED 保护避免重复) - init(); - // 仅在客户端设置阶段执行与 UI 相关的一次性绑定 - registerConfigScreen(); - // 菜单 -> 屏幕 绑定 - MenuScreens.register(ModMenuTypes.NETWORK_PATTERN_CONTROLLER.get(), GlobalProviderModesScreen::new); - }); + public static void registerMenuScreens() { + MenuScreens.register(ModMenuTypes.NETWORK_PATTERN_CONTROLLER.get(), GlobalProviderModesScreen::new); } /** @@ -68,7 +63,7 @@ public final class ClientProxy { ModLoadingContext.get().registerExtensionPoint( ConfigScreenHandler.ConfigScreenFactory.class, () -> new ConfigScreenHandler.ConfigScreenFactory( - (mc, parent) -> new com.extendedae_plus.client.ModConfigScreen(parent)) + (mc, parent) -> new ModConfigScreen(parent)) ); } }