Attempt fix for Engineer's Decor and related crashes

This commit is contained in:
embeddedt 2023-06-19 21:49:45 -04:00
parent 1bf64f9aa1
commit 41b71c5e59
No known key found for this signature in database
GPG Key ID: A69433EC199B5613
2 changed files with 55 additions and 0 deletions

View File

@ -0,0 +1,53 @@
package org.embeddedt.modernfix.forge.config;
import net.minecraftforge.fml.ModContainer;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
import net.minecraftforge.fml.config.ModConfig;
import org.embeddedt.modernfix.ModernFix;
import java.util.Optional;
import java.util.function.Consumer;
public class ConfigFixer {
/**
* To prevent mods from crashing if their ModConfigEvent is invoked by Night Config's watch thread and Forge
* at the same time, wrap their config handler so that it only executes the event in serial for that mod.
*
* Should have no noticeable performance impact as config handlers are virtually instant.
*/
public static void replaceConfigHandlers() {
ModList.get().forEachModContainer((id, container) -> {
try {
Optional<Consumer<ModConfig.ModConfigEvent>> configOpt = ObfuscationReflectionHelper.getPrivateValue(ModContainer.class, container, "configHandler");
if(configOpt.isPresent()) {
ObfuscationReflectionHelper.setPrivateValue(ModContainer.class, container, Optional.of(new LockingConfigHandler(id, configOpt.get())), "configHandler");
}
} catch(RuntimeException e) {
ModernFix.LOGGER.error("Error replacing config handler", e);
}
});
}
private static class LockingConfigHandler implements Consumer<ModConfig.ModConfigEvent> {
private final Consumer<ModConfig.ModConfigEvent> actualHandler;
private final String modId;
LockingConfigHandler(String id, Consumer<ModConfig.ModConfigEvent> actualHandler) {
this.modId = id;
this.actualHandler = actualHandler;
}
@Override
public void accept(ModConfig.ModConfigEvent modConfigEvent) {
synchronized (this) {
this.actualHandler.accept(modConfigEvent);
}
}
@Override
public String toString() {
return "LockingConfigHandler{id=" + modId + "}";
}
}
}

View File

@ -25,6 +25,7 @@ import org.embeddedt.modernfix.forge.classloading.ClassLoadHack;
import org.embeddedt.modernfix.forge.classloading.ModFileScanDataDeduplicator;
import org.embeddedt.modernfix.forge.ModernFixConfig;
import org.embeddedt.modernfix.entity.EntityDataIDSyncHandler;
import org.embeddedt.modernfix.forge.config.ConfigFixer;
import org.embeddedt.modernfix.forge.packet.PacketHandler;
import org.embeddedt.modernfix.forge.registry.ObjectHolderClearer;
import org.embeddedt.modernfix.forge.util.KubeUtil;
@ -48,6 +49,7 @@ public class ModernFixForge {
PacketHandler.register();
ModFileScanDataDeduplicator.deduplicate();
ClassLoadHack.loadModClasses();
ConfigFixer.replaceConfigHandlers();
}
@SubscribeEvent