Add support for running a second custom directory as a Minecraft server.

This commit is contained in:
2023-01-27 21:59:31 -08:00
parent 18916bbd22
commit ace5b0ab3e
8 changed files with 155 additions and 62 deletions

View File

@ -27,5 +27,7 @@ class ConcretePluginPlugin : ConcreteBaseBukkitPlugin() {
project.tasks.addTaskDependency("assemble", "shadowJar")
project.concreteRootProject.tasks["setupPaperServer"].dependsOn(project.tasks["shadowJar"])
project.concreteRootProject.tasks.find<SetupLocalMinecraftServer>("setupLocalMinecraftServer")
?.dependsOn(project.tasks["shadowJar"])
}
}

View File

@ -4,6 +4,7 @@ import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.create
import java.nio.file.Paths
class ConcreteRootPlugin : Plugin<Project> {
override fun apply(project: Project) {
@ -13,6 +14,21 @@ class ConcreteRootPlugin : Plugin<Project> {
val runPaperServer = project.tasks.create<RunPaperServer>("runPaperServer")
runPaperServer.dependsOn(setupPaperServer)
val maybeLocalServerPathString = project.properties["localMinecraftServerPath"]?.toString()
if (maybeLocalServerPathString != null) {
val localServerJarFileName = project.properties["localMinecraftServerJarFileName"]?.toString() ?: "server.jar"
val currentWorkingDirectory = System.getProperty("user.dir")
val localServerDirectory = Paths.get(currentWorkingDirectory).resolve(maybeLocalServerPathString).toFile()
val setupLocalMinecraftServer = project.tasks.create<SetupLocalMinecraftServer>("setupLocalMinecraftServer")
val runLocalMinecraftServer = project.tasks.create<RunLocalMinecraftServer>("runLocalMinecraftServer")
runLocalMinecraftServer.dependsOn(setupLocalMinecraftServer)
setupLocalMinecraftServer.minecraftServerDirectory = localServerDirectory
runLocalMinecraftServer.minecraftServerDirectory = localServerDirectory
runLocalMinecraftServer.serverJarFileName = localServerJarFileName
}
val updateManifests = project.tasks.create<UpdateManifestTask>("updateManifests")
project.tasks.getByName("assemble").dependsOn(updateManifests)
}

View File

@ -0,0 +1,18 @@
package gay.pizza.foundation.concrete
import org.gradle.api.tasks.Internal
import java.io.File
open class RunLocalMinecraftServer : RunMinecraftServer() {
@Internal
lateinit var minecraftServerDirectory: File
@Internal
lateinit var serverJarFileName: String
@Internal
override fun getServerDirectory(): File = minecraftServerDirectory
@Internal
override fun getServerJarName(): String = serverJarFileName
}

View File

@ -0,0 +1,47 @@
package gay.pizza.foundation.concrete
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import java.io.File
import java.util.jar.JarFile
abstract class RunMinecraftServer : DefaultTask() {
init {
outputs.upToDateWhen { false }
}
@get:Input
var additionalServerArguments = mutableListOf<String>()
@get:Input
var disableServerGui = true
@TaskAction
fun runMinecraftServer() {
val minecraftServerDirectory = getServerDirectory()
val serverJarFile = minecraftServerDirectory.resolve(getServerJarName())
val mainClassName = readMainClass(serverJarFile)
project.javaexec {
classpath(serverJarFile.absolutePath)
workingDir(minecraftServerDirectory)
val allServerArguments = mutableListOf<String>()
allServerArguments.addAll(additionalServerArguments)
if (disableServerGui) {
allServerArguments.add("nogui")
}
args(allServerArguments)
mainClass.set(mainClassName)
}
}
private fun readMainClass(file: File): String = JarFile(file).use { jar ->
jar.manifest.mainAttributes.getValue("Main-Class")!!
}
abstract fun getServerDirectory(): File
abstract fun getServerJarName(): String
}

View File

@ -7,41 +7,15 @@ import org.gradle.kotlin.dsl.getByType
import java.io.File
import java.util.jar.JarFile
open class RunPaperServer : DefaultTask() {
open class RunPaperServer : RunMinecraftServer() {
init {
outputs.upToDateWhen { false }
}
@get:Input
var additionalServerArguments = mutableListOf<String>()
@get:Input
var disableServerGui = true
@TaskAction
fun runPaperServer() {
override fun getServerDirectory(): File {
val concrete = project.extensions.getByType<ConcreteExtension>()
val minecraftServerDirectory = project.file(concrete.minecraftServerPath.get())
val paperJarFile = minecraftServerDirectory.resolve("paper.jar")
val mainClassName = readMainClass(paperJarFile)
project.javaexec {
classpath(paperJarFile.absolutePath)
workingDir(minecraftServerDirectory)
val allServerArguments = mutableListOf<String>()
allServerArguments.addAll(additionalServerArguments)
if (disableServerGui) {
allServerArguments.add("nogui")
}
args(allServerArguments)
mainClass.set(mainClassName)
}
return project.file(concrete.minecraftServerPath.get())
}
private fun readMainClass(file: File): String = JarFile(file).use { jar ->
jar.manifest.mainAttributes.getValue("Main-Class")!!
}
override fun getServerJarName(): String = "paper.jar"
}

View File

@ -0,0 +1,12 @@
package gay.pizza.foundation.concrete
import org.gradle.api.tasks.Internal
import java.io.File
open class SetupLocalMinecraftServer : SetupMinecraftServer() {
@Internal
lateinit var minecraftServerDirectory: File
@Internal
override fun getServerDirectory(): File = minecraftServerDirectory
}

View File

@ -0,0 +1,47 @@
package gay.pizza.foundation.concrete
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.getByType
import java.io.File
import java.nio.file.Files
import java.util.*
abstract class SetupMinecraftServer : DefaultTask() {
init {
outputs.upToDateWhen { false }
}
@TaskAction
fun setupMinecraftAction() {
val minecraftServerDirectory = getServerDirectory()
if (!minecraftServerDirectory.exists()) {
minecraftServerDirectory.mkdirs()
}
val serverPluginsDirectory = minecraftServerDirectory.resolve("plugins")
if (!serverPluginsDirectory.exists()) {
serverPluginsDirectory.mkdirs()
}
for (project in project.findPluginProjects()) {
val task = project.shadowJarTask!!
val pluginJarFile = task.outputs.files.first()
val pluginLinkFile = serverPluginsDirectory.resolve("${project.name}.jar")
pluginLinkFile.delete()
Files.createSymbolicLink(pluginLinkFile.toPath(), pluginJarFile.toPath())
}
val concrete = project.extensions.getByType<ConcreteExtension>()
if (concrete.acceptServerEula.isPresent && concrete.acceptServerEula.get()) {
val writer = minecraftServerDirectory.resolve("eula.txt").bufferedWriter()
val properties = Properties()
properties.setProperty("eula", "true")
properties.store(writer, "Written by Concrete")
writer.close()
}
}
abstract fun getServerDirectory(): File
}

View File

@ -1,6 +1,5 @@
package gay.pizza.foundation.concrete
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.options.Option
@ -9,7 +8,7 @@ import java.io.File
import java.nio.file.Files
import java.util.Properties
open class SetupPaperServer : DefaultTask() {
open class SetupPaperServer : SetupMinecraftServer() {
init {
outputs.upToDateWhen { false }
}
@ -21,40 +20,13 @@ open class SetupPaperServer : DefaultTask() {
private val paperVersionClient = PaperVersionClient()
@TaskAction
fun downloadPaperTask() {
fun setupPaperServer() {
val concrete = project.extensions.getByType<ConcreteExtension>()
val minecraftServerDirectory = project.file(concrete.minecraftServerPath.get())
if (!minecraftServerDirectory.exists()) {
minecraftServerDirectory.mkdirs()
}
val paperJarFile = project.file("${concrete.minecraftServerPath.get()}/paper.jar")
val minecraftServerDirectory = getServerDirectory()
val paperJarFile = project.file("${minecraftServerDirectory}/paper.jar")
if (!paperJarFile.exists() || shouldUpdatePaperServer) {
downloadLatestBuild(concrete.paperServerVersionGroup.get(), paperJarFile)
}
val paperPluginsDirectory = minecraftServerDirectory.resolve("plugins")
if (!paperPluginsDirectory.exists()) {
paperPluginsDirectory.mkdirs()
}
for (project in project.findPluginProjects()) {
val task = project.shadowJarTask!!
val pluginJarFile = task.outputs.files.first()
val pluginLinkFile = paperPluginsDirectory.resolve("${project.name}.jar")
pluginLinkFile.delete()
Files.createSymbolicLink(pluginLinkFile.toPath(), pluginJarFile.toPath())
}
if (concrete.acceptServerEula.isPresent && concrete.acceptServerEula.get()) {
val writer = minecraftServerDirectory.resolve("eula.txt").bufferedWriter()
val properties = Properties()
properties.setProperty("eula", "true")
properties.store(writer, "Written by Concrete")
writer.close()
}
}
private fun downloadLatestBuild(paperVersionGroup: String, paperJarFile: File) {
@ -77,4 +49,9 @@ open class SetupPaperServer : DefaultTask() {
logger.lifecycle("Paper Server ${build.version} build ${build.build} is up-to-date")
}
}
override fun getServerDirectory(): File {
val concrete = project.extensions.getByType<ConcreteExtension>()
return project.file(concrete.minecraftServerPath.get())
}
}