Added fix for In-Game Mod Options

This commit is contained in:
Ven committed 2023-09-11 09:12:01 +01:00
1 parent 1fe9c5f43c
commit d794c24d2e
6 files changed
+117 -3

No files matched your search

@@ -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);
}
}
@@ -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<ModContainer>();
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<ModContainer> getModsFromPrivateField() {
try {
return (List<ModContainer>) MODS_FIELD.get(this);
} catch (Exception e) {
return Collections.emptyList();
}
}
private void setModsToPrivateField(List<ModContainer> mods) {
try {
MODS_FIELD.set(this, mods);
} catch (Exception ignored) {
}
}
}
}
@@ -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")
@@ -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);
@@ -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();
}
}