import de.undercouch.gradle.tasks.download.Download import org.gradle.api.plugins.JavaPlugin import org.gradle.api.tasks.Copy import org.gradle.api.tasks.compile.JavaCompile import org.gradle.jvm.tasks.Jar import org.gradle.jvm.toolchain.JavaLanguageVersion /* * Iris is a World Generator for Minecraft Bukkit Servers * Copyright (c) 2021 Arcane Arts (Volmit Software) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ buildscript { repositories { maven { url = uri('https://jitpack.io') } } dependencies { classpath('com.github.VolmitSoftware:NMSTools:c88961416f') } } plugins { id 'java' id 'java-library' alias(libs.plugins.download) } group = 'art.arcane' version = providers.gradleProperty('irisVersion').getOrElse('4.0.0-26.2') project(':core') { group = 'art.arcane' version = rootProject.version } String minecraftVersion = providers.gradleProperty('minecraftVersion').getOrElse('26.2') String fabricLoaderVersion = providers.gradleProperty('fabricLoaderVersion').getOrElse('0.19.3') String forgeVersion = providers.gradleProperty('forgeVersion').getOrElse('26.2-65.0.0') String neoForgeVersion = providers.gradleProperty('neoForgeVersion').getOrElse('26.2.0.6-beta') String volmLibCoordinate = providers.gradleProperty('volmLibCoordinate') .orElse('com.github.VolmitSoftware:VolmLib:cdf7e8bb880199734dacd386a6616bda799fcde1') .get() String useLocalVolmLib = providers.gradleProperty('useLocalVolmLib').getOrElse('true') String localVolmLibDirectory = providers.gradleProperty('localVolmLibDirectory').getOrNull() Closure loaderDisplayVersion = { String loaderVersion -> String coordinatePrefix = "${minecraftVersion}-" if (loaderVersion.startsWith(coordinatePrefix)) { return loaderVersion.substring(coordinatePrefix.length()) } return loaderVersion } Closure irisArtifactName = { String platform, String targetVersion -> return "Iris v${project.version} [${platform}] ${targetVersion}.jar" } String bukkitArtifactName = irisArtifactName('CraftBukkit', minecraftVersion) String fabricArtifactName = irisArtifactName('Fabric', "${minecraftVersion}+${loaderDisplayVersion(fabricLoaderVersion)}") String forgeArtifactName = irisArtifactName('Forge', "${minecraftVersion}+${loaderDisplayVersion(forgeVersion)}") String neoForgeArtifactName = irisArtifactName('NeoForge', "${minecraftVersion}+${loaderDisplayVersion(neoForgeVersion)}") apply plugin: ApiGenerator String consumerLocation = providers.gradleProperty('location') .getOrElse('/Users/brianfopiano/Developer/RemoteGit/[Minecraft Server]/consumers') String bukkitConsumerPath = "${consumerLocation}/plugin-consumers/dropins/plugins" String fabricConsumerPath = "${consumerLocation}/fabric-mod-consumers/dropins/mods" String forgeConsumerPath = "${consumerLocation}/forge-mod-consumers/dropins/mods" String neoForgeConsumerPath = "${consumerLocation}/neoforge-mod-consumers/dropins/mods" def nmsBindings = [ v26_2_R1: '26.2.build.60-beta', ] Class nmsTypeClass = Class.forName('NMSBinding$Type') nmsBindings.each { key, value -> project(":adapters:bukkit:nms:${key}") { apply plugin: JavaPlugin def nmsConfig = new Config() nmsConfig.jvm = 25 nmsConfig.version = value nmsConfig.type = Enum.valueOf(nmsTypeClass, 'USER_DEV') extensions.extraProperties.set('nms', nmsConfig) plugins.apply(NMSBinding) dependencies { compileOnly(project(':core')) compileOnly(volmLibCoordinate) { transitive = false } compileOnly(rootProject.libs.annotations) compileOnly(rootProject.libs.byteBuddy.core) } } } def included = configurations.create('included') def jarJar = configurations.create('jarJar') dependencies { nmsBindings.keySet().each { key -> add('included', project(path: ":adapters:bukkit:nms:${key}", configuration: 'runtimeElements')) } add('included', project(path: ':core', configuration: 'shadow')) add('included', project(path: ':adapters:bukkit:plugin', configuration: 'runtimeElements')) add('jarJar', project(':core:agent')) } tasks.named('jar', Jar).configure { inputs.files(included) duplicatesStrategy = DuplicatesStrategy.EXCLUDE from(jarJar, provider { included.resolve().collect { zipTree(it) } }) doFirst { delete(layout.buildDirectory.file("libs/Iris-${project.version}.jar")) } archiveFileName.set(bukkitArtifactName) } tasks.register('iris', Copy) { group = 'iris' dependsOn('jar') from(layout.buildDirectory.file("libs/${bukkitArtifactName}")) into(layout.buildDirectory) doFirst { delete(layout.buildDirectory.file("Iris-${project.version}.jar")) } } tasks.register('buildBukkit', Copy) { group = 'iris' dependsOn('jar') from(layout.buildDirectory.file("libs/${bukkitArtifactName}")) into(layout.projectDirectory.dir('dist')) doFirst { delete(layout.projectDirectory.file("dist/Iris-${project.version}+mc${minecraftVersion}.jar")) } } tasks.register('fabricJar', Exec) { group = 'iris' workingDir = layout.projectDirectory.dir('adapters/fabric').asFile String wrapperScript = System.getProperty('os.name').toLowerCase().contains('windows') ? 'gradlew.bat' : 'gradlew' List command = [ layout.projectDirectory.file(wrapperScript).asFile.absolutePath, 'shadowJar', '--console=plain', "-PirisVersion=${project.version}", "-PminecraftVersion=${minecraftVersion}", "-PfabricLoaderVersion=${fabricLoaderVersion}", "-PuseLocalVolmLib=${useLocalVolmLib}", "-PvolmLibCoordinate=${volmLibCoordinate}" ] if (localVolmLibDirectory != null && !localVolmLibDirectory.isBlank()) { command.add("-PlocalVolmLibDirectory=${localVolmLibDirectory}") } commandLine(command) } tasks.register('buildFabric', Copy) { group = 'iris' dependsOn('fabricJar') from(layout.projectDirectory.file("adapters/fabric/build/libs/${fabricArtifactName}")) into(layout.projectDirectory.dir('dist')) doFirst { delete(layout.projectDirectory.file("dist/Iris-${project.version}+mc${minecraftVersion}-fabric.jar")) } } tasks.register('forgeJar', Exec) { group = 'iris' workingDir = layout.projectDirectory.dir('adapters/forge').asFile String wrapperScript = System.getProperty('os.name').toLowerCase().contains('windows') ? 'gradlew.bat' : 'gradlew' List command = [ layout.projectDirectory.file(wrapperScript).asFile.absolutePath, 'shadowJar', '--console=plain', "-PirisVersion=${project.version}", "-PminecraftVersion=${minecraftVersion}", "-PforgeVersion=${forgeVersion}", "-PuseLocalVolmLib=${useLocalVolmLib}", "-PvolmLibCoordinate=${volmLibCoordinate}" ] if (localVolmLibDirectory != null && !localVolmLibDirectory.isBlank()) { command.add("-PlocalVolmLibDirectory=${localVolmLibDirectory}") } commandLine(command) } tasks.register('buildForge', Copy) { group = 'iris' dependsOn('forgeJar') from(layout.projectDirectory.file("adapters/forge/build/libs/${forgeArtifactName}")) into(layout.projectDirectory.dir('dist')) doFirst { delete(layout.projectDirectory.file("dist/Iris-${project.version}+mc${minecraftVersion}-forge.jar")) } } tasks.register('neoforgeJar', Exec) { group = 'iris' workingDir = layout.projectDirectory.dir('adapters/neoforge').asFile String wrapperScript = System.getProperty('os.name').toLowerCase().contains('windows') ? 'gradlew.bat' : 'gradlew' List command = [ layout.projectDirectory.file(wrapperScript).asFile.absolutePath, 'shadowJar', '--console=plain', "-PirisVersion=${project.version}", "-PminecraftVersion=${minecraftVersion}", "-PneoForgeVersion=${neoForgeVersion}", "-PuseLocalVolmLib=${useLocalVolmLib}", "-PvolmLibCoordinate=${volmLibCoordinate}" ] if (localVolmLibDirectory != null && !localVolmLibDirectory.isBlank()) { command.add("-PlocalVolmLibDirectory=${localVolmLibDirectory}") } commandLine(command) } tasks.register('buildNeoforge', Copy) { group = 'iris' dependsOn('neoforgeJar') from(layout.projectDirectory.file("adapters/neoforge/build/libs/${neoForgeArtifactName}")) into(layout.projectDirectory.dir('dist')) doFirst { delete(layout.projectDirectory.file("dist/Iris-${project.version}+mc${minecraftVersion}-neoforge.jar")) } } tasks.named('forgeJar').configure { mustRunAfter(tasks.named('fabricJar')) } tasks.named('fabricJar').configure { mustRunAfter(tasks.named('jar')) mustRunAfter(tasks.named('buildBukkit')) mustRunAfter(project(':spi').tasks.named('jar')) } tasks.named('neoforgeJar').configure { mustRunAfter(tasks.named('forgeJar')) } tasks.register('buildAllToOut') { group = 'iris' dependsOn('buildBukkit', 'buildFabric', 'buildForge', 'buildNeoforge', ':spi:jar') doLast { File dist = layout.projectDirectory.dir('dist').asFile File[] jars = dist.listFiles((java.io.FileFilter) { File f -> f.name.endsWith('.jar') }) println('') println('=== Iris buildAllToOut -> dist/ ===') if (jars != null) { jars.sort { it.name }.each { File f -> println(String.format(' %-60s %8d KB', f.name, (long) (f.length() / 1024))) } } } } tasks.register('buildAll') { group = 'iris' outputs.upToDateWhen { false } dependsOn('iris', 'fabricJar', 'forgeJar', 'neoforgeJar') doLast { delete( file("${bukkitConsumerPath}/Iris-Fabric.jar"), file("${bukkitConsumerPath}/Iris-Forge.jar"), file("${bukkitConsumerPath}/Iris-Neoforge.jar") ) copy { from(layout.buildDirectory.file(bukkitArtifactName)) into(bukkitConsumerPath) rename { String ignored -> 'Iris.jar' } } delete( file("${fabricConsumerPath}/Iris.jar"), file("${fabricConsumerPath}/Iris-Forge.jar"), file("${fabricConsumerPath}/Iris-Neoforge.jar") ) copy { from(layout.projectDirectory.file("adapters/fabric/build/libs/${fabricArtifactName}")) into(fabricConsumerPath) rename { String ignored -> 'Iris-Fabric.jar' } } delete( file("${forgeConsumerPath}/Iris.jar"), file("${forgeConsumerPath}/Iris-Fabric.jar"), file("${forgeConsumerPath}/Iris-Neoforge.jar") ) copy { from(layout.projectDirectory.file("adapters/forge/build/libs/${forgeArtifactName}")) into(forgeConsumerPath) rename { String ignored -> 'Iris-Forge.jar' } } delete( file("${neoForgeConsumerPath}/Iris.jar"), file("${neoForgeConsumerPath}/Iris-Fabric.jar"), file("${neoForgeConsumerPath}/Iris-Forge.jar") ) copy { from(layout.projectDirectory.file("adapters/neoforge/build/libs/${neoForgeArtifactName}")) into(neoForgeConsumerPath) rename { String ignored -> 'Iris-Neoforge.jar' } } println('') println("=== Iris buildAll -> ${consumerLocation} ===") println(" ${bukkitConsumerPath}/Iris.jar") println(" ${fabricConsumerPath}/Iris-Fabric.jar") println(" ${forgeConsumerPath}/Iris-Forge.jar") println(" ${neoForgeConsumerPath}/Iris-Neoforge.jar") } } tasks.register('irisDev', Copy) { group = 'iris' from(project(':core').layout.buildDirectory.files('libs/core-javadoc.jar', 'libs/core-sources.jar')) rename { String fileName -> fileName.replace('core', "Iris-${project.version}") } into(layout.buildDirectory) dependsOn(':core:sourcesJar') dependsOn(':core:javadocJar') } def cli = file('sentry-cli.exe') tasks.register('downloadCli', Download) { group = 'io.sentry' src("https://release-registry.services.sentry.io/apps/sentry-cli/latest?response=download&arch=x86_64&platform=${System.getProperty('os.name')}&package=sentry-cli") dest(cli) doLast { cli.setExecutable(true) } } tasks.register('release') { group = 'io.sentry' dependsOn('downloadCli') doLast { String url = 'http://sentry.volmit.com:8080' def authToken = project.findProperty('sentry.auth.token') ?: System.getenv('SENTRY_AUTH_TOKEN') String org = 'sentry' String projectName = 'iris' runCommand(cli, '--url', url, '--auth-token', authToken, 'releases', 'new', '-o', org, '-p', projectName, version) runCommand(cli, '--url', url, '--auth-token', authToken, 'releases', 'set-commits', '-o', org, '-p', projectName, version, '--auto', '--ignore-missing') //exec(cli, "--url", url, "--auth-token", authToken, "releases", "finalize", "-o", org, "-p", projectName, version) cli.delete() } } void runCommand(Object... command) { Process process = new ProcessBuilder(command.collect { it.toString() }).start() process.inputStream.readLines().each { println(it) } process.errorStream.readLines().each { println(it) } process.waitFor() } configurations.configureEach { resolutionStrategy.cacheChangingModulesFor(0, 'seconds') resolutionStrategy.cacheDynamicVersionsFor(0, 'seconds') } allprojects { apply plugin: 'java' java { toolchain { languageVersion = JavaLanguageVersion.of(25) } } repositories { mavenCentral() maven { url = uri('https://repo.papermc.io/repository/maven-public/') } maven { url = uri('https://repo.codemc.org/repository/maven-public/') } maven { url = uri('https://jitpack.io') } // EcoItems, score maven { url = uri('https://repo.nexomc.com/releases/') } // nexo maven { url = uri('https://maven.devs.beer/') } // itemsadder maven { url = uri('https://repo.extendedclip.com/releases/') } // placeholderapi maven { url = uri('https://mvn.lumine.io/repository/maven-public/') } // mythic maven { url = uri('https://nexus.phoenixdevt.fr/repository/maven-public/') } //MMOItems maven { url = uri('https://repo.onarandombox.com/content/groups/public/') } //Multiverse Core maven { url = uri('https://repo.momirealms.net/releases/') } // CraftEngine } dependencies { // Provided or Classpath compileOnly(rootProject.libs.lombok) annotationProcessor(rootProject.libs.lombok) } /** * We need parameter meta for the decree command system */ tasks.named('compileJava', JavaCompile).configure { options.compilerArgs.add('-parameters') options.encoding = 'UTF-8' options.debugOptions.debugLevel = 'none' options.release.set(25) } tasks.named('javadoc').configure { options.encoding = 'UTF-8' options.quiet() //options.addStringOption("Xdoclint:none") // TODO: Re-enable this } tasks.register('sourcesJar', Jar) { archiveClassifier.set('sources') from(sourceSets.main.allSource) } tasks.register('javadocJar', Jar) { archiveClassifier.set('javadoc') from(tasks.named('javadoc').map { it.destinationDir }) } } if (!JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_25)) { System.err.println() System.err.println('=========================================================================================================') System.err.println('You must run gradle on Java 25 or newer. You are using ' + JavaVersion.current()) System.err.println() System.err.println('=== For IDEs ===') System.err.println('1. Configure the project for Java 25 toolchain') System.err.println('2. Configure the bundled gradle to use Java 25+ in settings') System.err.println() System.err.println('=== For Command Line (gradlew) ===') System.err.println('1. Install JDK 25 from https://adoptium.net/temurin/releases/?version=25') System.err.println('2. Set JAVA_HOME environment variable to the new jdk installation folder such as C:\\Program Files\\Java\\jdk-25') System.err.println('3. Open a new command prompt window to get the new environment variables if need be.') System.err.println('=========================================================================================================') System.err.println() System.exit(69) }