From 603903db507a483fefd90445fd2b3bdafeb4b5e0 Mon Sep 17 00:00:00 2001 From: mezz Date: Mon, 22 Jan 2018 23:03:17 -0800 Subject: [PATCH] Fix errors in preInit being lost when followed by a crash in fireRegistryEvents or objectHolder --- .../net/minecraftforge/fml/common/LoadController.java | 9 ++++++++- .../java/net/minecraftforge/fml/common/Loader.java | 3 ++- .../minecraftforge/debug/ClientExceptionTestMod.java | 11 +++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraftforge/fml/common/LoadController.java b/src/main/java/net/minecraftforge/fml/common/LoadController.java index b6ed0b8bd7..17c9fa087f 100644 --- a/src/main/java/net/minecraftforge/fml/common/LoadController.java +++ b/src/main/java/net/minecraftforge/fml/common/LoadController.java @@ -174,11 +174,18 @@ public class LoadController } } + @Deprecated // TODO remove in 1.13 public void checkErrorsAfterAvailable() + { + checkErrors(); + } + + public void checkErrors() { if (errors.size() > 0) { - FMLLog.log.fatal("Fatal errors were detected during {}. Loading cannot continue", LoaderState.AVAILABLE); + FMLLog.log.fatal("Fatal errors were detected during {}. Loading cannot continue.", state); + state = state.transition(true); throw throwStoredErrors(); } } diff --git a/src/main/java/net/minecraftforge/fml/common/Loader.java b/src/main/java/net/minecraftforge/fml/common/Loader.java index f76b4b54c4..5dd9f2288b 100644 --- a/src/main/java/net/minecraftforge/fml/common/Loader.java +++ b/src/main/java/net/minecraftforge/fml/common/Loader.java @@ -600,6 +600,7 @@ public class Loader ItemStackHolderInjector.INSTANCE.findHolders(discoverer.getASMTable()); CapabilityManager.INSTANCE.injectCapabilities(discoverer.getASMTable()); modController.distributeStateMessage(LoaderState.PREINITIALIZATION, discoverer.getASMTable(), canonicalConfigDir); + modController.checkErrors(); GameData.fireRegistryEvents(rl -> !rl.equals(GameData.RECIPES)); FMLCommonHandler.instance().fireSidedRegistryEvents(); ObjectHolderRegistry.INSTANCE.applyObjectHolders(); @@ -725,7 +726,7 @@ public class Loader progressBar.step("Finishing up"); modController.transition(LoaderState.AVAILABLE, false); modController.distributeStateMessage(LoaderState.AVAILABLE); - modController.checkErrorsAfterAvailable(); + modController.checkErrors(); GameData.freezeData(); FMLLog.log.info("Forge Mod Loader has successfully loaded {} mod{}", mods.size(), mods.size() == 1 ? "" : "s"); progressBar.step("Completing Minecraft initialization"); diff --git a/src/test/java/net/minecraftforge/debug/ClientExceptionTestMod.java b/src/test/java/net/minecraftforge/debug/ClientExceptionTestMod.java index e07abde23a..3b4edc2eeb 100644 --- a/src/test/java/net/minecraftforge/debug/ClientExceptionTestMod.java +++ b/src/test/java/net/minecraftforge/debug/ClientExceptionTestMod.java @@ -2,11 +2,15 @@ package net.minecraftforge.debug; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiErrorScreen; +import net.minecraft.item.Item; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.client.CustomModLoadingErrorDisplayException; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLLoadCompleteEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @Mod(modid = "clientexceptiontest", version = "1.0", name = "Client Exception Test", clientSideOnly = true) public class ClientExceptionTestMod @@ -22,10 +26,17 @@ public class ClientExceptionTestMod { if (ENABLE_PREINIT) { + MinecraftForge.EVENT_BUS.register(this); throwException("Thrown in Pre-Init"); } } + @SubscribeEvent + public void registerItems(RegistryEvent itemRegistryEvent) + { + throw new RuntimeException("This should not be called because the mod threw an exception earlier in Pre-Init and is in a broken state."); + } + @Mod.EventHandler public void onInit(FMLInitializationEvent e) {