From 16fd188e63251611ac07c70387e77da456b85969 Mon Sep 17 00:00:00 2001 From: Boy Date: Sun, 4 Aug 2024 21:55:49 +0200 Subject: [PATCH] feat: ModelTexturesSerializer & other RP stuff --- idofront-serializers/build.gradle.kts | 1 + .../serialization/ModelTexturesSerializer.kt | 39 +++++++++++++++++++ idofront-util/build.gradle.kts | 1 + .../idofront/resourcepacks/ResourcePacks.kt | 9 +++++ 4 files changed, 50 insertions(+) create mode 100644 idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/ModelTexturesSerializer.kt create mode 100644 idofront-util/src/main/kotlin/com/mineinabyss/idofront/resourcepacks/ResourcePacks.kt diff --git a/idofront-serializers/build.gradle.kts b/idofront-serializers/build.gradle.kts index 137d606c..d4bb8185 100644 --- a/idofront-serializers/build.gradle.kts +++ b/idofront-serializers/build.gradle.kts @@ -14,6 +14,7 @@ dependencies { compileOnly(libs.minecraft.plugin.mythic.crucible) compileOnly(libs.minecraft.plugin.oraxen) compileOnly(libs.minecraft.plugin.itemsadder) + compileOnly(libs.creative.api) implementation(project(":idofront-util")) implementation(project(":idofront-logging")) implementation(project(":idofront-text-components")) diff --git a/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/ModelTexturesSerializer.kt b/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/ModelTexturesSerializer.kt new file mode 100644 index 00000000..66494ec9 --- /dev/null +++ b/idofront-serializers/src/main/kotlin/com/mineinabyss/idofront/serialization/ModelTexturesSerializer.kt @@ -0,0 +1,39 @@ +package com.mineinabyss.idofront.serialization + +import com.charleskorn.kaml.* +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import net.kyori.adventure.key.Key +import team.unnamed.creative.model.ModelTexture +import team.unnamed.creative.model.ModelTextures + +@Serializable +@SerialName("ModelTextures") +class ModelTexturesSurrogate( + val layers: List<@Serializable(KeySerializer::class) Key> = emptyList(), + val particle: @Serializable(KeySerializer::class) Key? = null, + val variables: Map = emptyMap(), +) { + @Transient val modelTextures = ModelTextures.of(layers.map(ModelTexture::ofKey), particle?.let(ModelTexture::ofKey), variables.mapValues { ModelTexture.ofKey(it.value) }.toMap()) +} + +object ModelTexturesSerializer : KSerializer { + override val descriptor: SerialDescriptor = ContextualSerializer(ModelTexturesSurrogate::class).descriptor + + override fun deserialize(decoder: Decoder): ModelTexturesSurrogate { + val node = (decoder as? YamlInput)?.node?.yamlMap?.get("textures") ?: return ModelTexturesSurrogate.serializer().deserialize(decoder) + + return when (node) { + is YamlScalar -> ModelTexturesSurrogate(mutableListOf(Key.key(node.content))) + is YamlList -> ModelTexturesSurrogate(node.items.mapNotNull { (it as? YamlScalar)?.content?.let(Key::key) }.toMutableList()) + is YamlMap -> ModelTexturesSurrogate(variables = node.entries.mapNotNull { it.key.content to ((it.value as? YamlScalar)?.content?.let(Key::key) ?: return@mapNotNull null) }.toMap()) + else -> ModelTexturesSurrogate() + } + } + + override fun serialize(encoder: Encoder, value: ModelTexturesSurrogate) { + ModelTexturesSurrogate.serializer().serialize(encoder, value) + } +} \ No newline at end of file diff --git a/idofront-util/build.gradle.kts b/idofront-util/build.gradle.kts index 4a533a25..80c47090 100644 --- a/idofront-util/build.gradle.kts +++ b/idofront-util/build.gradle.kts @@ -9,6 +9,7 @@ plugins { dependencies { compileOnly(libs.kotlinx.serialization.json) + compileOnly(libs.creative.serializer.minecraft) implementation(project(":idofront-logging")) implementation(project(":idofront-di")) } diff --git a/idofront-util/src/main/kotlin/com/mineinabyss/idofront/resourcepacks/ResourcePacks.kt b/idofront-util/src/main/kotlin/com/mineinabyss/idofront/resourcepacks/ResourcePacks.kt new file mode 100644 index 00000000..b2937841 --- /dev/null +++ b/idofront-util/src/main/kotlin/com/mineinabyss/idofront/resourcepacks/ResourcePacks.kt @@ -0,0 +1,9 @@ +package com.mineinabyss.idofront.resourcepacks + +import team.unnamed.creative.serialize.minecraft.MinecraftResourcePackReader +import team.unnamed.creative.serialize.minecraft.MinecraftResourcePackWriter + +object ResourcePacks { + val resourcePackWriter = MinecraftResourcePackWriter.builder().prettyPrinting(true).build() + val resourcePackReader = MinecraftResourcePackReader.builder().lenient(true).build() +} \ No newline at end of file