diff --git a/src/main/java/net/moonleay/gimbal/client/config/GimbalGuiSettings.kt b/src/main/java/net/moonleay/gimbal/client/config/GimbalGuiSettings.kt
index 2a274b0..7c24608 100644
--- a/src/main/java/net/moonleay/gimbal/client/config/GimbalGuiSettings.kt
+++ b/src/main/java/net/moonleay/gimbal/client/config/GimbalGuiSettings.kt
@@ -23,6 +23,7 @@ import kotlinx.serialization.Serializable
@Serializable
data class GimbalGuiSettings(
val showHud: Boolean = true,
- val scaledRes: ScaledRes = ScaledRes(4.0, 4.0),
- val anchorPoint: AnchorPoint = AnchorPoint.TOP_LEFT,
+ val offset: ScaledRes = ScaledRes(4.0, 4.0),
+ val horizontalAnchor: HorizontalAnchor = HorizontalAnchor.LEFT,
+ val verticalAnchor: VerticalAnchor = VerticalAnchor.TOP,
)
diff --git a/src/main/java/net/moonleay/gimbal/client/config/AnchorPoint.kt b/src/main/java/net/moonleay/gimbal/client/config/HorizontalAnchor.kt
similarity index 88%
rename from src/main/java/net/moonleay/gimbal/client/config/AnchorPoint.kt
rename to src/main/java/net/moonleay/gimbal/client/config/HorizontalAnchor.kt
index 29f34a2..fa4dc4f 100644
--- a/src/main/java/net/moonleay/gimbal/client/config/AnchorPoint.kt
+++ b/src/main/java/net/moonleay/gimbal/client/config/HorizontalAnchor.kt
@@ -21,10 +21,8 @@ package net.moonleay.gimbal.client.config
import kotlinx.serialization.Serializable
@Serializable
-enum class AnchorPoint {
- TOP_LEFT,
- TOP_RIGHT,
- BOTTOM_RIGHT,
- BOTTOM_LEFT,
- CENTER
+enum class HorizontalAnchor {
+ LEFT,
+ CENTER,
+ RIGHT,
}
diff --git a/src/main/java/net/moonleay/gimbal/client/config/VerticalAnchor.kt b/src/main/java/net/moonleay/gimbal/client/config/VerticalAnchor.kt
new file mode 100644
index 0000000..7fd660a
--- /dev/null
+++ b/src/main/java/net/moonleay/gimbal/client/config/VerticalAnchor.kt
@@ -0,0 +1,28 @@
+/*
+ * Gimbal
+ * Copyright (C) 2024 moonleay
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.moonleay.gimbal.client.config
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+enum class VerticalAnchor {
+ TOP,
+ CENTER,
+ BOTTOM,
+}
diff --git a/src/main/java/net/moonleay/gimbal/client/screen/GimbalEditHudGui.kt b/src/main/java/net/moonleay/gimbal/client/screen/GimbalEditHudGui.kt
index 0b7fd61..6af484e 100644
--- a/src/main/java/net/moonleay/gimbal/client/screen/GimbalEditHudGui.kt
+++ b/src/main/java/net/moonleay/gimbal/client/screen/GimbalEditHudGui.kt
@@ -24,7 +24,10 @@ import net.minecraft.client.util.math.MatrixStack
import net.minecraft.screen.ScreenTexts
import net.minecraft.text.Text
import net.moonleay.gimbal.build.BuildConstants
-import net.moonleay.gimbal.client.config.*
+import net.moonleay.gimbal.client.config.ClientConfigHolder
+import net.moonleay.gimbal.client.config.GimbalClientConfig
+import net.moonleay.gimbal.client.config.GimbalGuiSettings
+import net.moonleay.gimbal.client.config.ScaledRes
import net.moonleay.gimbal.client.util.screen.ScreenUtil
import org.apache.logging.log4j.LogManager
@@ -37,8 +40,8 @@ class GimbalEditHudGui(private val parent: Screen, private val cfg: ClientConfig
private var shouldFollow = false
init {
- this.tempXOffset = cfg.config.guiSettings.scaledRes.scaledX
- this.tempYOffset = cfg.config.guiSettings.scaledRes.scaledY
+ this.tempXOffset = cfg.config.guiSettings.offset.scaledX
+ this.tempYOffset = cfg.config.guiSettings.offset.scaledY
}
override fun init() {
@@ -69,14 +72,18 @@ class GimbalEditHudGui(private val parent: Screen, private val cfg: ClientConfig
}
LOGGER.info("Saving Pos...")
+ val anchor = ScreenUtil.getAnchor(this.tempXOffset, this.tempYOffset)
+
val newConf = GimbalClientConfig(
showToasts = oldConf.showToasts,
guiSettings = GimbalGuiSettings(
showHud = oldConf.guiSettings.showHud,
- scaledRes = ScaledRes(
+ offset = ScaledRes(
scaledX = this.tempXOffset,
scaledY = this.tempYOffset,
- )
+ ),
+ horizontalAnchor = anchor.first,
+ verticalAnchor = anchor.second
)
)
@@ -92,12 +99,14 @@ class GimbalEditHudGui(private val parent: Screen, private val cfg: ClientConfig
super.tick()
if (this.shouldFollow) {
val mouse = this.client?.mouse!!
- val scaleFactor = this.client!!.window.calculateScaleFactor(
- this.client!!.options.guiScale.value,
- this.client!!.forcesUnicodeFont()
- )
- this.tempXOffset = ScreenUtil.getScaled(this.width, mouse.x.toFloat() / scaleFactor)
- this.tempYOffset = ScreenUtil.getScaled(this.height, mouse.y.toFloat() / scaleFactor)
+ val wantedX = ScreenUtil.getScaled(this.client!!.window.width, mouse.x.toFloat())
+ val wantedY = ScreenUtil.getScaled(this.client!!.window.height, mouse.y.toFloat())
+ if (!ScreenUtil.isPositionOutOfBounds(wantedX, wantedY)) {
+ this.tempXOffset = wantedX
+ this.tempYOffset = wantedY
+ } else {
+ LOGGER.info("Text is oob. wantedX: ${wantedX}, wantedY: ${wantedY}, width: ${this.client!!.window.width}, height: ${this.client!!.window.height}")
+ }
}
}
@@ -114,22 +123,30 @@ class GimbalEditHudGui(private val parent: Screen, private val cfg: ClientConfig
override fun render(matrices: MatrixStack?, mouseX: Int, mouseY: Int, delta: Float) {
this.renderBackground(matrices)
drawCenteredText(matrices, this.textRenderer, this.title, this.width / 2, 15, 16777215)
+ val scaleFactor = this.client!!.window.calculateScaleFactor(
+ this.client!!.options.guiScale.value,
+ this.client!!.forcesUnicodeFont()
+ )
+ val anchor = ScreenUtil.getAnchor(this.tempXOffset, this.tempYOffset)
this.textRenderer.drawWithShadow(
matrices,
Text.translatable("gimbal.gui.examplehud"),
- ScreenUtil.getXForRender(
- ScreenUtil.getReal(this.width, this.tempXOffset),
- AnchorPoint.CENTER,
+ ScreenUtil.getXForAnchor(
+ ScreenUtil.getReal(this.client!!.window.width, this.tempXOffset) / scaleFactor,
+ anchor.first,
this.textRenderer.getWidth(Text.translatable("gimbal.gui.examplehud"))
),
- ScreenUtil.getYForRender(
- ScreenUtil.getReal(this.height, this.tempYOffset),
- AnchorPoint.CENTER,
+ ScreenUtil.getYForAnchor(
+ ScreenUtil.getReal(this.client!!.window.height, this.tempYOffset) / scaleFactor,
+ anchor.second,
this.textRenderer.fontHeight
),
0xFFFFFF
) // TODO: improve placement when changing the scaling
-// LOGGER.info("width: ${this.width}, height: ${this.height}, posX: ${ScreenUtil.getReal(this.width, this.tempXOffset)}, posY: ${ScreenUtil.getReal(this.height, this.tempYOffset)}, scaleX: ${this.tempXOffset}, scaleY: ${this.tempYOffset}")
+// LOGGER.info("width: ${this.width}, height: ${this.height}," +
+// " posX: ${ScreenUtil.getReal(this.width, this.tempXOffset)}," +
+// " posY: ${ScreenUtil.getReal(this.height, this.tempYOffset)}," +
+// " scaleX: ${this.tempXOffset}, scaleY: ${this.tempYOffset}")
super.render(matrices, mouseX, mouseY, delta)
}
}
diff --git a/src/main/java/net/moonleay/gimbal/client/screen/GimbalSettingsGui.kt b/src/main/java/net/moonleay/gimbal/client/screen/GimbalSettingsGui.kt
index 99cedbb..0885102 100644
--- a/src/main/java/net/moonleay/gimbal/client/screen/GimbalSettingsGui.kt
+++ b/src/main/java/net/moonleay/gimbal/client/screen/GimbalSettingsGui.kt
@@ -46,8 +46,9 @@ class GimbalSettingsGui(private val parent: Screen, private val cfg: ClientConfi
val oldGui = cfg.config.guiSettings
val newGui = GimbalGuiSettings(
showHud = isEnabled ?: true,
- scaledRes = oldGui.scaledRes,
- anchorPoint = oldGui.anchorPoint
+ offset = oldGui.offset,
+ horizontalAnchor = oldGui.horizontalAnchor,
+ verticalAnchor = oldGui.verticalAnchor,
)
val newConf = GimbalClientConfig(
guiSettings = newGui,
diff --git a/src/main/java/net/moonleay/gimbal/client/util/screen/ScreenUtil.kt b/src/main/java/net/moonleay/gimbal/client/util/screen/ScreenUtil.kt
index c9166cb..9c0c130 100644
--- a/src/main/java/net/moonleay/gimbal/client/util/screen/ScreenUtil.kt
+++ b/src/main/java/net/moonleay/gimbal/client/util/screen/ScreenUtil.kt
@@ -18,27 +18,37 @@
package net.moonleay.gimbal.client.util.screen
-import net.moonleay.gimbal.client.config.AnchorPoint
+import net.moonleay.gimbal.client.config.HorizontalAnchor
+import net.moonleay.gimbal.client.config.VerticalAnchor
object ScreenUtil {
- fun getXForRender(x: Float, anchor: AnchorPoint, textWidth: Int): Float {
- return when (anchor) {
- AnchorPoint.TOP_LEFT -> x
- AnchorPoint.BOTTOM_LEFT -> x
- AnchorPoint.TOP_RIGHT -> x - textWidth
- AnchorPoint.BOTTOM_RIGHT -> x - textWidth
- AnchorPoint.CENTER -> x - textWidth / 2
+ fun getAnchor(x: Double, y: Double): Pair {
+ return when (x) {
+ in 0.0..<34.0 -> HorizontalAnchor.LEFT
+ in 34.0..<67.0 -> HorizontalAnchor.CENTER
+ else -> HorizontalAnchor.RIGHT
+ } to when (y) {
+ in 0.0..<34.0 -> VerticalAnchor.TOP
+ in 34.0..<67.0 -> VerticalAnchor.CENTER
+ else -> VerticalAnchor.BOTTOM
}
}
- fun getYForRender(y: Float, anchor: AnchorPoint, textHeight: Int): Float {
+ fun getXForAnchor(x: Float, anchor: HorizontalAnchor, textWidth: Int): Float {
return when (anchor) {
- AnchorPoint.TOP_LEFT -> y
- AnchorPoint.TOP_RIGHT -> y
- AnchorPoint.BOTTOM_RIGHT -> y - textHeight
- AnchorPoint.BOTTOM_LEFT -> y - textHeight
- AnchorPoint.CENTER -> y - textHeight / 2
+ HorizontalAnchor.LEFT -> x
+ HorizontalAnchor.CENTER -> x - (textWidth / 2)
+ HorizontalAnchor.RIGHT -> x - textWidth
+ }
+ }
+
+
+ fun getYForAnchor(y: Float, anchor: VerticalAnchor, textHeight: Int): Float {
+ return when (anchor) {
+ VerticalAnchor.TOP -> y
+ VerticalAnchor.CENTER -> y - (textHeight / 2)
+ VerticalAnchor.BOTTOM -> y - textHeight
}
}
diff --git a/src/main/java/net/moonleay/gimbal/mixin/HudMixin.java b/src/main/java/net/moonleay/gimbal/mixin/HudMixin.java
index fab79b6..607c7f2 100644
--- a/src/main/java/net/moonleay/gimbal/mixin/HudMixin.java
+++ b/src/main/java/net/moonleay/gimbal/mixin/HudMixin.java
@@ -22,7 +22,11 @@ import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.hud.InGameHud;
import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.text.Text;
+import net.moonleay.gimbal.client.ClientMain;
+import net.moonleay.gimbal.client.config.GimbalGuiSettings;
import net.moonleay.gimbal.client.editor.ClientEditor;
+import net.moonleay.gimbal.client.util.screen.ScreenUtil;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@@ -31,16 +35,40 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(InGameHud.class)
-public class HudMixin {
+public abstract class HudMixin {
@Shadow @Final private MinecraftClient client;
@Inject(method = "renderStatusEffectOverlay", at = @At("HEAD"))
private void render(MatrixStack matrices, CallbackInfo ci) {
TextRenderer tr = this.client.textRenderer;
- tr.drawWithShadow(matrices,
- ClientEditor.INSTANCE.getModeDisplayText(),
- 4, 4,
- ClientEditor.INSTANCE.getCurrentColor());
+ GimbalGuiSettings conf = ClientMain.CONFIG.getConfig().getGuiSettings();
+ if (!conf.getShowHud())
+ return;
+ int scaleFactor = this.client.getWindow()
+ .calculateScaleFactor(
+ this.client.options.getGuiScale().getValue(),
+ this.client.forcesUnicodeFont()
+ );
+ Text displayText = ClientEditor.INSTANCE.getModeDisplayText();
+ tr.drawWithShadow(
+ matrices,
+ displayText,
+ ScreenUtil.INSTANCE.getXForAnchor(
+ ScreenUtil.INSTANCE.getReal(
+ this.client.getWindow().getWidth(),
+ conf.getOffset().getScaledX() / scaleFactor),
+ conf.getHorizontalAnchor(),
+ this.client.textRenderer.getWidth(displayText)
+ ),
+ ScreenUtil.INSTANCE.getYForAnchor(
+ ScreenUtil.INSTANCE.getReal(
+ this.client.getWindow().getHeight(),
+ conf.getOffset().getScaledY() / scaleFactor),
+ conf.getVerticalAnchor(),
+ this.client.textRenderer.fontHeight
+ ),
+ ClientEditor.INSTANCE.getCurrentColor()
+ );
}
}