From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Kyle Wood <kyle@denwav.dev>
Date: Thu, 10 Dec 2020 20:54:19 -0800
Subject: [PATCH] Setup Gradle project


diff --git a/.gitignore b/.gitignore
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +0,0 @@
+.gradle/
+build/
+
 # Eclipse stuff
 /.classpath
 /.project
diff --git a/build.gradle.kts b/build.gradle.kts
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
--- /dev/null
+++ b/build.gradle.kts
@@ -0,0 +0,0 @@
+import com.github.jengelman.gradle.plugins.shadow.transformers.Log4j2PluginsCacheFileTransformer
+import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer
+import io.papermc.paperweight.util.Git
+import io.papermc.paperweight.util.path
+import org.gradle.api.file.FileTreeElement
+import shadow.org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor.PLUGIN_CACHE_FILE
+import java.util.Date
+import java.text.SimpleDateFormat
+
+plugins {
+    java
+    `maven-publish`
+    id("com.github.johnrengelman.shadow")
+}
+
+val packageVersion = providers.gradleProperty("packageVersion").forUseAtConfigurationTime().get()
+
+repositories {
+    maven("https://libraries.minecraft.net/")
+}
+
+dependencies {
+    implementation(project(":Paper-API"))
+    implementation("jline:jline:2.12.1")
+    implementation("org.apache.logging.log4j:log4j-iostreams:2.14.1") {
+        exclude(group = "org.apache.logging.log4j", module = "log4j-api")
+    }
+    implementation("org.ow2.asm:asm:9.1")
+    implementation("com.googlecode.json-simple:json-simple:1.1.1") {
+        // This includes junit transitively for whatever reason
+        isTransitive = false
+    }
+    runtimeOnly("org.xerial:sqlite-jdbc:3.34.0")
+    runtimeOnly("mysql:mysql-connector-java:5.1.49")
+
+    runtimeOnly("org.apache.maven:maven-resolver-provider:3.8.1")
+    runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.0")
+    runtimeOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.7.0")
+
+    testImplementation("junit:junit:4.13.1")
+    testImplementation("org.hamcrest:hamcrest-library:1.3")
+}
+
+tasks.jar {
+    manifest {
+        val git = Git(rootProject.layout.projectDirectory.path)
+        val gitHashCmd = git("rev-parse", "HEAD")
+        val gitHash = gitHashCmd.getText().substring(0, 7)
+        attributes(mapOf(
+            "Main-Class" to "org.bukkit.craftbukkit.Main",
+            "Implementation-Title" to "CraftBukkit",
+            "Implementation-Version" to "git-Paper-\"$gitHash\"",
+            "Implementation-Vendor" to SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(Date()), // Paper
+            "Specification-Title" to "Bukkit",
+            "Specification-Version" to project.version,
+            "Specification-Vendor" to "Bukkit Team"
+        ))
+        for (tld in listOf("net", "com", "org")) {
+            attributes(mapOf(
+                "Sealed" to "true"
+            ), "$tld/bukkit")
+        }
+    }
+}
+
+configure<PublishingExtension> {
+    publications.create<MavenPublication>("maven") {
+        // todo: confirm this is correct
+        from(components["java"])
+        artifact(tasks.reobfJar) {
+            classifier = "reobf"
+        }
+    }
+}
+
+tasks.shadowJar {
+    listOf(
+        "jline", "it.unimi", "org.apache.commons.codec", "org.apache.commons.io",
+        "org.apache.commons.lang3", "org.objectweb.asm"
+    ).forEach { pack ->
+        relocate(pack, "org.bukkit.craftbukkit.libs.$pack")
+    }
+    relocate("org.bukkit.craftbukkit", "org.bukkit.craftbukkit.v$packageVersion") {
+        exclude("org.bukkit.craftbukkit.Main*")
+    }
+    mergeServiceFiles()
+    transform(ModifiedLog4j2PluginsCacheFileTransformer::class.java)
+}
+
+tasks.test {
+    exclude("org/bukkit/craftbukkit/inventory/ItemStack*Test.class")
+}
+
+fun TaskContainer.registerRunTask(name: String, block: JavaExec.() -> Unit): TaskProvider<JavaExec> =
+    register<JavaExec>(name) {
+        group = "Paper"
+        workingDir = rootProject.layout.projectDirectory.dir(
+            providers.gradleProperty("runWorkDir").forUseAtConfigurationTime().orElse("run")
+        ).get().asFile
+        doFirst {
+            workingDir.mkdirs()
+        }
+        standardInput = System.`in`
+        args("--nogui")
+        systemProperty("net.kyori.adventure.text.warnWhenLegacyFormattingDetected", true)
+        block(this)
+    }
+
+tasks.registerRunTask("runShadow") {
+    description = "Spin up a test server from the shadowJar archiveFile"
+    classpath(tasks.shadowJar.flatMap { it.archiveFile })
+}
+
+tasks.registerRunTask("runReobf") {
+    description = "Spin up a test server from the reobfJar output jar"
+    classpath(tasks.reobfJar.flatMap { it.outputJar })
+}
+
+tasks.registerRunTask("runDev") {
+    description = "Spin up a non-shaded non-remapped test server"
+    classpath = project.convention.getPlugin(JavaPluginConvention::class.java)
+        .sourceSets.getByName("main").runtimeClasspath
+    main = "org.bukkit.craftbukkit.Main"
+    systemProperty("disable.watchdog", true)
+}
+
+class ModifiedLog4j2PluginsCacheFileTransformer : Transformer by Log4j2PluginsCacheFileTransformer() {
+    override fun canTransformResource(element: FileTreeElement): Boolean {
+        return PLUGIN_CACHE_FILE == element.name || element.name == "Log4j2Plugins.dat"
+    }
+}
