diff options
Diffstat (limited to 'src/main')
4 files changed, 111 insertions, 0 deletions
diff --git a/src/main/java/moe/nea/firmament/mixins/ReplaceTextColorInHandledScreen.java b/src/main/java/moe/nea/firmament/mixins/ReplaceTextColorInHandledScreen.java new file mode 100644 index 0000000..190fda0 --- /dev/null +++ b/src/main/java/moe/nea/firmament/mixins/ReplaceTextColorInHandledScreen.java @@ -0,0 +1,43 @@ +package moe.nea.firmament.mixins; + + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import moe.nea.firmament.features.texturepack.CustomTextColors; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.ingame.AnvilScreen; +import net.minecraft.client.gui.screen.ingame.BeaconScreen; +import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.gui.screen.ingame.InventoryScreen; +import net.minecraft.client.gui.screen.ingame.MerchantScreen; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin({HandledScreen.class, InventoryScreen.class, CreativeInventoryScreen.class, MerchantScreen.class, + AnvilScreen.class, BeaconScreen.class}) +public class ReplaceTextColorInHandledScreen { + + @WrapOperation( + method = "drawForeground", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/gui/DrawContext;drawText(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/text/Text;IIIZ)I"), + expect = 0) + private int replaceTextColorWithVariableShadow(DrawContext instance, TextRenderer textRenderer, Text text, int x, int y, int color, boolean shadow, Operation<Integer> original) { + return original.call(instance, textRenderer, text, x, y, CustomTextColors.INSTANCE.mapTextColor(text, color), shadow); + } + + @WrapOperation( + method = "drawForeground", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/gui/DrawContext;drawTextWithShadow(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/text/Text;III)I"), + expect = 0) + private int replaceTextColorWithShadow(DrawContext instance, TextRenderer textRenderer, Text text, int x, int y, int color, Operation<Integer> original) { + return original.call(instance, textRenderer, text, x, y, CustomTextColors.INSTANCE.mapTextColor(text, color)); + } + +} diff --git a/src/main/kotlin/features/texturepack/CustomSkyBlockTextures.kt b/src/main/kotlin/features/texturepack/CustomSkyBlockTextures.kt index b641959..627d39a 100644 --- a/src/main/kotlin/features/texturepack/CustomSkyBlockTextures.kt +++ b/src/main/kotlin/features/texturepack/CustomSkyBlockTextures.kt @@ -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 diff --git a/src/main/kotlin/features/texturepack/CustomTextColors.kt b/src/main/kotlin/features/texturepack/CustomTextColors.kt new file mode 100644 index 0000000..4ca1796 --- /dev/null +++ b/src/main/kotlin/features/texturepack/CustomTextColors.kt @@ -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 + } +} diff --git a/src/main/resources/assets/firmament/lang/en_us.json b/src/main/resources/assets/firmament/lang/en_us.json index cd4d2d4..9a204f7 100644 --- a/src/main/resources/assets/firmament/lang/en_us.json +++ b/src/main/resources/assets/firmament/lang/en_us.json @@ -191,6 +191,7 @@ "firmament.config.custom-skyblock-textures.cache-duration": "Model Cache Duration", "firmament.config.custom-skyblock-textures.model-overrides": "Enable model overrides/predicates", "firmament.config.custom-skyblock-textures.legacy-cit": "Enable legacy CIT Resewn compat", + "firmament.config.custom-skyblock-textures.recolor-text": "Allow packs to recolor text", "firmament.config.custom-skyblock-textures.armor-overrides": "Enable Armor re-texturing", "firmament.config.custom-skyblock-textures.block-overrides": "Enable Block re-modelling", "firmament.config.custom-skyblock-textures.enabled": "Enable Custom Item Textures", |