some ui stuff

This commit is contained in:
2025-05-17 01:24:27 +02:00
parent 21daf473b1
commit 324ffe0c8b
7 changed files with 130 additions and 34 deletions
@@ -24,7 +24,7 @@ public class ModDimensions {
"Background Color", bgColor,
"Foreground Color", fgColor,
"Corner Radius", radius
)).named("Hud Position");
)).named("In-Game Display");
}
public ModDimensions(int width, int height) {
@@ -25,15 +25,30 @@ public class ArmorDisplay extends Module implements HudMod {
}
public void renderArmor(RenderScope scope, ItemStack helmet, ItemStack chestplate, ItemStack leggings, ItemStack boots) {
scope.drawItem(helmet, 0, 0);
scope.drawItem(chestplate, 0, 15);
scope.drawItem(leggings, 0, 30);
scope.drawItem(boots, 0, 45);
int row = 0;
renderHealth(scope, 0, helmet.getMaxDamage(), helmet.getDamage());
renderHealth(scope, 1, chestplate.getMaxDamage(), chestplate.getDamage());
renderHealth(scope, 2, leggings.getMaxDamage(), leggings.getDamage());
renderHealth(scope, 3, boots.getMaxDamage(), boots.getDamage());
if (!helmet.isEmpty()) {
scope.drawItem(helmet, 0, 0);
renderHealth(scope, row, helmet.getMaxDamage(), helmet.getDamage());
row++;
}
if (!chestplate.isEmpty()) {
scope.drawItem(chestplate, 0, 15 * row);
renderHealth(scope, row, chestplate.getMaxDamage(), chestplate.getDamage());
row++;
}
if (!leggings.isEmpty()) {
scope.drawItem(leggings, 0, 15 * row);
renderHealth(scope, row, leggings.getMaxDamage(), leggings.getDamage());
row++;
}
if (!boots.isEmpty()) {
scope.drawItem(boots, 0, 15 * row);
renderHealth(scope, row, boots.getMaxDamage(), boots.getDamage());
row++;
}
}
public void renderHealth(RenderScope scope, int i, int max, int current) {
@@ -17,6 +17,8 @@ public class ColorDialog extends SaturnScreen {
private static final int PICKER_HEIGHT = 200;
private static final int SLIDER_WIDTH = 200;
private static final int SLIDER_HEIGHT = 10;
private static final int HUE_SLIDER_HEIGHT = 10;
private float hue = 0.0f;
private int selectedX = 0;
private int selectedY = 0;
@@ -32,6 +34,7 @@ public class ColorDialog extends SaturnScreen {
int alpha = (prop.value >> 24) & 0xFF;
if (alpha == 0) alpha = 255; // fallback if no alpha specified
this.opacity = alpha / 255.0f;
syncFromColor();
}
@Override
@@ -55,12 +58,12 @@ public class ColorDialog extends SaturnScreen {
int xStart = (width - PICKER_WIDTH) / 2;
int yStart = (height - PICKER_HEIGHT) / 2;
// Draw the HSV hue/saturation square (brightness fixed at 1)
// Draw the HSV saturation/value square (with current hue)
for (int x = 0; x < PICKER_WIDTH; x++) {
for (int y = 0; y < PICKER_HEIGHT; y++) {
float hue = x / (float) PICKER_WIDTH;
float saturation = y / (float) PICKER_HEIGHT;
int color = Color.HSBtoRGB(hue, saturation, 1.0f);
float saturation = x / (float) PICKER_WIDTH;
float value = 1.0f - y / (float) PICKER_HEIGHT;
int color = Color.HSBtoRGB(hue, saturation, value);
context.fill(xStart + x, yStart + y, xStart + x + 1, yStart + y + 1, 0xFF000000 | color);
}
}
@@ -71,6 +74,7 @@ public class ColorDialog extends SaturnScreen {
context.drawBorder(x, y, 8, 8, 0xFFffffff);
renderSlider(context, mouseX, mouseY, delta);
renderHueSlider(context);
renderScope.matrices.pop();
}
@@ -95,6 +99,20 @@ public class ColorDialog extends SaturnScreen {
// context.drawText(textRenderer, String.format("Opacity: %.2f", opacity), xStart, yStart - 15, 0xFFFFFF, false);
}
private void renderHueSlider(DrawContext context) {
int xStart = (width - SLIDER_WIDTH) / 2;
int yStart = (height + PICKER_HEIGHT) / 2 + 10;
for (int x = 0; x < SLIDER_WIDTH; x++) {
float localHue = x / (float) SLIDER_WIDTH;
int color = Color.HSBtoRGB(localHue, 1.0f, 1.0f);
context.fill(xStart + x, yStart, xStart + x + 1, yStart + HUE_SLIDER_HEIGHT, 0xFF000000 | color);
}
int knobX = xStart + (int)(hue * SLIDER_WIDTH);
context.fill(knobX - 1, yStart - 2, knobX + 1, yStart + HUE_SLIDER_HEIGHT + 2, 0xFF000000);
}
@Override
public boolean mouseClicked(double mouseX, double mouseY, int button) {
mouseX *= 2;
@@ -107,9 +125,9 @@ public class ColorDialog extends SaturnScreen {
int relY = (int) mouseY - yStart;
if (relX >= 0 && relX < PICKER_WIDTH && relY >= 0 && relY < PICKER_HEIGHT) {
float hue = relX / (float) PICKER_WIDTH;
float saturation = relY / (float) PICKER_HEIGHT;
prop.value = Color.HSBtoRGB(hue, saturation, 1.0f);
float saturation = relX / (float) PICKER_WIDTH;
float value = 1.0f - relY / (float) PICKER_HEIGHT;
prop.value = Color.HSBtoRGB(hue, saturation, value);
int alpha = (int)(opacity * 255) & 0xFF;
prop.value = (alpha << 24) | (prop.value & 0xFFFFFF);
@@ -122,6 +140,9 @@ public class ColorDialog extends SaturnScreen {
updateOpacity(mouseX);
dragging = true;
return true;
} else if (isInHueSlider(mouseX, mouseY)) {
updateHue(mouseX);
return true;
}
return super.mouseClicked(mouseX, mouseY, button);
@@ -138,7 +159,10 @@ public class ColorDialog extends SaturnScreen {
mouseX *= 2;
mouseY *= 2;
if (dragging) {
if (isInHueSlider(mouseX, mouseY)) {
updateHue(mouseX);
return true;
} else if (dragging) {
updateOpacity(mouseX);
return true;
} else {
@@ -149,9 +173,9 @@ public class ColorDialog extends SaturnScreen {
int relY = (int) mouseY - yStart;
if (relX >= 0 && relX < PICKER_WIDTH && relY >= 0 && relY < PICKER_HEIGHT) {
float hue = relX / (float) PICKER_WIDTH;
float saturation = relY / (float) PICKER_HEIGHT;
prop.value = Color.HSBtoRGB(hue, saturation, 1.0f);
float saturation = relX / (float) PICKER_WIDTH;
float value = 1.0f - relY / (float) PICKER_HEIGHT;
prop.value = Color.HSBtoRGB(hue, saturation, value);
int alpha = (int)(opacity * 255) & 0xFF;
prop.value = (alpha << 24) | (prop.value & 0xFFFFFF);
@@ -173,6 +197,13 @@ public class ColorDialog extends SaturnScreen {
mouseY >= yStart && mouseY <= yStart + SLIDER_HEIGHT;
}
private boolean isInHueSlider(double mouseX, double mouseY) {
int xStart = (width - SLIDER_WIDTH) / 2;
int yStart = (height + PICKER_HEIGHT) / 2 + 10;
return mouseX >= xStart && mouseX <= xStart + SLIDER_WIDTH &&
mouseY >= yStart && mouseY <= yStart + HUE_SLIDER_HEIGHT;
}
private void updateOpacity(double mouseX) {
int xStart = (width - SLIDER_WIDTH) / 2;
float newOpacity = (float)((mouseX - xStart) / SLIDER_WIDTH);
@@ -181,4 +212,35 @@ public class ColorDialog extends SaturnScreen {
int alpha = (int)(opacity * 255) & 0xFF;
prop.value = (alpha << 24) | (prop.value & 0xFFFFFF);
}
private void updateHue(double mouseX) {
int xStart = (width - SLIDER_WIDTH) / 2;
float newHue = (float)((mouseX - xStart) / SLIDER_WIDTH);
hue = Math.max(0.0f, Math.min(1.0f, newHue));
float saturation = selectedX / (float) PICKER_WIDTH;
float value = 1.0f - selectedY / (float) PICKER_HEIGHT;
prop.value = Color.HSBtoRGB(hue, saturation, value);
int alpha = (int)(opacity * 255) & 0xFF;
prop.value = (alpha << 24) | (prop.value & 0xFFFFFF);
}
private void syncFromColor() {
int rgb = prop.value & 0xFFFFFF;
float[] hsb = Color.RGBtoHSB((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF, null);
this.hue = hsb[0];
float saturation = hsb[1];
float value = hsb[2];
this.selectedX = (int)(saturation * PICKER_WIDTH);
this.selectedY = (int)((1.0f - value) * PICKER_HEIGHT);
// Extract alpha and convert to opacity float
int alpha = (prop.value >> 24) & 0xFF;
if (alpha == 0) alpha = 255;
this.opacity = alpha / 255.0f;
}
}
@@ -14,7 +14,7 @@ public class HexInput extends Element {
public HexInput(Property<Integer> prop, SaturnScreen screen) {
this.width = 58;
this.height = 18;
this.height = 20;
this.prop = prop;
this.scale = 0.8f;
this.screen = screen;
@@ -42,10 +42,10 @@ public abstract class Input extends Element {
String visibleText = text.substring(scrollOffset);
int newCursorPos = scrollOffset;
int textWidth = 0;
float textWidth = 0;
for (int i = 0; i < visibleText.length(); i++) {
textWidth = SaturnClient.client.textRenderer.getWidth(visibleText.substring(0, i + 1));
textWidth = SaturnClient.client.textRenderer.getWidth(visibleText.substring(0, i + 1)) * 0.6f;
if (textWidth > mouseX) {
break;
@@ -66,14 +66,14 @@ public abstract class Input extends Element {
int scrollOffset = getScrollOffset();
String visibleText = getVisibleText(scrollOffset);
int textColor = focused ? 0xFFFFFF : 0xAAAAAA;
renderScope.drawText(0.6f, visibleText, 2, 2, false, textColor);
renderScope.drawText(0.6f, visibleText, 4, 4, false, textColor);
if (focused) {
int cursorX = 2 +
SaturnClient.client.textRenderer.getWidth(
Fonts.setFont(visibleText.substring(0, cursorPosition - scrollOffset)));
int cursorX = 4 +
(int) (SaturnClient.client.textRenderer.getWidth(
Fonts.setFont(visibleText.substring(0, cursorPosition - scrollOffset))) * 0.6f);
renderScope.drawRect(cursorX, 2, 1, height - 1, 0xFFFFFFFF);
renderScope.drawRect(cursorX, 2, 1, height - 4, 0xFFFFFFFF);
}
}
@@ -12,6 +12,7 @@ import org.saturnclient.ui2.components.inputs.IntInput;
import org.saturnclient.ui2.components.inputs.Toggle;
import org.saturnclient.ui2.elements.Scroll;
import org.saturnclient.ui2.elements.Text;
import org.saturnclient.ui2.resources.Fonts;
public class ConfigEditor extends SaturnScreen {
private ConfigManager config;
@@ -54,10 +55,17 @@ public class ConfigEditor extends SaturnScreen {
int modX = (w / 2) * col; // two-column layout
int modY = 25 * row;
configScroll.draw(
if (prop.getType() == Property.PropertyType.NAMESPACE) {
configScroll.draw(
new Text(
propName.substring(0, 1).toUpperCase() + propName.substring(1)
).position(modX, modY + 1).scale(0.7f));
propName
).position(Fonts.centerX(520, propName, false), modY + 1).scale(0.7f));
} else {
configScroll.draw(
new Text(
propName
).position(modX, modY + 1).scale(0.7f));
}
switch (prop.getType()) {
case BOOLEAN:
@@ -83,6 +91,7 @@ public class ConfigEditor extends SaturnScreen {
Map<String, Property<?>> nestedProperties = (Map<String, Property<?>>) prop.value;
row = drawProperties(configScroll, nestedProperties, row + 1, col, w);
break;
case STRING:
}
if (full) {
@@ -12,6 +12,7 @@ import org.saturnclient.ui2.components.inputs.IntInput;
import org.saturnclient.ui2.components.inputs.Toggle;
import org.saturnclient.ui2.elements.Scroll;
import org.saturnclient.ui2.elements.Text;
import org.saturnclient.ui2.resources.Fonts;
public class SaturnConfigEditor extends SaturnScreen {
public SaturnConfigEditor() {
@@ -50,10 +51,17 @@ public class SaturnConfigEditor extends SaturnScreen {
int modX = (w / 2) * col; // two-column layout
int modY = 25 * row;
configScroll.draw(
if (prop.getType() == Property.PropertyType.NAMESPACE) {
configScroll.draw(
new Text(
propName.substring(0, 1).toUpperCase() + propName.substring(1)
).position(modX, modY + 1).scale(0.7f));
propName
).position(Fonts.centerX(520, propName, false), modY + 1).scale(0.7f));
} else {
configScroll.draw(
new Text(
propName
).position(modX, modY + 1).scale(0.7f));
}
switch (prop.getType()) {
case BOOLEAN:
@@ -79,6 +87,8 @@ public class SaturnConfigEditor extends SaturnScreen {
Map<String, Property<?>> nestedProperties = (Map<String, Property<?>>) prop.value;
row = drawProperties(configScroll, nestedProperties, row + 1, col, w);
break;
case STRING:
}
if (full) {