From 9cef44d9fea5fe6a48e28f42c45fe17208d46be4 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Mon, 31 Mar 2025 13:31:25 +0200 Subject: [PATCH] High resolution ui --- .../saturnclient/SaturnClient.java | 1 - .../saturnclient/cosmetics/cloaks/Cloaks.java | 1 + .../saturnclient/menus/MainMenu.java | 77 +++++---- .../java/org/saturnclient/ui/SaturnUi.java | 40 +++++ .../ui/components/SaturnFloat.java | 89 +++++------ .../saturnclient/ui/components/SaturnHex.java | 90 +++++------ .../ui/components/SaturnInteger.java | 89 +++++------ .../ui/components/SaturnModComp.java | 127 ++++++--------- .../ui/components/SaturnString.java | 89 +++++------ .../saturnclient/ui/widgets/SaturnButton.java | 79 +++++----- .../ui/widgets/SaturnClickableImage.java | 39 ++--- .../ui/widgets/SaturnClickableSprite.java | 35 ++-- .../saturnclient/ui/widgets/SaturnImage.java | 33 ++-- .../ui/widgets/SaturnInputBox.java | 149 ------------------ .../saturnclient/ui/widgets/SaturnSprite.java | 29 ++-- .../textures/gui/sprites/saturn/button.png | Bin 391 -> 672 bytes .../gui/sprites/saturn/button.png.mcmeta | 2 +- .../gui/sprites/saturn/button_border.png | Bin 421 -> 753 bytes .../sprites/saturn/button_border.png.mcmeta | 2 +- .../gui/sprites/saturn/settings_bg.png | Bin 1033 -> 7855 bytes 20 files changed, 375 insertions(+), 596 deletions(-) delete mode 100644 src/main/java/org/saturnclient/ui/widgets/SaturnInputBox.java diff --git a/src/main/java/org/saturnclient/saturnclient/SaturnClient.java b/src/main/java/org/saturnclient/saturnclient/SaturnClient.java index 3fb6d39..35e3a2b 100644 --- a/src/main/java/org/saturnclient/saturnclient/SaturnClient.java +++ b/src/main/java/org/saturnclient/saturnclient/SaturnClient.java @@ -19,7 +19,6 @@ import org.slf4j.LoggerFactory; /** * Main class for the Saturn Client mod. - * Originally created by IIpho3nix and modified for Saturn Client by leo. */ public class SaturnClient implements ModInitializer { diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/Cloaks.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/Cloaks.java index 7ad1b8a..2362677 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/Cloaks.java +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/Cloaks.java @@ -17,6 +17,7 @@ import java.util.concurrent.ConcurrentHashMap; /** * Manages the cloak system for Saturn Client. * Handles loading and caching of player cloaks. + * Originally created by IIpho3nix and modified for Saturn Client by leo. */ public class Cloaks { private static final String[] ANIMATED_CLOAKS = { "glitch" }; diff --git a/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java b/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java index c815f1c..f69bdca 100644 --- a/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java +++ b/src/main/java/org/saturnclient/saturnclient/menus/MainMenu.java @@ -25,57 +25,52 @@ 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(); } diff --git a/src/main/java/org/saturnclient/ui/SaturnUi.java b/src/main/java/org/saturnclient/ui/SaturnUi.java index dd40fe0..d00ba99 100644 --- a/src/main/java/org/saturnclient/ui/SaturnUi.java +++ b/src/main/java/org/saturnclient/ui/SaturnUi.java @@ -7,6 +7,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.render.RenderLayer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.MutableText; import net.minecraft.text.Style; @@ -23,6 +24,45 @@ public class SaturnUi extends Screen { Style.EMPTY.withFont(Identifier.of("saturnclient:panton"))); } + public static void drawHighResTexture(DrawContext context, Identifier t, int x, int y, int w, int h) { + MatrixStack matricies = context.getMatrices(); + matricies.push(); + matricies.scale(.25f, .25f, 1.0f); + + context.drawTexture(RenderLayer::getGuiTextured, t, x, y, 0, 0, + w * 4, h * 4, w * 4, h * 4); + + matricies.pop(); + } + + public static void drawHighResTexture(DrawContext context, Identifier t, int x, int y, int w, int h, int c) { + MatrixStack matricies = context.getMatrices(); + matricies.push(); + matricies.scale(.25f, .25f, 1.0f); + + context.drawTexture(RenderLayer::getGuiTextured, t, x, y, 0, 0, + w * 4, h * 4, w * 4, h * 4, c); + + matricies.pop(); + } + + public static void drawHighResGuiTexture(DrawContext context, Identifier t, int x, int y, int w, int h, int c) { + MatrixStack matricies = context.getMatrices(); + matricies.push(); + matricies.scale(.25f, .25f, 1.0f); + + context.drawGuiTexture( + RenderLayer::getGuiTextured, + t, + x, + y, + w * 4, + h * 4, + c); + + matricies.pop(); + } + public List widgets = new ArrayList<>(); private int tick = 0; diff --git a/src/main/java/org/saturnclient/ui/components/SaturnFloat.java b/src/main/java/org/saturnclient/ui/components/SaturnFloat.java index 86d6237..229507d 100644 --- a/src/main/java/org/saturnclient/ui/components/SaturnFloat.java +++ b/src/main/java/org/saturnclient/ui/components/SaturnFloat.java @@ -3,7 +3,6 @@ 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; @@ -16,8 +15,7 @@ public class SaturnFloat extends SaturnWidget { String text = ""; public Property prop; public int cursorPosition = 0; - private TextRenderer textRenderer = MinecraftClient.getInstance() - .textRenderer; + private TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; public SaturnFloat(Property prop, int x, int y, int width) { this.x = x; @@ -56,10 +54,9 @@ public class SaturnFloat extends SaturnWidget { if (text.equals("0") && cursorPosition == 1) { text = "" + chr; } else { - text = - text.substring(0, cursorPosition) + - chr + - text.substring(cursorPosition); + text = text.substring(0, cursorPosition) + + chr + + text.substring(cursorPosition); prop.value = text.isEmpty() ? 0 : Float.parseFloat(text); @@ -72,9 +69,8 @@ public class SaturnFloat extends SaturnWidget { public void keyPressed(int keyCode, int scanCode, int modifiers) { if (keyCode == GLFW.GLFW_KEY_BACKSPACE) { if (cursorPosition > 0) { - text = - text.substring(0, cursorPosition - 1) + - text.substring(cursorPosition); + text = text.substring(0, cursorPosition - 1) + + text.substring(cursorPosition); cursorPosition--; if (text.length() == 0) { text = "0"; @@ -95,51 +91,44 @@ public class SaturnFloat extends SaturnWidget { @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.value - : SaturnClient.getWhite(this.alpha) - ); + DrawContext context, + boolean hovering, + int mouseX, + int mouseY) { + SaturnUi.drawHighResGuiTexture( + context, + Textures.BUTTON_BORDER, + 0, + 0, + this.width, + this.height, + focused + ? SaturnClient.COLOR.value + : 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 - ); + textRenderer, + SaturnUi.text(visibleText), + 2, + 2, + textColor, + false); if (focused) { - int cursorX = - 2 + - textRenderer.getWidth( - SaturnUi.text( - visibleText.substring(0, cursorPosition - scrollOffset) - ) - ); + int cursorX = 2 + + textRenderer.getWidth( + SaturnUi.text( + visibleText.substring(0, cursorPosition - scrollOffset))); context.fill( - cursorX, - 2, - cursorX + 1, - textRenderer.fontHeight + 4, - 0xFFFFFFFF - ); + cursorX, + 2, + cursorX + 1, + textRenderer.fontHeight + 4, + 0xFFFFFFFF); } } @@ -172,12 +161,8 @@ public class SaturnFloat extends SaturnWidget { // Ensure text 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 - ) { + if (textRenderer.getWidth( + SaturnUi.text(visibleText.substring(0, i))) > width - 4) { return visibleText.substring(0, i - 1); // Trim overflow } } diff --git a/src/main/java/org/saturnclient/ui/components/SaturnHex.java b/src/main/java/org/saturnclient/ui/components/SaturnHex.java index c60ea73..3b1fce6 100644 --- a/src/main/java/org/saturnclient/ui/components/SaturnHex.java +++ b/src/main/java/org/saturnclient/ui/components/SaturnHex.java @@ -3,7 +3,6 @@ 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; @@ -16,8 +15,7 @@ public class SaturnHex extends SaturnWidget { private String text = "#"; // Always starts with '#' public Property prop; public int cursorPosition = 1; // After '#' - private final TextRenderer textRenderer = MinecraftClient.getInstance() - .textRenderer; + private final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; public SaturnHex(Property prop, int x, int y, int width) { this.x = x; @@ -37,10 +35,9 @@ public class SaturnHex extends SaturnWidget { @Override public void charTyped(char chr) { if (isHexChar(chr) && text.length() < 7) { // Limit to 6 hex digits + '#' - text = - text.substring(0, cursorPosition) + - chr + - text.substring(cursorPosition); + text = text.substring(0, cursorPosition) + + chr + + text.substring(cursorPosition); cursorPosition++; if (text.length() == 7) { // Only update value when full hex is entered @@ -52,15 +49,12 @@ public class SaturnHex extends SaturnWidget { @Override public void keyPressed(int keyCode, int scanCode, int modifiers) { if (keyCode == GLFW.GLFW_KEY_BACKSPACE && cursorPosition > 1) { // Prevent deleting '#' - text = - text.substring(0, cursorPosition - 1) + - text.substring(cursorPosition); + text = text.substring(0, cursorPosition - 1) + + text.substring(cursorPosition); cursorPosition--; } else if (keyCode == GLFW.GLFW_KEY_LEFT && cursorPosition > 1) { cursorPosition--; - } else if ( - keyCode == GLFW.GLFW_KEY_RIGHT && cursorPosition < text.length() - ) { + } else if (keyCode == GLFW.GLFW_KEY_RIGHT && cursorPosition < text.length()) { cursorPosition++; } @@ -76,46 +70,40 @@ public class SaturnHex extends SaturnWidget { @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.value - : SaturnClient.getWhite(this.alpha) - ); + DrawContext context, + boolean hovering, + int mouseX, + int mouseY) { + SaturnUi.drawHighResGuiTexture( + context, + Textures.BUTTON_BORDER, + 0, + 0, + this.width, + this.height, + focused + ? SaturnClient.COLOR.value + : SaturnClient.getWhite(this.alpha)); int textColor = focused ? 0xFFFFFF : 0xAAAAAA; context.drawText( - textRenderer, - SaturnUi.text(text), - 2, - 2, - textColor, - false - ); + textRenderer, + SaturnUi.text(text), + 2, + 2, + textColor, + false); if (focused) { - int cursorX = - 2 + - textRenderer.getWidth( - SaturnUi.text(text.substring(0, cursorPosition)) - ); + int cursorX = 2 + + textRenderer.getWidth( + SaturnUi.text(text.substring(0, cursorPosition))); context.fill( - cursorX, - 2, - cursorX + 1, - textRenderer.fontHeight + 4, - 0xFFFFFFFF - ); + cursorX, + 2, + cursorX + 1, + textRenderer.fontHeight + 4, + 0xFFFFFFFF); } } @@ -126,11 +114,9 @@ public class SaturnHex extends SaturnWidget { } private boolean isHexChar(char chr) { - return ( - (chr >= '0' && chr <= '9') || - (chr >= 'A' && chr <= 'F') || - (chr >= 'a' && chr <= 'f') - ); + return ((chr >= '0' && chr <= '9') || + (chr >= 'A' && chr <= 'F') || + (chr >= 'a' && chr <= 'f')); } public static int hexToInt(String hex) { diff --git a/src/main/java/org/saturnclient/ui/components/SaturnInteger.java b/src/main/java/org/saturnclient/ui/components/SaturnInteger.java index 7cf749c..82b2a7c 100644 --- a/src/main/java/org/saturnclient/ui/components/SaturnInteger.java +++ b/src/main/java/org/saturnclient/ui/components/SaturnInteger.java @@ -3,7 +3,6 @@ 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; @@ -16,8 +15,7 @@ public class SaturnInteger extends SaturnWidget { String text = ""; public Property prop; public int cursorPosition = 0; - private TextRenderer textRenderer = MinecraftClient.getInstance() - .textRenderer; + private TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; public SaturnInteger(Property prop, int x, int y, int width) { this.x = x; @@ -56,10 +54,9 @@ public class SaturnInteger extends SaturnWidget { if (text.equals("0") && cursorPosition == 1) { text = "" + chr; } else { - text = - text.substring(0, cursorPosition) + - chr + - text.substring(cursorPosition); + text = text.substring(0, cursorPosition) + + chr + + text.substring(cursorPosition); prop.value = text.isEmpty() ? 0 : Integer.parseInt(text); @@ -72,9 +69,8 @@ public class SaturnInteger extends SaturnWidget { public void keyPressed(int keyCode, int scanCode, int modifiers) { if (keyCode == GLFW.GLFW_KEY_BACKSPACE) { if (cursorPosition > 0) { - text = - text.substring(0, cursorPosition - 1) + - text.substring(cursorPosition); + text = text.substring(0, cursorPosition - 1) + + text.substring(cursorPosition); cursorPosition--; if (text.length() == 0) { text = "0"; @@ -95,51 +91,44 @@ public class SaturnInteger extends SaturnWidget { @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.value - : SaturnClient.getWhite(this.alpha) - ); + DrawContext context, + boolean hovering, + int mouseX, + int mouseY) { + SaturnUi.drawHighResGuiTexture( + context, + Textures.BUTTON_BORDER, + 0, + 0, + this.width, + this.height, + focused + ? SaturnClient.COLOR.value + : 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 - ); + textRenderer, + SaturnUi.text(visibleText), + 2, + 2, + textColor, + false); if (focused) { - int cursorX = - 2 + - textRenderer.getWidth( - SaturnUi.text( - visibleText.substring(0, cursorPosition - scrollOffset) - ) - ); + int cursorX = 2 + + textRenderer.getWidth( + SaturnUi.text( + visibleText.substring(0, cursorPosition - scrollOffset))); context.fill( - cursorX, - 2, - cursorX + 1, - textRenderer.fontHeight + 4, - 0xFFFFFFFF - ); + cursorX, + 2, + cursorX + 1, + textRenderer.fontHeight + 4, + 0xFFFFFFFF); } } @@ -172,12 +161,8 @@ public class SaturnInteger extends SaturnWidget { // Ensure text 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 - ) { + if (textRenderer.getWidth( + SaturnUi.text(visibleText.substring(0, i))) > width - 4) { return visibleText.substring(0, i - 1); // Trim overflow } } diff --git a/src/main/java/org/saturnclient/ui/components/SaturnModComp.java b/src/main/java/org/saturnclient/ui/components/SaturnModComp.java index c38b881..637063a 100644 --- a/src/main/java/org/saturnclient/ui/components/SaturnModComp.java +++ b/src/main/java/org/saturnclient/ui/components/SaturnModComp.java @@ -2,7 +2,6 @@ package org.saturnclient.ui.components; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.render.RenderLayer; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.menus.ConfigEditor; import org.saturnclient.saturnmods.SaturnMod; @@ -20,96 +19,74 @@ public class SaturnModComp extends SaturnWidget { @Override public void render( - DrawContext context, - boolean hovering, - int mouseX, - int mouseY - ) { + DrawContext context, + boolean hovering, + int mouseX, + int mouseY) { boolean enabled = mod.isEnabled(); boolean hovering_settings = settingsHovering(mouseX, mouseY); int color = !hovering_settings && (enabled || hovering) - ? SaturnClient.COLOR.value - : SaturnClient.getWhite(alpha); + ? SaturnClient.COLOR.value + : SaturnClient.getWhite(alpha); int size = 12; if (enabled) { - context.drawTexture( - RenderLayer::getGuiTextured, - Textures.MOD_BG, - 0, - 0, - 0, - 0, - 86, - 20, - 86, - 20, - SaturnClient.COLOR.value - ); + SaturnUi.drawHighResTexture( + context, + Textures.MOD_BG, + 0, + 0, + 86, + 20, + SaturnClient.COLOR.value); } - context.drawTexture( - RenderLayer::getGuiTextured, - Textures.MOD, - 0, - 0, - 0, - 0, - 86, - 20, - 86, - 20, - color - ); + SaturnUi.drawHighResTexture( + context, + Textures.MOD, + 0, + 0, + 86, + 20, + color); - context.drawTexture( - RenderLayer::getGuiTextured, - mod.getIconTexture(), - 4, - 4, - 0, - 0, - size, - size, - size, - size, - color - ); + SaturnUi.drawHighResTexture( + context, + mod.getIconTexture(), + 4, + 4, + size, + size, + color); context.drawText( - SaturnClient.textRenderer, - SaturnUi.text(mod.getName()), - 20, - (21 - SaturnClient.textRenderer.fontHeight) / 2, - color, - false - ); + SaturnClient.textRenderer, + SaturnUi.text(mod.getName()), + 20, + (21 - SaturnClient.textRenderer.fontHeight) / 2, + color, + false); - context.drawTexture( - RenderLayer::getGuiTextured, - Textures.SETTINGS, - 77, - 11, - 0, - 0, - 7, - 7, - 7, - 7, - hovering_settings - ? SaturnClient.COLOR.value - : SaturnClient.getWhite(alpha) - ); + SaturnUi.drawHighResTexture( + context, + Textures.SETTINGS, + 77, + 11, + 7, + 7, + hovering_settings + ? SaturnClient.COLOR.value + : SaturnClient.getWhite(alpha)); } @Override public void click(int mouseX, int mouseY) { if (settingsHovering(mouseX, mouseY)) { MinecraftClient.getInstance() - .setScreen(new ConfigEditor(mod.getConfig())); + .setScreen(new ConfigEditor(mod.getConfig())); } else { mod.setEnabled(!mod.isEnabled()); } @@ -120,11 +97,9 @@ public class SaturnModComp extends SaturnWidget { int sY = 11; int size = 7; - return ( - sX < mouseX && - sX + size > mouseX && - sY < mouseY && - sY + size > mouseY - ); + return (sX < mouseX && + sX + size > mouseX && + sY < mouseY && + sY + size > mouseY); } } diff --git a/src/main/java/org/saturnclient/ui/components/SaturnString.java b/src/main/java/org/saturnclient/ui/components/SaturnString.java index cfb980d..38b157c 100644 --- a/src/main/java/org/saturnclient/ui/components/SaturnString.java +++ b/src/main/java/org/saturnclient/ui/components/SaturnString.java @@ -3,7 +3,6 @@ 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; @@ -15,8 +14,7 @@ public class SaturnString extends SaturnWidget { public Property prop; public int cursorPosition = 0; - private TextRenderer textRenderer = MinecraftClient.getInstance() - .textRenderer; + private TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; public SaturnString(Property prop, int x, int y, int width) { this.x = x; @@ -50,10 +48,9 @@ public class SaturnString extends SaturnWidget { @Override public void charTyped(char chr) { - prop.value = - prop.value.substring(0, cursorPosition) + - chr + - prop.value.substring(cursorPosition); + prop.value = prop.value.substring(0, cursorPosition) + + chr + + prop.value.substring(cursorPosition); cursorPosition++; } @@ -62,9 +59,8 @@ public class SaturnString extends SaturnWidget { 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); + prop.value = prop.value.substring(0, cursorPosition - 1) + + prop.value.substring(cursorPosition); cursorPosition--; } } else if (keyCode == GLFW.GLFW_KEY_LEFT) { @@ -80,51 +76,44 @@ public class SaturnString extends SaturnWidget { @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.value - : SaturnClient.getWhite(this.alpha) - ); + DrawContext context, + boolean hovering, + int mouseX, + int mouseY) { + SaturnUi.drawHighResGuiTexture( + context, + Textures.BUTTON_BORDER, + 0, + 0, + this.width, + this.height, + focused + ? SaturnClient.COLOR.value + : 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 - ); + textRenderer, + SaturnUi.text(visibleText), + 2, + 2, + textColor, + false); if (focused) { - int cursorX = - 2 + - textRenderer.getWidth( - SaturnUi.text( - visibleText.substring(0, cursorPosition - scrollOffset) - ) - ); + int cursorX = 2 + + textRenderer.getWidth( + SaturnUi.text( + visibleText.substring(0, cursorPosition - scrollOffset))); context.fill( - cursorX, - 2, - cursorX + 1, - textRenderer.fontHeight + 3, - 0xFFFFFFFF - ); + cursorX, + 2, + cursorX + 1, + textRenderer.fontHeight + 3, + 0xFFFFFFFF); } } @@ -156,12 +145,8 @@ public class SaturnString extends SaturnWidget { // 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 - ) { + if (textRenderer.getWidth( + SaturnUi.text(visibleText.substring(0, i))) > width - 4) { return visibleText.substring(0, i - 1); // Trim overflow } } diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnButton.java b/src/main/java/org/saturnclient/ui/widgets/SaturnButton.java index fda753c..c2e0a49 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnButton.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnButton.java @@ -4,7 +4,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import java.util.function.Consumer; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.render.RenderLayer; import net.minecraft.util.math.MathHelper; import org.lwjgl.opengl.GL11; import org.saturnclient.saturnclient.SaturnClient; @@ -32,65 +31,59 @@ public class SaturnButton extends SaturnWidget { @Override public void render( - DrawContext context, - boolean hovering, - int mouseX, - int mouseY - ) { + DrawContext context, + boolean hovering, + int mouseX, + int mouseY) { MinecraftClient minecraftClient = MinecraftClient.getInstance(); - int hoverColor = - ((int) (alpha * 255) << 24) | - (SaturnClient.COLOR.value & 0x00FFFFFF); + int hoverColor = ((int) (alpha * 255) << 24) | + (SaturnClient.COLOR.value & 0x00FFFFFF); if (background) { RenderSystem.setShaderTexture(0, Textures.BUTTON); RenderSystem.texParameter( - GL11.GL_TEXTURE_2D, - GL11.GL_TEXTURE_MIN_FILTER, - GL11.GL_LINEAR_MIPMAP_LINEAR - ); + GL11.GL_TEXTURE_2D, + GL11.GL_TEXTURE_MIN_FILTER, + GL11.GL_LINEAR_MIPMAP_LINEAR); - context.drawGuiTexture( - RenderLayer::getGuiTextured, - Textures.BUTTON, - 0, - 0, - this.width, - this.height, - SaturnClient.getWhite(this.alpha) - ); - - if (hovering) { - context.drawGuiTexture( - RenderLayer::getGuiTextured, - Textures.BUTTON_BORDER, + SaturnUi.drawHighResGuiTexture( + context, + Textures.BUTTON, 0, 0, this.width, this.height, - hoverColor - ); + SaturnClient.getWhite(this.alpha)); + + if (hovering) { + SaturnUi.drawHighResGuiTexture( + context, + Textures.BUTTON_BORDER, + 0, + 0, + this.width, + this.height, + hoverColor); } } if (alpha != 0.0f) { int i = this.active ? 16777215 : 10526880; context.drawText( - minecraftClient.textRenderer, - SaturnUi.text(text), - ((this.width - - minecraftClient.textRenderer.getWidth( - SaturnUi.text(text) - )) / - 2), - ((this.height - minecraftClient.textRenderer.fontHeight + 1) / - 2), - hovering - ? hoverColor - : i | (MathHelper.ceil(this.alpha * 255.0F) << 24), - false - ); + minecraftClient.textRenderer, + SaturnUi.text(text), + ((this.width - + minecraftClient.textRenderer.getWidth( + SaturnUi.text(text))) + / + 2), + ((this.height - minecraftClient.textRenderer.fontHeight + 1) / + 2), + hovering + ? hoverColor + : i | (MathHelper.ceil(this.alpha * 255.0F) << 24), + false); } } diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnClickableImage.java b/src/main/java/org/saturnclient/ui/widgets/SaturnClickableImage.java index 823a741..efe0c99 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnClickableImage.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnClickableImage.java @@ -2,10 +2,10 @@ package org.saturnclient.ui.widgets; import java.util.function.Consumer; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.render.RenderLayer; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; import org.saturnclient.saturnclient.SaturnClient; +import org.saturnclient.ui.SaturnUi; import org.saturnclient.ui.SaturnWidget; public class SaturnClickableImage extends SaturnWidget { @@ -17,9 +17,8 @@ public class SaturnClickableImage extends SaturnWidget { public int hoverColor = SaturnClient.COLOR.value; public SaturnClickableImage( - Identifier texture, - Consumer onPress - ) { + Identifier texture, + Consumer onPress) { this.texture = texture; this.onPress = onPress; } @@ -32,25 +31,19 @@ public class SaturnClickableImage extends SaturnWidget { @Override public void render( - DrawContext context, - boolean hovering, - int mouseX, - int mouseY - ) { - context.drawTexture( - RenderLayer::getGuiTextured, - texture, - 0, - 0, - 0, - 0, - width, - height, - width, - height, - (hovering || selected ? hoverColor : color) | - (MathHelper.ceil(this.alpha * 255.0F) << 24) - ); + DrawContext context, + boolean hovering, + int mouseX, + int mouseY) { + SaturnUi.drawHighResTexture( + context, + texture, + 0, + 0, + width, + height, + (hovering || selected ? hoverColor : color) | + (MathHelper.ceil(this.alpha * 255.0F) << 24)); } @Override diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnClickableSprite.java b/src/main/java/org/saturnclient/ui/widgets/SaturnClickableSprite.java index 8a79060..c7075a8 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnClickableSprite.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnClickableSprite.java @@ -2,10 +2,10 @@ package org.saturnclient.ui.widgets; import java.util.function.Consumer; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.render.RenderLayer; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; import org.saturnclient.saturnclient.SaturnClient; +import org.saturnclient.ui.SaturnUi; import org.saturnclient.ui.SaturnWidget; public class SaturnClickableSprite extends SaturnWidget { @@ -17,9 +17,8 @@ public class SaturnClickableSprite extends SaturnWidget { public int hoverColor = SaturnClient.COLOR.value; public SaturnClickableSprite( - Identifier sprite, - Consumer onPress - ) { + Identifier sprite, + Consumer onPress) { this.sprite = sprite; this.onPress = onPress; } @@ -32,21 +31,19 @@ public class SaturnClickableSprite extends SaturnWidget { @Override public void render( - DrawContext context, - boolean hovering, - int mouseX, - int mouseY - ) { - context.drawGuiTexture( - RenderLayer::getGuiTextured, - sprite, - 0, - 0, - this.width, - this.height, - (hovering || selected ? hoverColor : color) | - (MathHelper.ceil(this.alpha * 255.0F) << 24) - ); + DrawContext context, + boolean hovering, + int mouseX, + int mouseY) { + SaturnUi.drawHighResGuiTexture( + context, + sprite, + 0, + 0, + this.width, + this.height, + (hovering || selected ? hoverColor : color) | + (MathHelper.ceil(this.alpha * 255.0F) << 24)); } @Override diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnImage.java b/src/main/java/org/saturnclient/ui/widgets/SaturnImage.java index 28c64f5..b86eafe 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnImage.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnImage.java @@ -1,9 +1,10 @@ package org.saturnclient.ui.widgets; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.render.RenderLayer; import net.minecraft.util.Identifier; import net.minecraft.util.math.ColorHelper; + +import org.saturnclient.ui.SaturnUi; import org.saturnclient.ui.SaturnWidget; public class SaturnImage extends SaturnWidget { @@ -16,23 +17,17 @@ public class SaturnImage extends SaturnWidget { @Override public void render( - DrawContext context, - boolean hovering, - int mouseX, - int mouseY - ) { - context.drawTexture( - RenderLayer::getGuiTextured, - sprite, - 0, - 0, - 0, - 0, - width, - height, - width, - height, - ColorHelper.getWhite(alpha) - ); + DrawContext context, + boolean hovering, + int mouseX, + int mouseY) { + SaturnUi.drawHighResTexture( + context, + sprite, + 0, + 0, + width, + height, + ColorHelper.getWhite(alpha)); } } diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnInputBox.java b/src/main/java/org/saturnclient/ui/widgets/SaturnInputBox.java deleted file mode 100644 index 324134a..0000000 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnInputBox.java +++ /dev/null @@ -1,149 +0,0 @@ -package org.saturnclient.ui.widgets; - -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.ui.SaturnUi; -import org.saturnclient.ui.SaturnWidget; -import org.saturnclient.ui.Textures; - -public class SaturnInputBox extends SaturnWidget { - - public String text = ""; - public String placeholder = ""; - public int cursorPosition = 0; - public boolean focused = false; - private TextRenderer textRenderer = MinecraftClient.getInstance() - .textRenderer; - - public SaturnInputBox( - String placeholder, - int y, - int x, - int width, - int height - ) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - this.placeholder = placeholder; - } - - @Override - public void click(int mouseX, int mouseY) { - focused = true; - } - - @Override - public void charTyped(char chr) { - if (focused) { - text = - text.substring(0, cursorPosition) + - chr + - text.substring(cursorPosition); - - cursorPosition++; - } - } - - @Override - public void keyPressed(int keyCode, int scanCode, int modifiers) { - if (focused) { - if (keyCode == GLFW.GLFW_KEY_BACKSPACE) { - if (cursorPosition > 0) { - text = - text.substring(0, cursorPosition - 1) + - text.substring(cursorPosition); - cursorPosition--; - } - } else if (keyCode == GLFW.GLFW_KEY_LEFT) { - if (cursorPosition > 0) { - cursorPosition--; - } - } else if (keyCode == GLFW.GLFW_KEY_RIGHT) { - if (cursorPosition < text.length()) { - cursorPosition++; - } - } - } - } - - @Override - public void render( - DrawContext context, - boolean hovering, - int mouseX, - int mouseY - ) { - context.drawGuiTexture( - RenderLayer::getGuiTextured, - Textures.BUTTON, - 0, - 0, - this.width, - this.height, - SaturnClient.getWhite(this.alpha) - ); - - int scrollOffset = getScrollOffset(); - String visibleText = text.substring(scrollOffset); - - int textColor = focused ? 0xFFFFFF : 0xAAAAAA; - context.drawText( - textRenderer, - SaturnUi.text(visibleText), - 5, - 5, - textColor, - false - ); - - if (focused) { - int cursorX = - 5 + - textRenderer.getWidth( - SaturnUi.text( - visibleText.substring(0, cursorPosition - scrollOffset) - ) - ); - context.fill(cursorX, 3, cursorX + 1, height - 3, 0xFFFFFFFF); - } - } - - public void clearText() { - text = ""; - cursorPosition = 0; - } - - private int getScrollOffset() { - if (text.isEmpty()) { - return 0; - } - - int offset = 0; - - if (cursorPosition == text.length()) { - while ( - textRenderer.getWidth(SaturnUi.text(text.substring(offset))) > - width - ) { - offset++; - } - } else { - while ( - textRenderer.getWidth( - SaturnUi.text(text.substring(offset, cursorPosition)) - ) > - width - ) { - offset++; - } - } - - return offset; - } -} diff --git a/src/main/java/org/saturnclient/ui/widgets/SaturnSprite.java b/src/main/java/org/saturnclient/ui/widgets/SaturnSprite.java index 3f33fe7..97e067a 100644 --- a/src/main/java/org/saturnclient/ui/widgets/SaturnSprite.java +++ b/src/main/java/org/saturnclient/ui/widgets/SaturnSprite.java @@ -1,9 +1,10 @@ package org.saturnclient.ui.widgets; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.render.RenderLayer; import net.minecraft.util.Identifier; import net.minecraft.util.math.ColorHelper; + +import org.saturnclient.ui.SaturnUi; import org.saturnclient.ui.SaturnWidget; public class SaturnSprite extends SaturnWidget { @@ -16,19 +17,17 @@ public class SaturnSprite extends SaturnWidget { @Override public void render( - DrawContext context, - boolean hovering, - int mouseX, - int mouseY - ) { - context.drawGuiTexture( - RenderLayer::getGuiTextured, - sprite, - 0, - 0, - this.width, - this.height, - ColorHelper.getWhite(this.alpha) - ); + DrawContext context, + boolean hovering, + int mouseX, + int mouseY) { + SaturnUi.drawHighResGuiTexture( + context, + sprite, + 0, + 0, + this.width, + this.height, + ColorHelper.getWhite(this.alpha)); } } diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/saturn/button.png b/src/main/resources/assets/minecraft/textures/gui/sprites/saturn/button.png index 93d42dda00a2f2c05e704eaa3d0e4cc70c894ce9..5127a7dc488a8423d7e3d69ac12a1b82c6b25d9d 100644 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&di3{0k;E{-7;jBoEQ43bV1X?w^#Gps>(+lnrw zsKA`n(YI&a^YryiUln+VP0ECWhl3}C5&xo9BHtOgDWVTl>~@$H|>%EKggWvs|;@ck6}6hT4|)Mf;Au=Dc=1?_Aiq zic8IEtRZXW2OgcBZXMYA#%AJq)+;N2N7uWQa{YHdo+(pm6LCJjzNy0Z>CgWr&sY8I zEpu>Hjx%@tBXX7dOzuvLEZYb10{N4QguWNOD_JP{q5RzQ114QR%$|G1>s%8*y_W0O zPr0x8S)4z#4OX`^FK_U+yw9{bXmcuS3_s7p=I^eI*O{ExYCiaVAYe7uiQ4-G+FTa? z{}U@Sy}KE?8GTty1TVNa2-BW1ndw`UNr&HdE(<;$)35`d4+NxhRme!Za$)3edVX*r zpGd%ImU3pG!)F&sZx)_0RqV2zUcwd4D@JSi8|_LSeEaJ8*{$l;xfGj##cMyg7PGD> zYsxyf>e|DNe5;}(+yCr1xqa`^@cpOM1K$RzJ__#IKC$@Xo*P@;e_2^{=01HAyJf#& z)id@}YtPPp(CVr$G5ccFf!Hs##!R{^=PtKh{p+yP?nT=VR~R>KtE{x<*~|9j-|IJW YA@bfwYo5+Z1tus4Pgg&ebxsLQ0D$BXhyVZp literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBIT=qE$B+ufw|6)CGCPX6Ufd|ic|?Wffs#g- zSO!BUUq>u&r?-M)DUadiTTD9dea}z4CsJVg^M3Eu!*^caxqRpEgGra~6u#RdoxSI~ z;+?Jkp54nk_UkiWbN1bHvfn;eO6GjsBQH|U``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&di3`}jFE{-7;jBn@OEu8Hj(yG7CLG^;;6D}XC z0``T?OPDo9J3<~TVP4*(B5NVq!MB9(T6tpb;UaMfdHapeXYah!Aa?f6^3(kl79yL3 zp5O7i|8DEME#IP+Uh~^_Fm(0Rs!P9?e~l11T6(ta=p_cx@K?9P*G6qq&f&G+x^MM~ zvb=zxgcm!SubH2m?N&80&3zV=^YyzWZCbQrbG?Ufk<9IeJmr z7iXnCdw2c)^nELQY8vCiJ=I>syq4ro%~~9rv{+4sf3wn$3?ZTNYi#Pt9|Dbze{Ekg zBiLre7At=b_eH{|A2zgy=FZYQXSc`nFn@BEqH;|AG`XUev(9`?pA-0<(~$F$TW^{2 z-}>8%`&*a%5Y)Y2+4%A3!^IOs>K8xVdv%&krAoo&)l?+&GIWNJJVlz^yb54{=b^)eM@9 literal 421 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBIV(>W$B+ufw|53X+`o3zcp4NYH^7VD|j?{6@_%i)c-qaQe0V9PJhZ7AG z7!{eF*jjivBnN?j>VpTaciuirQ+=R)Z1scNZ>)-jbi`+ diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/saturn/button_border.png.mcmeta b/src/main/resources/assets/minecraft/textures/gui/sprites/saturn/button_border.png.mcmeta index ed7677e..89e2e38 100644 --- a/src/main/resources/assets/minecraft/textures/gui/sprites/saturn/button_border.png.mcmeta +++ b/src/main/resources/assets/minecraft/textures/gui/sprites/saturn/button_border.png.mcmeta @@ -4,7 +4,7 @@ "type": "nine_slice", "width": 80, "height": 80, - "border": 9 + "border": 16 } } } diff --git a/src/main/resources/assets/minecraft/textures/gui/sprites/saturn/settings_bg.png b/src/main/resources/assets/minecraft/textures/gui/sprites/saturn/settings_bg.png index c9f9164703a54045c52ca98351c180c466b74426..47c62d2e4373d09b350fec90c88cd9ae6e6e7700 100644 GIT binary patch literal 7855 zcmeHM`#V%=96xeRF3)yZI}M{<#Z;nZikWgPg?5{;ks`DVMIj1P7_%M^8yT%B$%yjk zMoM;F#tbUVy05H77?e3y?xtnNpq=-e{)qkI{4meF-|PE+zwfzx&inbrh32TOxmgo} zAZ=$S2R8^(B|?yLhK8C#v%fd*sp4;KxYMaf2r~U1{FDlz%(qJEGoTzOXx3*!V!Z~VqXwk*8_e0RX9-m zru5y@Seqz6J(k-Y6@@aPqDAW#Te!m`w7Xncyh67znBKJ(c!w3V9T9&h-PW(kku>%D zrgd8zDb^G?xs~@7=&xI_Gm2vzFUD4aVb{ zzzWU$+NZ*9e7eB~*K>K$NF;Gu%*&Gbp(b9{VVSJ5@#f5gN;A&nvxSw0Ixt9UWl(NM z<0d1qJ3A&d6R7GKuDk=OU7RU)aesvJ(P#lPPQ(u9-C_QcQe%zdNluMwtJyMYc;^yaj@ zfz;8iuxK|QM>8+9!qUVI{WAjibpf)17uIB2jW;|#uG#7$CrK6NV8nD2;tKWMF^*0|Xc#zyJXT2rxi^0RjvVV1NKSTK+#D zqmz}zsVEu3G_gRB_nT93#5{z{N?18?sU8pbfyexJ`O8sY1WgV_;t>wSPCTx~`NFNN zTIaCl19~4IbiqQ1Mbk;$rtEZ-Jz3@N?~4mx(gwkG_w+lMH1+08bWX#e{(LK3IXdr( zG`LvLSeF(jJqKK&Nzok4?qa>&69y!|9=NNTZ5gK19(z6&At`zblOGLn6|{*fLV8s1 zt}v-xH074DA{w2&P?pBb$_JK>>xSk=c23b(OIt@kCa5>P%9`A-)@lkHQ**6X#KiDSRLMwoHClkH6i8Ms{o8)tra4A)$p)-Z~b>`-jAe zAV?IXR%f^^!ov)=`It)jOL;d&lgu^{g-f}!fr~Ip#e@{{43$wxp`I}TYgmmeE+^V<25YXX z{@6)kdcw9JHkaUumT;F~>?1tzF!l>)c)hA#+CwLpNg}+vjwy@x_E>%vw2qLXkzJiF zzqa4Qk(ZZ-=j|(>SS979yB8yyFEW$t{deF_tW|kHKP$rjNHcC{5>lFUJV#h%_-riT zLTAYu@#Uc6>0{>$P-^sU)YrzA3cB?8fzur*TPEF;^KFF4f4+0+%AVM%xNb!1@J*w6hZk(Gggd7h_>V@L(#+nXD6g991d9==}UF_rNI z!^=$!qRb4oi_#fZ+-P82@gh)5N}{Qa(}v+?#-*i?;&NO%p3GtVQ+w(En(uFZy@<*; z{#S1IJ?q`kJChj;Vz&LRo%Q?Y_lM8!@rTLW?~B!8?7R8)#?enzcjvs5Ul;u3_s-3X z2eKYs-Z^{cTdTmhGqrMllNk8dPJVj2bWx3YxhX?M#$28Ee$Sp3F%+Em{Pp_p;|vcL zOlCZ=xJ5{TL)AgRt3hE3gQEsxQvegoLKY4uPJvO0(I6S%#LyyoYBu8m#oMB%@|hc) zx6Q7!od0{*f0hUHZ|}Um{Bx1{_w08!86NEGFTU^p-Td}O?dMnT++?uGTiq`IY~PyM yXPfo)pWQnX`;NW9=i2GFU++DudXx0?c>V$}#YGca|4jzwTn0~9KbLh*2~7YFZ!L@f