Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[pull] 1.21.x from Sinytra:1.21.x #9

Merged
merged 5 commits into from
Feb 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
- name: Build
run: ./gradlew clean build publishToMavenLocal --stacktrace
- name: Upload Artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: Maven Local
path: ~/.m2/repository
13 changes: 6 additions & 7 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import java.time.LocalDateTime
plugins {
java
`maven-publish`
id("net.neoforged.moddev") version "2.0.52-beta"
id("net.neoforged.moddev") version "2.0.78"
id("io.github.goooler.shadow") version "8.1.8" apply false
id("me.modmuss50.mod-publish-plugin") version "0.5.+"
id("net.neoforged.gradleutils") version "3.0.0"
Expand Down Expand Up @@ -65,10 +65,6 @@ configurations {
"modCompileOnly" {
extendsFrom(shade)
}

additionalRuntimeClasspath {
extendsFrom(shade)
}
}

println("Java: ${System.getProperty("java.version")}, JVM: ${System.getProperty("java.vm.version")} (${System.getProperty("java.vendor")}), Arch: ${System.getProperty("os.arch")}")
Expand All @@ -86,6 +82,11 @@ neoForge {
}

runs {
configureEach {
additionalRuntimeClasspathConfiguration.extendsFrom(shade)
additionalRuntimeClasspathConfiguration.dependencies.add(dependencies.create(files(tasks.jar)))
}

val config = Action<RunModel> {
systemProperty("forge.logging.console.level", "debug")
systemProperty("forge.logging.markers", "REGISTRIES,SCAN,FMLHANDSHAKE,COREMOD")
Expand Down Expand Up @@ -144,8 +145,6 @@ dependencies {

"modCompileOnly"(sourceSets.main.get().output)

additionalRuntimeClasspath(files(tasks.jar))

implementation("curse.maven:connector-extras-913445:5618470")
}

Expand Down
8 changes: 4 additions & 4 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,19 @@ org.gradle.caching=true
#org.gradle.configuration-cache=true

# Versions
versionConnector=2.0.0-beta.6
versionConnector=2.0.0-beta.7
versionAdapter=1.13.20+1.21.1-20240811.191740
versionAdapterDefinition=1.13.23+1.21.1
versionAdapterDefinition=1.13.25+1.21.1
versionAdapterRuntime=1.0.0+1.21.1

versionMc=1.21.1
versionNeoForge=21.1.97
versionNeoForge=21.1.122
versionParchmentMc=1.21
versionParchment=2024.07.28
versionForgeAutoRenamingTool=1.0.12
versionForgifiedFabricLoader=2.5.34+0.16.0+1.21.1
versionAccessWidener=2.1.0
versionForgifiedFabricApi=0.104.0+2.0.13+1.21.1
versionForgifiedFabricApi=0.107.0+2.0.23+1.21.1

# Publishing
curseForgeId=890127
Expand Down
33 changes: 17 additions & 16 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 @@ -156,7 +154,7 @@ private List<IModFile> locateFabricMods(List<IModFile> discoveredMods) {
private static IModFile createConnectorModFile(SplitPackageMerger.FilteredModPath modPath) {
JarContents jarContents = new JarContentsBuilder().paths(modPath.paths()).pathFilter(modPath.filter()).build();
if (modPath.metadata().generated()) {
return IModFile.create(SecureJar.from(jarContents), JarModsDotTomlModFileReader::manifestParser, IModFile.Type.LIBRARY, ModFileDiscoveryAttributes.DEFAULT);
return IModFile.create(SecureJar.from(jarContents), JarModsDotTomlModFileReader::manifestParser, IModFile.Type.GAMELIBRARY, ModFileDiscoveryAttributes.DEFAULT);
}
ModJarMetadata modJarMetadata = new ModJarMetadata(jarContents);
SecureJar secureJar = SecureJar.from(jarContents, modJarMetadata);
Expand All @@ -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 @@ -27,7 +27,6 @@
import org.sinytra.adapter.patch.transformer.dynamic.DynamicInjectorOrdinalPatch;
import org.sinytra.adapter.patch.transformer.dynamic.DynamicLVTPatch;
import org.sinytra.adapter.patch.transformer.dynamic.DynamicModifyVarAtReturnPatch;
import org.sinytra.adapter.patch.transformer.dynamic.DynamicSyntheticInstanceofPatch;
import org.sinytra.adapter.patch.transformer.dynfix.DynamicInjectionPointPatch;
import org.sinytra.connector.transformer.patch.EnvironmentStripperTransformer;
import org.sinytra.connector.util.ConnectorUtil;
Expand Down Expand Up @@ -81,7 +80,6 @@ public MixinPatchTransformer(LVTOffsets lvtOffsets, PatchEnvironment environment
.transform(new DynamicAnonymousShadowFieldTypePatch())
.transform(new DynamicModifyVarAtReturnPatch())
.transform(new DynamicInheritedInjectionPointPatch())
.transform(new DynamicSyntheticInstanceofPatch())
.transform(new DynamicInjectionPointPatch())
.build(),
Patch.interfaceBuilder()
Expand Down
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