Skip to content

Commit 7791d1a

Browse files
committed
Auto-confirm future FML queries for this world after first confirmation
1 parent 57f53f3 commit 7791d1a

7 files changed

Lines changed: 125 additions & 1 deletion

File tree

src/main/java/fr/iamacat/optimizationsandtweaks/OptimizationsAndTweaks.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import fr.iamacat.optimizationsandtweaks.config.OptimizationsandTweaksConfig;
1313
import fr.iamacat.optimizationsandtweaks.eventshandler.EntityItemSpawningEventHandler;
1414
import fr.iamacat.optimizationsandtweaks.eventshandler.TidyChunkBackportEventHandler;
15+
import fr.iamacat.optimizationsandtweaks.eventshandler.WorldUnloadEventHandler;
1516
import fr.iamacat.optimizationsandtweaks.proxy.CommonProxy;
1617
import fr.iamacat.optimizationsandtweaks.utilsformods.experienceore.ExperienceOreConfig;
1718
import fr.iamacat.optimizationsandtweaks.utilsformods.mythandmonsters.recurrentcomplextrewrite.FileInjector;
@@ -57,6 +58,10 @@ public void init(FMLInitializationEvent event) {
5758
EntityItemSpawningEventHandler eventHandler = new EntityItemSpawningEventHandler();
5859
MinecraftForge.EVENT_BUS.register(eventHandler);
5960
}
61+
if (OptimizationsandTweaksConfig.enableFMLAutoConfirmAfterFirstConfirmation) {
62+
WorldUnloadEventHandler worldUnloadHandler = new WorldUnloadEventHandler();
63+
MinecraftForge.EVENT_BUS.register(worldUnloadHandler);
64+
}
6065
MinecraftForge.EVENT_BUS.register(proxy);
6166
}
6267

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ public enum Mixin implements IMixin {
7676
"core.MixinFMLClientHandler"),
7777
common_core_MixinFMLServerHandler(Side.COMMON, m -> OptimizationsandTweaksConfig.enableMixinFMLServerHandler,
7878
"core.MixinFMLServerHandler"),
79+
common_core_MixinStartupQuery(Side.COMMON, m -> OptimizationsandTweaksConfig.enableFMLAutoConfirmAfterFirstConfirmation,
80+
"core.MixinStartupQuery"),
7981
/*
8082
* todo need to fix was loaded to early crash
8183
* common_core_MixinLoader(Side.COMMON, m ->

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,10 @@ public class OptimizationsandTweaksConfig {
227227
@Config.DefaultBoolean(true)
228228
@Config.RequiresWorldRestart
229229
public static boolean enableMixinFMLServerHandler;
230+
@Config.Comment("Auto-confirm future FML queries after first confirmation")
231+
@Config.DefaultBoolean(true)
232+
@Config.RequiresWorldRestart
233+
public static boolean enableFMLAutoConfirmAfterFirstConfirmation;
230234
/*
231235
* todo need to fix was loaded to early crash
232236
* @Config.Comment("Optimize Loader")
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package fr.iamacat.optimizationsandtweaks.eventshandler;
2+
3+
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
4+
import net.minecraftforge.event.world.WorldEvent;
5+
import fr.iamacat.optimizationsandtweaks.utils.optimizationsandtweaks.vanilla.StartupQueryState;
6+
7+
public class WorldUnloadEventHandler {
8+
9+
@SubscribeEvent
10+
public void onWorldUnload(WorldEvent.Unload event) {
11+
StartupQueryState.resetConfirmation();
12+
}
13+
}

src/main/java/fr/iamacat/optimizationsandtweaks/mixins/common/core/MixinFMLServerHandler.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,43 @@
1212

1313
import org.spongepowered.asm.mixin.Mixin;
1414
import org.spongepowered.asm.mixin.Shadow;
15+
import org.spongepowered.asm.mixin.Unique;
1516

1617
import cpw.mods.fml.common.FMLLog;
1718
import cpw.mods.fml.common.IFMLSidedHandler;
1819
import cpw.mods.fml.common.StartupQuery;
1920
import cpw.mods.fml.common.functions.GenericIterableFactory;
2021
import cpw.mods.fml.server.FMLServerHandler;
2122

23+
import fr.iamacat.optimizationsandtweaks.config.OptimizationsandTweaksConfig;
24+
2225
@Mixin(FMLServerHandler.class)
2326
public abstract class MixinFMLServerHandler implements IFMLSidedHandler {
2427

2528
@Shadow
2629
private MinecraftServer server;
30+
31+
@Unique
32+
private MinecraftServer lastServer;
33+
34+
@Unique
35+
private static boolean hasConfirmedOnce = false;
2736

2837
@Override
2938
public void queryUser(StartupQuery query) throws InterruptedException {
39+
if (OptimizationsandTweaksConfig.enableFMLAutoConfirmAfterFirstConfirmation) {
40+
if (server != lastServer) {
41+
// reset confirmation when new world/server
42+
hasConfirmedOnce = false;
43+
lastServer = server;
44+
}
45+
if (hasConfirmedOnce) {
46+
FMLLog.info("Auto-confirming query due to previous confirmation.");
47+
query.setResult(true);
48+
query.finish();
49+
return;
50+
}
51+
}
3052
if (query.getResult() == null) {
3153
FMLLog.warning("%s", query.getText());
3254
query.finish();
@@ -61,6 +83,9 @@ public void queryUser(StartupQuery query) throws InterruptedException {
6183
query.setResult(true);
6284
done.set(true);
6385
it.remove();
86+
if (OptimizationsandTweaksConfig.enableFMLAutoConfirmAfterFirstConfirmation) {
87+
hasConfirmedOnce = true;
88+
}
6489
break;
6590
case "/fml cancel":
6691
FMLLog.info("cancelled");
@@ -92,4 +117,4 @@ public void queryUser(StartupQuery query) throws InterruptedException {
92117
query.finish();
93118
}
94119
}
95-
}
120+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package fr.iamacat.optimizationsandtweaks.mixins.common.core;
2+
3+
import cpw.mods.fml.common.FMLLog;
4+
import cpw.mods.fml.common.StartupQuery;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.injection.At;
7+
import org.spongepowered.asm.mixin.injection.Inject;
8+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
9+
10+
import fr.iamacat.optimizationsandtweaks.utils.optimizationsandtweaks.vanilla.StartupQueryState;
11+
12+
@Mixin(StartupQuery.class)
13+
public class MixinStartupQuery {
14+
15+
@Inject(method = "confirm", at = @At("HEAD"), cancellable = true, remap = false)
16+
private static void optimizationsAndTweaks$handleAutoConfirm(String text, CallbackInfoReturnable<Boolean> cir) {
17+
if (StartupQueryState.hasConfirmedOnce() && StartupQueryState.isWorldRepairQuery(text)) {
18+
FMLLog.info("[Optimizations] Auto-confirming world repair query due to previous confirmation.");
19+
cir.setReturnValue(true);
20+
return;
21+
}
22+
23+
StartupQueryState.updateLastQueryText(text);
24+
}
25+
26+
@Inject(method = "confirm", at = @At("RETURN"), remap = false)
27+
private static void optimizationsAndTweaks$trackConfirmation(String text, CallbackInfoReturnable<Boolean> cir) {
28+
if (cir.getReturnValue() != null && cir.getReturnValue() && StartupQueryState.isWorldRepairQuery(text)) {
29+
StartupQueryState.markConfirmedOnce();
30+
}
31+
}
32+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package fr.iamacat.optimizationsandtweaks.utils.optimizationsandtweaks.vanilla;
2+
3+
import cpw.mods.fml.common.FMLLog;
4+
5+
public final class StartupQueryState {
6+
7+
private static boolean hasConfirmedOnce = false;
8+
private static String lastQueryText = "";
9+
10+
private StartupQueryState() {
11+
}
12+
13+
public static boolean hasConfirmedOnce() {
14+
return hasConfirmedOnce;
15+
}
16+
17+
public static void markConfirmedOnce() {
18+
hasConfirmedOnce = true;
19+
}
20+
21+
public static void updateLastQueryText(String text) {
22+
lastQueryText = text != null ? text : "";
23+
}
24+
25+
public static boolean isWorldRepairQuery(String text) {
26+
if (text == null || text.isEmpty()) return false;
27+
28+
return text.contains("save is damaged") ||
29+
text.contains("automatic repair") ||
30+
text.contains("world backup") ||
31+
text.contains("items need to be removed") ||
32+
text.contains("items need to be relocated") ||
33+
text.contains("mods are missing") ||
34+
text.contains("Missing mods") ||
35+
text.contains("Forge Mod Loader detected");
36+
}
37+
38+
public static void resetConfirmation() {
39+
hasConfirmedOnce = false;
40+
lastQueryText = "";
41+
FMLLog.info("[Optimizations] Reset world repair auto-confirmation state.");
42+
}
43+
}

0 commit comments

Comments
 (0)