Skip to content

Commit d794c24

Browse files
committed
Added fix for In-Game Mod Options
1 parent 1fe9c5f commit d794c24

File tree

6 files changed

+117
-3
lines changed

6 files changed

+117
-3
lines changed

src/main/java/com/falsepattern/lib/internal/FalsePatternLib.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import cpw.mods.fml.common.Mod;
2828
import cpw.mods.fml.common.SidedProxy;
2929
import cpw.mods.fml.common.event.FMLConstructionEvent;
30+
import cpw.mods.fml.common.event.FMLInitializationEvent;
3031
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
3132
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
3233
import cpw.mods.fml.common.network.NetworkRegistry;
@@ -65,12 +66,16 @@ public void preInit(FMLPreInitializationEvent e) {
6566
proxy.preInit(e);
6667
}
6768

69+
@Mod.EventHandler
70+
public void init(FMLInitializationEvent e) {
71+
proxy.init(e);
72+
}
73+
6874
@Mod.EventHandler
6975
public void postInit(FMLPostInitializationEvent e) {
7076
if (Loader.isModLoaded("gasstation")) {
7177
CoreLoadingPlugin.validateGasStation();
7278
}
7379
proxy.postInit(e);
7480
}
75-
7681
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package com.falsepattern.lib.internal.config;
2+
3+
import com.falsepattern.lib.internal.Share;
4+
import lombok.AccessLevel;
5+
import lombok.NoArgsConstructor;
6+
import lombok.val;
7+
8+
import net.minecraft.client.Minecraft;
9+
import net.minecraft.client.gui.GuiScreen;
10+
import net.minecraftforge.client.event.GuiOpenEvent;
11+
import net.minecraftforge.common.MinecraftForge;
12+
import cpw.mods.fml.client.FMLClientHandler;
13+
import cpw.mods.fml.client.GuiIngameModOptions;
14+
import cpw.mods.fml.client.GuiModList;
15+
import cpw.mods.fml.common.ModContainer;
16+
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
17+
18+
import java.lang.reflect.Field;
19+
import java.util.ArrayList;
20+
import java.util.Collections;
21+
import java.util.List;
22+
23+
import static lombok.AccessLevel.PRIVATE;
24+
25+
@NoArgsConstructor(access = PRIVATE)
26+
public final class InGameModOptionsFix {
27+
private static boolean isInitialized = false;
28+
29+
private static Field MODS_FIELD;
30+
31+
public static void init() {
32+
if (isInitialized)
33+
return;
34+
35+
try {
36+
MODS_FIELD = GuiModList.class.getDeclaredField("mods");
37+
MODS_FIELD.setAccessible(true);
38+
} catch (NoSuchFieldException e) {
39+
MODS_FIELD = null;
40+
Share.LOG.error("Failed to get field: cpw.mods.fml.client.GuiModList.mods,"
41+
+ " In-Game Mod Options Fix will not work", e);
42+
return;
43+
}
44+
MinecraftForge.EVENT_BUS.register(new InGameModOptionsFix());
45+
isInitialized = true;
46+
}
47+
48+
@SubscribeEvent
49+
public void onGuiOpen(final GuiOpenEvent event) {
50+
if (!isInitialized)
51+
return;
52+
if (!LibraryConfig.IN_GAME_MOD_OPTIONS_FIX)
53+
return;
54+
55+
if (event.gui instanceof GuiIngameModOptions)
56+
event.gui = new GuiModConfigList(Minecraft.getMinecraft().currentScreen);
57+
}
58+
59+
private static class GuiModConfigList extends GuiModList {
60+
private GuiModConfigList(GuiScreen screen) {
61+
super(screen);
62+
val mods = new ArrayList<ModContainer>();
63+
for (val mod : getModsFromPrivateField()) {
64+
val guiFactory = FMLClientHandler.instance().getGuiFactoryFor(mod);
65+
if (guiFactory == null)
66+
continue;
67+
if (guiFactory.mainConfigGuiClass() != null)
68+
mods.add(mod);
69+
}
70+
setModsToPrivateField(mods);
71+
}
72+
73+
private List<ModContainer> getModsFromPrivateField() {
74+
try {
75+
return (List<ModContainer>) MODS_FIELD.get(this);
76+
} catch (Exception e) {
77+
return Collections.emptyList();
78+
}
79+
}
80+
81+
private void setModsToPrivateField(List<ModContainer> mods) {
82+
try {
83+
MODS_FIELD.set(this, mods);
84+
} catch (Exception ignored) {
85+
}
86+
}
87+
}
88+
}

src/main/java/com/falsepattern/lib/internal/config/LibraryConfig.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ public class LibraryConfig {
4545
@Config.DefaultBoolean(true)
4646
public static boolean ENABLE_LIBRARY_DOWNLOADS;
4747

48+
@Config.Comment({"Fixes the mod options menu in-game.",
49+
"By default, the mod options when in already in a game will show \"Test1, Test2, DISABLED\" in bright red.",
50+
"This replaces that interface with the one from the main menu."})
51+
@Config.LangKey("config.falsepatternlib.ingamemodoptionsfix")
52+
@Config.DefaultBoolean(true)
53+
public static boolean IN_GAME_MOD_OPTIONS_FIX;
54+
4855
@Config.Comment("How \"loud\" the config error logging should be.")
4956
@Config.LangKey("config.falsepatternlib.configlogging")
5057
@Config.DefaultEnum("Log")

src/main/java/com/falsepattern/lib/internal/proxy/ClientProxy.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@
2020
*/
2121
package com.falsepattern.lib.internal.proxy;
2222

23+
import com.falsepattern.lib.internal.config.InGameModOptionsFix;
2324
import com.falsepattern.lib.internal.impl.config.event.ClientEventHandlerPost;
2425
import com.falsepattern.lib.internal.impl.config.event.ClientEventHandlerPre;
2526
import com.falsepattern.lib.internal.impl.toast.GuiToastImpl;
2627

2728
import net.minecraft.client.Minecraft;
2829
import net.minecraftforge.common.MinecraftForge;
2930
import cpw.mods.fml.common.event.FMLConstructionEvent;
31+
import cpw.mods.fml.common.event.FMLInitializationEvent;
3032
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
3133
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
3234
import cpw.mods.fml.relauncher.Side;
@@ -47,6 +49,12 @@ public void preInit(FMLPreInitializationEvent e) {
4749
MinecraftForge.EVENT_BUS.register(this);
4850
}
4951

52+
@Override
53+
public void init(FMLInitializationEvent e) {
54+
super.init(e);
55+
InGameModOptionsFix.init();
56+
}
57+
5058
@Override
5159
public void postInit(FMLPostInitializationEvent e) {
5260
super.postInit(e);

src/main/java/com/falsepattern/lib/internal/proxy/CommonProxy.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@
3434
import com.falsepattern.lib.updates.UpdateChecker;
3535
import lombok.val;
3636

37+
import cpw.mods.fml.common.Mod;
3738
import cpw.mods.fml.common.event.FMLConstructionEvent;
39+
import cpw.mods.fml.common.event.FMLInitializationEvent;
3840
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
3941
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
4042
import cpw.mods.fml.relauncher.Side;
@@ -72,9 +74,11 @@ public void preInit(FMLPreInitializationEvent e) {
7274
}
7375
}
7476

77+
@Mod.EventHandler
78+
public void init(FMLInitializationEvent e) {
79+
}
80+
7581
public void postInit(FMLPostInitializationEvent e) {
7682
CommonEventHandlerPost.registerBus();
7783
}
78-
79-
8084
}

src/main/resources/assets/falsepatternlib/lang/en_US.lang

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ config.falsepatternlib.updatecheck=Enable update checks
1010
config.falsepatternlib.updatecheck.tooltip=Used to control whether FalsePatternLib should check for outdated mods.
1111
config.falsepatternlib.disableinternet=FalsePatternLib Offline Mode
1212
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.
13+
config.falsepatternlib.ingamemodoptionsfix=In-Game Mod Options Fix
14+
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.
1315
falsepatternlib.gui.config.description=Hover over a setting for more information.
1416
falsepatternlib.chat.updatesavailable=§4Outdated mods detected by %s! §r
1517
falsepatternlib.chat.modname=§b§l[%s]§r

0 commit comments

Comments
 (0)