Add custom inventory text color texture pack support

This commit is contained in:
Linnea Gräf
2024-10-18 16:35:18 +02:00
parent c89b663aca
commit c71fca6cc6
5 changed files with 289 additions and 149 deletions

View File

@@ -35,6 +35,7 @@ object CustomSkyBlockTextures : FirmamentFeature {
val enableArmorOverrides by toggle("armor-overrides") { true }
val enableBlockOverrides by toggle("block-overrides") { true }
val enableLegacyCIT by toggle("legacy-cit") { true }
val allowRecoloringUiText by toggle("recolor-text") { true }
}
override val config: ManagedConfig

View File

@@ -0,0 +1,66 @@
package moe.nea.firmament.features.texturepack
import java.util.Optional
import kotlinx.serialization.Serializable
import kotlin.jvm.optionals.getOrNull
import net.minecraft.resource.ResourceManager
import net.minecraft.resource.SinglePreparationResourceReloader
import net.minecraft.text.Text
import net.minecraft.util.Identifier
import net.minecraft.util.profiler.Profiler
import moe.nea.firmament.Firmament
import moe.nea.firmament.annotations.Subscribe
import moe.nea.firmament.events.FinalizeResourceManagerEvent
import moe.nea.firmament.util.collections.WeakCache
object CustomTextColors : SinglePreparationResourceReloader<CustomTextColors.TextOverrides?>() {
@Serializable
data class TextOverrides(
val defaultColor: Int,
val overrides: List<TextOverride> = listOf()
)
@Serializable
data class TextOverride(
val predicate: StringMatcher,
val override: Int,
)
@Subscribe
fun registerTextColorReloader(event: FinalizeResourceManagerEvent) {
event.resourceManager.registerReloader(this)
}
val cache = WeakCache.memoize<Text, Optional<Int>>("CustomTextColor") { text ->
val override = textOverrides ?: return@memoize Optional.empty()
Optional.of(override.overrides.find { it.predicate.matches(text) }?.override ?: override.defaultColor)
}
fun mapTextColor(text: Text, oldColor: Int): Int {
if (textOverrides == null) return oldColor
return cache(text).getOrNull() ?: oldColor
}
override fun prepare(
manager: ResourceManager,
profiler: Profiler
): TextOverrides? {
val resource = manager.getResource(Identifier.of("firmskyblock", "overrides/text_colors.json")).getOrNull()
?: return null
return Firmament.tryDecodeJsonFromStream<TextOverrides>(resource.inputStream)
.getOrElse {
Firmament.logger.error("Could not parse text_colors.json", it)
null
}
}
var textOverrides: TextOverrides? = null
override fun apply(
prepared: TextOverrides?,
manager: ResourceManager,
profiler: Profiler
) {
textOverrides = prepared
}
}