Skip to content

Commit 99441a8

Browse files
authored
Connector 1.21.1 beta 5 (Sinytra#1591)
2 parents abc8d98 + d309b3a commit 99441a8

11 files changed

+129
-71
lines changed

build.gradle.kts

+16-13
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
22
import me.modmuss50.mpp.ReleaseType
33
import net.neoforged.moddevgradle.dsl.RunModel
4+
import net.neoforged.moddevgradle.internal.RunGameTask
45
import java.time.LocalDateTime
56

67
plugins {
78
java
89
`maven-publish`
9-
id("net.neoforged.moddev") version "2.0.1-beta"
10+
id("net.neoforged.moddev") version "2.0.52-beta"
1011
id("io.github.goooler.shadow") version "8.1.8" apply false
1112
id("me.modmuss50.mod-publish-plugin") version "0.5.+"
1213
id("net.neoforged.gradleutils") version "3.0.0"
13-
id("org.sinytra.adapter.userdev") version "1.2-SNAPSHOT"
14+
id("org.sinytra.adapter.userdev") version "1.2.1-SNAPSHOT"
1415
}
1516

1617
val versionConnector: String by project
@@ -62,13 +63,9 @@ configurations {
6263
}
6364

6465
"modCompileOnly" {
65-
extendsFrom(configurations.compileOnly.get())
66-
}
67-
68-
"modImplementation" {
6966
extendsFrom(shade)
7067
}
71-
68+
7269
additionalRuntimeClasspath {
7370
extendsFrom(shade)
7471
}
@@ -95,23 +92,26 @@ neoForge {
9592
systemProperty("connector.logging.markers", "MIXINPATCH,MERGER")
9693
systemProperty("mixin.debug.export", "true")
9794
gameDirectory.set(layout.projectDirectory.dir("run"))
98-
99-
mods {
100-
maybeCreate("connector").apply {
101-
sourceSet(mod)
102-
}
103-
}
10495
}
10596

10697
create("client") {
10798
client()
10899
config(this)
109100
}
101+
110102
create("server") {
111103
server()
112104
config(this)
113105
}
114106
}
107+
108+
addModdingDependenciesTo(mod)
109+
110+
mods {
111+
maybeCreate("connector").apply {
112+
sourceSet(mod)
113+
}
114+
}
115115
}
116116

117117
repositories {
@@ -218,6 +218,9 @@ tasks {
218218
assemble {
219219
dependsOn(fullJar)
220220
}
221+
withType<RunGameTask> {
222+
dependsOn(jar)
223+
}
221224
}
222225

223226
publishMods {

gradle.properties

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@ org.gradle.caching=true
77
#org.gradle.configuration-cache=true
88

99
# Versions
10-
versionConnector=2.0.0-beta.4
10+
versionConnector=2.0.0-beta.5
1111
versionAdapter=1.13.20+1.21.1-20240811.191740
12-
versionAdapterDefinition=1.13.21+1.21.1
12+
versionAdapterDefinition=1.13.23+1.21.1
1313
versionAdapterRuntime=1.0.0+1.21.1
1414

1515
versionMc=1.21.1
16-
versionNeoForge=21.1.57
16+
versionNeoForge=21.1.90
1717
versionParchmentMc=1.21
1818
versionParchment=2024.07.28
1919
versionForgeAutoRenamingTool=1.0.12
20-
versionForgifiedFabricLoader=2.5.33+0.16.0+1.21.1
20+
versionForgifiedFabricLoader=2.5.34+0.16.0+1.21.1
2121
versionAccessWidener=2.1.0
2222
versionForgifiedFabricApi=0.104.0+2.0.13+1.21.1
2323

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
44
networkTimeout=10000
55
zipStoreBase=GRADLE_USER_HOME
66
zipStorePath=wrapper/dists

src/main/java/org/sinytra/connector/ConnectorCoremods.java

+1
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ private static List<ITransformer<?>> getFabricASMTransformers() {
173173
TargetType.METHOD,
174174
Set.of(
175175
ITransformer.Target.targetMethod("com.chocohead.mm.Plugin$1", "generate", "()Ljava/util/function/Consumer;"),
176+
ITransformer.Target.targetMethod("com.chocohead.mm.Plugin$1", "generate", "(Ljava/lang/String;Ljava/util/Collection;)V"),
176177
ITransformer.Target.targetMethod("me.shedaniel.mm.Plugin$1", "generate", "(Ljava/lang/String;Ljava/util/Collection;)V")
177178
),
178179
input -> {

src/main/java/org/sinytra/connector/locator/ConnectorLocator.java

+8
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,11 @@ private List<IModFile> locateFabricMods(List<IModFile> discoveredMods) {
132132
// Run jar transformations (or get existing outputs from cache)
133133
List<JarTransformer.TransformedFabricModPath> transformed = JarTransformer.transform(candidates, renameLibs, loadedModFiles);
134134

135+
List<JarTransformer.TransformedFabricModPath> failing = transformed.stream().filter(j -> j.auditTrail() != null && j.auditTrail().hasFailingMixins()).toList();
136+
if (!failing.isEmpty()) {
137+
MixinTransformSafeguard.trigger(failing);
138+
}
139+
135140
// Skip last step to save time if an error occured during transformation
136141
if (ConnectorEarlyLoader.hasEncounteredException()) {
137142
StartupNotificationManager.addModMessage("JAR TRANSFORMATION ERROR");
@@ -147,6 +152,9 @@ private List<IModFile> locateFabricMods(List<IModFile> discoveredMods) {
147152

148153
private static IModFile createConnectorModFile(SplitPackageMerger.FilteredModPath modPath) {
149154
JarContents jarContents = new JarContentsBuilder().paths(modPath.paths()).pathFilter(modPath.filter()).build();
155+
if (modPath.metadata().generated()) {
156+
return IModFile.create(SecureJar.from(jarContents), JarModsDotTomlModFileReader::manifestParser, IModFile.Type.LIBRARY, ModFileDiscoveryAttributes.DEFAULT);
157+
}
150158
ModJarMetadata modJarMetadata = new ModJarMetadata(jarContents);
151159
SecureJar secureJar = SecureJar.from(jarContents, modJarMetadata);
152160
IModFile modFile = IModFile.create(secureJar, f -> FabricModMetadataParser.createForgeMetadata(f, modPath.metadata().modMetadata(), modPath.metadata().visibleMixinConfigs(), modPath.metadata().generated()));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.sinytra.connector.locator;
2+
3+
import com.mojang.logging.LogUtils;
4+
import net.neoforged.fml.ModLoadingException;
5+
import net.neoforged.fml.ModLoadingIssue;
6+
import net.neoforged.fml.loading.progress.StartupNotificationManager;
7+
import org.sinytra.adapter.patch.api.PatchAuditTrail;
8+
import org.sinytra.connector.transformer.jar.JarTransformer;
9+
import org.sinytra.connector.util.ConnectorConfig;
10+
import org.slf4j.Logger;
11+
12+
import java.util.List;
13+
14+
public final class MixinTransformSafeguard {
15+
private static final Logger LOGGER = LogUtils.getLogger();
16+
17+
public static boolean isEnabled() {
18+
return ConnectorConfig.INSTANCE.get().enableMixinSafeguard();
19+
}
20+
21+
public static void trigger(List<JarTransformer.TransformedFabricModPath> failing) throws ModLoadingException {
22+
if (!isEnabled()) {
23+
LOGGER.warn("Ignoring {} found incompatibilities as mixin safeguard is disabled", failing.size());
24+
return;
25+
}
26+
27+
StartupNotificationManager.addModMessage("INCOMPATIBLE FABRIC MOD FOUND");
28+
StringBuilder builder = new StringBuilder();
29+
30+
String msg = "Found §e" + failing.size() + " incompatible Fabric " + (failing.size() > 1 ? "mods" : "mod") + "§r. Details are provided below.\n\n" +
31+
"With the current configuration, Connector §ccannot guarantee§r a stable environment. Should you still want to proceed, please restart the game.\n\n" +
32+
"§7This one-time safety check can be disabled in Connector's config file under \"enableMixinSafeguard\".§r";
33+
builder.append(msg).append("\n\n");
34+
35+
failing.forEach(p -> {
36+
builder.append("Mod file §e").append(p.input().getFileName().toString()).append("§r has failing mixins:\n");
37+
for (PatchAuditTrail.Candidate failed : p.auditTrail().getFailingMixins()) {
38+
String[] parts = failed.classNode().name.split("/");
39+
builder.append("- §c").append(parts[parts.length - 1]).append("§7#§3").append(failed.methodNode().name).append("§r\n");
40+
}
41+
builder.append("\n");
42+
});
43+
44+
throw new ModLoadingException(ModLoadingIssue.error(builder.toString()));
45+
}
46+
}

src/main/java/org/sinytra/connector/service/ConnectorLoaderService.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import net.neoforged.fml.loading.LoadingModList;
1313
import net.neoforged.neoforgespi.earlywindow.ImmediateWindowProvider;
1414
import org.sinytra.connector.ConnectorEarlyLoader;
15-
import org.sinytra.connector.locator.ConnectorLocator;
1615
import org.sinytra.connector.service.hacks.ConnectorForkJoinThreadFactory;
1716
import org.sinytra.connector.service.hacks.FabricASMFixer;
1817
import org.sinytra.connector.service.hacks.LenientRuntimeEnumExtender;
@@ -38,6 +37,7 @@
3837
public class ConnectorLoaderService implements ITransformationService {
3938
private static final String NAME = "connector_loader";
4039
private static final String AUTHLIB_MODULE = "authlib";
40+
private static final String BRIGADIER_MODULE = "brigadier";
4141
private static final Logger LOGGER = LogUtils.getLogger();
4242
private static final VarHandle PLUGINS = uncheck(() -> ConnectorUtil.TRUSTED_LOOKUP.findVarHandle(LaunchPluginHandler.class, "plugins", Map.class));
4343

@@ -122,7 +122,8 @@ public List<Resource> completeScan(IModuleLayerManager layerManager) {
122122
}
123123
return List.of(new Resource(IModuleLayerManager.Layer.GAME, List.of(
124124
FabricASMFixer.provideGeneratedClassesJar(),
125-
ModuleLayerMigrator.moveModule(AUTHLIB_MODULE)
125+
ModuleLayerMigrator.moveModule(AUTHLIB_MODULE),
126+
ModuleLayerMigrator.moveModule(BRIGADIER_MODULE)
126127
)));
127128
}
128129

src/main/java/org/sinytra/connector/transformer/OptimizedRenamingTransformer.java

+19-32
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,10 @@
77
import net.minecraftforge.fart.internal.RenamingTransformer;
88
import net.minecraftforge.srgutils.IMappingFile;
99
import org.jetbrains.annotations.Nullable;
10-
import org.objectweb.asm.AnnotationVisitor;
11-
import org.objectweb.asm.ClassReader;
12-
import org.objectweb.asm.ClassVisitor;
13-
import org.objectweb.asm.ClassWriter;
14-
import org.objectweb.asm.Handle;
15-
import org.objectweb.asm.Opcodes;
16-
import org.objectweb.asm.Type;
10+
import org.objectweb.asm.*;
1711
import org.objectweb.asm.commons.ClassRemapper;
1812
import org.objectweb.asm.commons.Remapper;
19-
import org.objectweb.asm.tree.AbstractInsnNode;
20-
import org.objectweb.asm.tree.AnnotationNode;
21-
import org.objectweb.asm.tree.ClassNode;
22-
import org.objectweb.asm.tree.FieldNode;
23-
import org.objectweb.asm.tree.InvokeDynamicInsnNode;
24-
import org.objectweb.asm.tree.LdcInsnNode;
25-
import org.objectweb.asm.tree.MethodInsnNode;
26-
import org.objectweb.asm.tree.MethodNode;
27-
import org.objectweb.asm.tree.VarInsnNode;
13+
import org.objectweb.asm.tree.*;
2814
import org.sinytra.adapter.patch.analysis.MethodCallAnalyzer;
2915
import org.sinytra.adapter.patch.analysis.selector.AnnotationHandle;
3016
import org.sinytra.adapter.patch.analysis.selector.AnnotationValueHandle;
@@ -33,12 +19,7 @@
3319
import org.spongepowered.asm.mixin.gen.AccessorInfo;
3420

3521
import java.io.IOException;
36-
import java.util.Collection;
37-
import java.util.HashSet;
38-
import java.util.List;
39-
import java.util.Map;
40-
import java.util.Optional;
41-
import java.util.Set;
22+
import java.util.*;
4223
import java.util.concurrent.ConcurrentHashMap;
4324
import java.util.function.Consumer;
4425
import java.util.regex.Matcher;
@@ -107,7 +88,8 @@ protected void postProcess(ClassNode node) {
10788
}
10889

10990
private void avoidAmbigousMappingRecursion(ClassNode classNode, MethodNode method) {
110-
if (isAmbigousOverridenMethod(classNode, method)) {
91+
int parentMethods = countAmbigousOverridenMethods(classNode, method);
92+
if (parentMethods > 1) {
11193
for (AbstractInsnNode insn : method.instructions) {
11294
if (insn instanceof MethodInsnNode minsn && minsn.getOpcode() == Opcodes.INVOKEVIRTUAL && minsn.owner.equals(classNode.name) && minsn.name.equals(method.name) && minsn.desc.equals(method.desc)) {
11395
List<AbstractInsnNode> insns = MethodCallAnalyzer.findMethodCallParamInsns(method, minsn);
@@ -117,16 +99,25 @@ private void avoidAmbigousMappingRecursion(ClassNode classNode, MethodNode metho
11799
}
118100
}
119101
}
102+
// Look for ambigous methods in our own class
103+
if (parentMethods > 0) {
104+
int i = 1;
105+
for (MethodNode m : classNode.methods) {
106+
if (m != method && m.name.equals(method.name) && m.desc.equals(method.desc)) {
107+
m.name += "$connector_disabled$" + i;
108+
}
109+
}
110+
}
120111
}
121112

122-
private boolean isAmbigousOverridenMethod(ClassNode classNode, MethodNode method) {
123-
return classNode.superName != null && this.remapper.getClass(classNode.name)
124-
.map(c -> c.getMethods().stream()
113+
private int countAmbigousOverridenMethods(ClassNode classNode, MethodNode method) {
114+
return classNode.superName != null ? this.remapper.getClass(classNode.name)
115+
.map(c -> (int) c.getMethods().stream()
125116
.flatMap(Optional::stream)
126117
.filter(m -> !m.getName().equals(m.getMapped()) && m.getMapped().equals(method.name) && method.desc.equals(this.remapper.mapMethodDesc(m.getDescriptor()))
127118
&& (m.getAccess() & (ACC_PRIVATE | ACC_STATIC)) == 0)
128-
.count() > 1)
129-
.orElse(false);
119+
.count())
120+
.orElse(0) : 0;
130121
}
131122

132123
private void processMixinAnnotation(AnnotationNode annotation, PostProcessRemapper postProcessRemapper) {
@@ -282,10 +273,6 @@ public MixinAwareEnhancedRemapper(ClassProvider classProvider, IMappingFile map,
282273
this.flatMappings = flatMappings;
283274
}
284275

285-
public ClassProvider getUpstreamProvider() {
286-
return ((IntermediaryClassProvider) this.classProvider).upstream;
287-
}
288-
289276
@Override
290277
public String map(final String key) {
291278
String fastMapped = this.flatMappings.map(key);

src/main/java/org/sinytra/connector/transformer/jar/JarTransformInstance.java

+9-3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import net.neoforged.fml.loading.LibraryFinder;
1919
import net.neoforged.fml.loading.MavenCoordinate;
2020
import net.neoforged.neoforgespi.locating.IModFile;
21+
import org.jetbrains.annotations.Nullable;
2122
import org.sinytra.adapter.patch.LVTOffsets;
2223
import org.sinytra.adapter.patch.api.Patch;
2324
import org.sinytra.adapter.patch.api.PatchAuditTrail;
@@ -111,12 +112,13 @@ public BytecodeFixerUpperFrontend getBfu() {
111112
return bfu;
112113
}
113114

114-
public void transformJar(File input, Path output, JarTransformer.FabricModFileMetadata metadata) throws IOException {
115+
@Nullable
116+
public PatchAuditTrail transformJar(File input, Path output, JarTransformer.FabricModFileMetadata metadata) throws IOException {
115117
Stopwatch stopwatch = Stopwatch.createStarted();
116118

117119
if (metadata.generated()) {
118120
processGeneratedJar(input, output, stopwatch);
119-
return;
121+
return null;
120122
}
121123

122124
String jarMapping = metadata.manifestAttributes().getValue(FABRIC_MAPPING_NAMESPACE);
@@ -130,10 +132,11 @@ public void transformJar(File input, Path output, JarTransformer.FabricModFileMe
130132
IMappingFile intermediaryToSrg = resolver.getCurrentMap(JarTransformer.SOURCE_NAMESPACE);
131133
AccessorRedirectTransformer accessorRedirectTransformer = new AccessorRedirectTransformer(srgToIntermediary);
132134

135+
PatchAuditTrail jarTrail = PatchAuditTrail.create();
133136
List<Patch> extraPatches = Stream.concat(this.adapterPatches.stream(), AccessorRedirectTransformer.PATCHES.stream()).toList();
134137
ConnectorRefmapHolder refmapHolder = new ConnectorRefmapHolder(refmap.merged(), refmap.files());
135138
int fabricLVTCompatibility = FabricMixinBootstrap.MixinConfigDecorator.getMixinCompat(metadata.modMetadata());
136-
PatchEnvironment environment = PatchEnvironment.create(refmapHolder, this.cleanClassLookup, this.bfu.unwrap(), fabricLVTCompatibility, this.auditTrail);
139+
PatchEnvironment environment = PatchEnvironment.create(refmapHolder, this.cleanClassLookup, this.bfu.unwrap(), fabricLVTCompatibility, jarTrail);
137140
MixinPatchTransformer patchTransformer = new MixinPatchTransformer(this.lvtOffsetsData, environment, extraPatches);
138141
RefmapRemapper refmapRemapper = new RefmapRemapper(refmap.files());
139142
Renamer.Builder builder = Renamer.builder()
@@ -168,6 +171,9 @@ public void transformJar(File input, Path output, JarTransformer.FabricModFileMe
168171

169172
stopwatch.stop();
170173
LOGGER.debug(JarTransformer.TRANSFORM_MARKER, "Jar {} transformed in {} ms", input.getName(), stopwatch.elapsed(TimeUnit.MILLISECONDS));
174+
175+
this.auditTrail.merge(jarTrail);
176+
return jarTrail;
171177
}
172178

173179
private static void processGeneratedJar(File input, Path output, Stopwatch stopwatch) throws IOException {

0 commit comments

Comments
 (0)