From 12c53099f28437ac3a919f298f4b0bfb30f71cf6 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Thu, 24 Apr 2025 03:37:37 -0500 Subject: [PATCH] ui and module improvements --- .../org/saturnclient/modules/ModManager.java | 8 ++-- .../java/org/saturnclient/modules/Module.java | 5 ++- .../org/saturnclient/modules/TickModule.java | 5 --- .../saturnclient/modules/mods/Crosshair.java | 32 +++++++-------- .../saturnclient/menus/SaturnMenu.java | 2 - .../saturnclient/menus/SaturnTitleScreen.java | 3 +- .../mod_utils/CameraOverriddenEntity.java | 9 ----- .../java/org/saturnclient/ui2/Element.java | 6 ++- .../org/saturnclient/ui2/RenderContext.java | 23 +++++++++++ .../org/saturnclient/ui2/RenderScope.java | 39 +++++++++++++++++++ .../org/saturnclient/ui2/SaturnScreen.java | 34 +++++++++------- src/main/java/org/saturnclient/ui2/Utils.java | 10 +++++ .../org/saturnclient/ui2/elements/Button.java | 16 ++++++-- .../org/saturnclient/ui2/elements/Text.java | 3 +- .../saturnclient/ui2/resources/Textures.java | 7 ++++ .../saturnclient/ui2/screens/ShiftMenu.java | 18 +++++++++ 16 files changed, 160 insertions(+), 60 deletions(-) delete mode 100644 src/main/java/org/saturnclient/modules/TickModule.java delete mode 100644 src/main/java/org/saturnclient/saturnclient/mod_utils/CameraOverriddenEntity.java create mode 100644 src/main/java/org/saturnclient/ui2/RenderContext.java create mode 100644 src/main/java/org/saturnclient/ui2/Utils.java create mode 100644 src/main/java/org/saturnclient/ui2/resources/Textures.java create mode 100644 src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java diff --git a/src/main/java/org/saturnclient/modules/ModManager.java b/src/main/java/org/saturnclient/modules/ModManager.java index 2725df1..452dc58 100644 --- a/src/main/java/org/saturnclient/modules/ModManager.java +++ b/src/main/java/org/saturnclient/modules/ModManager.java @@ -17,10 +17,10 @@ public class ModManager { }; public static void init() { - ClientTickEvents.START_CLIENT_TICK.register(client -> { + ClientTickEvents.END_CLIENT_TICK.register(client -> { for (Module m : MODS) { - if (m instanceof TickModule && m.isEnabled()) { - ((TickModule) m).tick(); + if (m.isEnabled()) { + m.tick(); } } }); @@ -48,7 +48,7 @@ public class ModManager { matrices.pop(); } else { - m.render(context); + m.render(renderScope); } } } diff --git a/src/main/java/org/saturnclient/modules/Module.java b/src/main/java/org/saturnclient/modules/Module.java index b556ca3..86e8c97 100644 --- a/src/main/java/org/saturnclient/modules/Module.java +++ b/src/main/java/org/saturnclient/modules/Module.java @@ -3,8 +3,8 @@ package org.saturnclient.modules; import org.saturnclient.saturnclient.config.ConfigManager; import org.saturnclient.saturnclient.config.NamedProperty; import org.saturnclient.ui.Textures; +import org.saturnclient.ui2.RenderScope; -import net.minecraft.client.gui.DrawContext; import net.minecraft.util.Identifier; public abstract class Module { @@ -30,7 +30,8 @@ public abstract class Module { configManager = config; } - public void render(DrawContext scope) {} + public void render(RenderScope scope) {} + public void tick() {} public abstract boolean isEnabled(); diff --git a/src/main/java/org/saturnclient/modules/TickModule.java b/src/main/java/org/saturnclient/modules/TickModule.java deleted file mode 100644 index 39710dc..0000000 --- a/src/main/java/org/saturnclient/modules/TickModule.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.saturnclient.modules; - -public interface TickModule { - public void tick(); -} diff --git a/src/main/java/org/saturnclient/modules/mods/Crosshair.java b/src/main/java/org/saturnclient/modules/mods/Crosshair.java index ef9a10a..260fbda 100644 --- a/src/main/java/org/saturnclient/modules/mods/Crosshair.java +++ b/src/main/java/org/saturnclient/modules/mods/Crosshair.java @@ -2,49 +2,43 @@ package org.saturnclient.modules.mods; import org.saturnclient.modules.Module; import org.saturnclient.saturnclient.SaturnClient; -import org.saturnclient.saturnclient.config.NamedProperty; import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.ui2.RenderScope; +import org.saturnclient.ui2.resources.Textures; -import com.mojang.blaze3d.systems.RenderSystem; - -import net.minecraft.client.gui.DrawContext; import net.minecraft.client.render.RenderLayer; -import net.minecraft.util.Identifier; public class Crosshair extends Module { - Identifier textureLocation = Identifier.of("saturnclient", "textures/gui/hud/crosshair_range.png"); - - public static NamedProperty enabled = new Property<>(false).named("Enabled"); - public static NamedProperty range_indicator = new Property<>(false).named("Range Indicator"); + public static Property enabled = new Property<>(false); + public static Property range_indicator = new Property<>(false); public Crosshair() { - super("Crosshair", "crosshair", enabled, range_indicator); + super("Crosshair", "crosshair", enabled.named("Enabled"), range_indicator.named("Range Indicator")); } @Override - public void render(DrawContext context) { - if (enabled.prop.value - && range_indicator.prop.value + public void render(RenderScope scope) { + if (enabled.value + && range_indicator.value && SaturnClient.client.targetedEntity != null && SaturnClient.client.targetedEntity.isAlive()) { - RenderSystem.setShaderTexture(0, textureLocation); int scaledWidth = 15; int scaledHeight = 15; - context.drawTexture(RenderLayer::getCrosshair, textureLocation, - (context.getScaledWindowWidth() - scaledWidth) / 2, - (context.getScaledWindowHeight() - scaledHeight) / 2, 0.0F, 0.0F, scaledWidth, scaledHeight, + scope.drawTexture(RenderLayer::getCrosshair, Textures.CROSSHAIR_RANGE, + (scope.getScaledWindowWidth() - scaledWidth) / 2, + (scope.getScaledWindowHeight() - scaledHeight) / 2, 0.0F, 0.0F, scaledWidth, scaledHeight, scaledWidth, scaledHeight); } } @Override public boolean isEnabled() { - return enabled.prop.value; + return enabled.value; } @Override public void setEnabled(boolean e) { - enabled.prop.value = e; + enabled.value = e; } } diff --git a/src/main/java/org/saturnclient/saturnclient/menus/SaturnMenu.java b/src/main/java/org/saturnclient/saturnclient/menus/SaturnMenu.java index d6ce73f..bc833ab 100644 --- a/src/main/java/org/saturnclient/saturnclient/menus/SaturnMenu.java +++ b/src/main/java/org/saturnclient/saturnclient/menus/SaturnMenu.java @@ -1,7 +1,6 @@ package org.saturnclient.saturnclient.menus; import org.saturnclient.ui2.SaturnScreen; -import org.saturnclient.ui2.elements.Button; public class SaturnMenu extends SaturnScreen { public SaturnMenu() { @@ -10,6 +9,5 @@ public class SaturnMenu extends SaturnScreen { @Override public void ui() { - draw(new Button("Settings").center(width, height)); } } diff --git a/src/main/java/org/saturnclient/saturnclient/menus/SaturnTitleScreen.java b/src/main/java/org/saturnclient/saturnclient/menus/SaturnTitleScreen.java index 2cc3785..d59a959 100644 --- a/src/main/java/org/saturnclient/saturnclient/menus/SaturnTitleScreen.java +++ b/src/main/java/org/saturnclient/saturnclient/menus/SaturnTitleScreen.java @@ -7,6 +7,7 @@ import org.saturnclient.ui.animations.FadeIn; import org.saturnclient.ui.animations.Slide; import org.saturnclient.ui.widgets.SaturnButton; import org.saturnclient.ui.widgets.SaturnImage; +import org.saturnclient.ui2.screens.ShiftMenu; import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; import net.minecraft.client.gui.screen.option.OptionsScreen; @@ -69,7 +70,7 @@ public class SaturnTitleScreen extends SaturnUi { bY += 20; draw(new SaturnButton("SATURN OPTIONS", () -> { - client.setScreen(new SaturnMenu()); + client.setScreen(new ShiftMenu()); }).setBold(true).setWidth(210).setHeight(26).setX(bX).setY(bY).setScale(0.69f)); super.init(); diff --git a/src/main/java/org/saturnclient/saturnclient/mod_utils/CameraOverriddenEntity.java b/src/main/java/org/saturnclient/saturnclient/mod_utils/CameraOverriddenEntity.java deleted file mode 100644 index a72664a..0000000 --- a/src/main/java/org/saturnclient/saturnclient/mod_utils/CameraOverriddenEntity.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.saturnclient.saturnclient.mod_utils; - -public interface CameraOverriddenEntity { - float freelook$getCameraPitch(); - float freelook$getCameraYaw(); - - void freelook$setCameraPitch(float pitch); - void freelook$setCameraYaw(float yaw); -} diff --git a/src/main/java/org/saturnclient/ui2/Element.java b/src/main/java/org/saturnclient/ui2/Element.java index cabd299..28ce456 100644 --- a/src/main/java/org/saturnclient/ui2/Element.java +++ b/src/main/java/org/saturnclient/ui2/Element.java @@ -5,8 +5,12 @@ public class Element { protected int y; protected int width; protected int height; + public boolean focused; - public void render(RenderScope renderScope, boolean hovering) { + public void render(RenderScope renderScope, RenderContext ctx) { + } + + public void click(int mouseX, int mouseY) { } public final void dimensions(int width, int height) { diff --git a/src/main/java/org/saturnclient/ui2/RenderContext.java b/src/main/java/org/saturnclient/ui2/RenderContext.java new file mode 100644 index 0000000..3ab4bff --- /dev/null +++ b/src/main/java/org/saturnclient/ui2/RenderContext.java @@ -0,0 +1,23 @@ +package org.saturnclient.ui2; + +public class RenderContext { + public int mouseX, mouseY; + public int elementX, elementY; + public int elementWidth, elementHeight; + + public RenderContext(int mouseX, int mouseY, Element e) { + this.mouseX = mouseX; + this.mouseY = mouseY; + this.elementX = e.x; + this.elementY = e.y; + this.elementWidth = e.width; + this.elementHeight = e.height; + } + + public boolean isHovering() { + return mouseX >= elementX && + mouseX <= elementX + elementWidth && + mouseY >= elementY && + mouseY <= elementY + elementHeight; + } +} diff --git a/src/main/java/org/saturnclient/ui2/RenderScope.java b/src/main/java/org/saturnclient/ui2/RenderScope.java index 1ebf58c..28387fd 100644 --- a/src/main/java/org/saturnclient/ui2/RenderScope.java +++ b/src/main/java/org/saturnclient/ui2/RenderScope.java @@ -1,7 +1,10 @@ package org.saturnclient.ui2; +import java.util.function.Function; + import org.joml.Matrix4f; import org.saturnclient.ui2.resources.Fonts; +import com.mojang.blaze3d.systems.RenderSystem; import org.saturnclient.saturnclient.SaturnClient; import net.minecraft.client.font.TextRenderer; @@ -133,4 +136,40 @@ public class RenderScope { this.matrices.pop(); } + + public int getScaledWindowWidth() { + return SaturnClient.client.getWindow().getScaledWidth(); + } + + public int getScaledWindowHeight() { + return SaturnClient.client.getWindow().getScaledHeight(); + } + + public void drawTexture(Function renderLayers, Identifier sprite, int x, int y, float u, float v, int width, int height, int textureWidth, int textureHeight, int color) { + this.drawTexture(renderLayers, sprite, x, y, u, v, width, height, width, height, textureWidth, textureHeight, color); + } + + public void drawTexture(Function renderLayers, Identifier sprite, int x, int y, float u, float v, int width, int height, int textureWidth, int textureHeight) { + this.drawTexture(renderLayers, sprite, x, y, u, v, width, height, width, height, textureWidth, textureHeight); + } + + public void drawTexture(Function renderLayers, Identifier sprite, int x, int y, float u, float v, int width, int height, int regionWith, int regionHeight, int textureWidth, int textureHeight) { + this.drawTexture(renderLayers, sprite, x, y, u, v, width, height, regionWith, regionHeight, textureWidth, textureHeight, -1); + } + + public void drawTexture(Function renderLayers, Identifier sprite, int x, int y, float u, float v, int width, int height, int regionWidth, int regionHeight, int textureWidth, int textureHeight, int color) { + this.drawTexturedQuad(renderLayers, sprite, x, x + width, y, y + height, (u + 0.0F) / (float)textureWidth, (u + (float)regionWidth) / (float)textureWidth, (v + 0.0F) / (float)textureHeight, (v + (float)regionHeight) / (float)textureHeight, color); + } + + private void drawTexturedQuad(Function renderLayers, Identifier sprite, int x1, int x2, int y1, int y2, float u1, float u2, float v1, float v2, int color) { + RenderSystem.setShaderTexture(0, sprite); + + RenderLayer renderLayer = (RenderLayer)renderLayers.apply(sprite); + Matrix4f matrix4f = this.matrices.peek().getPositionMatrix(); + VertexConsumer vertexConsumer = this.vertexConsumers.getBuffer(renderLayer); + vertexConsumer.vertex(matrix4f, (float)x1, (float)y1, 0.0F).texture(u1, v1).color(color); + vertexConsumer.vertex(matrix4f, (float)x1, (float)y2, 0.0F).texture(u1, v2).color(color); + vertexConsumer.vertex(matrix4f, (float)x2, (float)y2, 0.0F).texture(u2, v2).color(color); + vertexConsumer.vertex(matrix4f, (float)x2, (float)y1, 0.0F).texture(u2, v1).color(color); + } } diff --git a/src/main/java/org/saturnclient/ui2/SaturnScreen.java b/src/main/java/org/saturnclient/ui2/SaturnScreen.java index 70ef0eb..a115183 100644 --- a/src/main/java/org/saturnclient/ui2/SaturnScreen.java +++ b/src/main/java/org/saturnclient/ui2/SaturnScreen.java @@ -26,9 +26,7 @@ public class SaturnScreen extends Screen { @Override protected void init() { - ui(); - - // Do stuff + ui(); // abstraction to render the saturn ui and also render extra stuff here } public void ui() { @@ -43,22 +41,32 @@ public class SaturnScreen extends Screen { renderScope.matrices.push(); - for (int i = 0; i < elements.size(); i++) { - Element element = elements.get(i); - + for (Element element : elements) { renderScope.matrices.push(); renderScope.matrices.translate(element.x, element.y, 0); - element.render(renderScope, isMouseInside(mouseX, mouseY, element)); + element.render(renderScope, new RenderContext(mouseX, mouseY, element)); renderScope.matrices.pop(); } renderScope.matrices.pop(); } - public static boolean isMouseInside(int mouseX, int mouseY, Element element) { - return mouseX >= element.x && - mouseX <= (element.x + element.width) && - mouseY >= element.y && - mouseY <= (element.y + element.height); - } + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0) { + for (Element element : new ArrayList<>(elements)) { + element.focused = false; + + int adjustedMouseX = (int) mouseX - element.x; + int adjustedMouseY = (int) mouseY - element.y; + + if (Utils.isHovering(adjustedMouseX, adjustedMouseY, element.width, element.height)) { + element.focused = true; + element.click(adjustedMouseX, adjustedMouseY); + } + } + } + + return false; + } } diff --git a/src/main/java/org/saturnclient/ui2/Utils.java b/src/main/java/org/saturnclient/ui2/Utils.java new file mode 100644 index 0000000..3504adb --- /dev/null +++ b/src/main/java/org/saturnclient/ui2/Utils.java @@ -0,0 +1,10 @@ +package org.saturnclient.ui2; + +public class Utils { + public static boolean isHovering(int mouseX, int mouseY, int elementWidth, int elementHeight) { + return mouseX >= 0 && + mouseX <= elementWidth && + mouseY >= 0 && + mouseY <= elementHeight; + } +} diff --git a/src/main/java/org/saturnclient/ui2/elements/Button.java b/src/main/java/org/saturnclient/ui2/elements/Button.java index 7ff8204..75c0d6f 100644 --- a/src/main/java/org/saturnclient/ui2/elements/Button.java +++ b/src/main/java/org/saturnclient/ui2/elements/Button.java @@ -3,6 +3,7 @@ package org.saturnclient.ui2.elements; import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.ThemeManager; import org.saturnclient.ui2.Element; +import org.saturnclient.ui2.RenderContext; import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.resources.Fonts; @@ -20,16 +21,18 @@ public class Button extends Element { private String text; private Identifier font; + private Runnable onClick; - public Button(String text) { + public Button(String text, Runnable onClick) { this.text = text; this.font = Fonts.getFont(bold.value); + this.onClick = onClick; this.dimensions(Fonts.getWidth(text, font)+ 25 , Fonts.getHeight() + 10); } @Override - public void render(RenderScope renderScope, boolean hovering) { - if (hovering) { + public void render(RenderScope renderScope, RenderContext ctx) { + if (ctx.isHovering()) { theme.setState("hovering"); } else { theme.setState(null); @@ -38,4 +41,11 @@ public class Button extends Element { renderScope.drawText(text, width / 2 - Fonts.getWidth(text, font) / 2, height / 2 - Fonts.getHeight() / 2, bold.value, fgColor.value); } + + @Override + public void click(int mouseX, int mouseY) { + if (onClick != null) { + onClick.run(); + } + } } diff --git a/src/main/java/org/saturnclient/ui2/elements/Text.java b/src/main/java/org/saturnclient/ui2/elements/Text.java index e80ed57..70e8d9d 100644 --- a/src/main/java/org/saturnclient/ui2/elements/Text.java +++ b/src/main/java/org/saturnclient/ui2/elements/Text.java @@ -1,6 +1,7 @@ package org.saturnclient.ui2.elements; import org.saturnclient.ui2.Element; +import org.saturnclient.ui2.RenderContext; import org.saturnclient.ui2.RenderScope; public class Text extends Element { @@ -11,7 +12,7 @@ public class Text extends Element { } @Override - public void render(RenderScope renderScope, boolean hovering) { + public void render(RenderScope renderScope, RenderContext ctx) { renderScope.drawText(this.text, this.x, this.y, false, 0xFFFFFFFF); } } diff --git a/src/main/java/org/saturnclient/ui2/resources/Textures.java b/src/main/java/org/saturnclient/ui2/resources/Textures.java new file mode 100644 index 0000000..ff26eff --- /dev/null +++ b/src/main/java/org/saturnclient/ui2/resources/Textures.java @@ -0,0 +1,7 @@ +package org.saturnclient.ui2.resources; + +import net.minecraft.util.Identifier; + +public class Textures { + public static final Identifier CROSSHAIR_RANGE = Identifier.of("saturnclient", "textures/gui/hud/crosshair_range.png"); +} \ No newline at end of file diff --git a/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java b/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java new file mode 100644 index 0000000..ea281de --- /dev/null +++ b/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java @@ -0,0 +1,18 @@ +package org.saturnclient.ui2.screens; + +import org.saturnclient.saturnclient.SaturnClient; +import org.saturnclient.ui2.SaturnScreen; +import org.saturnclient.ui2.elements.Button; + +public class ShiftMenu extends SaturnScreen { + public ShiftMenu() { + super("Shift Menu"); + } + + @Override + public void ui() { + draw(new Button("Click Me!", () -> { + SaturnClient.LOGGER.info("Clicked!"); + }).center(width, height)); + } +}