diff --git a/src/main/kotlin/gay/pizza/foundation/concrete/ConcretePluginPlugin.kt b/src/main/kotlin/gay/pizza/foundation/concrete/ConcretePluginPlugin.kt index 22bd89f..08f9cea 100644 --- a/src/main/kotlin/gay/pizza/foundation/concrete/ConcretePluginPlugin.kt +++ b/src/main/kotlin/gay/pizza/foundation/concrete/ConcretePluginPlugin.kt @@ -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") + ?.dependsOn(project.tasks["shadowJar"]) } } diff --git a/src/main/kotlin/gay/pizza/foundation/concrete/ConcreteRootPlugin.kt b/src/main/kotlin/gay/pizza/foundation/concrete/ConcreteRootPlugin.kt index 74fe2dc..6ac640b 100644 --- a/src/main/kotlin/gay/pizza/foundation/concrete/ConcreteRootPlugin.kt +++ b/src/main/kotlin/gay/pizza/foundation/concrete/ConcreteRootPlugin.kt @@ -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 { override fun apply(project: Project) { @@ -13,6 +14,21 @@ class ConcreteRootPlugin : Plugin { val runPaperServer = project.tasks.create("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") + val runLocalMinecraftServer = project.tasks.create("runLocalMinecraftServer") + runLocalMinecraftServer.dependsOn(setupLocalMinecraftServer) + + setupLocalMinecraftServer.minecraftServerDirectory = localServerDirectory + runLocalMinecraftServer.minecraftServerDirectory = localServerDirectory + runLocalMinecraftServer.serverJarFileName = localServerJarFileName + } + val updateManifests = project.tasks.create("updateManifests") project.tasks.getByName("assemble").dependsOn(updateManifests) } diff --git a/src/main/kotlin/gay/pizza/foundation/concrete/RunLocalMinecraftServer.kt b/src/main/kotlin/gay/pizza/foundation/concrete/RunLocalMinecraftServer.kt new file mode 100644 index 0000000..82907be --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/concrete/RunLocalMinecraftServer.kt @@ -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 +} diff --git a/src/main/kotlin/gay/pizza/foundation/concrete/RunMinecraftServer.kt b/src/main/kotlin/gay/pizza/foundation/concrete/RunMinecraftServer.kt new file mode 100644 index 0000000..659f817 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/concrete/RunMinecraftServer.kt @@ -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() + + @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() + 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 +} diff --git a/src/main/kotlin/gay/pizza/foundation/concrete/RunPaperServer.kt b/src/main/kotlin/gay/pizza/foundation/concrete/RunPaperServer.kt index 7cd3ab4..45b8e4e 100644 --- a/src/main/kotlin/gay/pizza/foundation/concrete/RunPaperServer.kt +++ b/src/main/kotlin/gay/pizza/foundation/concrete/RunPaperServer.kt @@ -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() - - @get:Input - var disableServerGui = true - - @TaskAction - fun runPaperServer() { + override fun getServerDirectory(): File { val concrete = project.extensions.getByType() - - 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() - 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" } diff --git a/src/main/kotlin/gay/pizza/foundation/concrete/SetupLocalMinecraftServer.kt b/src/main/kotlin/gay/pizza/foundation/concrete/SetupLocalMinecraftServer.kt new file mode 100644 index 0000000..10fb940 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/concrete/SetupLocalMinecraftServer.kt @@ -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 +} diff --git a/src/main/kotlin/gay/pizza/foundation/concrete/SetupMinecraftServer.kt b/src/main/kotlin/gay/pizza/foundation/concrete/SetupMinecraftServer.kt new file mode 100644 index 0000000..8149390 --- /dev/null +++ b/src/main/kotlin/gay/pizza/foundation/concrete/SetupMinecraftServer.kt @@ -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() + 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 +} diff --git a/src/main/kotlin/gay/pizza/foundation/concrete/SetupPaperServer.kt b/src/main/kotlin/gay/pizza/foundation/concrete/SetupPaperServer.kt index e6fc394..60727ef 100644 --- a/src/main/kotlin/gay/pizza/foundation/concrete/SetupPaperServer.kt +++ b/src/main/kotlin/gay/pizza/foundation/concrete/SetupPaperServer.kt @@ -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() - 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() + return project.file(concrete.minecraftServerPath.get()) + } }