animations and added string configs

This commit is contained in:
2025-03-26 16:11:51 +01:00
parent 1c849af6fc
commit 6fc49863e1
15 changed files with 289 additions and 146 deletions
@@ -9,6 +9,9 @@ import org.saturnclient.saturnclient.cloaks.Cloaks;
import org.saturnclient.saturnclient.config.ConfigManager;
import org.saturnclient.saturnclient.event.KeyInputHandler;
import org.saturnclient.saturnmods.ModManager;
import org.saturnclient.ui.SaturnAnimation;
import org.saturnclient.ui.animations.FadeIn;
import org.saturnclient.ui.animations.Slide;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -29,13 +32,18 @@ public class SaturnClient implements ModInitializer {
return ((int) (alpha * 255) << 24) | (NORMAL & 0x00FFFFFF);
}
public static SaturnAnimation[] getAnimations() {
return new SaturnAnimation[] { new FadeIn(1), new Slide(3, 15) };
}
@Override
public void onInitialize() {
LOGGER.info("Initializing " + MOD_ID);
ModManager.init();
ConfigManager.load();
ClientLifecycleEvents.CLIENT_STOPPING.register(_ -> ConfigManager.save()
ClientLifecycleEvents.CLIENT_STOPPING.register(_o ->
ConfigManager.save()
);
KeyInputHandler.register();
@@ -27,7 +27,7 @@ public class SaturnSocket {
@SuppressWarnings("resource")
public static boolean authenticate() {
// Register shutdown hook ONCE
ClientLifecycleEvents.CLIENT_STOPPING.register(_ -> close());
ClientLifecycleEvents.CLIENT_STOPPING.register(_o -> close());
try {
MinecraftClient client = MinecraftClient.getInstance();
@@ -4,8 +4,12 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
public class Property<T> {
public enum PropertyType {
BOOLEAN, INTEGER, FLOAT, STRING, UNKNOWN
BOOLEAN,
INTEGER,
FLOAT,
STRING,
}
public T value;
@@ -55,20 +59,16 @@ public class Property<T> {
if (value instanceof String) {
return PropertyType.STRING;
}
return PropertyType.UNKNOWN;
return null;
}
public boolean matchesJson(JsonElement element) {
if (element.isJsonPrimitive()) {
JsonPrimitive primitive = element.getAsJsonPrimitive();
if (value instanceof Boolean && primitive.isBoolean())
return true;
if (value instanceof Integer && primitive.isNumber())
return true;
if (value instanceof Float && primitive.isNumber())
return true;
if (value instanceof String && primitive.isString())
return true;
if (value instanceof Boolean && primitive.isBoolean()) return true;
if (value instanceof Integer && primitive.isNumber()) return true;
if (value instanceof Float && primitive.isNumber()) return true;
if (value instanceof String && primitive.isString()) return true;
}
return false;
}
@@ -1,11 +1,11 @@
package org.saturnclient.saturnclient.menus;
import net.minecraft.text.Text;
import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.saturnclient.auth.SaturnSocket;
import org.saturnclient.saturnclient.cloaks.Cloaks;
import org.saturnclient.ui.SaturnUi;
import org.saturnclient.ui.Textures;
import org.saturnclient.ui.animations.Slide;
import org.saturnclient.ui.widgets.SaturnClickableSprite;
import org.saturnclient.ui.widgets.SaturnImage;
import org.saturnclient.ui.widgets.SaturnScroll;
@@ -30,7 +30,7 @@ public class CloaksMenu extends SaturnUi {
.setY(rectY)
.setWidth(rectWidth)
.setHeight(rectHeight)
.setAnimations(new Slide(1, 10))
.setAnimations(SaturnClient.getAnimations())
);
int tabsX = (width - 43) / 2;
@@ -42,7 +42,7 @@ public class CloaksMenu extends SaturnUi {
.setY(tabsY)
.setWidth(43)
.setHeight(15)
.setAnimations(new Slide(1, 10))
.setAnimations(SaturnClient.getAnimations())
);
int cloakWidth = 32;
@@ -91,7 +91,7 @@ public class CloaksMenu extends SaturnUi {
.setY(rectY + 10)
.setWidth(rectWidth - 17)
.setHeight(rectHeight - 10)
.setAnimations(new Slide(1, 10))
.setAnimations(SaturnClient.getAnimations())
);
super.init();
@@ -2,11 +2,11 @@ package org.saturnclient.saturnclient.menus;
import java.util.Map;
import net.minecraft.text.Text;
import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.saturnclient.config.ConfigManager;
import org.saturnclient.saturnclient.config.Property;
import org.saturnclient.ui.SaturnUi;
import org.saturnclient.ui.Textures;
import org.saturnclient.ui.animations.Slide;
import org.saturnclient.ui.components.SaturnFloat;
import org.saturnclient.ui.components.SaturnInteger;
import org.saturnclient.ui.components.SaturnString;
@@ -38,7 +38,7 @@ public class ConfigEditor extends SaturnUi {
.setY(rectY)
.setWidth(rectWidth)
.setHeight(rectHeight)
.setAnimations(new Slide(1, 10))
.setAnimations(SaturnClient.getAnimations())
);
int tabsX = (width - 43) / 2;
@@ -50,7 +50,7 @@ public class ConfigEditor extends SaturnUi {
.setY(tabsY)
.setWidth(43)
.setHeight(15)
.setAnimations(new Slide(1, 10))
.setAnimations(SaturnClient.getAnimations())
);
SaturnScroll configScroll = new SaturnScroll();
@@ -170,6 +170,7 @@ public class ConfigEditor extends SaturnUi {
.setY(rectY + 10)
.setWidth(rectWidth - 17)
.setHeight(rectHeight - 10)
.setAnimations(SaturnClient.getAnimations())
);
super.init();
@@ -1,17 +1,18 @@
package org.saturnclient.saturnclient.menus;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text;
import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.ui.SaturnUi;
import org.saturnclient.ui.Textures;
import org.saturnclient.ui.animations.FadeIn;
import org.saturnclient.ui.animations.Slide;
import org.saturnclient.ui.widgets.SaturnButton;
import org.saturnclient.ui.widgets.SaturnImageButton;
import org.saturnclient.ui.widgets.SaturnImage;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text;
import org.saturnclient.ui.widgets.SaturnImageButton;
public class MainMenu extends SaturnUi {
public MainMenu() {
super(Text.literal("Saturn Client"));
}
@@ -24,52 +25,57 @@ public class MainMenu extends SaturnUi {
int buttonHeight = 25;
draw(
new SaturnButton("Mods", () -> {
client.setScreen(new ModMenu());
}).setX((width - buttonWidth) / 2).setY((height - buttonHeight) /
2).setWidth(buttonWidth)
.setHeight(buttonHeight)
.setAnimations(new FadeIn(2)));
new SaturnButton("Mods", () -> {
client.setScreen(new ModMenu());
})
.setX((width - buttonWidth) / 2)
.setY((height - buttonHeight) / 2)
.setWidth(buttonWidth)
.setHeight(buttonHeight)
.setAnimations(new FadeIn(2))
);
draw(
new SaturnImageButton(Textures.HUD_ICON, 14, 14,
() -> {
client.setScreen(new HudEditor());
})
.setX((width - buttonWidth - (buttonHeight * 2) - 6) / 2)
.setY((height - buttonHeight) / 2)
.setWidth(buttonHeight)
.setHeight(buttonHeight)
.setAnimations(new FadeIn(2)));
new SaturnImageButton(Textures.HUD_ICON, 14, 14, () -> {
client.setScreen(new HudEditor());
})
.setX((width - buttonWidth - (buttonHeight * 2) - 6) / 2)
.setY((height - buttonHeight) / 2)
.setWidth(buttonHeight)
.setHeight(buttonHeight)
.setAnimations(new FadeIn(2))
);
draw(
new SaturnImageButton(Textures.COSMETICS, 14, 14,
() -> {
client.setScreen(new CloaksMenu());
})
.setX((width / 2) + (buttonWidth / 2) + 3)
.setY((height - buttonHeight) / 2)
.setWidth(buttonHeight)
.setHeight(buttonHeight)
.setAnimations(new FadeIn(2)));
new SaturnImageButton(Textures.COSMETICS, 14, 14, () -> {
client.setScreen(new CloaksMenu());
})
.setX((width / 2) + (buttonWidth / 2) + 3)
.setY((height - buttonHeight) / 2)
.setWidth(buttonHeight)
.setHeight(buttonHeight)
.setAnimations(new FadeIn(2))
);
int logoSize = 49;
draw(
new SaturnImage(Textures.LOGO_TEXT)
.setX((width - logoSize) / 2)
.setY((height - 8) / 2 - 23)
.setWidth(logoSize)
.setHeight(8)
.setAnimations(new FadeIn(2)));
new SaturnImage(Textures.LOGO_TEXT)
.setX((width - logoSize) / 2)
.setY((height - 8) / 2 - 23)
.setWidth(logoSize)
.setHeight(8)
.setAnimations(new FadeIn(2))
);
draw(
new SaturnImage(Textures.LOGO)
.setX((width - logoSize) / 2)
.setY(height / 2 - logoSize - 24)
.setWidth(logoSize)
.setHeight(logoSize)
.setAnimations(new Slide(2, 14)));
new SaturnImage(Textures.LOGO)
.setX((width - logoSize) / 2)
.setY(height / 2 - logoSize - 24)
.setWidth(logoSize)
.setHeight(logoSize)
.setAnimations(new Slide(2, 14))
);
super.init();
}
@@ -7,8 +7,6 @@ import org.saturnclient.saturnmods.ModManager;
import org.saturnclient.saturnmods.SaturnMod;
import org.saturnclient.ui.SaturnUi;
import org.saturnclient.ui.Textures;
import org.saturnclient.ui.animations.FadeIn;
import org.saturnclient.ui.animations.Slide;
import org.saturnclient.ui.components.SaturnModComp;
import org.saturnclient.ui.widgets.SaturnClickableImage;
import org.saturnclient.ui.widgets.SaturnScroll;
@@ -33,7 +31,7 @@ public class ModMenu extends SaturnUi {
.setY(modsY)
.setWidth(rectWidth)
.setHeight(rectHeight)
.setAnimations(new Slide(1, 10))
.setAnimations(SaturnClient.getAnimations())
);
int tabsX = (width - 43) / 2;
@@ -45,7 +43,7 @@ public class ModMenu extends SaturnUi {
.setY(tabsY)
.setWidth(43)
.setHeight(15)
.setAnimations(new Slide(1, 10))
.setAnimations(SaturnClient.getAnimations())
);
int tabSize = 9;
@@ -58,8 +56,7 @@ public class ModMenu extends SaturnUi {
.setY(tabsY + 3)
.setWidth(tabSize)
.setHeight(tabSize)
.setAnimations(new FadeIn(2))
.setAnimations(new Slide(1, 10))
.setAnimations(SaturnClient.getAnimations())
);
draw(
@@ -70,8 +67,7 @@ public class ModMenu extends SaturnUi {
.setY(tabsY + 3)
.setWidth(tabSize)
.setHeight(tabSize)
.setAnimations(new FadeIn(2))
.setAnimations(new Slide(1, 10))
.setAnimations(SaturnClient.getAnimations())
);
draw(
@@ -82,8 +78,7 @@ public class ModMenu extends SaturnUi {
.setY(tabsY + 3)
.setWidth(tabSize)
.setHeight(tabSize)
.setAnimations(new FadeIn(2))
.setAnimations(new Slide(1, 10))
.setAnimations(SaturnClient.getAnimations())
);
int modX = 0;
@@ -119,7 +114,7 @@ public class ModMenu extends SaturnUi {
.setY(modsY + 10)
.setWidth(rectWidth - 17)
.setHeight(rectHeight - 20)
.setAnimations(new Slide(1, 10))
.setAnimations(SaturnClient.getAnimations())
);
super.init();
@@ -11,49 +11,10 @@ import org.saturnclient.saturnmods.mods.Coordinates;
public class ModManager {
public static SaturnMod[] MODS = {
new Coordinates(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new ArmorDisplay(),
new Coordinates(),
};
public static SaturnMod[] MODS = { new Coordinates(), new ArmorDisplay() };
public static void init() {
HudRenderCallback.EVENT.register((context, _) -> {
HudRenderCallback.EVENT.register((context, _o) -> {
MinecraftClient client = MinecraftClient.getInstance();
TextRenderer textRenderer = client.textRenderer;
+20 -18
View File
@@ -63,11 +63,13 @@ public class SaturnUi extends Screen {
for (SaturnWidget widget : new ArrayList<>(widgets)) {
if (!widget.visible) continue;
double adjustedMouseX = mouseX - widget.x;
double adjustedMouseY = mouseY - widget.y;
boolean isMouseInside =
widget.x < mouseX &&
widget.x + widget.width > mouseX &&
widget.y < mouseY &&
widget.y + widget.height > mouseY;
adjustedMouseX >= 0 &&
adjustedMouseX <= (widget.width * widget.scale) &&
adjustedMouseY >= 0 &&
adjustedMouseY <= (widget.height * widget.scale);
MatrixStack matrices = context.getMatrices();
matrices.push();
@@ -76,8 +78,8 @@ public class SaturnUi extends Screen {
widget.render(
context,
isMouseInside,
mouseX - widget.x,
mouseY - widget.y
(int) (adjustedMouseX / widget.scale),
(int) (adjustedMouseY / widget.scale)
);
matrices.pop();
}
@@ -90,13 +92,13 @@ public class SaturnUi extends Screen {
widget.focused = false;
if (!widget.visible) continue;
double adjustedMouseX = (mouseX - widget.x) / widget.scale;
double adjustedMouseY = (mouseY - widget.y) / widget.scale;
double adjustedMouseX = mouseX - widget.x;
double adjustedMouseY = mouseY - widget.y;
boolean isMouseInside =
adjustedMouseX >= 0 &&
adjustedMouseX <= widget.width &&
adjustedMouseX <= (widget.width * widget.scale) &&
adjustedMouseY >= 0 &&
adjustedMouseY <= widget.height;
adjustedMouseY <= (widget.height * widget.scale);
SaturnClient.LOGGER.info(
"CLick mouse X: " +
@@ -108,8 +110,8 @@ public class SaturnUi extends Screen {
if (isMouseInside) {
widget.focused = true;
widget.click(
((int) mouseX) - widget.x,
((int) mouseY) - widget.y
(int) (adjustedMouseX / widget.scale),
(int) (adjustedMouseY / widget.scale)
);
}
}
@@ -141,18 +143,18 @@ public class SaturnUi extends Screen {
double verticalAmount
) {
for (SaturnWidget widget : new ArrayList<>(widgets)) {
double adjustedMouseX = (mouseX - widget.x) / widget.scale;
double adjustedMouseY = (mouseY - widget.y) / widget.scale;
double adjustedMouseX = mouseX - widget.x;
double adjustedMouseY = mouseY - widget.y;
boolean isMouseInside =
adjustedMouseX >= 0 &&
adjustedMouseX <= widget.width &&
adjustedMouseX <= (widget.width * widget.scale) &&
adjustedMouseY >= 0 &&
adjustedMouseY <= widget.height;
adjustedMouseY <= (widget.height * widget.scale);
if (isMouseInside) {
widget.mouseScrolled(
((int) mouseX) - widget.x,
((int) mouseY) - widget.y,
(int) (adjustedMouseX / widget.scale),
(int) (adjustedMouseY / widget.scale),
horizontalAmount,
verticalAmount
);
@@ -40,7 +40,7 @@ public class SaturnFloat extends SaturnWidget {
for (int i = 0; i < visibleText.length(); i++) {
textWidth = textRenderer.getWidth(visibleText.substring(0, i + 1));
if (textWidth > (mouseX - x)) {
if (textWidth > mouseX) {
break;
}
@@ -0,0 +1,168 @@
package org.saturnclient.ui.components;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.RenderLayer;
import org.lwjgl.glfw.GLFW;
import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.saturnclient.config.Property;
import org.saturnclient.ui.SaturnUi;
import org.saturnclient.ui.SaturnWidget;
import org.saturnclient.ui.Textures;
public class SaturnString extends SaturnWidget {
public Property<String> prop;
public int cursorPosition = 0;
private TextRenderer textRenderer = MinecraftClient.getInstance()
.textRenderer;
public SaturnString(Property<String> prop, int x, int y, int width) {
this.x = x;
this.y = y;
this.width = width;
this.prop = prop;
this.height = textRenderer.fontHeight + 4;
this.scale = 0.8f;
}
@Override
public void click(int mouseX, int mouseY) {
int scrollOffset = getScrollOffset();
String visibleText = prop.value.substring(scrollOffset);
int newCursorPos = scrollOffset;
int textWidth = 0;
for (int i = 0; i < visibleText.length(); i++) {
textWidth = textRenderer.getWidth(visibleText.substring(0, i + 1));
if (textWidth > mouseX) {
break;
}
newCursorPos++;
}
cursorPosition = newCursorPos;
}
@Override
public void charTyped(char chr) {
prop.value =
prop.value.substring(0, cursorPosition) +
chr +
prop.value.substring(cursorPosition);
cursorPosition++;
}
@Override
public void keyPressed(int keyCode, int scanCode, int modifiers) {
if (keyCode == GLFW.GLFW_KEY_BACKSPACE) {
if (cursorPosition > 0) {
prop.value =
prop.value.substring(0, cursorPosition - 1) +
prop.value.substring(cursorPosition);
cursorPosition--;
}
} else if (keyCode == GLFW.GLFW_KEY_LEFT) {
if (cursorPosition > 0) {
cursorPosition--;
}
} else if (keyCode == GLFW.GLFW_KEY_RIGHT) {
if (cursorPosition < prop.value.length()) {
cursorPosition++;
}
}
}
@Override
public void render(
DrawContext context,
boolean hovering,
int mouseX,
int mouseY
) {
context.drawGuiTexture(
RenderLayer::getGuiTextured,
Textures.BUTTON_BORDER,
0,
0,
this.width,
this.height,
focused ? SaturnClient.COLOR : SaturnClient.getWhite(this.alpha)
);
int scrollOffset = getScrollOffset();
String visibleText = getVisibleText(scrollOffset);
int textColor = focused ? 0xFFFFFF : 0xAAAAAA;
context.drawText(
textRenderer,
SaturnUi.text(visibleText),
2,
2,
textColor,
false
);
if (focused) {
int cursorX =
2 +
textRenderer.getWidth(
SaturnUi.text(
visibleText.substring(0, cursorPosition - scrollOffset)
)
);
context.fill(
cursorX,
2,
cursorX + 1,
textRenderer.fontHeight + 3,
0xFFFFFFFF
);
}
}
public void clearText() {
prop.value = "";
cursorPosition = 1;
}
private int getScrollOffset() {
if (prop.value.isEmpty()) {
return 0;
}
int offset = 0;
int maxWidth = width - 4; // Available width for prop.value
while (offset < cursorPosition) { // Ensure cursor remains visible
String visibleText = prop.value.substring(offset, cursorPosition);
if (textRenderer.getWidth(SaturnUi.text(visibleText)) > maxWidth) {
offset++;
} else {
break;
}
}
return offset;
}
private String getVisibleText(int scrollOffset) {
String visibleText = prop.value.substring(scrollOffset);
// Ensure prop.value does not overflow past the available width
for (int i = 1; i <= visibleText.length(); i++) {
if (
textRenderer.getWidth(
SaturnUi.text(visibleText.substring(0, i))
) >
width - 4
) {
return visibleText.substring(0, i - 1); // Trim overflow
}
}
return visibleText;
}
}
@@ -25,7 +25,7 @@ public class SaturnClickableImage extends SaturnWidget {
}
public SaturnClickableImage(Identifier texture, Runnable onPress) {
this(texture, _ -> {
this(texture, _o -> {
onPress.run();
});
}
@@ -25,7 +25,7 @@ public class SaturnClickableSprite extends SaturnWidget {
}
public SaturnClickableSprite(Identifier sprite, Runnable onPress) {
this(sprite, _ -> {
this(sprite, _o -> {
onPress.run();
});
}
@@ -19,7 +19,7 @@ public class SaturnImageButton extends SaturnButton {
int imageHeight,
Consumer<SaturnImageButton> onPress
) {
super("", _ -> {});
super("", _o -> {});
this.sprite = sprite;
this.imageWidth = imageWidth;
this.imageHeight = imageHeight;
@@ -32,7 +32,7 @@ public class SaturnImageButton extends SaturnButton {
int imageHeight,
Runnable onPress
) {
this(sprite, imageWidth, imageHeight, _ -> {
this(sprite, imageWidth, imageHeight, _o -> {
onPress.run();
});
}
@@ -42,13 +42,13 @@ public class SaturnScroll extends SaturnWidget {
for (SaturnWidget widget : children) {
if (!widget.visible) continue;
double adjustedMouseX = (mouseX - widget.x) * scale;
double adjustedMouseY = (mouseY - widget.y + scroll) * scale;
double adjustedMouseX = (mouseX - widget.x);
double adjustedMouseY = (mouseY - widget.y + scroll);
boolean isMouseInside =
adjustedMouseX >= 0 &&
adjustedMouseX <= widget.width &&
adjustedMouseX <= (widget.width * widget.scale) &&
adjustedMouseY >= 0 &&
adjustedMouseY <= widget.height;
adjustedMouseY <= (widget.height * widget.scale);
if (
widget.y - scroll < height && widget.y + widget.height > scroll
@@ -61,8 +61,8 @@ public class SaturnScroll extends SaturnWidget {
widget.render(
context,
isMouseInside,
(int) adjustedMouseX,
(int) adjustedMouseY
(int) (adjustedMouseX / widget.scale),
(int) (adjustedMouseY / widget.scale)
);
matrices.pop();
}
@@ -126,18 +126,20 @@ public class SaturnScroll extends SaturnWidget {
continue;
}
double adjustedMouseX = (mouseX - widget.x) * scale;
double adjustedMouseY =
(mouseY - (widget.y - scroll)) * widget.scale;
double adjustedMouseX = (mouseX - widget.x);
double adjustedMouseY = (mouseY - (widget.y - scroll));
boolean isMouseInside =
adjustedMouseX >= 0 &&
adjustedMouseX <= widget.width &&
adjustedMouseX <= (widget.width * widget.scale) &&
adjustedMouseY >= 0 &&
adjustedMouseY <= widget.height;
adjustedMouseY <= (widget.height * widget.scale);
if (isMouseInside) {
widget.focused = true;
widget.click((int) adjustedMouseX, (int) adjustedMouseY);
widget.click(
(int) (adjustedMouseX / widget.scale),
(int) (adjustedMouseY / widget.scale)
);
}
}
}