mirror of
				https://github.com/GayPizzaSpecifications/concrete.git
				synced 2025-11-04 10:29:39 +00:00 
			
		
		
		
	Add support for running a second custom directory as a Minecraft server.
This commit is contained in:
		@ -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"])
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
}
 | 
			
		||||
@ -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
 | 
			
		||||
}
 | 
			
		||||
@ -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"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
}
 | 
			
		||||
@ -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
 | 
			
		||||
}
 | 
			
		||||
@ -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())
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user