plugins { id("dev.kikugie.stonecutter") } // The version whose code is uncommented in src/. Switch with "Set active project to ", and run // "Reset active project" before committing. stonecutter active "1.21.11" // src/ uses 1.21.11's Mojang names (the active version). These names changed in the versions given, // so Stonecutter swaps in each version's name when it processes it. stonecutter parameters { for ((since, old, new) in listOf( Triple("1.21.11", "ResourceLocation", "Identifier"), Triple("1.21.9", "PlayerRenderer", "AvatarRenderer"), Triple("1.21.9", "PlayerRenderState", "AvatarRenderState"), Triple("26.1", "GuiGraphics", "GuiGraphicsExtractor"), Triple("26.1", "net.minecraft.client.gui.render.state", "net.minecraft.client.renderer.state.gui"), // GuiRenderState's methods Triple("26.1", "submitGuiElement", "addGuiElement"), Triple("26.1", "submitText", "addText"), Triple("26.1", "submitItem", "addItem"), Triple("26.1", "submitPicturesInPictureState", "addPicturesInPictureState"), // 26.3 moves Blaze3D's API to renderpearl Triple("26.3", "com.mojang.blaze3d.GpuFormat", "com.mojang.renderpearl.api.GpuFormat"), Triple("26.3", "com.mojang.blaze3d.pipeline.RenderPipeline", "com.mojang.renderpearl.api.pipeline.RenderPipeline"), Triple("26.3", "com.mojang.blaze3d.textures", "com.mojang.renderpearl.api.textures"), )) { replacements.regex(eval(current.version, ">=$since")) { replace("\\b${Regex.escape(old)}\\b", new, "\\b${Regex.escape(new)}\\b", old) } } } subprojects { apply(plugin = "java") repositories { maven("https://maven.fabricmc.net/") maven("https://git.selimaj.dev/api/packages/selimaj-dev/maven") maven("https://git.selimaj.dev/api/packages/saturnclientmc/maven") mavenCentral() } dependencies { "implementation"("de.javagl:obj:0.4.0") "implementation"("com.formdev:svgSalamander:1.1.4") "implementation"("com.fasterxml.jackson.core:jackson-databind:2.17.0") "implementation"("com.fasterxml.jackson.core:jackson-annotations:2.17.0") "implementation"("com.fasterxml.jackson.core:jackson-core:2.17.0") } } // Every Minecraft version builds on common and ships its resources. configure(subprojects.filter { it.name != "common" }) { dependencies { "implementation"(project(":common")) } extensions.configure { named("main") { resources.srcDir(project(":common").file("src/main/resources")) } } } // remapJar loads a whole Minecraft classpath and remaps a ~50 MB jar. Eight at once don't fit in the // daemon's heap (org.gradle.jvmargs) and the build stalls in garbage collection, so only two run // together. Everything else still builds in parallel. abstract class RemapLimit : BuildService val remapLimit = gradle.sharedServices.registerIfAbsent("remapLimit", RemapLimit::class) { maxParallelUsages = 2 } subprojects { tasks.matching { it.name == "remapJar" }.configureEach { usesService(remapLimit) } } tasks.register("buildAll") { group = "build" description = "Builds every Minecraft version's mod jar and collects them in build/allJars" // The mod jar is remapJar's output for 1.21.x, and jar's for 26.1+, which isn't obfuscated. val modJars = subprojects.filter { it.name != "common" }.flatMap { project -> val unobfuscated = project.name.substringBefore('.').toInt() >= 26 val task = if (unobfuscated) "jar" else "remapJar" project.tasks.matching { it.name == task } } dependsOn(modJars) doLast { val outputDir = layout.buildDirectory.dir("allJars").get().asFile outputDir.mkdirs() modJars.map { (it as AbstractArchiveTask).archiveFile.get().asFile } .filter { it.exists() && !it.name.contains("sources") } .forEach { it.copyTo(outputDir.resolve(it.name), overwrite = true) } println("All mod jars collected in: $outputDir") } }