From 0d0fb47e251eed38e31f8a37de65630dd8682cc7 Mon Sep 17 00:00:00 2001 From: rfresh2 <89827146+rfresh2@users.noreply.github.com> Date: Sat, 3 Jun 2023 09:36:51 -0700 Subject: [PATCH 1/2] Hud: Chat and Collision snapping --- .../client/gui/hudgui/AbstractHudElement.kt | 65 +++++++++++++++++-- .../com/lambda/client/gui/rgui/Component.kt | 3 +- .../client/module/modules/client/Hud.kt | 2 + 3 files changed, 64 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/com/lambda/client/gui/hudgui/AbstractHudElement.kt b/src/main/kotlin/com/lambda/client/gui/hudgui/AbstractHudElement.kt index e68c065b8..1d8e2b6ce 100644 --- a/src/main/kotlin/com/lambda/client/gui/hudgui/AbstractHudElement.kt +++ b/src/main/kotlin/com/lambda/client/gui/hudgui/AbstractHudElement.kt @@ -4,6 +4,7 @@ import com.lambda.client.commons.interfaces.Alias import com.lambda.client.commons.interfaces.DisplayEnum import com.lambda.client.commons.interfaces.Nameable import com.lambda.client.event.LambdaEventBus +import com.lambda.client.gui.GuiManager import com.lambda.client.gui.rgui.windows.BasicWindow import com.lambda.client.module.modules.client.GuiColors import com.lambda.client.module.modules.client.Hud @@ -18,6 +19,7 @@ import com.lambda.client.util.math.Vec2d import com.lambda.client.util.math.Vec2f import com.lambda.client.util.text.MessageSendHelper import com.lambda.client.util.threads.safeListener +import net.minecraft.client.gui.GuiChat import net.minecraftforge.fml.common.gameevent.TickEvent import org.lwjgl.opengl.GL11.glScalef @@ -34,7 +36,13 @@ abstract class AbstractHudElement( val bind by setting("Bind", Bind()) val scale by setting("Scale", 1.0f, 0.1f..4.0f, 0.05f) val default = setting("Default", false) + private val overridePrimaryColor by setting("Override Primary Color", false) + private val overridePrimaryColorValue by setting("Override Primary Color Value", Hud.primaryColor, visibility = { overridePrimaryColor }) + private val overrideSecondaryColor by setting("Override Secondary Color", false) + private val overrideSecondaryColorValue by setting("Override Secondary Color Value", Hud.secondaryColor, visibility = { overrideSecondaryColor }) + val primaryColor get() = if (overridePrimaryColor) overridePrimaryColorValue else Hud.primaryColor + val secondaryColor get() = if (overrideSecondaryColor) overrideSecondaryColorValue else Hud.secondaryColor override val resizable = false final override val minWidth: Float get() = FontRenderAdapter.getFontHeight() * scale * 2.0f @@ -47,12 +55,64 @@ abstract class AbstractHudElement( open val hudHeight: Float get() = 10f val settingList get() = GuiConfig.getSettings(this) + private var chatSnapping = false + private val snappedElements = mutableListOf() + private val chatSnapY = 15f init { safeListener { if (it.phase != TickEvent.Phase.END || !visible) return@safeListener width = maxWidth height = maxHeight + if (Hud.chatSnap) { + if (mc.currentScreen is GuiChat && !chatSnapping) { + val screenH = (mc.currentScreen as GuiChat).height + if (posY >= screenH - height - 3 && posX <= 3 && yShift == 0.0f) { + val prevPosYSnap = posY + yShift = -chatSnapY + snappedElements.clear() + GuiManager.getHudElementOrNull(componentName)?.let { snappedElements.add(it) } + chatSnapCheck(componentName, prevPosYSnap) + chatSnapping = true + } + } else if (mc.currentScreen !is GuiChat && chatSnapping) { + yShift = 0.0f + for (element in snappedElements) { + element.yShift = 0.0f + } + snappedElements.clear() + chatSnapping = false + } + } + } + } + + private fun chatSnapCheck(thisElement: String, prevSnapY: Float) { + for (element in GuiManager.hudElements) { + if (!snappedElements.contains(element) + && element.componentName != thisElement + && element.visible + && element.posY + element.height >= prevSnapY - 3 + && element.posX <= 3) { + snappedElements.add(element) + chatSnapCheck(element.componentName, element.posY) + element.yShift = -chatSnapY + } + } + } + + override fun onReposition() { + super.onReposition() + if (Hud.collisionSnapping) { + for (element in GuiManager.hudElements) { + if (element.componentName != componentName && element.visible && element.posY + element.height >= posY && element.posY <= posY + height && element.posX + element.width >= posX && element.posX <= posX + width) { + if (posY + height / 2 <= element.posY + element.height / 2) { + posY = element.posY - height + } else { + posY = element.posY + element.height + } + } + } } } @@ -112,9 +172,4 @@ abstract class AbstractHudElement( MISC("Misc") } - protected companion object { - val primaryColor get() = Hud.primaryColor - val secondaryColor get() = Hud.secondaryColor - } - } \ No newline at end of file diff --git a/src/main/kotlin/com/lambda/client/gui/rgui/Component.kt b/src/main/kotlin/com/lambda/client/gui/rgui/Component.kt index 277454355..144a01eb0 100644 --- a/src/main/kotlin/com/lambda/client/gui/rgui/Component.kt +++ b/src/main/kotlin/com/lambda/client/gui/rgui/Component.kt @@ -45,6 +45,7 @@ open class Component( var relativePosY by relativePosYSetting var dockingH by dockingHSetting var dockingV by dockingVSetting + var yShift = 0.0f var posX: Float get() { @@ -57,7 +58,7 @@ open class Component( var posY: Float get() { - return relativeToAbsY(relativePosY) + return relativeToAbsY(relativePosY) + yShift } set(value) { if (!LambdaMod.ready) return diff --git a/src/main/kotlin/com/lambda/client/module/modules/client/Hud.kt b/src/main/kotlin/com/lambda/client/module/modules/client/Hud.kt index 11e5595c5..8887db8ce 100644 --- a/src/main/kotlin/com/lambda/client/module/modules/client/Hud.kt +++ b/src/main/kotlin/com/lambda/client/module/modules/client/Hud.kt @@ -14,4 +14,6 @@ object Hud : Module( val hudFrame by setting("Hud Frame", false) val primaryColor by setting("Primary Color", ColorHolder(255, 240, 246), false) val secondaryColor by setting("Secondary Color", ColorHolder(108, 0, 43), false) + val chatSnap by setting("Chat Snap", true) + val collisionSnapping by setting("Collision Snapping", true) } \ No newline at end of file From 108d766c0a5db10e10acfff8d0365549e7150087 Mon Sep 17 00:00:00 2001 From: Constructor Date: Mon, 5 Jun 2023 01:27:46 +0200 Subject: [PATCH 2/2] Improve type safety and nesting depth --- .../client/gui/hudgui/AbstractHudElement.kt | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/main/kotlin/com/lambda/client/gui/hudgui/AbstractHudElement.kt b/src/main/kotlin/com/lambda/client/gui/hudgui/AbstractHudElement.kt index 1d8e2b6ce..7a572d332 100644 --- a/src/main/kotlin/com/lambda/client/gui/hudgui/AbstractHudElement.kt +++ b/src/main/kotlin/com/lambda/client/gui/hudgui/AbstractHudElement.kt @@ -60,29 +60,31 @@ abstract class AbstractHudElement( private val chatSnapY = 15f init { - safeListener { - if (it.phase != TickEvent.Phase.END || !visible) return@safeListener + safeListener { event -> + if (event.phase != TickEvent.Phase.END || !visible) return@safeListener width = maxWidth height = maxHeight - if (Hud.chatSnap) { - if (mc.currentScreen is GuiChat && !chatSnapping) { - val screenH = (mc.currentScreen as GuiChat).height - if (posY >= screenH - height - 3 && posX <= 3 && yShift == 0.0f) { - val prevPosYSnap = posY - yShift = -chatSnapY - snappedElements.clear() - GuiManager.getHudElementOrNull(componentName)?.let { snappedElements.add(it) } - chatSnapCheck(componentName, prevPosYSnap) - chatSnapping = true - } - } else if (mc.currentScreen !is GuiChat && chatSnapping) { - yShift = 0.0f - for (element in snappedElements) { - element.yShift = 0.0f - } + + if (!Hud.chatSnap) return@safeListener + + val currentScreen = mc.currentScreen + if (currentScreen is GuiChat && !chatSnapping) { + val screenH = currentScreen.height + if (posY >= screenH - height - 3 && posX <= 3 && yShift == 0.0f) { + val prevPosYSnap = posY + yShift = -chatSnapY snappedElements.clear() - chatSnapping = false + GuiManager.getHudElementOrNull(componentName)?.let { snappedElements.add(it) } + chatSnapCheck(componentName, prevPosYSnap) + chatSnapping = true + } + } else if (currentScreen !is GuiChat && chatSnapping) { + yShift = 0.0f + snappedElements.forEach { + it.yShift = 0.0f } + snappedElements.clear() + chatSnapping = false } } }