Attempt fix for Engineer's Decor and related crashes
This commit is contained in:
parent
1bf64f9aa1
commit
41b71c5e59
|
|
@ -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 + "}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user