aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/mixins
diff options
context:
space:
mode:
authorVixid <52578495+VixidDev@users.noreply.github.com>2023-10-14 10:05:48 +0100
committerGitHub <noreply@github.com>2023-10-14 11:05:48 +0200
commit16ef943b3c2ce8db2331332261143a12bdba61cf (patch)
tree52c764205ef2464c62b05e3585390b61c69bcdda /src/main/java/at/hannibal2/skyhanni/mixins
parentbfae99cb54988568b2752c7d6a8d3d5babed1bbc (diff)
downloadskyhanni-16ef943b3c2ce8db2331332261143a12bdba61cf.tar.gz
skyhanni-16ef943b3c2ce8db2331332261143a12bdba61cf.tar.bz2
skyhanni-16ef943b3c2ce8db2331332261143a12bdba61cf.zip
Feature: SBA Chroma but in SH (#487)
Porting SBA's chroma into SkyHanni with many more options and chroma everything. #487
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/mixins')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/mixins/hooks/FontRendererHook.kt135
-rw-r--r--src/main/java/at/hannibal2/skyhanni/mixins/transformers/AccessorFontRenderer.java12
-rw-r--r--src/main/java/at/hannibal2/skyhanni/mixins/transformers/AccessorMinecraft.java13
-rw-r--r--src/main/java/at/hannibal2/skyhanni/mixins/transformers/MixinFontRenderer.java75
-rw-r--r--src/main/java/at/hannibal2/skyhanni/mixins/transformers/MixinPatcherFontRendererHook.java21
5 files changed, 256 insertions, 0 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/mixins/hooks/FontRendererHook.kt b/src/main/java/at/hannibal2/skyhanni/mixins/hooks/FontRendererHook.kt
new file mode 100644
index 000000000..808406946
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/mixins/hooks/FontRendererHook.kt
@@ -0,0 +1,135 @@
+package at.hannibal2.skyhanni.mixins.hooks
+
+import at.hannibal2.skyhanni.SkyHanniMod
+import at.hannibal2.skyhanni.features.chroma.ChromaFontRenderer
+import at.hannibal2.skyhanni.mixins.transformers.AccessorFontRenderer
+import at.hannibal2.skyhanni.utils.LorenzUtils
+import net.minecraft.client.Minecraft
+import net.minecraft.client.renderer.GlStateManager
+
+/**
+ * Object to handle chroma font states from handler methods from MixinFontRenderer
+ *
+ * Modified from SkyblockAddons
+ *
+ * Credit: [FontRendererHook.java](https://github.com/BiscuitDevelopment/SkyblockAddons/blob/main/src/main/java/codes/biscuit/skyblockaddons/asm/hooks/FontRendererHook.java)
+ */
+object FontRendererHook {
+ private var CHROMA_COLOR: Int = -0x1
+ private val DRAW_CHROMA = ChromaFontRenderer(CHROMA_COLOR)
+ private var CHROMA_COLOR_SHADOW: Int = -0xAAAAAB
+ private val DRAW_CHROMA_SHADOW = ChromaFontRenderer(CHROMA_COLOR_SHADOW)
+
+ private var currentDrawState: ChromaFontRenderer? = null
+ private var previewChroma = false
+
+ /**
+ * Setups the [ChromaFontRenderer][at.hannibal2.skyhanni.features.chroma.ChromaFontRenderer] for rendering text
+ * in chroma. This should only be used when you don't have control over the color code a string uses, or it
+ * doesn't make sense to add §Z color code to a string.
+ *
+ * If you do have control over the color code, you can prepend the string with §Z instead.
+ *
+ * **Usage:**
+ *
+ * Surround string render call with this method and [endChromaFont].
+ * ```
+ * FontRendererHook.setupChromaFont()
+ * // render string call(s) here...
+ * FontRendererHook.endChromaFont()
+ * ```
+ *
+ * Note: This only works if the string render call ends up using
+ * [FontRenderer#drawString()][net.minecraft.client.gui.FontRenderer.drawString] rather than a custom font renderer
+ *
+ */
+ fun setupChromaFont() {
+ DRAW_CHROMA.startChroma()
+ DRAW_CHROMA_SHADOW.startChroma()
+ }
+
+ /**
+ * See [setupChromaFont]
+ */
+ fun endChromaFont() {
+ DRAW_CHROMA.endChroma()
+ DRAW_CHROMA_SHADOW.endChroma()
+ }
+
+ @JvmStatic
+ fun beginChromaRendering(text: String, shadow: Boolean) {
+ if (!LorenzUtils.inSkyBlock) return
+ if (!SkyHanniMod.feature.chroma.enabled) return
+
+ if (text == "§fPlease star the mod on GitHub!") {
+ previewChroma = true
+ setupChromaFont()
+ }
+
+ val alpha = (Minecraft.getMinecraft().fontRendererObj as AccessorFontRenderer).alpha
+ if (shadow) {
+ currentDrawState = DRAW_CHROMA_SHADOW
+ CHROMA_COLOR_SHADOW = ((255 * alpha).toInt() shl 24 or 0x555555)
+ } else {
+ currentDrawState = DRAW_CHROMA
+ CHROMA_COLOR = ((255 * alpha).toInt() shl 24 or 0xFFFFFF)
+ }
+
+ // Best feature ngl
+ if (SkyHanniMod.feature.chroma.allChroma) {
+ // Handles setting the base color of text when they don't use color codes i.e. MoulConfig
+ if (shadow) {
+ GlStateManager.color(0.33f, 0.33f, 0.33f, 1f)
+ } else {
+ GlStateManager.color(1f, 1f, 1f, 1f)
+ }
+ setupChromaFont()
+ }
+
+ currentDrawState?.loadChromaEnv()
+ }
+
+ @JvmStatic
+ fun toggleChromaOn() {
+ if (!LorenzUtils.inSkyBlock) return
+
+ currentDrawState?.newChromaEnv()?.bindActualColor()
+ }
+
+ @JvmStatic
+ fun forceWhiteColorCode(i1: Int) : Int {
+ if (!SkyHanniMod.feature.chroma.enabled) return i1
+
+ val drawState = currentDrawState ?: return i1
+ if (drawState.getChromaState()) {
+ if (i1 < 16) {
+ return 15
+ }
+ }
+
+ return i1
+ }
+
+ @JvmStatic
+ fun restoreChromaState() {
+ if (!SkyHanniMod.feature.chroma.enabled) return
+ if (!LorenzUtils.inSkyBlock) return
+
+ currentDrawState?.restoreChromaEnv()
+ }
+
+ @JvmStatic
+ fun endChromaRendering() {
+ if (!SkyHanniMod.feature.chroma.enabled) return
+ if (!LorenzUtils.inSkyBlock) return
+
+ if (previewChroma) {
+ previewChroma = false
+ endChromaFont()
+ }
+
+ if (SkyHanniMod.feature.chroma.allChroma) endChromaFont()
+
+ currentDrawState?.endChromaEnv()
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/mixins/transformers/AccessorFontRenderer.java b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/AccessorFontRenderer.java
new file mode 100644
index 000000000..e20462d1a
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/AccessorFontRenderer.java
@@ -0,0 +1,12 @@
+package at.hannibal2.skyhanni.mixins.transformers;
+
+import net.minecraft.client.gui.FontRenderer;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@Mixin(FontRenderer.class)
+public interface AccessorFontRenderer {
+
+ @Accessor("alpha")
+ float getAlpha();
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/mixins/transformers/AccessorMinecraft.java b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/AccessorMinecraft.java
new file mode 100644
index 000000000..24074f296
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/AccessorMinecraft.java
@@ -0,0 +1,13 @@
+package at.hannibal2.skyhanni.mixins.transformers;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.util.Timer;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@Mixin(Minecraft.class)
+public interface AccessorMinecraft {
+
+ @Accessor("timer")
+ Timer getTimer();
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/mixins/transformers/MixinFontRenderer.java b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/MixinFontRenderer.java
new file mode 100644
index 000000000..cf357eb74
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/MixinFontRenderer.java
@@ -0,0 +1,75 @@
+package at.hannibal2.skyhanni.mixins.transformers;
+
+import at.hannibal2.skyhanni.SkyHanniMod;
+import at.hannibal2.skyhanni.mixins.hooks.FontRendererHook;
+import net.minecraft.client.gui.FontRenderer;
+import org.spongepowered.asm.lib.Opcodes;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.*;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
+
+@Mixin(FontRenderer.class)
+public abstract class MixinFontRenderer {
+
+ /**
+ * Inject call to {@link FontRendererHook#beginChromaRendering(String, boolean)} as first call
+ */
+ @Inject(method = "renderStringAtPos", at = @At("HEAD"))
+ public void beginRenderString(String text, boolean shadow, CallbackInfo ci) {
+ FontRendererHook.beginChromaRendering(text, shadow);
+ }
+
+ /**
+ * Modify color code constant to add Z color code
+ */
+ @ModifyConstant(method = "renderStringAtPos", constant = @Constant(stringValue = "0123456789abcdefklmnor"))
+ public String insertZColorCode(String constant) {
+ if (!SkyHanniMod.getFeature().chroma.enabled) return constant;
+ return "0123456789abcdefklmnorz";
+ }
+
+ /**
+ * Inject call to {@link FontRendererHook#restoreChromaState()} after 1st and 3rd fontrenderer.italicStyle = ___ call
+ */
+ @Inject(method = "renderStringAtPos", at = {
+ @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/client/gui/FontRenderer;italicStyle:Z", ordinal = 0, shift = At.Shift.AFTER),
+ @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/client/gui/FontRenderer;italicStyle:Z", ordinal = 2, shift = At.Shift.AFTER)})
+ public void insertRestoreChromaState(CallbackInfo ci) {
+ FontRendererHook.restoreChromaState();
+ }
+
+ @Shadow
+ protected abstract void resetStyles();
+
+ /**
+ * Inject call to {@link FontRendererHook#toggleChromaOn()} to check for Z color code index and if so,
+ * reset styles and toggle chroma on
+ */
+ @Inject(method = "renderStringAtPos", at = @At(value = "INVOKE", target = "Ljava/lang/String;indexOf(I)I", ordinal = 0, shift = At.Shift.BY, by = 2), locals = LocalCapture.CAPTURE_FAILHARD)
+ public void toggleChromaCondition(String text, boolean shadow, CallbackInfo ci, int i, char c0, int i1) {
+ if (!SkyHanniMod.getFeature().chroma.enabled) return;
+ if (i1 == 22) {
+ this.resetStyles();
+ FontRendererHook.toggleChromaOn();
+ }
+ }
+
+ /**
+ * Replace all color codes (when chroma is enabled) to white so chroma renders uniformly and at best brightness
+ */
+ @ModifyVariable(method = "renderStringAtPos", at = @At(value = "INVOKE", target = "Ljava/lang/String;indexOf(I)I", ordinal = 0, shift = At.Shift.BY, by = 2), ordinal = 1)
+ public int forceWhiteColorCode(int i1) {
+ return FontRendererHook.forceWhiteColorCode(i1);
+ }
+
+ /**
+ * Inject call to {@link FontRendererHook#endChromaRendering()} to turn off chroma rendering after entire
+ * string has been rendered
+ */
+ @Inject(method = "renderStringAtPos", at = @At("RETURN"))
+ public void insertEndOfString(String text, boolean shadow, CallbackInfo ci) {
+ FontRendererHook.endChromaRendering();
+ }
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/mixins/transformers/MixinPatcherFontRendererHook.java b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/MixinPatcherFontRendererHook.java
new file mode 100644
index 000000000..7c585b725
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/MixinPatcherFontRendererHook.java
@@ -0,0 +1,21 @@
+package at.hannibal2.skyhanni.mixins.transformers;
+
+import at.hannibal2.skyhanni.SkyHanniMod;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Pseudo;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+@Pseudo
+@Mixin(targets = "club.sk1er.patcher.hooks.FontRendererHook")
+public class MixinPatcherFontRendererHook {
+
+ @Inject(method = "renderStringAtPos(Ljava/lang/String;Z)Z", at = @At("HEAD"), cancellable = true)
+ public void overridePatcherFontRenderer(String string, boolean shadow, CallbackInfoReturnable<Boolean> cir) {
+ if (SkyHanniMod.getFeature().chroma.enabled) {
+ cir.cancel();
+ cir.setReturnValue(false);
+ }
+ }
+}