Skip to content

Commit

Permalink
Fix Fabric and Neo kotlin libs incompat
Browse files Browse the repository at this point in the history
Fixes #1654
  • Loading branch information
Su5eD committed Feb 25, 2025
1 parent 058dfc5 commit bc96a81
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 17 deletions.
31 changes: 16 additions & 15 deletions src/main/java/org/sinytra/connector/locator/ConnectorLocator.java
Original file line number Diff line number Diff line change
Expand Up @@ -101,22 +101,20 @@ private List<IModFile> locateFabricMods(List<IModFile> discoveredMods) {
Collection<SimpleModInfo> loadedModInfos = getPreviouslyDiscoveredMods(discoveredMods);
Collection<IModFile> loadedModFiles = loadedModInfos.stream().map(SimpleModInfo::origin).toList();
Collection<String> loadedModIds = loadedModInfos.stream().filter(mod -> !mod.library()).map(SimpleModInfo::modid).collect(Collectors.toUnmodifiableSet());
Collection<String> loadedModuleNames = loadedModInfos.stream().filter(SimpleModInfo::library).map(SimpleModInfo::moduleName).filter(Objects::nonNull).collect(Collectors.toUnmodifiableSet());

// Discover fabric mod jars
List<JarTransformer.TransformableJar> discoveredJars = FabricModsDiscoverer.scanFabricMods()
.map(rethrowFunction(p -> cacheTransformableJar(p.toFile())))
.filter(jar -> {
ConnectorFabricModMetadata metadata = jar.modPath().metadata().modMetadata();
return !shouldIgnoreMod(metadata, loadedModIds);
})
.filter(jar -> !shouldIgnoreMod(jar, loadedModIds, loadedModuleNames))
.toList();

// Discover fabric nested mod jars
Multimap<JarTransformer.TransformableJar, JarTransformer.TransformableJar> parentToChildren = HashMultimap.create();
List<JarTransformer.TransformableJar> discoveredNestedJars = discoveredJars.stream()
.flatMap(jar -> {
ConnectorFabricModMetadata metadata = jar.modPath().metadata().modMetadata();
return shouldIgnoreMod(metadata, loadedModIds) ? Stream.empty() : discoverNestedJarsRecursive(tempDir, jar, metadata.getJars(), parentToChildren, loadedModIds);
return shouldIgnoreMod(jar, loadedModIds, loadedModuleNames) ? Stream.empty() : discoverNestedJarsRecursive(tempDir, jar, metadata.getJars(), parentToChildren, loadedModIds, loadedModuleNames);
})
.toList();

Expand Down Expand Up @@ -165,19 +163,19 @@ private static IModFile createConnectorModFile(SplitPackageMerger.FilteredModPat
return modFile;
}

private static Stream<JarTransformer.TransformableJar> discoverNestedJarsRecursive(Path tempDir, JarTransformer.TransformableJar parent, Collection<NestedJarEntry> jars, Multimap<JarTransformer.TransformableJar, JarTransformer.TransformableJar> parentToChildren, Collection<String> loadedModIds) {
private static Stream<JarTransformer.TransformableJar> discoverNestedJarsRecursive(Path tempDir, JarTransformer.TransformableJar parent, Collection<NestedJarEntry> jars, Multimap<JarTransformer.TransformableJar, JarTransformer.TransformableJar> parentToChildren, Collection<String> loadedModIds, Collection<String> loadedModuleNames) {
SecureJar secureJar = SecureJar.from(parent.input().toPath());
return jars.stream()
.map(entry -> secureJar.getPath(entry.getFile()))
.filter(Files::exists)
.flatMap(path -> {
JarTransformer.TransformableJar jar = uncheck(() -> prepareNestedJar(tempDir, secureJar.getPrimaryPath().getFileName().toString(), path));
ConnectorFabricModMetadata metadata = jar.modPath().metadata().modMetadata();
if (shouldIgnoreMod(metadata, loadedModIds)) {
if (shouldIgnoreMod(jar, loadedModIds, loadedModuleNames)) {
return Stream.empty();
}
parentToChildren.put(parent, jar);
return Stream.concat(Stream.of(jar), discoverNestedJarsRecursive(tempDir, jar, metadata.getJars(), parentToChildren, loadedModIds));
ConnectorFabricModMetadata metadata = jar.modPath().metadata().modMetadata();
return Stream.concat(Stream.of(jar), discoverNestedJarsRecursive(tempDir, jar, metadata.getJars(), parentToChildren, loadedModIds, loadedModuleNames));
});
}

Expand All @@ -203,7 +201,7 @@ private static List<JarTransformer.TransformableJar> handleDuplicateMods(List<Ja
// Add mods that are going to be excluded by FML's UniqueModListBuilder to the ignore list
if (forgeMods.stream().anyMatch(SimpleModInfo::library)) {
ArtifactVersion artifactVersion = new DefaultArtifactVersion(jar.modPath().metadata().modMetadata().getVersion().getFriendlyString());
SimpleModInfo fabricModInfo = new SimpleModInfo(id, artifactVersion, false, null);
SimpleModInfo fabricModInfo = new SimpleModInfo(id, artifactVersion, false, null, null);
// Sort mods by version, descending
List<SimpleModInfo> modsByVersion = Stream.concat(Stream.of(fabricModInfo), forgeMods.stream())
.sorted(Comparator.comparing(SimpleModInfo::version).reversed())
Expand All @@ -226,9 +224,11 @@ private static List<JarTransformer.TransformableJar> handleDuplicateMods(List<Ja
.toList();
}

private static boolean shouldIgnoreMod(ConnectorFabricModMetadata metadata, Collection<String> loadedModIds) {
private static boolean shouldIgnoreMod(JarTransformer.TransformableJar jar, Collection<String> loadedModIds, Collection<String> loadedModuleNames) {
ConnectorFabricModMetadata metadata = jar.modPath().metadata().modMetadata();
String id = metadata.getId();
return ConnectorUtil.DISABLED_MODS.contains(id) || loadedModIds.contains(id);
return ConnectorUtil.DISABLED_MODS.contains(id) || loadedModIds.contains(id)
|| jar.modPath().metadata().generated() && loadedModuleNames.contains(jar.moduleName());
}

private static Collection<SimpleModInfo> getPreviouslyDiscoveredMods(List<IModFile> discoveredMods) {
Expand All @@ -244,10 +244,10 @@ private static Collection<SimpleModInfo> getPreviouslyDiscoveredMods(List<IModFi
return Stream.empty();
}
if (!modInfos.isEmpty()) {
return modInfos.stream().map(modInfo -> new SimpleModInfo(modInfo.getModId(), modInfo.getVersion(), false, modFile));
return modInfos.stream().map(modInfo -> new SimpleModInfo(modInfo.getModId(), modInfo.getVersion(), false, modFile, modFileInfo.moduleName()));
}
String version = modFileInfo.getFile().getSecureJar().moduleDataProvider().descriptor().version().map(ModuleDescriptor.Version::toString).orElse("0.0");
return Stream.of(new SimpleModInfo(modFileInfo.moduleName(), new DefaultArtifactVersion(version), true, modFile));
return Stream.of(new SimpleModInfo(modFileInfo.moduleName(), new DefaultArtifactVersion(version), true, modFile, modFileInfo.moduleName()));
})
.toList();
}
Expand All @@ -258,5 +258,6 @@ private static void loadEmbeddedJars(IDiscoveryPipeline pipeline) throws Excepti
new JarInJarDependencyLocator().scanMods(List.of(modFile), pipeline);
}

private record SimpleModInfo(String modid, ArtifactVersion version, boolean library, @Nullable IModFile origin) {}
private record SimpleModInfo(String modid, ArtifactVersion version, boolean library, @Nullable IModFile origin, @Nullable String moduleName) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
import com.google.gson.JsonParser;
import com.mojang.datafixers.util.Pair;
import com.mojang.logging.LogUtils;
import cpw.mods.jarhandling.JarContents;
import cpw.mods.jarhandling.JarContentsBuilder;
import cpw.mods.jarhandling.JarMetadata;
import cpw.mods.modlauncher.serviceapi.ILaunchPluginService;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.metadata.CustomValue;
Expand Down Expand Up @@ -116,7 +119,8 @@ public static TransformableJar cacheTransformableJar(File input) throws IOExcept
FabricModFileMetadata metadata = readModMetadata(input);
FabricModPath path = new FabricModPath(output, metadata);
ConnectorUtil.CacheFile cacheFile = ConnectorUtil.getCached(input.toPath(), output);
return new TransformableJar(input, path, cacheFile);
String moduleName = getModuleName(input.toPath());
return new TransformableJar(input, path, cacheFile, moduleName);
}

private static List<TransformedFabricModPath> transformJars(List<TransformableJar> paths, List<Path> libs, Collection<IModFile> loadedMods) {
Expand Down Expand Up @@ -259,6 +263,17 @@ private static void cleanupEnvironment() {
}
}

@Nullable
private static String getModuleName(Path path) {
try(JarContents contents = new JarContentsBuilder().paths(path).build()) {
JarMetadata metadata = JarMetadata.from(contents);
return metadata.descriptor().name();
} catch (IOException e) {
LOGGER.error("Error reading jar contents from {}", path, e);
return null;
}
}

private JarTransformer() {}

public record FabricModPath(Path path, FabricModFileMetadata metadata) {}
Expand All @@ -267,7 +282,7 @@ public record TransformedFabricModPath(Path input, FabricModPath output, @Nullab

public record FabricModFileMetadata(ConnectorFabricModMetadata modMetadata, Collection<String> visibleMixinConfigs, Collection<String> mixinConfigs, Set<String> refmaps, Set<String> mixinPackages, Attributes manifestAttributes, boolean containsAT, boolean generated) {}

public record TransformableJar(File input, FabricModPath modPath, ConnectorUtil.CacheFile cacheFile) {
public record TransformableJar(File input, FabricModPath modPath, ConnectorUtil.CacheFile cacheFile, String moduleName) {
public Pair<FabricModPath, PatchAuditTrail> transform(JarTransformInstance transformInstance) throws IOException {
Files.deleteIfExists(this.modPath.path);
PatchAuditTrail audit = transformInstance.transformJar(this.input, this.modPath.path, this.modPath.metadata());
Expand Down

0 comments on commit bc96a81

Please sign in to comment.