aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2024-05-18 17:33:19 +0200
committerLinnea Gräf <nea@nea.moe>2024-05-18 17:33:19 +0200
commit8c66016bb3041793961375178d470546519e0e69 (patch)
treed8b65a2727619766856f7a865665303cccc444a2
parenta39f6e9bec3318b2be251570ea7aea29d58b49cb (diff)
downloadFirmament-8c66016bb3041793961375178d470546519e0e69.tar.gz
Firmament-8c66016bb3041793961375178d470546519e0e69.tar.bz2
Firmament-8c66016bb3041793961375178d470546519e0e69.zip
Add more screens at once
[no changelog]
-rw-r--r--docs/Texture Pack Format.md3
-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
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)
+ }
+}