import org.apache.commons.lang3.SystemUtils import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import java.io.ByteArrayOutputStream plugins { idea java id("gg.essential.loom") version "0.10.0.+" id("dev.architectury.architectury-pack200") version "0.1.3" id("com.github.johnrengelman.shadow") version "7.1.2" kotlin("jvm") version "1.9.0" id("com.bnorm.power.kotlin-power-assert") version "0.13.0" `maven-publish` id("moe.nea.shot") version "1.0.0" } group = "at.hannibal2.skyhanni" version = "0.26.Beta.4" val gitHash by lazy { val baos = ByteArrayOutputStream() exec { standardOutput = baos commandLine("git", "rev-parse", "--short", "HEAD") isIgnoreExitValue = true } baos.toByteArray().decodeToString().trim() } // Toolchains: java { toolchain.languageVersion.set(JavaLanguageVersion.of(8)) } sourceSets.main { output.setResourcesDir(sourceSets.main.flatMap { it.java.classesDirectory }) java.srcDir(layout.projectDirectory.dir("src/main/kotlin")) kotlin.destinationDirectory.set(java.destinationDirectory) } repositories { mavenCentral() mavenLocal() maven("https://repo.spongepowered.org/maven/") // mixin maven("https://pkgs.dev.azure.com/djtheredstoner/DevAuth/_packaging/public/maven/v1") // DevAuth maven("https://jitpack.io") { // NotEnoughUpdates (compiled against) content { includeGroupByRegex("com\\.github\\..*") } } maven("https://repo.nea.moe/releases") // libautoupdate maven("https://maven.notenoughupdates.org/releases") // NotEnoughUpdates (dev env) maven("https://repo.hypixel.net/repository/Hypixel/") // mod-api maven("https://maven.teamresourceful.com/repository/thatgravyboat/") // DiscordIPC } val shadowImpl: Configuration by configurations.creating { configurations.implementation.get().extendsFrom(this) } val shadowModImpl: Configuration by configurations.creating { configurations.modImplementation.get().extendsFrom(this) } val devenvMod: Configuration by configurations.creating { isTransitive = false isVisible = false } val headlessLwjgl by configurations.creating { isTransitive = false isVisible = false } val shot = shots.shot("minecraft", project.file("shots.txt")) dependencies { minecraft("com.mojang:minecraft:1.8.9") mappings("de.oceanlabs.mcp:mcp_stable:22-1.8.9") forge("net.minecraftforge:forge:1.8.9-11.15.1.2318-1.8.9") // Discord RPC client shadowImpl("com.jagrosh:DiscordIPC:0.5.3") { exclude(module = "log4j") because("Different version conflicts with Minecraft's Log4J") exclude(module = "gson") because("Different version conflicts with Minecraft's Log4j") } compileOnly(libs.jbAnnotations) headlessLwjgl(libs.headlessLwjgl) shadowImpl("org.spongepowered:mixin:0.7.11-SNAPSHOT") { isTransitive = false } annotationProcessor("org.spongepowered:mixin:0.8.4-SNAPSHOT") implementation(kotlin("stdlib-jdk8")) shadowImpl("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") { exclude(group = "org.jetbrains.kotlin") } modRuntimeOnly("me.djtheredstoner:DevAuth-forge-legacy:1.1.0") modCompileOnly("com.github.hannibal002:notenoughupdates:4957f0b:all") { exclude(module = "unspecified") isTransitive = false } // May 4, 2024, 4:05 PM GMT+2 // https://github.com/NotEnoughUpdates/NotEnoughUpdates/tree/2.2.2 devenvMod("com.github.NotEnoughUpdates:NotEnoughUpdates:2.2.2:all") { exclude(module = "unspecified") isTransitive = false } shadowModImpl(libs.moulconfig) shadowImpl(libs.libautoupdate) { exclude(module = "gson") } shadowImpl("org.jetbrains.kotlin:kotlin-reflect:1.9.0") implementation(libs.hotswapagentforge) testImplementation("com.github.NotEnoughUpdates:NotEnoughUpdates:faf22b5dd9:all") { exclude(module = "unspecified") isTransitive = false } testImplementation("org.junit.jupiter:junit-jupiter:5.10.0") testImplementation("io.mockk:mockk:1.12.5") implementation("net.hypixel:mod-api:0.3.1") } configurations.getByName("minecraftNamed").dependencies.forEach { shot.applyTo(it as HasConfigurableAttributes<*>) } tasks.withType(Test::class) { useJUnitPlatform() javaLauncher.set(javaToolchains.launcherFor(java.toolchain)) workingDir(file("run")) systemProperty("junit.jupiter.extensions.autodetection.enabled", "true") } kotlin { sourceSets.all { languageSettings { languageVersion = "2.0" enableLanguageFeature("BreakContinueInInlineLambdas") } } } // Minecraft configuration: loom { launchConfigs { "client" { property("mixin.debug", "true") if (System.getenv("repo_action") != "true") { property("devauth.configDir", rootProject.file(".devauth").absolutePath) } arg("--tweakClass", "org.spongepowered.asm.launch.MixinTweaker") arg("--tweakClass", "io.github.notenoughupdates.moulconfig.tweaker.DevelopmentResourceTweaker") arg("--mods", devenvMod.resolve().joinToString(",") { it.relativeTo(file("run")).path }) } } forge { pack200Provider.set(dev.architectury.pack200.java.Pack200Adapter()) mixinConfig("mixins.skyhanni.json") } @Suppress("UnstableApiUsage") mixin { defaultRefmapName.set("mixins.skyhanni.refmap.json") } runConfigs { "client" { if (SystemUtils.IS_OS_MAC_OSX) { vmArgs.remove("-XstartOnFirstThread") } vmArgs.add("-Xmx4G") } "server" { isIdeConfigGenerated = false } } } // Tasks: tasks.processResources { inputs.property("version", version) filesMatching("mcmod.info") { expand("version" to version) } } val generateRepoPatterns by tasks.creating(JavaExec::class) { javaLauncher.set(javaToolchains.launcherFor(java.toolchain)) mainClass.set("net.fabricmc.devlaunchinjector.Main") workingDir(project.file("run")) classpath(sourceSets.main.map { it.runtimeClasspath }, sourceSets.main.map { it.output }) jvmArgs( "-Dfabric.dli.config=${project.file(".gradle/loom-cache/launch.cfg").absolutePath}", "-Dfabric.dli.env=client", "-Dfabric.dli.main=net.minecraft.launchwrapper.Launch", "-Dorg.lwjgl.opengl.Display.allowSoftwareOpenGL=true", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5006", "-javaagent:${headlessLwjgl.singleFile.absolutePath}" ) val outputFile = project.file("build/regexes/constants.json") environment("SKYHANNI_DUMP_REGEXES", "${gitHash}:${outputFile.absolutePath}") environment("SKYHANNI_DUMP_REGEXES_EXIT", "true") } tasks.compileJava { dependsOn(tasks.processResources) } tasks.withType(JavaCompile::class) { options.encoding = "UTF-8" } tasks.withType(Jar::class) { archiveBaseName.set("SkyHanni") duplicatesStrategy = DuplicatesStrategy.EXCLUDE manifest.attributes.run { this["FMLCorePluginContainsFMLMod"] = "true" this["ForceLoadAsMod"] = "true" this["Main-Class"] = "SkyHanniInstallerFrame" this["TweakClass"] = "org.spongepowered.asm.launch.MixinTweaker" this["MixinConfigs"] = "mixins.skyhanni.json" } } val remapJar by tasks.named("remapJar") { archiveClassifier.set("") from(tasks.shadowJar) input.set(tasks.shadowJar.get().archiveFile) } tasks.shadowJar { destinationDirectory.set(layout.buildDirectory.dir("badjars")) archiveClassifier.set("all-dev") configurations = listOf(shadowImpl, shadowModImpl) doLast { configurations.forEach { println("Config: ${it.files}") } } exclude("META-INF/versions/**") mergeServiceFiles() relocate("io.github.notenoughupdates.moulconfig", "at.hannibal2.skyhanni.deps.moulconfig") relocate("moe.nea.libautoupdate", "at.hannibal2.skyhanni.deps.libautoupdate") relocate("com.jagrosh.discordipc", "at.hannibal2.skyhanni.deps.discordipc") } tasks.jar { archiveClassifier.set("nodeps") destinationDirectory.set(layout.buildDirectory.dir("badjars")) } tasks.assemble.get().dependsOn(tasks.remapJar) val compileKotlin: KotlinCompile by tasks compileKotlin.kotlinOptions { jvmTarget = "1.8" } val compileTestKotlin: KotlinCompile by tasks compileTestKotlin.kotlinOptions { jvmTarget = "1.8" } val sourcesJar by tasks.creating(Jar::class) { destinationDirectory.set(layout.buildDirectory.dir("badjars")) archiveClassifier.set("src") from(sourceSets.main.get().allSource) } publishing.publications { create("maven") { artifact(tasks.remapJar) artifact(sourcesJar) { classifier = "sources" } pom { name.set("SkyHanni") licenses { license { name.set("GNU Lesser General Public License") url.set("https://github.com/hannibal002/SkyHanni/blob/HEAD/LICENSE") } } developers { developer { name.set("hannibal002") } developer { name.set("The SkyHanni contributors") } } } } }