Switch to version catalogs

- Closes #1204
- Switch to security advisory
- Move fawe-tests to fawe packages
This commit is contained in:
NotMyFault 2021-08-01 19:28:51 +02:00
parent 9f3a451ef6
commit a5e84dcfea
No known key found for this signature in database
GPG Key ID: 158F5701A6AAD00C
15 changed files with 276 additions and 134 deletions

View File

@ -1,8 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Reporting Security Vulnerabilities
url: https://forms.gle/btgdRn9yhGtzEiGW8
about: Use this form to report security vulnerabilities. Do not use the public issue tracker.
- name: IntellectualSites Discord
url: https://discord.gg/intellectualsites
about: Our support Discord, please ask questions and seek support here.

3
SECURITY.md Normal file
View File

@ -0,0 +1,3 @@
If you discover a security vulnerability in FastAsyncWorldEdit, please submit it through the [Security Vulnerability Form](https://forms.gle/btgdRn9yhGtzEiGW8).
Thanks for helping make FastAsyncWorldEdit safe for everyone.

View File

@ -1,9 +1,7 @@
import org.gradle.api.Project
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.jvm.toolchain.JavaLanguageVersion
import org.gradle.jvm.toolchain.JvmVendorSpec
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.get
import org.gradle.kotlin.dsl.repositories
import org.gradle.kotlin.dsl.the
@ -56,15 +54,15 @@ fun Project.applyCommonConfiguration() {
continue
}
add(conf.name, "com.google.guava:guava") {
version { require(Versions.GUAVA) }
version { require("21.0") }
because("Mojang provides Guava")
}
add(conf.name, "com.google.code.gson:gson") {
version { require(Versions.GSON) }
version { require("2.8.0") }
because("Mojang provides Gson")
}
add(conf.name, "it.unimi.dsi:fastutil") {
version { require(Versions.FAST_UTIL) }
version { require("8.2.1") }
because("Mojang provides FastUtil")
}
}

View File

@ -51,6 +51,7 @@ fun Project.applyLibrariesConfiguration() {
exclude(dependency("com.google.code.gson:gson"))
exclude(dependency("org.checkerframework:checker-qual"))
exclude(dependency("org.apache.logging.log4j:log4j-api"))
exclude(dependency("com.google.code.findbugs:jsr305"))
}
relocations.forEach { (from, to) ->

View File

@ -1,6 +1,7 @@
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.gradle.api.JavaVersion
import org.gradle.api.Project
import org.gradle.api.attributes.java.TargetJvmVersion
import org.gradle.api.plugins.JavaPluginConvention
import org.gradle.api.tasks.bundling.Jar
import org.gradle.api.tasks.compile.JavaCompile
@ -44,18 +45,22 @@ fun Project.applyPlatformAndCoreConfiguration() {
options.compilerArgs.add("-parameters")
}
configurations.all {
attributes.attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 16)
}
tasks.withType<Test>().configureEach {
useJUnitPlatform()
}
dependencies {
"testImplementation"("org.junit.jupiter:junit-jupiter-api:${Versions.JUNIT}")
"testImplementation"("org.junit.jupiter:junit-jupiter-params:${Versions.JUNIT}")
"testImplementation"("org.mockito:mockito-core:${Versions.MOCKITO}")
"testImplementation"("org.mockito:mockito-junit-jupiter:${Versions.MOCKITO}")
"testImplementation"("net.bytebuddy:byte-buddy:1.11.0")
"testRuntimeOnly"("org.junit.jupiter:junit-jupiter-engine:${Versions.JUNIT}")
"compileOnly"("com.google.code.findbugs:jsr305:3.0.2")
"testImplementation"("org.junit.jupiter:junit-jupiter-api:5.7.2")
"testImplementation"("org.junit.jupiter:junit-jupiter-params:5.7.2")
"testImplementation"("org.mockito:mockito-core:3.11.2")
"testImplementation"("org.mockito:mockito-junit-jupiter:3.11.2")
"testImplementation"("net.bytebuddy:byte-buddy:1.11.9")
"testRuntimeOnly"("org.junit.jupiter:junit-jupiter-engine:3.11.2")
}
// Java 8 turns on doclint which we fail

View File

@ -1,22 +0,0 @@
import org.gradle.api.Project
object Versions {
const val TEXT = "3.0.4"
const val TEXT_EXTRAS = "3.0.6"
const val PISTON = "0.5.7"
const val AUTO_VALUE = "1.7.4"
const val JUNIT = "5.7.0"
const val MOCKITO = "3.9.0"
const val FAST_UTIL = "8.2.1"
const val GUAVA = "21.0"
const val GSON = "2.8.0"
}
// Properties that need a project reference to resolve:
class ProjectVersions(project: Project) {
val loom = project.rootProject.property("loom.version")
val mixin = project.rootProject.property("mixin.version")
}
val Project.versions
get() = ProjectVersions(this)

129
gradle/libs.versions.toml Normal file
View File

@ -0,0 +1,129 @@
[versions]
# Minecraft expectations
fastutil = "8.2.1"
log4j = "2.14.1"
guava = "21.0"
gson = "2.8.0"
# Platform expectations
paper = "1.17.1-R0.1-SNAPSHOT"
# Plugins
vault = "1.7"
dummypermscompat = "1.10"
worldguard-bukkit = "7.0.5"
mapmanager = "1.8.0-SNAPSHOT"
griefprevention = "16.17.1"
griefdefender = "920a610"
mcore = "7.0.1"
residence = "4.5._13.1"
towny = "0.97.0.19"
protocollib = "4.7.0"
plotsquaredV6 = "6.0.8-SNAPSHOT"
plotsquaredV4 = "4.514"
redprotect = "1.9.6"
# Third party
flow-math = "1.0.3"
paperlib = "1.0.6"
bstats = "2.2.1"
serverlib = "2.2.1"
paster = "1.0.1-SNAPSHOT"
sparsebitset = "1.2"
parallelgzip = "1.0.5"
adventure = "4.8.1"
truezip = "6.8.4"
auto-value = "1.7.4"
findbugs = "3.0.2"
rhino-runtime = "1.7.13"
zstd-jni = "1.5.0-4"
antlr4 = "4.9.1"
json-simple = "1.1.1"
paranamer = "2.8"
jlibnoise = "1.0.0"
jchronic = "0.2.4a"
lz4-java = "1.8.0"
lz4-stream = "1.0.0"
## Internal
minimessage-text = "4.1.0-SNAPSHOT"
adapter-text = "3.0.6"
text = "3.0.4"
piston = "0.5.7"
# Tests
mockito = "3.11.2"
checker-qual = "3.16.0"
[libraries]
# Minecraft expectations
fastutil = { group = "it.unimi.dsi", name = "fastutil", version.ref = "fastutil" }
log4j = { group = "org.apache.logging.log4j", name = "log4j-api", version.ref = "log4j" }
log4jBom = { group = "org.apache.logging.log4j", name = "log4j-bom", version.ref = "log4j" }
guava = { group = "com.google.guava", name = "guava", version.ref = "guava" }
gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" }
#Platform expectations
paper = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper" }
spigot = { group = "org.spigotmc", name = "spigot", version.ref = "paper" }
# Plugins
vault = { group = "com.github.MilkBowl", name = "VaultAPI", version.ref = "vault" }
dummypermscompat = { group = "com.sk89q", name = "dummypermscompat", version.ref = "dummypermscompat" }
worldguard = { group = "com.sk89q.worldguard", name = "worldguard-bukkit", version.ref = "worldguard-bukkit" }
mapmanager = { group = "com.github.InventivetalentDev", name = "MapManager", version.ref = "mapmanager" }
griefprevention = { group = "com.github.TechFortress", name = "GriefPrevention", version.ref = "griefprevention" }
griefdefender = { group = "com.github.bloodmc", name = "GriefDefenderApi", version.ref = "griefdefender" }
mcore = { group = "com.massivecraft", name = "mcore", version.ref = "mcore" }
residence = { group = "com.bekvon.bukkit.residence", name = "Residence", version.ref = "residence" }
towny = { group = "com.github.TownyAdvanced", name = "Towny", version.ref = "towny" }
protocollib = { group = "com.comphenix.protocol", name = "ProtocolLib", version.ref = "protocollib" }
plotsquaredV6Bukkit = { group = "com.plotsquared", name = "PlotSquared-Bukkit", version.ref = "plotsquaredV6" }
plotsquaredV6Core = { group = "com.plotsquared", name = "PlotSquared-Core", version.ref = "plotsquaredV6" }
plotsquaredV4 = { group = "com.github.intellectualsites.plotsquared", name = "PlotSquared-API", version.ref = "plotsquaredV4" }
redprotect = { group = "net.fabiozumbi12", name = "redprotect", version.ref = "redprotect" }
# Third Party
flowmath = { group = "com.flowpowered", name = "flow-math", version.ref = "flow-math" }
paperlib = { group = "io.papermc", name = "paperlib", version.ref = "paperlib" }
bstatsBukkit = { group = "org.bstats", name = "bstats-bukkit", version.ref = "bstats" }
bstatsBase = { group = "org.bstats", name = "bstats-base", version.ref = "bstats" }
serverlib = { group = "org.incendo.serverlib", name = "ServerLib", version.ref = "serverlib" }
paster = { group = "com.intellectualsites.paster", name = "Paster", version.ref = "paster" }
sparsebitset = { group = "com.zaxxer", name = "SparseBitSet", version.ref = "sparsebitset" }
parallelgzip = { group = "org.anarres", name = "parallelgzip", version.ref = "parallelgzip" }
adventure = { group = "net.kyori", name = "adventure-api", version.ref = "adventure" }
adventureNbt = { group = "net.kyori", name = "adventure-nbt", version.ref = "adventure" }
truezip = { group = "de.schlichtherle", name = "truezip", version.ref = "truezip" }
autoValueAnnotations = { group = "com.google.auto.value", name = "auto-value-annotations", version.ref = "auto-value" }
autoValue = { group = "com.google.auto.value", name = "auto-value", version.ref = "auto-value" }
findbugs = { group = "com.google.code.findbugs", name = "jsr305", version.ref = "findbugs" }
rhino = { group = "org.mozilla", name = "rhino-runtime", version.ref = "rhino-runtime" }
zstd = { group = "com.github.luben", name = "zstd-jni", version.ref = "zstd-jni" }
antlr4 = { group = "org.antlr", name = "antlr4", version.ref = "antlr4" }
antlr4Runtime = { group = "org.antlr", name = "antlr4-runtime", version.ref = "antlr4" }
jsonSimple = { group = "com.googlecode.json-simple", name = "json-simple", version.ref = "json-simple" }
paranamer = { group = "com.thoughtworks.paranamer", name = "paranamer", version.ref = "paranamer" }
jlibnoise = { group = "com.sk89q.lib", name = "jlibnoise", version.ref = "jlibnoise" }
jchronic = { group = "com.sk89q", name = "jchronic", version.ref = "jchronic" }
lz4Java = { group = "org.lz4", name = "lz4-java", version.ref = "lz4-java" }
lz4JavaStream = { group = "net.jpountz", name = "lz4-java-stream", version.ref = "lz4-stream" }
# Internal
## Text
adventureTextAdapter = { group = "net.kyori", name = "text-adapter-bukkit", version.ref = "adapter-text" }
adventureMiniMessage = { group = "net.kyori", name = "adventure-text-minimessage", version.ref = "minimessage-text" }
adventureTextApi = { group = "net.kyori", name = "text-api", version.ref = "text" }
adventureTextSerializerGson = { group = "net.kyori", name = "text-serializer-gson", version.ref = "text" }
adventureTextSerializerLegacy = { group = "net.kyori", name = "text-serializer-legacy", version.ref = "text" }
adventureTextSerializerPlain = { group = "net.kyori", name = "text-serializer-plain", version.ref = "text" }
## Piston
piston = { group = "org.enginehub.piston", name = "core", version.ref = "piston" }
pistonImpl = { group = "org.enginehub.piston", name = "default-impl", version.ref = "piston" }
pistonAnnotations = { group = "org.enginehub.piston.core-ap", name = "annotations", version.ref = "piston" }
pistonProcessor = { group = "org.enginehub.piston.core-ap", name = "processor", version.ref = "piston" }
pistonRuntime = { group = "org.enginehub.piston.core-ap", name = "runtime", version.ref = "piston" }
# Tests
mockito = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" }
checkerqual = { group = "org.checkerframework", name = "checker-qual", version.ref = "checker-qual" }
log4jCore = { group = "org.apache.logging.log4j", name = "log4j-core", version.ref = "log4j" }

View File

@ -18,3 +18,6 @@ dependencyResolutionManagement {
}
}
}
enableFeaturePreview("VERSION_CATALOGS")
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")

View File

@ -30,10 +30,6 @@ repositories {
name = "ProtocolLib"
url = uri("https://repo.dmulloy2.net/nexus/repository/public/")
}
maven {
name = "Inventivetalent"
url = uri("https://repo.inventivetalent.org/content/groups/public/")
}
maven {
name = "OSS Sonatype Snapshots"
url = uri("https://oss.sonatype.org/content/repositories/snapshots/")
@ -52,57 +48,71 @@ configurations.all {
}
dependencies {
compileOnly("com.github.MilkBowl:VaultAPI:1.7") { isTransitive = false }
api(project(":worldedit-core"))
api(project(":worldedit-libs:bukkit"))
// Modules
api(projects.worldeditCore)
api(projects.worldeditLibs.bukkit)
implementation(":worldedit-adapters:")
implementation("it.unimi.dsi:fastutil")
api("com.destroystokyo.paper:paper-api:1.16.5-R0.1-SNAPSHOT") {
// Minecraft expectations
implementation(libs.fastutil)
// Platform expectations
api(libs.paper) {
exclude("junit", "junit")
isTransitive = false
exclude(group = "org.slf4j", module = "slf4j-api")
}
implementation(platform("org.apache.logging.log4j:log4j-bom:2.14.1") {
compileOnly(libs.spigot) {
because("Remove if #1208 has been addressed")
}
// Logging
implementation(libs.log4j)
implementation(libs.log4jBom) {
because("Spigot provides Log4J (sort of, not in API, implicitly part of server)")
})
implementation("org.apache.logging.log4j:log4j-api")
compileOnly("org.spigotmc:spigot:1.17-R0.1-SNAPSHOT")
implementation("io.papermc:paperlib:1.0.6")
compileOnly("com.sk89q:dummypermscompat:1.10") {
}
// Plugins
compileOnly(libs.vault) { isTransitive = false }
compileOnly(libs.dummypermscompat) {
exclude("com.github.MilkBowl", "VaultAPI")
}
testImplementation("org.mockito:mockito-core:3.11.2")
compileOnly("com.sk89q.worldguard:worldguard-bukkit:7.0.5") {
compileOnly(libs.worldguard) {
exclude("com.sk89q.worldedit", "worldedit-bukkit")
exclude("com.sk89q.worldedit", "worldedit-core")
exclude("com.sk89q.worldedit.worldedit-libs", "bukkit")
exclude("com.sk89q.worldedit.worldedit-libs", "core")
}
compileOnly("net.kyori:adventure-api:4.8.1")
testImplementation("net.kyori:adventure-api:4.8.1")
testImplementation("org.checkerframework:checker-qual:3.16.0")
testImplementation("org.spigotmc:spigot-api:1.17-R0.1-SNAPSHOT") { isTransitive = true }
api("com.intellectualsites.paster:Paster:1.0.1-SNAPSHOT")
api("org.lz4:lz4-java:1.8.0")
api("net.jpountz:lz4-java-stream:1.0.0") { isTransitive = false }
api("com.zaxxer:SparseBitSet:1.2") { isTransitive = false }
api("org.anarres:parallelgzip:1.0.5") { isTransitive = false }
implementation(libs.mapmanager) { isTransitive = false }
implementation(libs.griefprevention) { isTransitive = false }
implementation(libs.griefdefender) { isTransitive = false }
implementation(libs.mcore) { isTransitive = false }
implementation(libs.residence) { isTransitive = false }
compileOnly(libs.towny) { isTransitive = false }
implementation(libs.protocollib) { isTransitive = false }
api(libs.plotsquaredV6Bukkit) { isTransitive = false }
// Third party
implementation("org.bstats:bstats-bukkit:2.2.1")
implementation("org.bstats:bstats-base:2.2.1")
compileOnlyApi("org.inventivetalent:mapmanager:1.7.10-SNAPSHOT") { isTransitive = false }
implementation("com.github.TechFortress:GriefPrevention:16.17.1") { isTransitive = false }
implementation("com.github.bloodmc:GriefDefenderApi:920a610") { isTransitive = false }
implementation("com.flowpowered:flow-math:1.0.3") {
implementation(libs.flowmath) {
because("This dependency is needed by GriefDefender but not exposed transitively.")
isTransitive = false
}
implementation("com.massivecraft:mcore:7.0.1") { isTransitive = false }
implementation("com.bekvon.bukkit.residence:Residence:4.5._13.1") { isTransitive = false }
compileOnly("com.github.TownyAdvanced:Towny:0.97.0.17") { isTransitive = false }
implementation("com.comphenix.protocol:ProtocolLib:4.7.0") { isTransitive = false }
implementation("org.incendo.serverlib:ServerLib:2.2.1")
api("com.plotsquared:PlotSquared-Bukkit:6.0.6-SNAPSHOT") { isTransitive = false }
implementation(libs.paperlib)
implementation(libs.bstatsBukkit)
implementation(libs.bstatsBase)
implementation(libs.serverlib)
api(libs.paster)
api(libs.lz4Java)
api(libs.lz4JavaStream) { isTransitive = false }
api(libs.sparsebitset) { isTransitive = false }
api(libs.parallelgzip) { isTransitive = false }
compileOnly(libs.adventure)
// Tests
testImplementation(libs.mockito)
testImplementation(libs.adventure)
testImplementation(libs.checkerqual)
testImplementation(libs.paper) { isTransitive = true }
}
tasks.named<Copy>("processResources") {

View File

@ -1,4 +1,4 @@
package com.sk89q.util;
package com.fastasyncworldedit.util;
import com.fastasyncworldedit.bukkit.util.MinecraftVersion;
import org.junit.jupiter.api.Test;

View File

@ -13,18 +13,24 @@ applyShadowConfiguration()
addJarManifest(WorldEditKind.Standalone("com.sk89q.worldedit.cli.CLIWorldEdit"))
dependencies {
compileOnly(project(":worldedit-libs:core:ap"))
annotationProcessor(project(":worldedit-libs:core:ap"))
annotationProcessor("com.google.guava:guava:${Versions.GUAVA}")
api(project(":worldedit-core"))
implementation(platform("org.apache.logging.log4j:log4j-bom:2.14.1") {
// Modules
api(projects.worldeditCore)
compileOnly(projects.worldeditLibs.core.ap)
annotationProcessor(projects.worldeditLibs.core.ap)
// Minecraft expectations
annotationProcessor(libs.guava)
implementation(libs.guava)
implementation(libs.gson)
// Logging
implementation(libs.log4jBom) {
because("We control Log4J on this platform")
})
implementation("org.apache.logging.log4j:log4j-api")
implementation("org.apache.logging.log4j:log4j-core")
}
implementation(libs.log4j)
implementation(libs.log4jCore
)
implementation("commons-cli:commons-cli:1.4")
implementation("com.google.guava:guava")
implementation("com.google.code.gson:gson")
}
tasks.named<ShadowJar>("shadowJar") {

View File

@ -12,47 +12,59 @@ applyPlatformAndCoreConfiguration()
dependencies {
constraints {
implementation( "org.yaml:snakeyaml") {
version { strictly("1.27") }
version { strictly("1.28") }
because("Bukkit provides SnakeYaml")
}
}
api(project(":worldedit-libs:core"))
implementation("de.schlichtherle:truezip:6.8.4")
implementation("org.mozilla:rhino-runtime:1.7.13")
implementation("org.yaml:snakeyaml")
implementation("com.google.guava:guava")
implementation("com.google.code.findbugs:jsr305:3.0.2")
implementation("com.google.code.gson:gson")
implementation("org.apache.logging.log4j:log4j-api:2.8.1") {
because("Mojang provides Log4J 2.8.1")
}
implementation("it.unimi.dsi:fastutil")
compileOnly("net.kyori:adventure-nbt:4.8.1")
testImplementation("net.kyori:adventure-nbt:4.7.0")
// Modules
api(projects.worldeditLibs.core)
compileOnly(projects.worldeditLibs.core.ap)
annotationProcessor(projects.worldeditLibs.core.ap)
// Minecraft expectations
implementation(libs.fastutil)
implementation(libs.guava)
implementation(libs.gson)
// Platform expectations
implementation("org.yaml:snakeyaml")
// Logging
implementation(libs.log4j) {
because("Mojang provides Log4J 2.14.1")
}
// Plugins
compileOnly(libs.redprotect)
api(libs.plotsquaredV4) { isTransitive = false }
api(libs.plotsquaredV6Core) { isTransitive = false }
val antlrVersion = "4.9.1"
antlr("org.antlr:antlr4:$antlrVersion")
implementation("org.antlr:antlr4-runtime:$antlrVersion")
implementation("com.googlecode.json-simple:json-simple:1.1.1") { isTransitive = false }
compileOnly(project(":worldedit-libs:core:ap"))
annotationProcessor(project(":worldedit-libs:core:ap"))
// ensure this is on the classpath for the AP
annotationProcessor("com.google.guava:guava:21.0")
compileOnly("com.google.auto.value:auto-value-annotations:${Versions.AUTO_VALUE}")
annotationProcessor("com.google.auto.value:auto-value:${Versions.AUTO_VALUE}")
testRuntimeOnly("org.apache.logging.log4j:log4j-core:2.8.1")
implementation("com.github.luben:zstd-jni:1.5.0-4")
compileOnly("net.fabiozumbi12:redprotect:1.9.6")
api("com.github.intellectualsites.plotsquared:PlotSquared-API:4.514") { isTransitive = false }
api("com.plotsquared:PlotSquared-Core:6.0.6-SNAPSHOT") { isTransitive = false }
compileOnlyApi("net.kyori:adventure-api:4.8.0")
compileOnlyApi("net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT")
api("com.intellectualsites.paster:Paster:1.0.1-SNAPSHOT")
compileOnly("net.jpountz:lz4-java-stream:1.0.0") { isTransitive = false }
compileOnly("org.lz4:lz4-java:1.8.0")
compileOnly("com.zaxxer:SparseBitSet:1.2")
compileOnly("org.anarres:parallelgzip:1.0.5")
annotationProcessor(libs.guava)
compileOnly(libs.autoValueAnnotations)
annotationProcessor(libs.autoValue)
// Third party
implementation(libs.truezip)
implementation(libs.findbugs)
implementation(libs.rhino)
compileOnly(libs.adventure)
compileOnlyApi(libs.adventureNbt)
compileOnlyApi(libs.adventureMiniMessage)
implementation(libs.zstd)
api(libs.paster)
compileOnly(libs.lz4Java) { isTransitive = false }
compileOnly(libs.lz4JavaStream)
compileOnly(libs.sparsebitset)
compileOnly(libs.parallelgzip)
antlr(libs.antlr4)
implementation(libs.antlr4Runtime)
implementation(libs.jsonSimple) { isTransitive = false }
// Tests
testRuntimeOnly(libs.log4jCore)
testImplementation(libs.adventureNbt)
}
tasks.named<Test>("test") {

View File

@ -9,5 +9,5 @@ repositories {
}
dependencies {
"shade"("net.kyori:text-adapter-bukkit:${Versions.TEXT_EXTRAS}")
"shade"(libs.adventureTextAdapter)
}

View File

@ -1,6 +1,6 @@
applyLibrariesConfiguration()
dependencies {
"shade"("org.enginehub.piston.core-ap:annotations:${Versions.PISTON}")
"shade"("org.enginehub.piston.core-ap:processor:${Versions.PISTON}")
"shade"(libs.pistonAnnotations)
"shade"(libs.pistonProcessor)
}

View File

@ -1,17 +1,17 @@
applyLibrariesConfiguration()
dependencies {
"shade"("net.kyori:text-api:3.0.4")
"shade"("net.kyori:text-serializer-gson:3.0.4")
"shade"("net.kyori:text-serializer-legacy:3.0.4")
"shade"("net.kyori:text-serializer-plain:3.0.4")
"shade"("com.sk89q:jchronic:0.2.4a") {
"shade"(libs.adventureTextApi)
"shade"(libs.adventureTextSerializerGson)
"shade"(libs.adventureTextSerializerLegacy)
"shade"(libs.adventureTextSerializerPlain)
"shade"(libs.jchronic) {
exclude(group = "junit", module = "junit")
}
"shade"("com.thoughtworks.paranamer:paranamer:2.8")
"shade"("com.sk89q.lib:jlibnoise:1.0.0")
"shade"("org.enginehub.piston:core:${Versions.PISTON}")
"shade"("org.enginehub.piston.core-ap:runtime:${Versions.PISTON}")
"shade"("org.enginehub.piston:default-impl:${Versions.PISTON}")
"shade"("net.kyori:adventure-nbt:4.8.1")
"shade"(libs.paranamer)
"shade"(libs.jlibnoise)
"shade"(libs.piston)
"shade"(libs.pistonRuntime)
"shade"(libs.pistonImpl)
"shade"(libs.adventureNbt)
}