import java.net.URI import java.security.MessageDigest plugins { java } group = "games.dmg" version = providers.gradleProperty("releaseVersion") .orElse("0.1.0-SNAPSHOT") .get() repositories { mavenCentral() maven("https://repo.purpurmc.org/snapshots/") } java { toolchain { languageVersion = JavaLanguageVersion.of(25) } } tasks.withType().configureEach { options.compilerArgs.addAll(listOf("-Xlint:all,-deprecation,-removal", "-Werror")) } dependencies { compileOnly("org.purpurmc.purpur:purpur-api:26.3.build.2651-stable") testImplementation("org.purpurmc.purpur:purpur-api:26.3.build.2651-stable") testImplementation(platform("org.junit:junit-bom:5.13.4")) testImplementation("org.junit.jupiter:junit-jupiter") testImplementation("org.mockito:mockito-core:5.18.0") testImplementation("org.yaml:snakeyaml:2.4") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } tasks.test { useJUnitPlatform() dependsOn(tasks.jar) systemProperty("distribution.jar", tasks.jar.get().archiveFile.get().asFile.absolutePath) systemProperty("distribution.version", project.version.toString()) } val installReleaseTools = tasks.register("installReleaseTools") { commandLine("npm", "ci", "--ignore-scripts", "--no-audit", "--no-fund") } val releaseToolCheck = tasks.register("releaseToolCheck") { dependsOn(installReleaseTools) commandLine("npm", "test") } tasks.check { dependsOn(releaseToolCheck) } // Exercise actual Purpur event dispatch and command registration without starting a server. val carryRuntime = layout.buildDirectory.dir("carry-runtime") val downloadCarryRuntime = tasks.register("downloadCarryRuntime") { val launcher = carryRuntime.map { it.file("purpur-26.3-2651.jar") } outputs.file(launcher) doLast { val file = launcher.get().asFile file.parentFile.mkdirs() val connection = URI("https://api.purpurmc.org/v2/purpur/26.3/2651/download") .toURL().openConnection() connection.connectTimeout = 30_000 connection.readTimeout = 120_000 val bytes = connection.getInputStream().use { it.readBytes() } val digest = MessageDigest.getInstance("SHA-256").digest(bytes) .joinToString("") { "%02x".format(it) } check(digest == "0677c1febecfbc2e5b0a7f76abd647b70a1f38d3cbdf3dd6a82e401b4262a598") { "Purpur 2651 checksum mismatch" } file.writeBytes(bytes) } } val prepareCarryRuntime = tasks.register("prepareCarryRuntime") { dependsOn(downloadCarryRuntime) javaLauncher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(25) } classpath = files(carryRuntime.map { it.file("purpur-26.3-2651.jar") }) mainClass = "io.papermc.paperclip.Main" jvmArgs("-Dpaperclip.patchonly=true") workingDir(carryRuntime) outputs.dir(carryRuntime.map { it.dir("versions") }) outputs.dir(carryRuntime.map { it.dir("libraries") }) } val nativeTest = sourceSets.create("nativeTest") dependencies { add(nativeTest.implementationConfigurationName, platform("org.junit:junit-bom:5.13.4")) add(nativeTest.implementationConfigurationName, "org.junit.jupiter:junit-jupiter") add(nativeTest.implementationConfigurationName, "org.mockito:mockito-core:5.18.0") add(nativeTest.compileOnlyConfigurationName, "org.jetbrains:annotations:26.0.2") add(nativeTest.compileOnlyConfigurationName, "org.checkerframework:checker-qual:3.49.2") add(nativeTest.runtimeOnlyConfigurationName, "org.junit.platform:junit-platform-launcher") } val nativeRuntimeJars = files(fileTree(carryRuntime) { include("versions/**/*.jar", "libraries/**/*.jar") }).builtBy(prepareCarryRuntime) nativeTest.compileClasspath += sourceSets.main.get().output + nativeRuntimeJars nativeTest.runtimeClasspath += sourceSets.main.get().output + nativeRuntimeJars val nativeCarryTest = tasks.register("nativeCarryTest") { description = "Runs registered Purpur carry event and command regressions without a server" testClassesDirs = nativeTest.output.classesDirs classpath = nativeTest.runtimeClasspath useJUnitPlatform() maxHeapSize = "1G" workingDir(carryRuntime) } tasks.check { dependsOn(nativeCarryTest) } val pluginVersion = version tasks.processResources { filesMatching("plugin.yml") { expand("version" to pluginVersion) } }