Add custom inventory text color texture pack support
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
66
src/main/kotlin/features/texturepack/CustomTextColors.kt
Normal file
66
src/main/kotlin/features/texturepack/CustomTextColors.kt
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user