import groovy.lang.Closure import groovy.util.Node import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import java.util.Date import java.text.SimpleDateFormat import groovy.util.NodeList import org.gradle.kotlin.dsl.accessors.runtime.addDependencyTo val mod_version: String by project val mc_version: String by project val forge_version: String by project val mod_id: String by project val handle_deps: String by project val handleDeps = handle_deps == "true" plugins { java kotlin `maven-publish` id("net.minecraftforge.gradle") } configurations { create("library") // non-mod libraries create("klibrary") // kotlin libs get("implementation").extendsFrom(get("library"), get("klibrary")) } version = mod_version group = "ru.dbotthepony" java.toolchain.languageVersion.set(JavaLanguageVersion.of(17)) println("Targeting Java ${java.toolchain.languageVersion.get()}") tasks.withType(KotlinCompile::class.java) { kotlinOptions { freeCompilerArgs = listOf("-Xjvm-default=all") jvmTarget = java.toolchain.languageVersion.get().toString() } } tasks.withType(JavaCompile::class.java) { options.compilerArgs.add("-Xlint:all") } sourceSets { create("data") { compileClasspath += sourceSets["main"].output runtimeClasspath += sourceSets["main"].output } this["main"].resources { srcDir("src/data/resources") } } tasks.test { useJUnitPlatform() } dependencies { val jupiter_version: String by project val kotlin_version: String by project val kotlin_for_forge_version: String by project val kotlin_coroutines_version: String by project val kotlin_serialization_version: String by project minecraft("net.minecraftforge:forge:$mc_version-$forge_version") testImplementation("org.junit.jupiter:junit-jupiter:${jupiter_version}") implementation("thedarkcolour:kotlinforforge:$kotlin_for_forge_version") fun library(notation: Any) { this.add("library", notation) } fun klibrary(notation: Any) { this.add("klibrary", notation) } val excludeKGroup = closureOf { (this as ExternalModuleDependency).exclude(group = "org.jetbrains", module = "annotations") } as Closure // Add everything to the classpath correctly klibrary(create("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version", excludeKGroup)) klibrary(create("org.jetbrains.kotlin:kotlin-reflect:$kotlin_version", excludeKGroup)) klibrary(create("org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version", excludeKGroup)) klibrary(create("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:$kotlin_coroutines_version", excludeKGroup)) klibrary(create("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlin_serialization_version", excludeKGroup)) // Real mod deobf dependency examples - these get remapped to your current mappings // compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // Adds JEI API as a compile dependency // runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") // Adds the full JEI mod as a runtime dependency // implementation fg.deobf("com.tterrag.registrate:Registrate:MC${mc_version}-${registrate_version}") // Adds registrate as a dependency // Examples using mod jars from ./libs // implementation fg.deobf("blank:EnderRift-1.18.1:2.4.1") // compile against the JEI API but do not include it at runtime //compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // at runtime, use the full JEI jar //runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") if (handleDeps) { val jei_version: String by project val the_one_probe_version: String by project val mekanism_version: String by project implementation(fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}")) implementation("mcjty:theoneprobe:${mc_version}-${the_one_probe_version}:deobf") implementation(fg.deobf("mekanism:Mekanism:${mc_version}-${mekanism_version}:all")) } library(create("ru.dbotthepony:kvector:1.2.0", closureOf { // avoid adding kotlin libraries as dependency twice // since KVector depends solely on Kotlin (this as ExternalModuleDependency).isTransitive = false excludeKGroup.invoke(this) } as Closure)) } configurations { getByName("dataImplementation").extendsFrom(getByName("implementation")) getByName("library").resolutionStrategy.cacheChangingModulesFor(10, "minutes") } minecraft { mappings("official", mc_version) accessTransformer(file("src/main/resources/META-INF/accesstransformer.cfg")) runs { create("client") { mods { create(mod_id) { source(sourceSets["main"]) } } } create("server") { mods { create(mod_id) { source(sourceSets["main"]) } } } create("data") { args("--mod", "overdrive_that_matters", "--all", "--output", file("src/data/resources/"), "--existing", file("src/main/resources/")) mods { create(mod_id) { sources(sourceSets["main"], sourceSets["data"]) } } } } } minecraft.runs.all { workingDirectory = project.file("run").absolutePath // "SCAN": For mods scan. // "REGISTRIES": For firing of registry events. // "REGISTRYDUMP": For getting the contents of all registries. property("forge.logging.markers", "REGISTRIES") // Log4j console level property("forge.logging.console.level", "debug") lazyToken("minecraft_classpath") { configurations["library"] .copyRecursive() .resolve() .map { it.absolutePath } .toMutableList() .also { it.addAll(configurations["klibrary"].copyRecursive().resolve().map { it.absolutePath }) } .joinToString(File.pathSeparator) } } repositories { maven { url = uri("https://maven.dbotthepony.ru") } mavenCentral() maven { name = "Progwml6 maven" url = uri("https://dvs1.progwml6.com/files/maven/") } maven { name = "ModMaven" url = uri("https://modmaven.dev") } maven { name = "tterrag maven" url = uri("https://maven.tterrag.com/") } maven { url = uri("https://maven.k-4u.nl") } maven { name = "Kotlin for Forge" url = uri("https://thedarkcolour.github.io/KotlinForForge/") } // If you have mod jar dependencies in ./libs, you can declare them as a repository like so: flatDir { dir("libs") } } fun org.gradle.jvm.tasks.Jar.attachManifest() { manifest { attributes(mapOf( "Specification-Title" to project.name, "Specification-Vendor" to "DBotThePony", "Specification-Version" to "1", // We are version 1 of ourselves "Implementation-Title" to project.name, "Implementation-Version" to tasks.jar.get().archiveVersion, "Implementation-Vendor" to "DBotThePony", "Implementation-Timestamp" to SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").format(Date()) )) } } // Example configuration to allow publishing using the maven-publish plugin // This is the preferred method to reobfuscate your jar file tasks.jar.configure { from(configurations["library"].map { if (it.isDirectory) it else zipTree(it) }) finalizedBy("reobfJar") attachManifest() } tasks { create("sourceJar", org.gradle.jvm.tasks.Jar::class.java) { archiveClassifier.set("sources") from(sourceSets.main.get().allSource) } create("deobfJar", org.gradle.jvm.tasks.Jar::class.java) { archiveClassifier.set("deobf") from(configurations["library"].map { if (it.isDirectory) it else zipTree(it) }) from(sourceSets.main.get().output) attachManifest() } } publishing { publications { create("mavenJava") { // from(components["java"]) artifact(tasks["jar"]) artifact(tasks["sourceJar"]) artifact(tasks["deobfJar"]) pom { scm { url.set("https://gitlab.com/DBotThePony/overdrive-that-matters.git") } issueManagement { system.set("gitlab") url.set("https://gitlab.com/DBotThePony/overdrive-that-matters/issues") } } } } repositories { maven { url = uri("sftp://maven@dbotthepony.ru:22/maven") credentials { val mavenUser: String by project val mavenPassword: String by project username = mavenUser password = mavenPassword } } } } // However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing // publish.dependsOn("reobfJar") /* publishing { publications { mavenJava(MavenPublication) { artifact jar } } repositories { maven { url "file://${project.projectDir}/mcmodsrepo" } } } */