Skip to content

Commit ccc4cad

Browse files
committed
Bindings list HUD element
1 parent 3cf536d commit ccc4cad

File tree

1 file changed

+111
-0
lines changed
  • src/main/kotlin/com/lambda/client/gui/hudgui/elements/client

1 file changed

+111
-0
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package com.lambda.client.gui.hudgui.elements.client
2+
3+
import com.lambda.client.commons.extension.sumByFloat
4+
import com.lambda.client.commons.interfaces.DisplayEnum
5+
import com.lambda.client.gui.hudgui.HudElement
6+
import com.lambda.client.module.AbstractModule
7+
import com.lambda.client.module.ModuleManager
8+
import com.lambda.client.util.AsyncCachedValue
9+
import com.lambda.client.util.TimeUnit
10+
import com.lambda.client.util.color.ColorHolder
11+
import com.lambda.client.util.graphics.VertexHelper
12+
import com.lambda.client.util.graphics.font.FontRenderAdapter
13+
import com.lambda.client.util.graphics.font.HAlign
14+
import com.lambda.client.util.graphics.font.TextComponent
15+
import com.lambda.client.util.graphics.font.VAlign
16+
import com.lambda.client.util.threads.safeAsyncListener
17+
import net.minecraft.client.renderer.GlStateManager
18+
import net.minecraftforge.fml.common.gameevent.TickEvent
19+
import kotlin.math.max
20+
21+
internal object Bindings : HudElement(
22+
name = "Bindings",
23+
category = Category.CLIENT,
24+
description = "Display current module keybindings",
25+
enabledByDefault = false
26+
) {
27+
private val sortingMode by setting("Sorting Mode", SortingMode.LENGTH)
28+
private val disabledColor by setting("Disabled Color", ColorHolder(255, 255, 255), false)
29+
private val enabledColor by setting("Enabled Color", ColorHolder(0, 255, 0), false)
30+
31+
private var cacheWidth = 20.0f
32+
private var cacheHeight = 20.0f
33+
override val hudWidth: Float get() = cacheWidth
34+
override val hudHeight: Float get() = cacheHeight
35+
36+
@Suppress("UNUSED")
37+
private enum class SortingMode(
38+
override val displayName: String,
39+
val comparator: Comparator<AbstractModule>
40+
) : DisplayEnum {
41+
LENGTH("Length", compareByDescending { it.textLine.getWidth() }),
42+
ALPHABET("Alphabet", compareBy { it.name }),
43+
CATEGORY("Category", compareBy { it.category.ordinal })
44+
}
45+
46+
private var modulesWithBindings: List<AbstractModule> = emptyList()
47+
private val lineHeight = FontRenderAdapter.getFontHeight() + 2.0f
48+
49+
init {
50+
relativePosX = -2.0f
51+
relativePosY = 2.0f
52+
dockingH = HAlign.RIGHT
53+
54+
safeAsyncListener<TickEvent.ClientTickEvent> {event ->
55+
if (event.phase != TickEvent.Phase.END) return@safeAsyncListener
56+
// this isn't terribly efficient, consider creating events for editing bindings and module toggle state
57+
modulesWithBindings = sortedModuleList
58+
.filter { it.bind.value.isEmpty.not() }
59+
cacheWidth = modulesWithBindings.maxOfOrNull {
60+
it.textLine.getWidth() + 4.0f
61+
} ?: 20.0f
62+
cacheHeight = max(modulesWithBindings.sumByFloat { lineHeight }, 20.0f)
63+
}
64+
}
65+
66+
override fun renderHud(vertexHelper: VertexHelper) {
67+
super.renderHud(vertexHelper)
68+
GlStateManager.pushMatrix()
69+
GlStateManager.translate(width / scale * dockingH.multiplier, 0.0f, 0.0f)
70+
if (dockingV == VAlign.BOTTOM) {
71+
GlStateManager.translate(0.0f, height / scale - (FontRenderAdapter.getFontHeight() + 2.0f), 0.0f)
72+
}
73+
74+
drawModuleList()
75+
76+
GlStateManager.popMatrix()
77+
}
78+
79+
private fun drawModuleList() {
80+
for (module in modulesWithBindings) {
81+
GlStateManager.pushMatrix()
82+
val textLine = module.textLine
83+
val textWidth = textLine.getWidth()
84+
val stringPosX = textWidth * dockingH.multiplier
85+
val margin = 2.0f * dockingH.offset
86+
GlStateManager.translate(-stringPosX - margin, 0.0f, 0.0f)
87+
textLine.drawLine(1.0f, true, HAlign.LEFT, FontRenderAdapter.useCustomFont)
88+
GlStateManager.popMatrix()
89+
var yOffset = lineHeight
90+
if (dockingV == VAlign.BOTTOM) yOffset *= -1.0f
91+
GlStateManager.translate(0.0f, yOffset, 0.0f)
92+
}
93+
}
94+
95+
private val AbstractModule.textLine get() = this.newTextLine()
96+
97+
private val sortedModuleList: List<AbstractModule> by AsyncCachedValue(1L, TimeUnit.SECONDS) {
98+
ModuleManager.modules
99+
.filter { it.category != com.lambda.client.module.Category.CLIENT}
100+
.sortedWith(this.sortingMode.comparator)
101+
}
102+
103+
private fun AbstractModule.newTextLine() =
104+
TextComponent.TextLine(" ").apply {
105+
val lineColor: ColorHolder = if (isEnabled) enabledColor else disabledColor
106+
add(TextComponent.TextElement(name, lineColor))
107+
add(TextComponent.TextElement("[" + bind.value.toString() + "]", lineColor))
108+
if (dockingH == HAlign.RIGHT) reverse()
109+
}
110+
111+
}

0 commit comments

Comments
 (0)