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.2.build.2618-stable") testImplementation("org.purpurmc.purpur:purpur-api:26.2.build.2618-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()) } // Verify client-only label packets against the declared runtime, without starting a server. val labelRuntime = layout.buildDirectory.dir("label-runtime") val downloadLabelRuntime = tasks.register("downloadLabelRuntime") { val launcher = labelRuntime.map { it.file("purpur-26.2-2618.jar") } outputs.file(launcher) doLast { val file = launcher.get().asFile file.parentFile.mkdirs() val connection = URI("https://api.purpurmc.org/v2/purpur/26.2/2618/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 == "4a32d046a118804d89ca74ba89b798c98f6d8d1f310c18077ac573597049de31") { "Purpur 2618 checksum mismatch" } file.writeBytes(bytes) } } val prepareLabelRuntime = tasks.register("prepareLabelRuntime") { dependsOn(downloadLabelRuntime) javaLauncher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(25) } classpath = files(labelRuntime.map { it.file("purpur-26.2-2618.jar") }) mainClass = "io.papermc.paperclip.Main" jvmArgs("-Dpaperclip.patchonly=true") workingDir(labelRuntime) outputs.dir(labelRuntime.map { it.dir("versions") }) outputs.dir(labelRuntime.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(labelRuntime) { include("versions/**/*.jar", "libraries/**/*.jar") }).builtBy(prepareLabelRuntime) nativeTest.compileClasspath += sourceSets.main.get().output + nativeRuntimeJars nativeTest.runtimeClasspath += sourceSets.main.get().output + nativeRuntimeJars val nativeLabelTest = tasks.register("nativeLabelTest") { description = "Tests native label packet encoding without a listening server" testClassesDirs = nativeTest.output.classesDirs classpath = nativeTest.runtimeClasspath useJUnitPlatform() maxHeapSize = "1G" workingDir(labelRuntime) } tasks.check { dependsOn(nativeLabelTest) } val pluginVersion = version tasks.processResources { filesMatching("plugin.yml") { expand("version" to pluginVersion) } }