From d794c24d2e9e3bfc5dff9517ff3b467f94e3eecb Mon Sep 17 00:00:00 2001 From: Ven Date: Mon, 11 Sep 2023 09:12:01 +0100 Subject: [PATCH] Added fix for In-Game Mod Options --- .../lib/internal/FalsePatternLib.java | 7 +- .../internal/config/InGameModOptionsFix.java | 88 +++++++++++++++++++ .../lib/internal/config/LibraryConfig.java | 7 ++ .../lib/internal/proxy/ClientProxy.java | 8 ++ .../lib/internal/proxy/CommonProxy.java | 8 +- .../assets/falsepatternlib/lang/en_US.lang | 2 + 6 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/falsepattern/lib/internal/config/InGameModOptionsFix.java diff --git a/src/main/java/com/falsepattern/lib/internal/FalsePatternLib.java b/src/main/java/com/falsepattern/lib/internal/FalsePatternLib.java index 3b986aa..6ec99c2 100644 --- a/src/main/java/com/falsepattern/lib/internal/FalsePatternLib.java +++ b/src/main/java/com/falsepattern/lib/internal/FalsePatternLib.java @@ -27,6 +27,7 @@ import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLConstructionEvent; +import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.network.NetworkRegistry; @@ -65,6 +66,11 @@ public class FalsePatternLib { proxy.preInit(e); } + @Mod.EventHandler + public void init(FMLInitializationEvent e) { + proxy.init(e); + } + @Mod.EventHandler public void postInit(FMLPostInitializationEvent e) { if (Loader.isModLoaded("gasstation")) { @@ -72,5 +78,4 @@ public class FalsePatternLib { } proxy.postInit(e); } - } diff --git a/src/main/java/com/falsepattern/lib/internal/config/InGameModOptionsFix.java b/src/main/java/com/falsepattern/lib/internal/config/InGameModOptionsFix.java new file mode 100644 index 0000000..ea92de0 --- /dev/null +++ b/src/main/java/com/falsepattern/lib/internal/config/InGameModOptionsFix.java @@ -0,0 +1,88 @@ +package com.falsepattern.lib.internal.config; + +import com.falsepattern.lib.internal.Share; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.val; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraftforge.client.event.GuiOpenEvent; +import net.minecraftforge.common.MinecraftForge; +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.client.GuiIngameModOptions; +import cpw.mods.fml.client.GuiModList; +import cpw.mods.fml.common.ModContainer; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static lombok.AccessLevel.PRIVATE; + +@NoArgsConstructor(access = PRIVATE) +public final class InGameModOptionsFix { + private static boolean isInitialized = false; + + private static Field MODS_FIELD; + + public static void init() { + if (isInitialized) + return; + + try { + MODS_FIELD = GuiModList.class.getDeclaredField("mods"); + MODS_FIELD.setAccessible(true); + } catch (NoSuchFieldException e) { + MODS_FIELD = null; + Share.LOG.error("Failed to get field: cpw.mods.fml.client.GuiModList.mods," + + " In-Game Mod Options Fix will not work", e); + return; + } + MinecraftForge.EVENT_BUS.register(new InGameModOptionsFix()); + isInitialized = true; + } + + @SubscribeEvent + public void onGuiOpen(final GuiOpenEvent event) { + if (!isInitialized) + return; + if (!LibraryConfig.IN_GAME_MOD_OPTIONS_FIX) + return; + + if (event.gui instanceof GuiIngameModOptions) + event.gui = new GuiModConfigList(Minecraft.getMinecraft().currentScreen); + } + + private static class GuiModConfigList extends GuiModList { + private GuiModConfigList(GuiScreen screen) { + super(screen); + val mods = new ArrayList(); + for (val mod : getModsFromPrivateField()) { + val guiFactory = FMLClientHandler.instance().getGuiFactoryFor(mod); + if (guiFactory == null) + continue; + if (guiFactory.mainConfigGuiClass() != null) + mods.add(mod); + } + setModsToPrivateField(mods); + } + + private List getModsFromPrivateField() { + try { + return (List) MODS_FIELD.get(this); + } catch (Exception e) { + return Collections.emptyList(); + } + } + + private void setModsToPrivateField(List mods) { + try { + MODS_FIELD.set(this, mods); + } catch (Exception ignored) { + } + } + } +} diff --git a/src/main/java/com/falsepattern/lib/internal/config/LibraryConfig.java b/src/main/java/com/falsepattern/lib/internal/config/LibraryConfig.java index 5c3c8ac..e0b85eb 100644 --- a/src/main/java/com/falsepattern/lib/internal/config/LibraryConfig.java +++ b/src/main/java/com/falsepattern/lib/internal/config/LibraryConfig.java @@ -45,6 +45,13 @@ public class LibraryConfig { @Config.DefaultBoolean(true) public static boolean ENABLE_LIBRARY_DOWNLOADS; + @Config.Comment({"Fixes the mod options menu in-game.", + "By default, the mod options when in already in a game will show \"Test1, Test2, DISABLED\" in bright red.", + "This replaces that interface with the one from the main menu."}) + @Config.LangKey("config.falsepatternlib.ingamemodoptionsfix") + @Config.DefaultBoolean(true) + public static boolean IN_GAME_MOD_OPTIONS_FIX; + @Config.Comment("How \"loud\" the config error logging should be.") @Config.LangKey("config.falsepatternlib.configlogging") @Config.DefaultEnum("Log") diff --git a/src/main/java/com/falsepattern/lib/internal/proxy/ClientProxy.java b/src/main/java/com/falsepattern/lib/internal/proxy/ClientProxy.java index 75841e9..936a55c 100644 --- a/src/main/java/com/falsepattern/lib/internal/proxy/ClientProxy.java +++ b/src/main/java/com/falsepattern/lib/internal/proxy/ClientProxy.java @@ -20,6 +20,7 @@ */ package com.falsepattern.lib.internal.proxy; +import com.falsepattern.lib.internal.config.InGameModOptionsFix; import com.falsepattern.lib.internal.impl.config.event.ClientEventHandlerPost; import com.falsepattern.lib.internal.impl.config.event.ClientEventHandlerPre; import com.falsepattern.lib.internal.impl.toast.GuiToastImpl; @@ -27,6 +28,7 @@ import com.falsepattern.lib.internal.impl.toast.GuiToastImpl; import net.minecraft.client.Minecraft; import net.minecraftforge.common.MinecraftForge; import cpw.mods.fml.common.event.FMLConstructionEvent; +import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.relauncher.Side; @@ -47,6 +49,12 @@ public class ClientProxy extends CommonProxy { MinecraftForge.EVENT_BUS.register(this); } + @Override + public void init(FMLInitializationEvent e) { + super.init(e); + InGameModOptionsFix.init(); + } + @Override public void postInit(FMLPostInitializationEvent e) { super.postInit(e); diff --git a/src/main/java/com/falsepattern/lib/internal/proxy/CommonProxy.java b/src/main/java/com/falsepattern/lib/internal/proxy/CommonProxy.java index 5d27a7b..c5219f6 100644 --- a/src/main/java/com/falsepattern/lib/internal/proxy/CommonProxy.java +++ b/src/main/java/com/falsepattern/lib/internal/proxy/CommonProxy.java @@ -34,7 +34,9 @@ import com.falsepattern.lib.internal.impl.config.net.SyncRequestHandler; import com.falsepattern.lib.updates.UpdateChecker; import lombok.val; +import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.event.FMLConstructionEvent; +import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.relauncher.Side; @@ -72,9 +74,11 @@ public class CommonProxy { } } + @Mod.EventHandler + public void init(FMLInitializationEvent e) { + } + public void postInit(FMLPostInitializationEvent e) { CommonEventHandlerPost.registerBus(); } - - } diff --git a/src/main/resources/assets/falsepatternlib/lang/en_US.lang b/src/main/resources/assets/falsepatternlib/lang/en_US.lang index 30ffc77..8f542af 100644 --- a/src/main/resources/assets/falsepatternlib/lang/en_US.lang +++ b/src/main/resources/assets/falsepatternlib/lang/en_US.lang @@ -10,6 +10,8 @@ config.falsepatternlib.updatecheck=Enable update checks config.falsepatternlib.updatecheck.tooltip=Used to control whether FalsePatternLib should check for outdated mods. config.falsepatternlib.disableinternet=FalsePatternLib Offline Mode config.falsepatternlib.disableinternet.tooltip=Used to control whether FalsePatternLib should be allowed to use the internet. If this is enabled, update checks and library downloads will be completely blocked. +config.falsepatternlib.ingamemodoptionsfix=In-Game Mod Options Fix +config.falsepatternlib.ingamemodoptionsfix.tooltip=Fixes the mod options menu in-game. By default, the mod options when in already in a game will show: "Test1, Test2, DISABLED\" in bright red. This replaces that interface with the one from the main menu. falsepatternlib.gui.config.description=Hover over a setting for more information. falsepatternlib.chat.updatesavailable=§4Outdated mods detected by %s! §r falsepatternlib.chat.modname=§b§l[%s]§r