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")) } val purpurApi = "org.purpurmc.purpur:purpur-api:26.3.build.2651-stable" val nativeRuntimeName = "purpur-26.3-2651.jar" val nativeRuntimeUrl = "https://api.purpurmc.org/v2/purpur/26.3/2651/download" dependencies { compileOnly(purpurApi) testImplementation(purpurApi) 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()) } // Verify native projectile adapters against the declared runtime, without starting a server. val nativeRuntime = layout.buildDirectory.dir("native-runtime/26.3-2651") val downloadNativeRuntime = tasks.register("downloadNativeRuntime") { val launcher = nativeRuntime.map { it.file(nativeRuntimeName) } outputs.file(launcher) doLast { val file = launcher.get().asFile file.parentFile.mkdirs() val connection = URI(nativeRuntimeUrl).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 prepareNativeRuntime = tasks.register("prepareNativeRuntime") { dependsOn(downloadNativeRuntime) javaLauncher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(25) } classpath = files(nativeRuntime.map { it.file(nativeRuntimeName) }) mainClass = "io.papermc.paperclip.Main" jvmArgs("-Dpaperclip.patchonly=true") workingDir(nativeRuntime) outputs.dir(nativeRuntime.map { it.dir("versions") }) outputs.dir(nativeRuntime.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(nativeRuntime) { include("versions/**/*.jar", "libraries/**/*.jar") }).builtBy(prepareNativeRuntime) nativeTest.compileClasspath += sourceSets.main.get().output + nativeRuntimeJars nativeTest.runtimeClasspath += sourceSets.main.get().output + nativeRuntimeJars val nativeCompatibilityTest = tasks.register("nativeCompatibilityTest") { description = "Tests native projectile and damage behavior without a listening server" testClassesDirs = nativeTest.output.classesDirs classpath = nativeTest.runtimeClasspath useJUnitPlatform() maxHeapSize = "1G" workingDir(nativeRuntime) } 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(nativeCompatibilityTest, releaseToolCheck) } val pluginVersion = version tasks.processResources { inputs.property("pluginVersion", pluginVersion) filesMatching("plugin.yml") { expand("version" to pluginVersion) } }