Isolate CIT resewn compat

This commit is contained in:
Linnea Gräf
2024-09-12 13:34:11 +02:00
parent ab809e197f
commit 52623b715d
8 changed files with 103 additions and 12 deletions

View File

@@ -94,6 +94,18 @@ kotlin {
}
}
}
fun String.capitalizeN() = replaceFirstChar { it.uppercaseChar() }
fun innerJarsOf(name: String, dependency: Dependency): FileCollection {
val task = tasks.create("unpackInnerJarsFor${name.capitalizeN()}", InnerJarsUnpacker::class) {
this.inputJars.setFrom(files(configurations.detachedConfiguration(dependency)))
this.outputDir.set(layout.buildDirectory.dir("unpackedJars/$name").also {
it.get().asFile.mkdirs()
})
}
println("Constructed innerJars task: ${project.files(task).toList()}")
return project.files(task)
}
val compatSourceSets: MutableSet<SourceSet> = mutableSetOf()
fun createIsolatedSourceSet(name: String, path: String = "compat/$name"): SourceSet {
val ss = sourceSets.create(name) {
@@ -103,7 +115,7 @@ fun createIsolatedSourceSet(name: String, path: String = "compat/$name"): Source
compatSourceSets.add(ss)
loom.createRemapConfigurations(ss)
val mainSS = sourceSets.main.get()
val upperName = ss.name.replaceFirstChar { it.uppercaseChar() }
val upperName = ss.name.capitalizeN()
configurations {
(ss.implementationConfigurationName) {
extendsFrom(getByName(mainSS.compileClasspathConfigurationName))
@@ -140,6 +152,7 @@ val SourceSet.modImplementationConfigurationName
}!!.sourceConfiguration
val configuredSourceSet = createIsolatedSourceSet("configured")
val sodiumSourceSet = createIsolatedSourceSet("sodium")
val citResewnSourceSet = createIsolatedSourceSet("citresewn")
val shadowMe by configurations.creating {
exclude(group = "org.jetbrains.kotlin")
@@ -163,8 +176,6 @@ val nonModImplentation by configurations.creating {
configurations.implementation.get().extendsFrom(this)
}
loom {
}
dependencies {
// Minecraft dependencies
@@ -208,6 +219,10 @@ dependencies {
(configuredSourceSet.modImplementationConfigurationName)(libs.configured)
(sodiumSourceSet.modImplementationConfigurationName)(libs.sodium)
(citResewnSourceSet.modImplementationConfigurationName)(
innerJarsOf("citresewn", dependencies.create(libs.citresewn.get())).asFileTree)
(citResewnSourceSet.modImplementationConfigurationName)(libs.citresewn)
// Actual dependencies
modCompileOnly(libs.rei.api) {
exclude(module = "architectury")
@@ -227,7 +242,6 @@ dependencies {
// Dev environment preinstalled mods
modLocalRuntime(libs.bundles.runtime.required)
modLocalRuntime(libs.bundles.runtime.optional)
modImplementation(modLocalRuntime(project.files("citresewn-defaults-1.2.0+1.21.jar"))!!)
modLocalRuntime(libs.jarvis.fabric)
transInclude.resolvedConfiguration.resolvedArtifacts.forEach {

View File

@@ -0,0 +1,70 @@
import com.google.gson.Gson
import com.google.gson.JsonArray
import com.google.gson.JsonObject
import com.google.gson.JsonPrimitive
import java.io.File
import java.util.zip.ZipInputStream
import org.gradle.api.DefaultTask
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.OutputFiles
import org.gradle.api.tasks.TaskAction
import kotlin.io.path.createDirectories
import kotlin.io.path.outputStream
abstract class InnerJarsUnpacker : DefaultTask() {
@get:InputFiles
abstract val inputJars: ConfigurableFileCollection
@get:OutputDirectory
abstract val outputDir: DirectoryProperty
private fun getFabricModJson(inputFile: File): JsonObject {
inputFile.inputStream().use {
val zis = ZipInputStream(it)
while (true) {
val entry = zis.nextEntry ?: error("Failed to find fabric.mod.json")
if (entry.name == "fabric.mod.json") {
return Gson().fromJson(zis.reader(), JsonObject::class.java)
}
}
}
}
@TaskAction
fun unpack() {
inputJars.forEach { inputFile ->
val fabricModObject = getFabricModJson(inputFile)
val jars = fabricModObject["jars"] as? JsonArray ?: error("No jars to unpack in $inputFile")
val jarPaths = jars.map {
((it as? JsonObject)?.get("file") as? JsonPrimitive)?.asString
?: error("Invalid Jar $it in $inputFile")
}
extractJars(inputFile, jarPaths)
}
}
private fun extractJars(inputFile: File, jarPaths: List<String>) {
val outputFile = outputDir.get().asFile.toPath()
val jarPathSet = jarPaths.toMutableSet()
inputFile.inputStream().use {
val zis = ZipInputStream(it)
while (true) {
val entry = zis.nextEntry ?: break
if (jarPathSet.remove(entry.name)) {
val resolvedPath = outputFile.resolve(entry.name)
resolvedPath.parent.createDirectories()
resolvedPath.outputStream().use { os ->
zis.copyTo(os)
}
}
}
}
if (jarPathSet.isNotEmpty()) {
error("Could not extract all jars: $jarPathSet")
}
}
}

Binary file not shown.

View File

@@ -1,4 +1,4 @@
package moe.nea.firmament.util
package moe.nea.firmament.compat.citresewn
import java.lang.invoke.MethodHandles
import java.util.function.BiPredicate
@@ -7,6 +7,7 @@ import shcm.shsupercm.fabric.citresewn.defaults.cit.conditions.ConditionNBT
object ConditionNBTMixin {
class Helper<StringMatcher> {
// TODO: make lambdametafactory work by way of modifying the actual modifiers
val stringMatcherType = ConditionNBT::class.java.getDeclaredField("matchString").type

View File

@@ -1,6 +1,4 @@
package moe.nea.firmament.mixins;
// People are complaining but this really is not my place to fix things
package moe.nea.firmament.mixins.compat.citresewn;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
@@ -9,8 +7,8 @@ import com.llamalad7.mixinextras.sugar.ref.LocalRef;
import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.DynamicOps;
import moe.nea.firmament.compat.citresewn.ConditionNBTMixin;
import moe.nea.firmament.features.texturepack.CustomSkyBlockTextures;
import moe.nea.firmament.util.ConditionNBTMixin;
import net.minecraft.component.ComponentType;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.NbtComponent;
@@ -30,6 +28,8 @@ import shcm.shsupercm.fabric.citresewn.pack.format.PropertyGroup;
import shcm.shsupercm.fabric.citresewn.pack.format.PropertyKey;
import shcm.shsupercm.fabric.citresewn.pack.format.PropertyValue;
// People are complaining but this really is not my place to fix things
@Mixin(ConditionComponents.class)
@Pseudo
public class MixinConditionComponents {

View File

@@ -21,5 +21,8 @@ interface SubscriptionList {
}
.toList()
}
init {
require(allLists.isNotEmpty())
}
}
}

View File

@@ -47,7 +47,9 @@
"fabric": "*",
"fabric-language-kotlin": ">=${fabric_kotlin_version}",
"minecraft": ">=${minecraft_version}",
"roughlyenoughitems": ">=${rei_version}"
"roughlyenoughitems": ">=${rei_version}",
"cloth-config": "*",
"architectury": "*"
},
"custom": {
"configured": {
@@ -62,7 +64,8 @@
},
"mc-publish": {
"dependencies": [
"roughlyenoughitems{modrinth:rei}"
"roughlyenoughitems{modrinth:rei}",
"architectury{modrinth:architectury-api}"
]
}
}

View File

@@ -61,7 +61,7 @@ class SubscribeAnnotationProcessor(
}
subscriptionsFile.close()
val metaInf = codeGenerator.createNewFileByPath(
Dependencies(false),
dependencies,
"META-INF/services/moe.nea.firmament.events.subscription.SubscriptionList", extensionName = "")
.bufferedWriter()
metaInf.append("moe.nea.firmament.annotations.generated.")