aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/mixins/hooks/FontRendererHook.kt
blob: 881a1c42acee6cca2efff1e32e80d500dc6dae1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
package at.hannibal2.skyhanni.mixins.hooks

import at.hannibal2.skyhanni.features.chroma.ChromaFontRenderer
import at.hannibal2.skyhanni.features.chroma.ChromaManager
import at.hannibal2.skyhanni.mixins.transformers.AccessorFontRenderer
import at.hannibal2.skyhanni.utils.LorenzUtils
import net.minecraft.client.Minecraft
import net.minecraft.client.renderer.GlStateManager
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo

/**
 * 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

    var cameFromChat = 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
     *
     */
    private fun setupChromaFont() {
        DRAW_CHROMA.startChroma()
        DRAW_CHROMA_SHADOW.startChroma()
    }

    /**
     * See [setupChromaFont]
     */
    private fun endChromaFont() {
        DRAW_CHROMA.endChroma()
        DRAW_CHROMA_SHADOW.endChroma()
    }

    @JvmStatic
    fun beginChromaRendering(text: String, shadow: Boolean) {
        if (!LorenzUtils.inSkyBlock) return
        if (!ChromaManager.config.enabled) return
        if (ChromaManager.config.allChroma && ChromaManager.config.ignoreChat && cameFromChat) {
            endChromaFont()
            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 (ChromaManager.config.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 (!LorenzUtils.inSkyBlock) return i1

        if (!ChromaManager.config.enabled) return i1

        val drawState = currentDrawState ?: return i1
        if (drawState.getChromaState()) {
            if (i1 < 16) {
                return 15
            }
        }

        return i1
    }

    @JvmStatic
    fun restoreChromaState() {
        if (!LorenzUtils.inSkyBlock) return
        if (!ChromaManager.config.enabled) return

        currentDrawState?.restoreChromaEnv()
    }

    @JvmStatic
    fun endChromaRendering() {
        if (!LorenzUtils.inSkyBlock) return
        if (!ChromaManager.config.enabled) return

        if (previewChroma) {
            previewChroma = false
            endChromaFont()
        }

        if (ChromaManager.config.allChroma) endChromaFont()

        currentDrawState?.endChromaEnv()
    }

    @JvmStatic
    fun insertZColorCode(constant: String): String {
        return if (LorenzUtils.inSkyBlock && !ChromaManager.config.enabled) constant else "0123456789abcdefklmnorz"
    }

    // TODO add better parameter names
    @JvmStatic
    fun toggleChromaCondition_shouldResetStyles(
        text: String,
        shadow: Boolean,
        ci: CallbackInfo,
        i: Int,
        c0: Char,
        i1: Int,
    ): Boolean {
        if (!LorenzUtils.inSkyBlock) return false
        if (!ChromaManager.config.enabled) return false
        if (i1 == 22) {
            toggleChromaOn()
            return true
        }
        return false
    }
}