aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin')
-rw-r--r--src/main/kotlin/moe/nea/firmament/features/texturepack/CustomGlobalTextures.kt14
-rw-r--r--src/main/kotlin/moe/nea/firmament/util/json/SingletonSerializableList.kt36
2 files changed, 44 insertions, 6 deletions
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)
+ }
+}