diff --git a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/forge/fg3/FG3MinecraftTransformer.kt b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/forge/fg3/FG3MinecraftTransformer.kt index 0d43a4f5..3d8d695a 100644 --- a/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/forge/fg3/FG3MinecraftTransformer.kt +++ b/src/minecraft/kotlin/xyz/wagyourtail/unimined/internal/minecraft/patch/forge/fg3/FG3MinecraftTransformer.kt @@ -1,9 +1,12 @@ package xyz.wagyourtail.unimined.internal.minecraft.patch.forge.fg3 +import com.google.gson.JsonArray +import com.google.gson.JsonObject import com.google.gson.JsonParser import net.minecraftforge.binarypatcher.ConsoleTool import org.apache.commons.io.output.NullOutputStream import org.gradle.api.Project +import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Dependency import org.gradle.api.logging.LogLevel import org.jetbrains.annotations.ApiStatus @@ -13,6 +16,7 @@ import xyz.wagyourtail.unimined.api.minecraft.MinecraftJar import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask import xyz.wagyourtail.unimined.api.runs.RunConfig import xyz.wagyourtail.unimined.api.unimined +import xyz.wagyourtail.unimined.internal.minecraft.patch.fabric.FabricLikeMinecraftTransformer import xyz.wagyourtail.unimined.internal.minecraft.patch.forge.ForgeLikeMinecraftTransformer import xyz.wagyourtail.unimined.internal.minecraft.patch.forge.MinecraftForgeMinecraftTransformer import xyz.wagyourtail.unimined.internal.minecraft.patch.forge.NeoForgedMinecraftTransformer @@ -21,7 +25,6 @@ import xyz.wagyourtail.unimined.internal.minecraft.patch.forge.fg3.mcpconfig.Mcp import xyz.wagyourtail.unimined.internal.minecraft.patch.forge.fg3.mcpconfig.McpExecutor import xyz.wagyourtail.unimined.internal.minecraft.patch.jarmod.JarModMinecraftTransformer import xyz.wagyourtail.unimined.internal.minecraft.resolver.AssetsDownloader -import xyz.wagyourtail.unimined.internal.minecraft.transform.fixes.FixFG2Coremods import xyz.wagyourtail.unimined.internal.minecraft.transform.fixes.FixFG2ResourceLoading import xyz.wagyourtail.unimined.internal.minecraft.transform.merge.ClassMerger import xyz.wagyourtail.unimined.util.* @@ -59,6 +62,13 @@ class FG3MinecraftTransformer(project: Project, val parent: ForgeLikeMinecraftTr parent.accessTransformerTransformer.accessTransformerPaths = listOf("fml_at.cfg", "forge_at.cfg", "META-INF/accesstransformer.cfg") } + private val include: Configuration? = + if (provider.minecraftData.mcVersionCompare(provider.version, "1.18") >= 0) { + project.configurations.maybeCreate("include".withSourceSet(provider.sourceSet)) + } else { + null + } + override val prodNamespace by lazy { if (userdevCfg["mcp"].asString.contains("neoform")) { provider.mappings.getNamespace("mojmap") @@ -524,8 +534,53 @@ class FG3MinecraftTransformer(project: Project, val parent: ForgeLikeMinecraftTr return parent.accessTransformerTransformer.afterRemap(fixForge(baseMinecraft)) } + private fun addIncludeToMetadata(json: JsonObject, dep: Dependency, path: String) { + var jars = json.get("jars")?.asJsonArray + if (jars == null) { + jars = JsonArray() + json.add("jars", jars) + } + jars.add(JsonObject().apply { + add("identifier", JsonObject().apply { + addProperty("group", dep.group) + addProperty("artifact", dep.name) + }) + add("version", JsonObject().apply { + addProperty("range", "[${dep.version},)") + addProperty("artifactVersion", dep.version) + }) + addProperty("path", path) + }) + } + + private fun doJarJar(remapJarTask: RemapJarTask, output: Path) { + output.openZipFileSystem(mapOf("mutable" to true)).use { fs -> + val mod = fs.getPath("META-INF/jarjar/metadata.json") + val json = JsonObject() + + Files.createDirectories(fs.getPath("META-INF/jarjar/")) + val includeCache = provider.localCache.resolve("includeCache") + Files.createDirectories(includeCache) + for (dep in include!!.dependencies) { + val path = fs.getPath("META-INF/jarjar/${dep.name}-${dep.version}.jar") + if (!Files.exists(path)) { + Files.copy( + include.files(dep).first { it.extension == "jar" }.toPath(), + includeCache.resolve("${dep.name}-${dep.version}.jar"), + StandardCopyOption.REPLACE_EXISTING + ) + } + + addIncludeToMetadata(json, dep, "META-INF/jarjar/${dep.name}-${dep.version}.jar") + } + Files.write(mod, FabricLikeMinecraftTransformer.GSON.toJson(json).toByteArray(), StandardOpenOption.TRUNCATE_EXISTING) + } + } + override fun afterRemapJarTask(remapJarTask: RemapJarTask, output: Path) { - //TODO: JarJar + if (provider.minecraftData.mcVersionCompare(provider.version, "1.18") >= 0) { + doJarJar(remapJarTask, output) + } } private fun fixForge(baseMinecraft: MinecraftJar): MinecraftJar {