Forcefully inject access transformers from mods even if a load error occurs
Related: https://github.com/neoforged/NeoForge/issues/43
This commit is contained in:
parent
022367c8d6
commit
4972081d8a
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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<ModFile> modFiles = ObfuscationReflectionHelper.getPrivateValue(ModValidator.class, validator, "candidateMods");
|
||||
List<Pair<ModFile, Path>> 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");
|
||||
}
|
||||
}
|
||||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user