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

@@ -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));
}
}

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
}
}

View File

@@ -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",