Skip to content

Commit 4972081

Browse files
committed
Forcefully inject access transformers from mods even if a load error occurs
Related: neoforged/NeoForge#43
1 parent 022367c commit 4972081

File tree

3 files changed

+41
-0
lines changed

3 files changed

+41
-0
lines changed

common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ public DefaultSettingMapBuilder put(String key, Boolean value) {
172172
.put("mixin.devenv", isDevEnv)
173173
.put("mixin.perf.remove_spawn_chunks", isDevEnv)
174174
.putConditionally(() -> !isFabric, "mixin.bugfix.fix_config_crashes", true)
175+
.putConditionally(() -> !isFabric, "mixin.bugfix.forge_at_inject_error", true)
175176
.putConditionally(() -> isFabric, "mixin.perf.clear_fabric_mapping_tables", false)
176177
.build();
177178

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.embeddedt.modernfix.forge.classloading;
2+
3+
import net.minecraftforge.fml.loading.FMLLoader;
4+
import net.minecraftforge.fml.loading.moddiscovery.ModFile;
5+
import net.minecraftforge.fml.loading.moddiscovery.ModValidator;
6+
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
7+
import org.apache.commons.lang3.tuple.Pair;
8+
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
9+
import org.embeddedt.modernfix.util.CommonModUtil;
10+
11+
import java.nio.file.Path;
12+
import java.util.List;
13+
import java.util.stream.Collectors;
14+
15+
public class ATInjector {
16+
public static void injectModATs() {
17+
CommonModUtil.runWithoutCrash(() -> {
18+
ModValidator validator = ObfuscationReflectionHelper.getPrivateValue(FMLLoader.class, null, "modValidator");
19+
List<ModFile> modFiles = ObfuscationReflectionHelper.getPrivateValue(ModValidator.class, validator, "candidateMods");
20+
List<Pair<ModFile, Path>> list = modFiles.stream()
21+
.filter(file -> file.getAccessTransformer().isPresent())
22+
.map(file -> Pair.of(file, file.getAccessTransformer().get()))
23+
.collect(Collectors.toList());
24+
if(list.size() > 0) {
25+
ModernFixMixinPlugin.instance.logger.warn("Applying ATs from {} mods despite being in errored state, this might cause a crash!", list.size());
26+
for(var pair : list) {
27+
try {
28+
FMLLoader.addAccessTransformer(pair.getRight(), pair.getLeft());
29+
} catch(RuntimeException e) {
30+
ModernFixMixinPlugin.instance.logger.error("Exception occured applying AT from {}", pair.getLeft().getFileName(), e);
31+
}
32+
}
33+
}
34+
}, "applying mod ATs in errored state");
35+
}
36+
}

forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import net.minecraftforge.fml.loading.moddiscovery.ModInfo;
2525
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
2626
import org.embeddedt.modernfix.api.constants.IntegrationConstants;
27+
import org.embeddedt.modernfix.forge.classloading.ATInjector;
2728
import org.embeddedt.modernfix.forge.classloading.FastAccessTransformerList;
2829
import org.embeddedt.modernfix.forge.config.NightConfigFixer;
2930
import org.embeddedt.modernfix.forge.packet.PacketHandler;
@@ -138,6 +139,9 @@ public void sendPacket(ServerPlayer player, Object packet) {
138139
}
139140

140141
public void injectPlatformSpecificHacks() {
142+
if(!isEarlyLoadingNormally() && ModernFixMixinPlugin.instance.isOptionEnabled("bugfix.forge_at_inject_error.ATInjector")) {
143+
ATInjector.injectModATs();
144+
}
141145
FastAccessTransformerList.attemptReplace();
142146

143147
/* https://github.com/FabricMC/Mixin/pull/99 */

0 commit comments

Comments
 (0)