diff --git a/.factorypath b/.factorypath index d0b65a4..6e520e1 100644 --- a/.factorypath +++ b/.factorypath @@ -1,12 +1,12 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/src/main/java/org/saturnclient/saturnclient/auth/Auth.java b/src/main/java/org/saturnclient/saturnclient/auth/Auth.java index 5a687dc..bf21829 100644 --- a/src/main/java/org/saturnclient/saturnclient/auth/Auth.java +++ b/src/main/java/org/saturnclient/saturnclient/auth/Auth.java @@ -95,6 +95,16 @@ public class Auth { playerNames.entrySet().removeIf(entry -> entry.getValue().equals(uuid)); } break; + + case "successful_transaction": + String cloak = parser.getStringOrNull("cloak"); + String hat = parser.getStringOrNull("hat"); + if (cloak != null) { + Cloaks.availableCloaks.add(cloak); + } + if (hat != null) { + Hats.availableHats.add(hat); + } default: if (parser.error != null) { @@ -218,4 +228,12 @@ public class Auth { } } } + + public static void buyCloak(String name) { + try { + Network.write("buy_cloak@cloak=" + name); + } catch (Exception e) { + SaturnClient.LOGGER.error("Request failed", e); + } + } } diff --git a/src/main/java/org/saturnclient/saturnclient/auth/SaturnParser.java b/src/main/java/org/saturnclient/saturnclient/auth/SaturnParser.java index 522f345..60d1c31 100644 --- a/src/main/java/org/saturnclient/saturnclient/auth/SaturnParser.java +++ b/src/main/java/org/saturnclient/saturnclient/auth/SaturnParser.java @@ -43,6 +43,11 @@ public class SaturnParser { } } + public String getStringOrNull(String i) throws IOException { + String val = params.get(i); + return val; + } + public boolean getBool(String i) throws IOException { String val = params.get(i); if (val != null) { 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 05e16ab..d0aa7e3 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/Cloaks.java +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/cloaks/Cloaks.java @@ -20,6 +20,7 @@ import org.saturnclient.saturnclient.SaturnClient; * Originally created by IIpho3nix and modified for Saturn Client by leo. */ public class Cloaks { + public static final String[] ALL_CLOAKS = { "glitch", "mercedes_flow", }; private static final String[] ANIMATED_CLOAKS = { "glitch", "mercedes_flow" }; private static final String CLOAKS_RESOURCE_PATH = "assets/saturnclient/textures/cloaks/"; @@ -48,6 +49,17 @@ public class Cloaks { SaturnClient.LOGGER.info("Cloak set to " + cloakName); } + /** + * Sets cloak of the current player + * + * @param cloakName Name of the cloak file to load + */ + public static void setCloak(String cloakName) { + if (availableCloaks.contains(cloakName)) { + setCloak(Auth.uuid, cloakName); + } + } + /** * Handles loading and caching of a new cloak texture, without connecting to the * server. diff --git a/src/main/java/org/saturnclient/ui2/Element.java b/src/main/java/org/saturnclient/ui2/Element.java index 499a047..d6a0058 100644 --- a/src/main/java/org/saturnclient/ui2/Element.java +++ b/src/main/java/org/saturnclient/ui2/Element.java @@ -31,45 +31,45 @@ public class Element { public void charTyped(char typedChar) { } - public final Element dimensions(int width, int height) { + public Element dimensions(int width, int height) { this.width = width; this.height = height; return this; } - public final Element position(int x, int y) { + public Element position(int x, int y) { this.x = x; this.y = y; return this; } - public final Element centerHorizontal(int w, int h, int offsetX, int offsetY) { + public Element centerHorizontal(int w, int h, int offsetX, int offsetY) { this.x = (w - (int) (width * scale)) / 2 + offsetX; this.y = offsetY; return this; } - public final Element center(int w, int h) { + public Element center(int w, int h) { this.centerOffset(w, h, 0, 0); return this; } - public final Element centerOffset(int w, int h, int offsetX, int offsetY) { + public Element centerOffset(int w, int h, int offsetX, int offsetY) { this.x = (w - (int) (width * scale)) / 2 + offsetX; this.y = (h - (int) (height * scale)) / 2 + offsetY; return this; } - public final Element animation(Animation animation) { + public Element animation(Animation animation) { this.animation = animation; return this; } - public final Element animation(Animation animation, Function curve) { + public Element animation(Animation animation, Function curve) { this.animation = animation; this.curve = curve; return this; diff --git a/src/main/java/org/saturnclient/ui2/components/Sidebar.java b/src/main/java/org/saturnclient/ui2/components/Sidebar.java index c15822f..93df017 100644 --- a/src/main/java/org/saturnclient/ui2/components/Sidebar.java +++ b/src/main/java/org/saturnclient/ui2/components/Sidebar.java @@ -13,6 +13,7 @@ import org.saturnclient.ui2.screens.CloakMenu; import org.saturnclient.ui2.screens.ConfigEditor; import org.saturnclient.ui2.screens.HatMenu; import org.saturnclient.ui2.screens.ModMenu; +import org.saturnclient.ui2.screens.Store; import net.minecraft.client.render.RenderLayer; import net.minecraft.util.Identifier; @@ -62,7 +63,11 @@ public class Sidebar extends Element { new Sidebar.SidebarComponent(Textures.CLOSE, () -> { onClose.run(); - }, true) + }, true), + + new Sidebar.SidebarComponent(Textures.STORE, () -> { + SaturnClient.client.setScreen(new Store()); + }, true), }; int active = 0; diff --git a/src/main/java/org/saturnclient/ui2/elements/Scroll.java b/src/main/java/org/saturnclient/ui2/elements/Scroll.java index 00683cc..0b0e761 100644 --- a/src/main/java/org/saturnclient/ui2/elements/Scroll.java +++ b/src/main/java/org/saturnclient/ui2/elements/Scroll.java @@ -61,16 +61,14 @@ public class Scroll extends Element { public void draw(Element element) { children.add(element); + } - if (element.width > width) { - width = element.width; + @Override + public Element dimensions(int width, int height) { + for (Element element : children) { + maxScroll = Math.max(maxScroll, element.y + element.height - height); } - - if (element.height > height) { - height = element.height; - } - - maxScroll = Math.max(maxScroll, element.y - maxScroll); + return super.dimensions(width, height); } int calculateScrollBarHeight() { diff --git a/src/main/java/org/saturnclient/ui2/elements/Text.java b/src/main/java/org/saturnclient/ui2/elements/Text.java index d4453d3..8465021 100644 --- a/src/main/java/org/saturnclient/ui2/elements/Text.java +++ b/src/main/java/org/saturnclient/ui2/elements/Text.java @@ -5,6 +5,7 @@ import org.saturnclient.saturnclient.config.ThemeManager; import org.saturnclient.ui2.Element; import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.RenderScope; +import org.saturnclient.ui2.resources.Fonts; public class Text extends Element { private static ThemeManager theme = new ThemeManager("Text"); @@ -15,6 +16,8 @@ public class Text extends Element { public Text(String text) { this.text = text; + width = Fonts.getWidth(text, font.value); + height = Fonts.getHeight(); } @Override diff --git a/src/main/java/org/saturnclient/ui2/resources/Textures.java b/src/main/java/org/saturnclient/ui2/resources/Textures.java index 2bb3b48..c7bbfb8 100644 --- a/src/main/java/org/saturnclient/ui2/resources/Textures.java +++ b/src/main/java/org/saturnclient/ui2/resources/Textures.java @@ -17,6 +17,8 @@ public class Textures { "textures/gui/components/toggle_indicator.png"); public static final Identifier LEFT = Identifier.of("saturnclient", "textures/gui/components/left.png"); public static final Identifier RIGHT = Identifier.of("saturnclient", "textures/gui/components/right.png"); + public static final Identifier STORE = Identifier.of("saturnclient", "textures/gui/components/store.png"); + public static final Identifier COINS = Identifier.of("saturnclient", "textures/gui/components/coins.png"); public static final Identifier LOGO = Identifier.of("saturnclient", "textures/logo/logo.png"); public static final Identifier REALISTIC_LOGO = Identifier.of("saturnclient", "textures/logo/realistic.png"); diff --git a/src/main/java/org/saturnclient/ui2/screens/CloakMenu.java b/src/main/java/org/saturnclient/ui2/screens/CloakMenu.java index 47bfb6d..904bf6f 100644 --- a/src/main/java/org/saturnclient/ui2/screens/CloakMenu.java +++ b/src/main/java/org/saturnclient/ui2/screens/CloakMenu.java @@ -30,7 +30,7 @@ public class CloakMenu extends SaturnScreen { if (player != null) { for (String cloak : Cloaks.availableCloaks) { scroll.draw(new CosmeticPreview(cloak == player.cloak, Textures.getCloakPreview(cloak), () -> { - Cloaks.setCloak(Auth.uuid, cloak); + Cloaks.setCloak(cloak); }).position((50 + g) * col, (111 + g) * row)); if (col == 5) { diff --git a/src/main/java/org/saturnclient/ui2/screens/Store.java b/src/main/java/org/saturnclient/ui2/screens/Store.java new file mode 100644 index 0000000..84beb75 --- /dev/null +++ b/src/main/java/org/saturnclient/ui2/screens/Store.java @@ -0,0 +1,66 @@ +package org.saturnclient.ui2.screens; + +import org.saturnclient.saturnclient.auth.Auth; +import org.saturnclient.saturnclient.auth.SaturnPlayer; +import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; +import org.saturnclient.ui2.SaturnScreen; +import org.saturnclient.ui2.components.CosmeticPreview; +import org.saturnclient.ui2.components.Sidebar; +import org.saturnclient.ui2.elements.ImageTexture; +import org.saturnclient.ui2.elements.Scroll; +import org.saturnclient.ui2.elements.Text; +import org.saturnclient.ui2.resources.Fonts; +import org.saturnclient.ui2.resources.Textures; + +public class Store extends SaturnScreen { + public Store() { + super("Store"); + } + + @Override + public void ui() { + int p = 10; + int gx = 10; + int gy = 20; + + Scroll scroll = new Scroll(p); + + int row = 0; + int col = 0; + + SaturnPlayer player = Auth.players.get(Auth.uuid); + + if (player != null) { + for (String cloak : Cloaks.ALL_CLOAKS) { + if (!Cloaks.availableCloaks.contains(cloak)) { + int x = (50 + gx) * col; + int y = (111 + gy) * row; + scroll.draw(new CosmeticPreview(cloak == player.cloak, Textures.getCloakPreview(cloak), () -> { + Auth.buyCloak(cloak); + // This is to refresh the screen to remove the cloak because it's in our inventory + resize(client, width, height); + }).position(x, y)); + + String t = "100"; + + scroll.draw(new Text(t).position(x + Fonts.centerX(50, t, Text.font.value), y + 113).scale(0.5f)); + + scroll.draw(new ImageTexture(Textures.COINS).dimensions(16, 16).position(x + Fonts.getWidth(t, Text.font.value), y + 112).scale(0.5f)); + + if (col == 8) { + col = 0; + row++; + } else { + col++; + } + } + } + } + + int scrollWidth = 480 + 40 + (gx * 2) + (p * 2); + + draw(scroll.dimensions(scrollWidth, 350).centerOffset(width, height, 15, 0)); + + draw(new Sidebar(5, this::close).centerOffset(width, height, -((scrollWidth - 30) / 2 + 20), 0)); + } +} diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/coins.png b/src/main/resources/assets/saturnclient/textures/gui/components/coins.png new file mode 100644 index 0000000..0946546 Binary files /dev/null and b/src/main/resources/assets/saturnclient/textures/gui/components/coins.png differ diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/store.png b/src/main/resources/assets/saturnclient/textures/gui/components/store.png new file mode 100644 index 0000000..b067b97 Binary files /dev/null and b/src/main/resources/assets/saturnclient/textures/gui/components/store.png differ