Skip to content

Commit 7a2d38f

Browse files
committed
Merge 1.19.4 into 1.20
2 parents af48699 + 370a0fa commit 7a2d38f

File tree

4 files changed

+74
-5
lines changed

4 files changed

+74
-5
lines changed

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

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.io.*;
1818
import java.nio.charset.StandardCharsets;
1919
import java.util.*;
20+
import java.util.function.BooleanSupplier;
2021
import java.util.regex.Pattern;
2122
import java.util.stream.Collectors;
2223

@@ -136,7 +137,21 @@ else if(isClientOnly && !ModernFixPlatformHooks.isClient())
136137

137138
private static final boolean isDevEnv = ModernFixPlatformHooks.isDevEnv();
138139

139-
private static final ImmutableMap<String, Boolean> DEFAULT_SETTING_OVERRIDES = ImmutableMap.<String, Boolean>builder()
140+
private static class DefaultSettingMapBuilder extends ImmutableMap.Builder<String, Boolean> {
141+
public DefaultSettingMapBuilder putConditionally(BooleanSupplier condition, String k, Boolean v) {
142+
if(condition.getAsBoolean())
143+
put(k, v);
144+
return this;
145+
}
146+
147+
@Override
148+
public DefaultSettingMapBuilder put(String key, Boolean value) {
149+
super.put(key, value);
150+
return this;
151+
}
152+
}
153+
154+
private static final ImmutableMap<String, Boolean> DEFAULT_SETTING_OVERRIDES = new DefaultSettingMapBuilder()
140155
.put("mixin.perf.dynamic_resources", false)
141156
.put("mixin.feature.direct_stack_trace", false)
142157
.put("mixin.perf.rewrite_registry", false)
@@ -152,16 +167,15 @@ else if(isClientOnly && !ModernFixPlatformHooks.isClient())
152167
.put("mixin.feature.spark_profile_launch", false)
153168
.put("mixin.devenv", isDevEnv)
154169
.put("mixin.perf.remove_spawn_chunks", isDevEnv)
170+
.putConditionally(() -> !isFabric, "mixin.bugfix.fix_config_crashes", true)
171+
.putConditionally(() -> isFabric, "mixin.perf.clear_fabric_mapping_tables", false)
155172
.build();
156173

157174
private ModernFixEarlyConfig(File file) {
158175
this.configFile = file;
159176

160177
this.scanForAndBuildMixinOptions();
161178
mixinOptions.addAll(DEFAULT_SETTING_OVERRIDES.keySet());
162-
if(!isFabric) {
163-
mixinOptions.add("mixin.bugfix.fix_config_crashes");
164-
}
165179
for(String optionName : mixinOptions) {
166180
boolean defaultEnabled = DEFAULT_SETTING_OVERRIDES.getOrDefault(optionName, true);
167181
this.options.putIfAbsent(optionName, new Option(optionName, defaultEnabled, false));

common/src/main/java/org/embeddedt/modernfix/util/CommonModUtil.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,16 @@
33
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
44

55
public class CommonModUtil {
6+
@FunctionalInterface
7+
public interface SafeRunnable {
8+
void run() throws Throwable;
9+
}
10+
611
/**
712
* Avoid using this, it's bad practice but cleanest way of suppressing errors for nonessential mod-dependent
813
* functionality.
914
*/
10-
public static void runWithoutCrash(Runnable r, String errorMsg) {
15+
public static void runWithoutCrash(SafeRunnable r, String errorMsg) {
1116
try {
1217
r.run();
1318
} catch(Throwable e) {

fabric/src/main/java/org/embeddedt/modernfix/ModernFixPreLaunchFabric.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint;
44
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
5+
import org.embeddedt.modernfix.fabric.mappings.MappingsClearer;
56
import org.embeddedt.modernfix.spark.SparkLaunchProfiler;
67
import org.embeddedt.modernfix.util.CommonModUtil;
78

@@ -11,5 +12,8 @@ public void onPreLaunch() {
1112
if(ModernFixMixinPlugin.instance.isOptionEnabled("feature.spark_profile_launch.OnFabric")) {
1213
CommonModUtil.runWithoutCrash(() -> SparkLaunchProfiler.start("launch"), "Failed to start profiler");
1314
}
15+
if(ModernFixMixinPlugin.instance.isOptionEnabled("perf.clear_fabric_mapping_tables.MappingsClearer")) {
16+
MappingsClearer.clear();
17+
}
1418
}
1519
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.embeddedt.modernfix.fabric.mappings;
2+
3+
import net.fabricmc.loader.api.FabricLoader;
4+
import net.fabricmc.loader.api.MappingResolver;
5+
import net.fabricmc.loader.impl.launch.FabricLauncherBase;
6+
import net.fabricmc.loader.impl.launch.MappingConfiguration;
7+
import net.fabricmc.mapping.tree.TinyMappingFactory;
8+
import org.embeddedt.modernfix.util.CommonModUtil;
9+
10+
import java.lang.reflect.Constructor;
11+
import java.lang.reflect.Field;
12+
import java.util.Map;
13+
14+
/**
15+
* Designed for Fabric Loader 0.14.x, probably has issues on other versions. The entire thing is wrapped in a try-catch
16+
* so it should never cause crashes, just fail to work.
17+
*/
18+
public class MappingsClearer {
19+
@SuppressWarnings("unchecked")
20+
public static void clear() {
21+
if(FabricLoader.getInstance().isDevelopmentEnvironment())
22+
return; // never do this in dev
23+
CommonModUtil.runWithoutCrash(() -> {
24+
// clear notch->intermediary mappings
25+
MappingConfiguration config = FabricLauncherBase.getLauncher().getMappingConfiguration();
26+
Field mappingsField = MappingConfiguration.class.getDeclaredField("mappings");
27+
mappingsField.setAccessible(true);
28+
mappingsField.set(config, TinyMappingFactory.EMPTY_TREE);
29+
30+
// clear useless intermediary->intermediary mappings
31+
MappingResolver resolver = FabricLoader.getInstance().getMappingResolver();
32+
Class<?> targetResolverClz = Class.forName("net.fabricmc.loader.impl.MappingResolverImpl");
33+
if(targetResolverClz.isAssignableFrom(resolver.getClass())) {
34+
// hopefully still Loader 0.14.x, proceed
35+
Class<?> namespaceDataClz = Class.forName("net.fabricmc.loader.impl.MappingResolverImpl$NamespaceData");
36+
Constructor<?> constructor = namespaceDataClz.getDeclaredConstructor();
37+
constructor.setAccessible(true);
38+
Object theData = constructor.newInstance();
39+
Field mapField = resolver.getClass().getDeclaredField("namespaceDataMap");
40+
mapField.setAccessible(true);
41+
Map<String, Object> theMap = (Map<String, Object>)mapField.get(resolver);
42+
theMap.replace("intermediary", theData);
43+
}
44+
}, "Failed to clear mappings");
45+
}
46+
}

0 commit comments

Comments
 (0)