diff options
author | Vixid <52578495+VixidDev@users.noreply.github.com> | 2023-10-14 10:05:48 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-14 11:05:48 +0200 |
commit | 16ef943b3c2ce8db2331332261143a12bdba61cf (patch) | |
tree | 52c764205ef2464c62b05e3585390b61c69bcdda /src/main/java/at/hannibal2/skyhanni/mixins | |
parent | bfae99cb54988568b2752c7d6a8d3d5babed1bbc (diff) | |
download | skyhanni-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')
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); + } + } +} |