Skip to content

Commit 57f53f3

Browse files
committed
Fix Stackoverflow caused by Salutation mod on servers
1 parent 75505fa commit 57f53f3

7 files changed

Lines changed: 78 additions & 2 deletions

File tree

dependencies.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ dependencies {
206206
implementation files("libs/The Mists of RioV-v2.5.2.jar")
207207
implementation files("libs/structpro-4.0-1.7.10.jar")
208208
implementation files("libs/TheCampingMod_2.1g.jar")
209+
implementation files("libs/Salutation-1.7.10-1.0.0.jar")
210+
implementation files("libs/CarbonConfig-1.7.10-1.1.5.jar")
209211

210212
compileOnly("com.github.GTNewHorizons:ThaumicHorizons:1.6.3:dev")
211213
compileOnly("com.github.GTNewHorizons:HoloInventory:2.4.12-GTNH:dev")

libs/CarbonConfig-1.7.10-1.1.5.jar

1.09 MB
Binary file not shown.

libs/Salutation-1.7.10-1.0.0.jar

51 KB
Binary file not shown.

src/main/java/fr/iamacat/optimizationsandtweaks/asm/Mixin.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
@RequiredArgsConstructor
1414
public enum Mixin implements IMixin {
15-
15+
1616
common_core_MixinWorld(Side.COMMON, m -> OptimizationsandTweaksConfig.enableMixinWorld, "core.MixinWorld"),
1717
common_core_MixinEventBus(Side.COMMON, m -> OptimizationsandTweaksConfig.enableMixinEventBus, "core.MixinEventBus"),
1818
common_core_MixinEnchantmentHelper(Side.COMMON, m -> OptimizationsandTweaksConfig.enableMixinEnchantmentHelper,
@@ -860,6 +860,9 @@ public enum Mixin implements IMixin {
860860
client_practicallogistics_MixinEventRegistry(Side.CLIENT,
861861
require(TargetedMod.PRACTICALLOGISTICS).and(m -> OptimizationsandTweaksConfig.enableMixinEventRegistry),
862862
"practicallogistics.MixinEventRegistry"),
863+
client_salutation_MixinSalutationClientHandler(Side.CLIENT,
864+
require(TargetedMod.SALUTATION).and(m -> OptimizationsandTweaksConfig.enableMixinSalutationClientHandler),
865+
"salutation.MixinSalutationClientHandler"),
863866

864867
common_core_MixinEntityPlayer(Side.COMMON,
865868
m -> OptimizationsandTweaksConfig.enableMixinEntityPlayer,

src/main/java/fr/iamacat/optimizationsandtweaks/asm/TargetedMod.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,8 @@ public enum TargetedMod implements ITargetedMod {
133133
THEMISTOFRIOV("The Mists of RioV", false, startsWith("The Mists of RioV")),
134134
STRUCTPRO("structpro", false, startsWith("structpro")),
135135
ALIENVSPREDATOR("aliensvspredator", false, startsWith("[1.7.10-10.13.4.1614-1.7.10][4.0.0.822] aliensvspredator")),
136-
THECAMPINGMOD("TheCampingMod", false, startsWith("TheCampingMod"))
136+
THECAMPINGMOD("TheCampingMod", false, startsWith("TheCampingMod")),
137+
SALUTATION("Salutation", false, startsWith("Salutation"))
137138
;
138139

139140
@Getter

src/main/java/fr/iamacat/optimizationsandtweaks/config/OptimizationsandTweaksConfig.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,10 @@ public class OptimizationsandTweaksConfig {
307307
@Config.DefaultBoolean(false)
308308
@Config.RequiresWorldRestart
309309
public static boolean enableMixinEventRegistry;
310+
@Config.Comment("Fix Stackoverflow caused by Salutation mod on servers")
311+
@Config.DefaultBoolean(true)
312+
@Config.RequiresWorldRestart
313+
public static boolean enableMixinSalutationClientHandler;
310314

311315
@Config.Comment("Optimize ThaumcraftCraftingManager from Thaumcraft To " + "Reduce loading time")
312316
@Config.DefaultBoolean(true)
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package fr.iamacat.optimizationsandtweaks.mixins.client.salutation;
2+
3+
import cpw.mods.fml.common.FMLCommonHandler;
4+
import cpw.mods.fml.common.Loader;
5+
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
6+
import cpw.mods.fml.relauncher.ReflectionHelper;
7+
import cpw.mods.fml.relauncher.Side;
8+
import cpw.mods.fml.relauncher.SideOnly;
9+
import net.minecraft.client.Minecraft;
10+
import net.minecraft.client.gui.GuiChat;
11+
import net.minecraft.client.gui.GuiIngame;
12+
import net.minecraft.client.gui.GuiMainMenu;
13+
import net.minecraft.client.gui.GuiNewChat;
14+
import net.minecraft.client.gui.GuiScreen;
15+
import net.minecraft.client.gui.GuiSleepMP;
16+
import net.minecraftforge.client.event.GuiOpenEvent;
17+
import net.minecraftforge.common.MinecraftForge;
18+
import speiger.src.salutation.Salutation;
19+
import speiger.src.salutation.client.gui.chat.ChatScreen;
20+
import speiger.src.salutation.client.gui.chat.ISaluationChat;
21+
import speiger.src.salutation.client.gui.chat.MPChatScreen;
22+
import speiger.src.salutation.client.gui.chat.MultilineChatScreen;
23+
24+
import speiger.src.salutation.client.ClientHandler;
25+
26+
import org.spongepowered.asm.mixin.Mixin;
27+
import org.spongepowered.asm.mixin.Overwrite;
28+
import org.spongepowered.asm.mixin.Unique;
29+
import org.spongepowered.asm.mixin.Shadow;
30+
31+
@Mixin(ClientHandler.class)
32+
public class MixinSalutationClientHandler {
33+
34+
@Shadow
35+
boolean replacedChat = false;
36+
37+
@SubscribeEvent
38+
@Overwrite(remap = false)
39+
public void onGuiOpen(GuiOpenEvent event) {
40+
if (!FMLCommonHandler.instance().getEffectiveSide().isClient()) return;
41+
GuiScreen screen = event.gui;
42+
Minecraft mc = Minecraft.getMinecraft();
43+
if(Loader.isModLoaded("chunkpregen")) return;
44+
boolean disable = Salutation.DISABLE_OVERRIDE.get();
45+
if(screen instanceof GuiMainMenu) {
46+
if(!replacedChat && !disable) {
47+
ReflectionHelper.setPrivateValue(GuiIngame.class, mc.ingameGUI, new MultilineChatScreen(), "persistantChatGUI", "field_73840_e");
48+
replacedChat = true;
49+
}
50+
else if(replacedChat && disable) {
51+
ReflectionHelper.setPrivateValue(GuiIngame.class, mc.ingameGUI, new GuiNewChat(mc), "persistantChatGUI", "field_73840_e");
52+
replacedChat = false;
53+
}
54+
}
55+
else if(!disable && screen instanceof GuiChat && !(screen instanceof ISaluationChat)) {
56+
if(screen instanceof GuiSleepMP) {
57+
event.setCanceled(true);
58+
mc.displayGuiScreen(new MPChatScreen());
59+
}
60+
else {
61+
event.setCanceled(true);
62+
mc.displayGuiScreen(new ChatScreen((GuiChat)screen));
63+
}
64+
}
65+
}
66+
}

0 commit comments

Comments
 (0)