restructure build process
All checks were successful
Publish to snapshot maven / build (push) Successful in 21s

- separate constants
- prevent minecraft and its dependencies from appearing in poms
- rename nested jars to frogmods
- clean up a bit
This commit is contained in:
moehreag 2024-06-11 16:28:11 +02:00
parent e731f57a43
commit 3f25831332
12 changed files with 185 additions and 98 deletions

View file

@ -0,0 +1,15 @@
package dev.frogmc.phytotelma
object Constants {
const val MOD_EXTENSION = ".frogmod"
const val MOD_METADATA_FILE = "frog.mod.toml"
const val MINECRAFT_CONFIGURATION = "minecraftDependency"
const val INCLUDE_CONFIGURATION = "include"
const val TASK_GROUP = "frogmc"
const val BUILD_TASK = "buildFrogmod"
const val UPDATE_AW_TASK = "updateAccesswidener"
const val DOWNLOAD_ASSETS_TASK = "downloadAssets"
const val GEN_RUN_CONFIGS_TASK = "genRunConfigs"
const val RUN_CLIENT_TASK = "runClient"
const val RUNT_SERVER_TASK = "runServer"
}

View file

@ -1,15 +1,10 @@
package dev.frogmc.phytotelma package dev.frogmc.phytotelma
import com.electronwill.nightconfig.core.CommentedConfig
import com.electronwill.nightconfig.core.file.FileNotFoundAction
import com.electronwill.nightconfig.core.io.WritingMode
import com.electronwill.nightconfig.toml.TomlParser
import com.electronwill.nightconfig.toml.TomlWriter
import dev.frogmc.phytotelma.accesswidener.AccessWidener import dev.frogmc.phytotelma.accesswidener.AccessWidener
import dev.frogmc.phytotelma.build.PhytotelmaBuildTask
import dev.frogmc.phytotelma.common.Env import dev.frogmc.phytotelma.common.Env
import dev.frogmc.phytotelma.ext.PhytotelmaGradleExtension import dev.frogmc.phytotelma.ext.PhytotelmaGradleExtension
import dev.frogmc.phytotelma.ext.PhytotelmaGradleExtensionImpl import dev.frogmc.phytotelma.ext.PhytotelmaGradleExtensionImpl
import dev.frogmc.phytotelma.nest.Nester
import dev.frogmc.phytotelma.run.AssetDownloader import dev.frogmc.phytotelma.run.AssetDownloader
import dev.frogmc.phytotelma.run.RunConfigGenerator import dev.frogmc.phytotelma.run.RunConfigGenerator
import dev.frogmc.phytotelma.run.task.RunGameTask import dev.frogmc.phytotelma.run.task.RunGameTask
@ -18,26 +13,23 @@ import dev.frogmc.thyroxine.provider.ParchmentProvider
import net.fabricmc.fernflower.api.IFabricJavadocProvider import net.fabricmc.fernflower.api.IFabricJavadocProvider
import org.gradle.api.Plugin import org.gradle.api.Plugin
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.plugins.JavaPlugin
import org.jetbrains.java.decompiler.main.Fernflower import org.jetbrains.java.decompiler.main.Fernflower
import org.jetbrains.java.decompiler.main.decompiler.PrintStreamLogger import org.jetbrains.java.decompiler.main.decompiler.PrintStreamLogger
import org.jetbrains.java.decompiler.main.decompiler.SingleFileSaver import org.jetbrains.java.decompiler.main.decompiler.SingleFileSaver
import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences
import java.io.PrintStream import java.io.PrintStream
import java.net.URI import java.net.URI
import java.nio.charset.StandardCharsets
import java.nio.file.FileSystems
import java.nio.file.Files
import java.nio.file.Path import java.nio.file.Path
import java.nio.file.StandardCopyOption import kotlin.io.path.createDirectories
import kotlin.io.path.* import kotlin.io.path.deleteExisting
import kotlin.io.path.exists
class PhytotelmaPlugin : Plugin<Project> { class PhytotelmaPlugin : Plugin<Project> {
private val taskGroup = "frogmc"
override fun apply(project: Project) { override fun apply(project: Project) {
println("> Applying FrogMC Gradle Plugin") println("> Applying FrogMC Gradle Plugin to ${project.name}")
globalCacheDir = project.gradle.gradleUserHomeDir.resolve("caches/phytotelma/").toPath() globalCacheDir = project.gradle.gradleUserHomeDir.resolve("caches/phytotelma/").toPath()
globalCacheDir.createDirectories() globalCacheDir.createDirectories()
localCacheDir = project.projectDir.resolve(".gradle/phytotelma/cache/").toPath() localCacheDir = project.projectDir.resolve(".gradle/phytotelma/cache/").toPath()
@ -78,7 +70,7 @@ class PhytotelmaPlugin : Plugin<Project> {
project.extensions.findByType(PhytotelmaGradleExtension::class.java) ?: return project.extensions.findByType(PhytotelmaGradleExtension::class.java) ?: return
project.task("genSources").apply { project.task("genSources").apply {
group = taskGroup group = Constants.TASK_GROUP
doFirst { doFirst {
val fileName = remappedGameJarPath.fileName.toString() val fileName = remappedGameJarPath.fileName.toString()
val output = val output =
@ -125,71 +117,42 @@ class PhytotelmaPlugin : Plugin<Project> {
} }
project.task("genRunConfigs").apply { project.task(Constants.GEN_RUN_CONFIGS_TASK).apply {
group = taskGroup group = Constants.TASK_GROUP
doFirst { doFirst {
RunConfigGenerator.generate(project) RunConfigGenerator.generate(project)
} }
} }
project.tasks.register("runClient", RunGameTask::class.java, Env.CLIENT) project.tasks.register(Constants.RUN_CLIENT_TASK, RunGameTask::class.java, Env.CLIENT)
project.tasks.register("runServer", RunGameTask::class.java, Env.SERVER) project.tasks.register(Constants.RUNT_SERVER_TASK, RunGameTask::class.java, Env.SERVER)
project.task("downloadAssets").apply { project.task(Constants.DOWNLOAD_ASSETS_TASK).apply {
group = taskGroup group = Constants.TASK_GROUP
doFirst { doFirst {
AssetDownloader.download() AssetDownloader.download()
} }
} }
val includeConfiguration = project.configurations.register("include") { project.configurations.register(Constants.INCLUDE_CONFIGURATION) {
it.isCanBeResolved = true it.isCanBeResolved = true
it.isCanBeConsumed = false it.isCanBeConsumed = false
} }
project.tasks.getByName("jar") { task -> project.configurations.register(Constants.MINECRAFT_CONFIGURATION) {
task.outputs.upToDateWhen { false } project.configurations.getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME).extendsFrom(it)
task.actions.addLast { _ -> project.configurations.getByName(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME).extendsFrom(it)
task.outputs.files.forEach { file -> it.isCanBeResolved = false
val output = file.toPath().parent.resolveSibling("frogmc") it.isCanBeConsumed = false
output.createDirectories() it.isTransitive = false
if (file.name.endsWith(".jar") && !(file.name.contains("-dev.") || file.name.contains("-sources."))) {
val outFile = output.resolve(file.name.substring(0, file.name.length - 4) + ".frogmod")
Files.copy(file.toPath(), outFile, StandardCopyOption.REPLACE_EXISTING)
FileSystems.newFileSystem(outFile).use { fs ->
if (includeConfiguration.isPresent) {
val jijPath = fs.getPath("META-INF/jars")
val files = Nester.run(includeConfiguration.get(), jijPath).map { it.toml() }.toList()
if (files.isNotEmpty()) {
val manifest = fs.getPath("frog.mod.toml")
val config: CommentedConfig =
TomlParser().parse(manifest, FileNotFoundAction.THROW_ERROR)
if (!config.add("frog.extensions.included_jars", listOf(files))) {
println("Failed to add included jars to mod manifest, make sure it doesn't include a key at 'frog.extensions.included_jars'!")
}
TomlWriter().write(config, manifest, WritingMode.REPLACE)
}
}
val manifest = fs.getPath("META-INF/MANIFEST.MF")
val lines = manifest.readLines().filter { it.isNotBlank() }
.plus(
"""
Built-By: Phytotelma ${this.javaClass.`package`.implementationVersion}
Target-Namespace: Mojmap
Built-For: Minecraft $minecraftVersion
""".trimIndent()
)
manifest.writeLines(lines, StandardCharsets.UTF_8)
}
println("Built mod to ${outFile.toUri()}")
}
}
}
} }
project.tasks.register("updateAccesswidener") { val buildTask = project.tasks.register(Constants.BUILD_TASK, PhytotelmaBuildTask::class.java)
it.group = taskGroup project.tasks.getByName("build").dependsOn(buildTask)
project.tasks.register(Constants.UPDATE_AW_TASK) {
it.group = Constants.TASK_GROUP
it.actions.addFirst { it.actions.addFirst {
AccessWidener.apply(project, remappedGameJarPath) AccessWidener.apply(project, remappedGameJarPath)
} }

View file

@ -29,7 +29,7 @@ object VersionChecker {
return downloadFile return downloadFile
} }
fun savePomFile(version: String, dir: Path){ fun savePomFile(version: String, dir: Path) {
val content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + val content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n" + "<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n" +
"\t\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" + "\t\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +
@ -41,7 +41,7 @@ object VersionChecker {
dir.resolve("client-$version.pom").writeText(content) dir.resolve("client-$version.pom").writeText(content)
} }
fun getDependencies(version: String, action: (String) -> Unit) { fun getDependencies(version: String, action: (String) -> Unit) {
fetchVersionData(version).libraries.map { it.name }.forEach { fetchVersionData(version).libraries.map { it.name }.forEach {
action.invoke(it) action.invoke(it)
} }
@ -72,7 +72,7 @@ object VersionChecker {
fun downloadAssetIndex(version: String, path: Path): String { fun downloadAssetIndex(version: String, path: Path): String {
val index = fetchVersionData(version).assetIndex val index = fetchVersionData(version).assetIndex
val dest = path.resolve(index.id+".json") val dest = path.resolve(index.id + ".json")
if (dest.notExists()) { if (dest.notExists()) {
CachingHttpClient.getUncached(URI.create(index.url)).use { CachingHttpClient.getUncached(URI.create(index.url)).use {
Files.copy(it, dest) Files.copy(it, dest)
@ -109,11 +109,24 @@ private class MojangResponse(val latest: Latest, val versions: List<Version>)
private class Latest(val release: String, val snapshot: String) private class Latest(val release: String, val snapshot: String)
private class Version(val id: String, val type: String, val url: String, val time: String, val releaseTime: String, val sha1: String, val complianceLevel: Int) private class Version(
val id: String,
val type: String,
val url: String,
val time: String,
val releaseTime: String,
val sha1: String,
val complianceLevel: Int
)
private class VersionUrl(val id: String, val url: String) private class VersionUrl(val id: String, val url: String)
class VersionData(val downloads: VersionDownloads, val libraries: List<LibraryDownload>, val id: String, val assetIndex: AssetIndex) class VersionData(
val downloads: VersionDownloads,
val libraries: List<LibraryDownload>,
val id: String,
val assetIndex: AssetIndex
)
class LibraryDownload(val artifact: LibraryArtifact, val name: String) class LibraryDownload(val artifact: LibraryArtifact, val name: String)
class LibraryArtifact(val path: String, val sha1: String, val size: Int, val url: String) class LibraryArtifact(val path: String, val sha1: String, val size: Int, val url: String)

View file

@ -3,7 +3,9 @@ package dev.frogmc.phytotelma.accesswidener
import com.electronwill.nightconfig.core.file.FileNotFoundAction import com.electronwill.nightconfig.core.file.FileNotFoundAction
import com.electronwill.nightconfig.toml.TomlParser import com.electronwill.nightconfig.toml.TomlParser
import com.google.common.hash.Hashing import com.google.common.hash.Hashing
import dev.frogmc.phytotelma.Constants
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.plugins.JavaPluginExtension import org.gradle.api.plugins.JavaPluginExtension
import org.objectweb.asm.* import org.objectweb.asm.*
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets
@ -27,7 +29,7 @@ object AccessWidener {
private fun getAWFile(project: Project): Path? { private fun getAWFile(project: Project): Path? {
project.extensions.getByType(JavaPluginExtension::class.java).sourceSets.forEach { set -> project.extensions.getByType(JavaPluginExtension::class.java).sourceSets.forEach { set ->
set.resources.filter { it.name == "frog.mod.toml" }.firstOrNull { set.resources.filter { it.name == Constants.MOD_METADATA_FILE }.firstOrNull {
if (it == null) { if (it == null) {
println("Please make sure a 'frog.mod.toml' file is present in the mod's resources!") println("Please make sure a 'frog.mod.toml' file is present in the mod's resources!")
return null return null
@ -43,9 +45,10 @@ object AccessWidener {
} }
private fun findDependencyAWs(project: Project): List<Path> { private fun findDependencyAWs(project: Project): List<Path> {
return project.configurations.getByName("runtimeClasspath").resolvedConfiguration.firstLevelModuleDependencies.flatMap { dep -> return project.configurations.getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME)
dep.moduleArtifacts .resolvedConfiguration.firstLevelModuleDependencies.flatMap { dep ->
}.map { it.file }.map { it.toPath() }.toList() dep.moduleArtifacts
}.map { it.file }.map { it.toPath() }.toList()
} }
fun needsUpdate(project: Project): Boolean { fun needsUpdate(project: Project): Boolean {
@ -63,9 +66,9 @@ object AccessWidener {
val awFile = getAWFile(project) val awFile = getAWFile(project)
println("Found accesswidener in project: $awFile") println("Found accesswidener in project: $awFile")
return awFile?.bufferedReader(StandardCharsets.UTF_8) return awFile?.bufferedReader(StandardCharsets.UTF_8)
.takeIf { HEADER.test(it?.readLine()?:"") }?.lines() .takeIf { HEADER.test(it?.readLine() ?: "") }?.lines()
?.map { it.replace("transitive-", "") } ?.map { it.replace("transitive-", "") }
?: Stream.empty() ?: Stream.empty()
} }

View file

@ -0,0 +1,80 @@
package dev.frogmc.phytotelma.build
import com.electronwill.nightconfig.core.CommentedConfig
import com.electronwill.nightconfig.core.file.FileNotFoundAction
import com.electronwill.nightconfig.core.io.WritingMode
import com.electronwill.nightconfig.toml.TomlParser
import com.electronwill.nightconfig.toml.TomlWriter
import dev.frogmc.phytotelma.Constants
import dev.frogmc.phytotelma.PhytotelmaPlugin
import dev.frogmc.phytotelma.nest.Nester
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.bundling.AbstractArchiveTask
import java.nio.charset.StandardCharsets
import java.nio.file.FileSystems
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.StandardCopyOption
import java.time.LocalDateTime
import kotlin.io.path.createDirectories
import kotlin.io.path.readLines
import kotlin.io.path.writeLines
abstract class PhytotelmaBuildTask : DefaultTask() {
@OutputFile
val outputFile: Path
init {
group = Constants.TASK_GROUP
val includeConfiguration = project.configurations.findByName(Constants.INCLUDE_CONFIGURATION)
val jarTask = project.tasks.getByName("jar")
dependsOn.add(jarTask)
val output = project.layout.buildDirectory.dir("frogmc").get().asFile.toPath()
output.createDirectories()
val abstractArchiveTask = (jarTask as AbstractArchiveTask)
val filename = abstractArchiveTask.archiveFileName.get()
val outFile = output.resolve(filename.substring(0, filename.length - 4) + Constants.MOD_EXTENSION)
outputFile = outFile
outputs.upToDateWhen { false }
inputs.files(jarTask.outputs)
actions.add { task ->
task.inputs.files.forEach { file ->
if (file.name.endsWith(".jar") && !(file.name.contains("-dev.") || file.name.contains("-sources."))) {
Files.copy(file.toPath(), outFile, StandardCopyOption.REPLACE_EXISTING)
FileSystems.newFileSystem(outFile).use { fs ->
if (includeConfiguration != null) {
val jijPath = fs.getPath("META-INF/jars")
val files = Nester.run(includeConfiguration, jijPath).map { it.toml() }.toList()
if (files.isNotEmpty()) {
val manifest = fs.getPath(Constants.MOD_METADATA_FILE)
val config: CommentedConfig =
TomlParser().parse(manifest, FileNotFoundAction.THROW_ERROR)
if (!config.add("frog.extensions.included_jars", listOf(files))) {
println("Failed to add included jars to mod manifest, make sure it doesn't include a key at 'frog.extensions.included_jars'!")
}
TomlWriter().write(config, manifest, WritingMode.REPLACE)
}
}
val manifest = fs.getPath("META-INF/MANIFEST.MF")
val lines = manifest.readLines().filter { it.isNotBlank() }
.plus(
"""
Built-By: Phytotelma ${this.javaClass.`package`.implementationVersion}
Target-Namespace: Mojmap
Built-For: Minecraft ${PhytotelmaPlugin.minecraftVersion}
Build-Date: ${LocalDateTime.now()}
""".trimIndent()
)
manifest.writeLines(lines, StandardCharsets.UTF_8)
}
println("Built mod to ${outFile.toUri()}")
}
}
}
}
}

View file

@ -40,7 +40,7 @@ object CachingHttpClient {
private fun getCacheFile(uri: URI): Path { private fun getCacheFile(uri: URI): Path {
val path = PhytotelmaPlugin.globalCacheDir.resolve("httpCache") val path = PhytotelmaPlugin.globalCacheDir.resolve("httpCache")
.resolve(uri.host+uri.rawPath) // Use rawPath to ensure ASCII compat (since this will be a filesystem dir) .resolve(uri.host + uri.rawPath) // Use rawPath to ensure ASCII compat (since this will be a filesystem dir)
path.createParentDirectories() path.createParentDirectories()
return path return path
} }

View file

@ -1,5 +1,6 @@
package dev.frogmc.phytotelma.ext package dev.frogmc.phytotelma.ext
import dev.frogmc.phytotelma.Constants
import dev.frogmc.phytotelma.PhytotelmaPlugin import dev.frogmc.phytotelma.PhytotelmaPlugin
import dev.frogmc.phytotelma.VersionChecker import dev.frogmc.phytotelma.VersionChecker
import dev.frogmc.phytotelma.accesswidener.AccessWidener import dev.frogmc.phytotelma.accesswidener.AccessWidener
@ -10,9 +11,10 @@ import dev.frogmc.thyroxine.provider.MojmapProvider
import dev.frogmc.thyroxine.provider.ParchmentProvider import dev.frogmc.thyroxine.provider.ParchmentProvider
import org.gradle.api.Project import org.gradle.api.Project
import javax.inject.Inject import javax.inject.Inject
import kotlin.io.path.* import kotlin.io.path.createParentDirectories
import kotlin.io.path.notExists
abstract class PhytotelmaGradleExtensionImpl: PhytotelmaGradleExtension { abstract class PhytotelmaGradleExtensionImpl : PhytotelmaGradleExtension {
@Inject @Inject
abstract fun getProject(): Project abstract fun getProject(): Project
@ -20,13 +22,15 @@ abstract class PhytotelmaGradleExtensionImpl: PhytotelmaGradleExtension {
override fun minecraft(version: String, parchmentVersion: String?) { override fun minecraft(version: String, parchmentVersion: String?) {
if (VersionChecker.validateVersion(version)) { if (VersionChecker.validateVersion(version)) {
println("Setting up Minecraft...") println("Setting up Minecraft...")
val parchment = parchmentVersion ?: kotlin.runCatching { ParchmentProvider.findForMinecraftVersion(version) } val parchment =
.getOrDefault("") parchmentVersion ?: kotlin.runCatching { ParchmentProvider.findForMinecraftVersion(version) }
.getOrDefault("")
PhytotelmaPlugin.minecraftVersion = version PhytotelmaPlugin.minecraftVersion = version
PhytotelmaPlugin.parchmentVersion = parchment PhytotelmaPlugin.parchmentVersion = parchment
println("Valid version! $version") println("Valid version! $version")
val clientJar = VersionChecker.downloadClient(version) val clientJar = VersionChecker.downloadClient(version)
val remappedJar = PhytotelmaPlugin.localCacheDir.resolve("net/minecraft/client/$version/client-$version-remapped.jar") val remappedJar =
PhytotelmaPlugin.localCacheDir.resolve("net/minecraft/client/$version/client-$version-remapped.jar")
remappedJar.createParentDirectories() remappedJar.createParentDirectories()
PhytotelmaPlugin.remappedGameJarPath = remappedJar PhytotelmaPlugin.remappedGameJarPath = remappedJar
println("Time to setup Minecraft!") println("Time to setup Minecraft!")
@ -60,19 +64,22 @@ abstract class PhytotelmaGradleExtensionImpl: PhytotelmaGradleExtension {
} }
} }
println("Adding dependencies...") println("Adding dependencies...")
getProject().dependencies.add("implementation", "net.minecrell:terminalconsoleappender:1.2.0") getProject().dependencies.add(
Constants.MINECRAFT_CONFIGURATION,
"net.minecrell:terminalconsoleappender:1.2.0"
)
VersionChecker.getDependencies(version) { VersionChecker.getDependencies(version) {
getProject().dependencies.add("implementation", it) getProject().dependencies.add(Constants.MINECRAFT_CONFIGURATION, it)
} }
VersionChecker.savePomFile(version, remappedJar.parent) VersionChecker.savePomFile(version, remappedJar.parent)
getProject().dependencies.add("implementation", "net.minecraft:client:$version:remapped") getProject().dependencies.add(Constants.MINECRAFT_CONFIGURATION, "net.minecraft:client:$version:remapped")
println("Generating run configurations...") println("Generating run configurations...")
RunConfigGenerator.generate(getProject()) RunConfigGenerator.generate(getProject())
if (applyAW) { if (applyAW) {
getProject().afterEvaluate { getProject().afterEvaluate {
println("Applying AccessWideners..") println("Applying AccessWideners...")
AccessWidener.apply(getProject(), remappedJar) AccessWidener.apply(getProject(), remappedJar)
} }
} }

View file

@ -4,6 +4,7 @@ import com.electronwill.nightconfig.core.Config
import com.electronwill.nightconfig.core.UnmodifiableConfig import com.electronwill.nightconfig.core.UnmodifiableConfig
import com.electronwill.nightconfig.toml.TomlParser import com.electronwill.nightconfig.toml.TomlParser
import com.google.common.jimfs.Jimfs import com.google.common.jimfs.Jimfs
import dev.frogmc.phytotelma.Constants
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ProjectDependency import org.gradle.api.artifacts.ProjectDependency
import org.gradle.api.plugins.JavaPlugin import org.gradle.api.plugins.JavaPlugin
@ -21,7 +22,6 @@ object Nester {
Jimfs.newFileSystem(com.google.common.jimfs.Configuration.unix()).use { memFs -> Jimfs.newFileSystem(com.google.common.jimfs.Configuration.unix()).use { memFs ->
configuration.dependencies.filterIsInstance<ProjectDependency>().forEach { dependency -> configuration.dependencies.filterIsInstance<ProjectDependency>().forEach { dependency ->
val project = dependency.dependencyProject val project = dependency.dependencyProject
project.getTasksByName(JavaPlugin.JAR_TASK_NAME, false).map { t -> t as AbstractArchiveTask } project.getTasksByName(JavaPlugin.JAR_TASK_NAME, false).map { t -> t as AbstractArchiveTask }
.forEach { task -> .forEach { task ->
val location = task.archiveFile.map { val location = task.archiveFile.map {
@ -35,7 +35,8 @@ object Nester {
) )
}.get() }.get()
path.createDirectories() path.createDirectories()
val target = path.resolve(location.file.fileName.toString()) val target =
path.resolve(location.file.fileName.toString().replace(".jar", Constants.MOD_EXTENSION))
if (target.notExists()) { if (target.notExists()) {
Files.copy(location.file, target) Files.copy(location.file, target)
files.add( files.add(
@ -44,6 +45,7 @@ object Nester {
} }
} }
} }
//}
configuration.resolvedConfiguration.firstLevelModuleDependencies.forEach { dep -> configuration.resolvedConfiguration.firstLevelModuleDependencies.forEach { dep ->
dep.moduleArtifacts.forEach { artifact -> dep.moduleArtifacts.forEach { artifact ->
val location = addMetadata( val location = addMetadata(
@ -55,7 +57,8 @@ object Nester {
memFs memFs
) )
path.createDirectories() path.createDirectories()
val target = path.resolve(location.file.fileName.toString()) val target =
path.resolve(location.file.fileName.toString().replace(".jar", Constants.MOD_EXTENSION))
if (target.notExists()) { if (target.notExists()) {
Files.copy(location.file, target) Files.copy(location.file, target)
@ -90,8 +93,8 @@ object Nester {
) )
if (tempFile.exists()) { if (tempFile.exists()) {
FileSystems.newFileSystem(tempFile).use { FileSystems.newFileSystem(tempFile).use {
val metadata = it.getPath("frog.mod.toml") val metadata = it.getPath(Constants.MOD_METADATA_FILE)
if (metadata.exists()){ if (metadata.exists()) {
return JarMetadata(readModId(metadata), tempFile) return JarMetadata(readModId(metadata), tempFile)
} }
} }
@ -99,7 +102,8 @@ object Nester {
tempFile.createParentDirectories() tempFile.createParentDirectories()
input.copyTo(tempFile) input.copyTo(tempFile)
val modId = ("${group}_$name${if (classifier != null) "_$classifier" else ""}").replace( val modId = ("${group}_$name${if (classifier != null) "_$classifier" else ""}").replace(
"\\.".toRegex(), "_").lowercase(Locale.ROOT) "\\.".toRegex(), "_"
).lowercase(Locale.ROOT)
FileSystems.newFileSystem(tempFile).use { FileSystems.newFileSystem(tempFile).use {
it.getPath("frog.mod.toml").writeText( it.getPath("frog.mod.toml").writeText(
""" """
@ -130,7 +134,7 @@ object Nester {
data class JarMetadata(val modId: String, val file: Path) data class JarMetadata(val modId: String, val file: Path)
class NestedJar(val id: String, val path: String){ class NestedJar(val id: String, val path: String) {
fun toml(): UnmodifiableConfig { fun toml(): UnmodifiableConfig {
val config = Config.inMemory() val config = Config.inMemory()
config.add("id", id) config.add("id", id)

View file

@ -52,7 +52,7 @@ object RunConfigGenerator {
"-Dlog4j2.configurationFile=$log4jPath", "-Dlog4j2.configurationFile=$log4jPath",
"-Dlog4j2.formatMsgLookups=true" "-Dlog4j2.formatMsgLookups=true"
).apply { ).apply {
if (project.gradle.startParameter.consoleOutput != ConsoleOutput.Plain){ if (project.gradle.startParameter.consoleOutput != ConsoleOutput.Plain) {
add("-Dfrogmc.log.disableAnsi=false") add("-Dfrogmc.log.disableAnsi=false")
} }
}.toTypedArray(), if (env == Env.CLIENT) { }.toTypedArray(), if (env == Env.CLIENT) {

View file

@ -25,9 +25,10 @@ class IdeaAdapter : RunConfigAdapter {
val file = folder.resolve("$name.xml") val file = folder.resolve("$name.xml")
var module = project.name + "." + project.extensions.getByType(JavaPluginExtension::class.java).sourceSets.getByName( var module =
SourceSet.MAIN_SOURCE_SET_NAME project.name + "." + project.extensions.getByType(JavaPluginExtension::class.java).sourceSets.getByName(
).name SourceSet.MAIN_SOURCE_SET_NAME
).name
var parent: Project? = project var parent: Project? = project
while ((parent?.parent.also { parent = it }) != null) { while ((parent?.parent.also { parent = it }) != null) {

View file

@ -1,5 +1,6 @@
package dev.frogmc.phytotelma.run.task package dev.frogmc.phytotelma.run.task
import dev.frogmc.phytotelma.Constants
import dev.frogmc.phytotelma.PhytotelmaPlugin import dev.frogmc.phytotelma.PhytotelmaPlugin
import dev.frogmc.phytotelma.VersionChecker import dev.frogmc.phytotelma.VersionChecker
import dev.frogmc.phytotelma.common.Env import dev.frogmc.phytotelma.common.Env
@ -21,7 +22,7 @@ abstract class RunGameTask @Inject constructor(env: Env) : JavaExec() {
private val classpath: ConfigurableFileCollection = project.objects.fileCollection() private val classpath: ConfigurableFileCollection = project.objects.fileCollection()
init { init {
group = "frogmc" group = Constants.TASK_GROUP
val assetPath = PhytotelmaPlugin.globalCacheDir.resolve("assets").absolute() val assetPath = PhytotelmaPlugin.globalCacheDir.resolve("assets").absolute()
val assetIndexPath = assetPath.resolve("indexes") val assetIndexPath = assetPath.resolve("indexes")
if (assetIndexPath.notExists()) { if (assetIndexPath.notExists()) {
@ -61,7 +62,7 @@ abstract class RunGameTask @Inject constructor(env: Env) : JavaExec() {
writeArgFile() writeArgFile()
) )
if (project.gradle.startParameter.consoleOutput != ConsoleOutput.Plain){ if (project.gradle.startParameter.consoleOutput != ConsoleOutput.Plain) {
jvmArguments.add("-Dfrogmc.log.disableAnsi=false") jvmArguments.add("-Dfrogmc.log.disableAnsi=false")
} }

View file

@ -1,7 +1,7 @@
package dev.frogmc.phytotelma.vineflower package dev.frogmc.phytotelma.vineflower
import net.fabricmc.fernflower.api.IFabricJavadocProvider
import dev.frogmc.thyroxine.api.data.Parchment import dev.frogmc.thyroxine.api.data.Parchment
import net.fabricmc.fernflower.api.IFabricJavadocProvider
import org.jetbrains.java.decompiler.struct.StructClass import org.jetbrains.java.decompiler.struct.StructClass
import org.jetbrains.java.decompiler.struct.StructField import org.jetbrains.java.decompiler.struct.StructField
import org.jetbrains.java.decompiler.struct.StructMethod import org.jetbrains.java.decompiler.struct.StructMethod