import groovy.json.JsonSlurper plugins { id 'java' id 'com.gradleup.shadow' version '9.6.0' } group = 'de.maxhenkel.voicechat' version = findProperty('buildVersion') ?: '1.0.1' java { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } repositories { mavenCentral() maven { url = 'https://hub.spigotmc.org/nexus/content/groups/public/' } maven { url = 'https://libraries.minecraft.net/' } maven { url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' } maven { url = 'https://maven.maxhenkel.de/repository/public' } maven { url = 'https://repo.viaversion.com/' } } configurations { shadow } dependencies { compileOnly 'org.bukkit:bukkit:1.8.8-R0.1-SNAPSHOT' compileOnly 'com.google.code.findbugs:jsr305:3.0.2' compileOnly 'me.clip:placeholderapi:2.12.2' compileOnly 'com.viaversion:viaversion-bukkit:5.7.2' compileOnly 'com.viaversion:viaversion-common:5.7.2' implementation 'io.netty:netty-all:4.1.132.Final' implementation 'org.json:json:20251224' shadow 'org.json:json:20251224' implementation 'me.lucko:commodore:2.2' shadow 'me.lucko:commodore:2.2' implementation 'org.concentus:Concentus:1.0.1' shadow 'org.concentus:Concentus:1.0.1' implementation 'de.maxhenkel.configbuilder:configbuilder:2.1.0' shadow 'de.maxhenkel.configbuilder:configbuilder:2.1.0' } sourceSets { main { java { srcDirs = [ 'source/api/src/main/java', 'source/bukkit/src/main/java', layout.buildDirectory.dir('generated/sources/java').get().asFile ] } resources { srcDirs = ['source/bukkit/src/main/resources'] exclude 'plugin.yml' } } test { java { srcDirs = ['tests'] } } } tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' options.release = 8 } tasks.register('generateBuildConstants', Copy) { from 'source/bukkit/src/template/java' into layout.buildDirectory.dir('generated/sources/java') expand compatibility_version: '20', mod_compatible_version: '2.6.x', target_bukkit_version: '1.8.8-R0.1-SNAPSHOT', plugin_name: 'Simple Voice Chat' } compileJava.dependsOn tasks.named('generateBuildConstants') tasks.register('generateFallbackTranslations') { def inputFile = file('source/common/src/main/resources/assets/voicechat/lang/en_us.json') def outputFile = layout.buildDirectory.file('generated/sources/java/de/maxhenkel/voicechat/FallbackTranslations.java') inputs.file inputFile outputs.file outputFile doLast { def translations = new JsonSlurper().parse(inputFile) def output = new StringBuilder('''package de.maxhenkel.voicechat; import java.util.Collections; import java.util.HashMap; import java.util.Map; public class FallbackTranslations { public static final Map FALLBACK_TRANSLATIONS; static { Map translations = new HashMap<>(); ''') translations.each { key, value -> def k = key.toString().replace('\\', '\\\\').replace('\n', '\\n').replace('"', '\\"') def v = value.toString().replace('\\', '\\\\').replace('\n', '\\n').replace('"', '\\"') output.append(" translations.put(\"${k}\", \"${v}\");\n") } output.append(''' FALLBACK_TRANSLATIONS = Collections.unmodifiableMap(translations); } } ''') outputFile.get().asFile.parentFile.mkdirs() outputFile.get().asFile.text = output.toString() } } compileJava.dependsOn tasks.named('generateFallbackTranslations') processResources { from('plugin.yml') { filter { String line -> line.startsWith('version:') ? "version: '${project.version}'" : line } } } tasks.named('jar') { archiveClassifier = 'dev' } shadowJar { configurations = [project.configurations.shadow] archiveClassifier = '' archiveFileName = "AsminVoiceChat-${project.version}.jar" from('LICENSE-upstream.txt') { rename { 'LICENSE_SimpleVoiceChat' } } relocate 'org.json', 'de.maxhenkel.voicechat.org.json' relocate 'me.lucko.commodore', 'de.maxhenkel.voicechat.commodore' relocate 'org.concentus', 'de.maxhenkel.voicechat.concentus' relocate 'de.maxhenkel.configbuilder', 'de.maxhenkel.voicechat.configbuilder' dependencies { exclude(dependency('com.mojang:brigadier:.*')) exclude(dependency('com.google.code.findbugs:jsr305:.*')) } } tasks.named('build') { dependsOn 'shadowJar' dependsOn 'cryptoTest' } tasks.register('cryptoTest', JavaExec) { dependsOn tasks.named('testClasses') classpath = sourceSets.test.runtimeClasspath + files(shadowJar.archiveFile) mainClass = 'ProtocolCryptoSelfTest' } tasks.withType(Test).configureEach { failOnNoDiscoveredTests = false }