diff --git a/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index b247fbb4..ba4813f8 100644 --- a/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -172,6 +172,7 @@ public class ModernFixEarlyConfig { .put("mixin.devenv", isDevEnv) .put("mixin.perf.remove_spawn_chunks", isDevEnv) .putConditionally(() -> !isFabric, "mixin.bugfix.fix_config_crashes", true) + .putConditionally(() -> !isFabric, "mixin.bugfix.forge_at_inject_error", true) .putConditionally(() -> isFabric, "mixin.perf.clear_fabric_mapping_tables", false) .build(); diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ATInjector.java b/forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ATInjector.java new file mode 100644 index 00000000..f86b9623 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ATInjector.java @@ -0,0 +1,36 @@ +package org.embeddedt.modernfix.forge.classloading; + +import net.minecraftforge.fml.loading.FMLLoader; +import net.minecraftforge.fml.loading.moddiscovery.ModFile; +import net.minecraftforge.fml.loading.moddiscovery.ModValidator; +import net.minecraftforge.fml.util.ObfuscationReflectionHelper; +import org.apache.commons.lang3.tuple.Pair; +import org.embeddedt.modernfix.core.ModernFixMixinPlugin; +import org.embeddedt.modernfix.util.CommonModUtil; + +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Collectors; + +public class ATInjector { + public static void injectModATs() { + CommonModUtil.runWithoutCrash(() -> { + ModValidator validator = ObfuscationReflectionHelper.getPrivateValue(FMLLoader.class, null, "modValidator"); + List modFiles = ObfuscationReflectionHelper.getPrivateValue(ModValidator.class, validator, "candidateMods"); + List> list = modFiles.stream() + .filter(file -> file.getAccessTransformer().isPresent()) + .map(file -> Pair.of(file, file.getAccessTransformer().get())) + .collect(Collectors.toList()); + if(list.size() > 0) { + ModernFixMixinPlugin.instance.logger.warn("Applying ATs from {} mods despite being in errored state, this might cause a crash!", list.size()); + for(var pair : list) { + try { + FMLLoader.addAccessTransformer(pair.getRight(), pair.getLeft()); + } catch(RuntimeException e) { + ModernFixMixinPlugin.instance.logger.error("Exception occured applying AT from {}", pair.getLeft().getFileName(), e); + } + } + } + }, "applying mod ATs in errored state"); + } +} diff --git a/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java b/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java index 8a53cfbe..6dde752b 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java +++ b/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java @@ -24,6 +24,7 @@ import net.minecraftforge.server.ServerLifecycleHooks; import net.minecraftforge.fml.loading.moddiscovery.ModInfo; import org.embeddedt.modernfix.core.ModernFixMixinPlugin; import org.embeddedt.modernfix.api.constants.IntegrationConstants; +import org.embeddedt.modernfix.forge.classloading.ATInjector; import org.embeddedt.modernfix.forge.classloading.FastAccessTransformerList; import org.embeddedt.modernfix.forge.config.NightConfigFixer; import org.embeddedt.modernfix.forge.packet.PacketHandler; @@ -138,6 +139,9 @@ public class ModernFixPlatformHooksImpl implements ModernFixPlatformHooks { } public void injectPlatformSpecificHacks() { + if(!isEarlyLoadingNormally() && ModernFixMixinPlugin.instance.isOptionEnabled("bugfix.forge_at_inject_error.ATInjector")) { + ATInjector.injectModATs(); + } FastAccessTransformerList.attemptReplace(); /* https://github.com/FabricMC/Mixin/pull/99 */