diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e0b77d0..dd0c049 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -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 diff --git a/build.gradle.kts b/build.gradle.kts index 5cb8658..754b2e8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -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" @@ -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")}") @@ -86,6 +82,11 @@ neoForge { } runs { + configureEach { + additionalRuntimeClasspathConfiguration.extendsFrom(shade) + additionalRuntimeClasspathConfiguration.dependencies.add(dependencies.create(files(tasks.jar))) + } + val config = Action { systemProperty("forge.logging.console.level", "debug") systemProperty("forge.logging.markers", "REGISTRIES,SCAN,FMLHANDSHAKE,COREMOD") @@ -144,8 +145,6 @@ dependencies { "modCompileOnly"(sourceSets.main.get().output) - additionalRuntimeClasspath(files(tasks.jar)) - implementation("curse.maven:connector-extras-913445:5618470") } diff --git a/gradle.properties b/gradle.properties index cafc83e..7a2077d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -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 diff --git a/src/main/java/org/sinytra/connector/locator/ConnectorLocator.java b/src/main/java/org/sinytra/connector/locator/ConnectorLocator.java index 72e0fac..399759c 100644 --- a/src/main/java/org/sinytra/connector/locator/ConnectorLocator.java +++ b/src/main/java/org/sinytra/connector/locator/ConnectorLocator.java @@ -101,14 +101,12 @@ private List locateFabricMods(List discoveredMods) { Collection loadedModInfos = getPreviouslyDiscoveredMods(discoveredMods); Collection loadedModFiles = loadedModInfos.stream().map(SimpleModInfo::origin).toList(); Collection loadedModIds = loadedModInfos.stream().filter(mod -> !mod.library()).map(SimpleModInfo::modid).collect(Collectors.toUnmodifiableSet()); + Collection loadedModuleNames = loadedModInfos.stream().filter(SimpleModInfo::library).map(SimpleModInfo::moduleName).filter(Objects::nonNull).collect(Collectors.toUnmodifiableSet()); // Discover fabric mod jars List 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 @@ -116,7 +114,7 @@ private List locateFabricMods(List discoveredMods) { List 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(); @@ -156,7 +154,7 @@ private List locateFabricMods(List 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); @@ -165,19 +163,19 @@ private static IModFile createConnectorModFile(SplitPackageMerger.FilteredModPat return modFile; } - private static Stream discoverNestedJarsRecursive(Path tempDir, JarTransformer.TransformableJar parent, Collection jars, Multimap parentToChildren, Collection loadedModIds) { + private static Stream discoverNestedJarsRecursive(Path tempDir, JarTransformer.TransformableJar parent, Collection jars, Multimap parentToChildren, Collection loadedModIds, Collection 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)); }); } @@ -203,7 +201,7 @@ private static List handleDuplicateMods(List modsByVersion = Stream.concat(Stream.of(fabricModInfo), forgeMods.stream()) .sorted(Comparator.comparing(SimpleModInfo::version).reversed()) @@ -226,9 +224,11 @@ private static List handleDuplicateMods(List loadedModIds) { + private static boolean shouldIgnoreMod(JarTransformer.TransformableJar jar, Collection loadedModIds, Collection 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 getPreviouslyDiscoveredMods(List discoveredMods) { @@ -244,10 +244,10 @@ private static Collection getPreviouslyDiscoveredMods(List 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(); } @@ -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) { + } } diff --git a/src/main/java/org/sinytra/connector/transformer/MixinPatchTransformer.java b/src/main/java/org/sinytra/connector/transformer/MixinPatchTransformer.java index f30ec32..28dcfc3 100644 --- a/src/main/java/org/sinytra/connector/transformer/MixinPatchTransformer.java +++ b/src/main/java/org/sinytra/connector/transformer/MixinPatchTransformer.java @@ -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; @@ -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() diff --git a/src/main/java/org/sinytra/connector/transformer/jar/JarTransformer.java b/src/main/java/org/sinytra/connector/transformer/jar/JarTransformer.java index b6c8f44..943156c 100644 --- a/src/main/java/org/sinytra/connector/transformer/jar/JarTransformer.java +++ b/src/main/java/org/sinytra/connector/transformer/jar/JarTransformer.java @@ -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; @@ -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 transformJars(List paths, List libs, Collection loadedMods) { @@ -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) {} @@ -267,7 +282,7 @@ public record TransformedFabricModPath(Path input, FabricModPath output, @Nullab public record FabricModFileMetadata(ConnectorFabricModMetadata modMetadata, Collection visibleMixinConfigs, Collection mixinConfigs, Set refmaps, Set 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 transform(JarTransformInstance transformInstance) throws IOException { Files.deleteIfExists(this.modPath.path); PatchAuditTrail audit = transformInstance.transformJar(this.input, this.modPath.path, this.modPath.metadata());