diff options
author | Linnea Gräf <nea@nea.moe> | 2024-05-18 17:33:19 +0200 |
---|---|---|
committer | Linnea Gräf <nea@nea.moe> | 2024-05-18 17:33:19 +0200 |
commit | 8c66016bb3041793961375178d470546519e0e69 (patch) | |
tree | d8b65a2727619766856f7a865665303cccc444a2 | |
parent | a39f6e9bec3318b2be251570ea7aea29d58b49cb (diff) | |
download | firmament-8c66016bb3041793961375178d470546519e0e69.tar.gz firmament-8c66016bb3041793961375178d470546519e0e69.tar.bz2 firmament-8c66016bb3041793961375178d470546519e0e69.zip |
Add more screens at once
[no changelog]
3 files changed, 47 insertions, 6 deletions
diff --git a/docs/Texture Pack Format.md b/docs/Texture Pack Format.md index 914e157..ab072b3 100644 --- a/docs/Texture Pack Format.md +++ b/docs/Texture Pack Format.md @@ -268,6 +268,9 @@ avoid collisions with other texture packs that might use the same id for a gui. The `predicate` is just a normal [predicate](#predicates). This one does not support the vanilla predicates. You can still use vanilla predicates in the resolved model, but this will not allow you to fall back to other global overrides. +The `screen` specifies which screens your override will work on. This is purely for performance reasons, your filter +should work purely based on predicates if possible. You can specify multiply screens by using a json array. + ### Global item texture Screens In order to improve performance not all overrides are tested all the time. Instead you can prefilter by the screen that diff --git a/src/main/kotlin/moe/nea/firmament/features/texturepack/CustomGlobalTextures.kt b/src/main/kotlin/moe/nea/firmament/features/texturepack/CustomGlobalTextures.kt index 2eb4ee1..c2a003a 100644 --- a/src/main/kotlin/moe/nea/firmament/features/texturepack/CustomGlobalTextures.kt +++ b/src/main/kotlin/moe/nea/firmament/features/texturepack/CustomGlobalTextures.kt @@ -33,6 +33,7 @@ import moe.nea.firmament.events.subscription.SubscriptionOwner import moe.nea.firmament.features.FirmamentFeature import moe.nea.firmament.util.IdentifierSerializer import moe.nea.firmament.util.MC +import moe.nea.firmament.util.json.SingletonSerializableList import moe.nea.firmament.util.runNull object CustomGlobalTextures : SinglePreparationResourceReloader<CustomGlobalTextures.CustomGuiTextureOverride>(), @@ -46,7 +47,7 @@ object CustomGlobalTextures : SinglePreparationResourceReloader<CustomGlobalText @Serializable data class GlobalItemOverride( - val screen: Identifier, + val screen: @Serializable(SingletonSerializableList::class) List<Identifier>, val model: Identifier, val predicate: FirmamentModelPredicate, ) @@ -107,7 +108,8 @@ object CustomGlobalTextures : SinglePreparationResourceReloader<CustomGlobalText } } - val byGuiClass = overrideResources.groupBy { it.screen } + val byGuiClass = overrideResources.flatMap { override -> override.screen.toSet().map { it to override } } + .groupBy { it.first } val guiClasses = byGuiClass.entries .mapNotNull { val key = it.key @@ -123,7 +125,7 @@ object CustomGlobalTextures : SinglePreparationResourceReloader<CustomGlobalText logger.error("Failed to load screen filter at $key", ex) return@mapNotNull null } - ItemOverrideCollection(screenFilter, it.value) + ItemOverrideCollection(screenFilter, it.value.map { it.second }) } logger.info("Loaded ${overrideResources.size} global item overrides") return CustomGuiTextureOverride(guiClasses) @@ -131,14 +133,14 @@ object CustomGlobalTextures : SinglePreparationResourceReloader<CustomGlobalText var guiClassOverrides = CustomGuiTextureOverride(listOf()) - var matchingOverrides: List<ItemOverrideCollection> = listOf() + var matchingOverrides: Set<ItemOverrideCollection> = setOf() @Subscribe fun onOpenGui(event: ScreenChangeEvent) { val newTitle = event.new?.title matchingOverrides = - if (newTitle == null) listOf() - else guiClassOverrides.classes.filter { it.screenFilter.title.matches(newTitle) } + if (newTitle == null) setOf() + else guiClassOverrides.classes.filterTo(mutableSetOf()) { it.screenFilter.title.matches(newTitle) } } @JvmStatic diff --git a/src/main/kotlin/moe/nea/firmament/util/json/SingletonSerializableList.kt b/src/main/kotlin/moe/nea/firmament/util/json/SingletonSerializableList.kt new file mode 100644 index 0000000..5474b35 --- /dev/null +++ b/src/main/kotlin/moe/nea/firmament/util/json/SingletonSerializableList.kt @@ -0,0 +1,36 @@ +/* + * SPDX-FileCopyrightText: 2024 Linnea Gräf <nea@nea.moe> + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package moe.nea.firmament.util.json + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.builtins.ListSerializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.JsonDecoder +import kotlinx.serialization.json.JsonElement + +class SingletonSerializableList<T>(val child: KSerializer<T>) : KSerializer<List<T>> { + override val descriptor: SerialDescriptor + get() = JsonElement.serializer().descriptor + + override fun deserialize(decoder: Decoder): List<T> { + decoder as JsonDecoder + val list = JsonElement.serializer().deserialize(decoder) + if (list is JsonArray) { + return list.map { + decoder.json.decodeFromJsonElement(child, it) + } + } + return listOf(decoder.json.decodeFromJsonElement(child, list)) + } + + override fun serialize(encoder: Encoder, value: List<T>) { + ListSerializer(child).serialize(encoder, value) + } +} |