Skip to content

Hud: Chat and Collision snapping + Color overrides #544

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 64 additions & 7 deletions src/main/kotlin/com/lambda/client/gui/hudgui/AbstractHudElement.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand All @@ -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
Expand All @@ -47,12 +55,66 @@ abstract class AbstractHudElement(
open val hudHeight: Float get() = 10f

val settingList get() = GuiConfig.getSettings(this)
private var chatSnapping = false
private val snappedElements = mutableListOf<AbstractHudElement>()
private val chatSnapY = 15f

init {
safeListener<TickEvent.ClientTickEvent> {
if (it.phase != TickEvent.Phase.END || !visible) return@safeListener
safeListener<TickEvent.ClientTickEvent> { event ->
if (event.phase != TickEvent.Phase.END || !visible) return@safeListener
width = maxWidth
height = maxHeight

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()
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
}
}
}

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
}
}
}
}
}

Expand Down Expand Up @@ -112,9 +174,4 @@ abstract class AbstractHudElement(
MISC("Misc")
}

protected companion object {
val primaryColor get() = Hud.primaryColor
val secondaryColor get() = Hud.secondaryColor
}

}
3 changes: 2 additions & 1 deletion src/main/kotlin/com/lambda/client/gui/rgui/Component.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -57,7 +58,7 @@ open class Component(

var posY: Float
get() {
return relativeToAbsY(relativePosY)
return relativeToAbsY(relativePosY) + yShift
}
set(value) {
if (!LambdaMod.ready) return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}