From 0980e3a5d4d43ed15eb051f6145ae481162d8b97 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sun, 22 Jun 2025 16:56:18 -0500 Subject: [PATCH] semi working Store --- .factorypath | 20 +++--- .../saturnclient/saturnclient/auth/Auth.java | 18 +++++ .../saturnclient/auth/SaturnParser.java | 5 ++ .../saturnclient/cosmetics/cloaks/Cloaks.java | 12 ++++ .../java/org/saturnclient/ui2/Element.java | 14 ++-- .../saturnclient/ui2/components/Sidebar.java | 7 +- .../org/saturnclient/ui2/elements/Scroll.java | 14 ++-- .../org/saturnclient/ui2/elements/Text.java | 3 + .../saturnclient/ui2/resources/Textures.java | 2 + .../saturnclient/ui2/screens/CloakMenu.java | 2 +- .../org/saturnclient/ui2/screens/Store.java | 66 ++++++++++++++++++ .../textures/gui/components/coins.png | Bin 0 -> 1684 bytes .../textures/gui/components/store.png | Bin 0 -> 958 bytes 13 files changed, 136 insertions(+), 27 deletions(-) create mode 100644 src/main/java/org/saturnclient/ui2/screens/Store.java create mode 100644 src/main/resources/assets/saturnclient/textures/gui/components/coins.png create mode 100644 src/main/resources/assets/saturnclient/textures/gui/components/store.png 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 0000000000000000000000000000000000000000..0946546c6c5b36c749c8f26194d10b32dac86807 GIT binary patch literal 1684 zcmV;F25b3=P)eP5tWixyigThwf^6f=;FwA2(WqsYRt4aJq{YN`d z^(X*>AA$5E5siOndjft9UIM?K$n@nm@GzcZc1Hr@(W*hzI7*hy%aM`)n6|M5@oHWW z==Z1pK6oc5_bc!H(SNf_5E%eCUmN4g;oY2*S-elixt2pAVP_MBZiG*F!ulq9Vn;Js z33&jMusXw8o{2-XH%tJTiP9NPaU%9KAeB%G0B4(F@l$w9WBDVVd*Sf6(1zUcJYNOx znY6vn?^I;8TV)8@jcIrnw#(^T-g_Yba}@|IfRizJr!m^Wb3Yt~54E$4pcK&F&iOLr z_K5|A{9&{&fbDFLNB-Wb0o;zk3C8G4IMK=LM>PhZ4cWXcStqnk??AHRlDluSG_=H0DgZDV!3T}_3gnwT-7`2X zfYtQqqYJbZPQI@ZU$q*5w#**J$xr}1 zQxO2A;7_%B2`$3Gp~lH20Jx?i0GDFtYGX_F!a#4EWvL86%WX0Jzn58Jb_v~#!Z}81 z4o1dS1mGd;X!iZB6u z(WkWAp3=*a?HRFmD{ZmEO^M%NbY6^s@X6d5gyuNG=_uPnsNP`2X6Y6h&vqTr^MwIX zEGk>4!m7V5{m6^bnibxO2cUP2y3ciH({^6j1dL#`$4`e(bq<$e8^hd%6R)|G--dKUd5 zxd7CeQ&OsX8LaguqSjQcs@jU1P+yg*AM|-PvZrqV~t5QwfHbr7y^g8!Rmr5E$+O&)r^=u@5+D9xuT1Ar4P z2c_g^!n)lXLQuAh)Kbs~uHq(8Vek?}??Qe$cb$aNv!F@~gN`d}l$>zjGbvDL#$^axIrCYo{#@P}aY27zP0M>Px8#CK zW>zZ&kj#Sq#5m3csAY3XSr7!S1X2~+NzP79an%X{IyE)zDp4&dDV$^zwb(2Wd~e$I zVfzG9X?$<=Gv#gN0FqfyzH~pVHEc--mXbGBc*;0eDjIJaDNs+AXK=j$0000p*ca3L+St+@5~Vnn0O+)T7&EmAK04J9cu*J2Dw$`%&O z1rnPJ7i61@k(58j=Qr;;{T%0<_j#Xlp5uMvS8vZbXV3HfeLv5i_j%rTv7(4aEaLu) zk^u2|d>Jr@xaOrm_42(w7K>dEBdi9vfx+b&OuhwRYS;m8VX!ib$#Nhbh7H1G3MD)@ z0B}6C0I9}U6ZQOdO#R*lz`7^_EX3>sWw;lB*--)*f!WVoBbDiKKzs}nMAm(PX>=d6 z<;rkX*lwqO07o(3pa5C`*cYV{Sc}<<%5Vn&E29K36SJ}thbf+5W+xqaM@;#ig;)pg zsW&-H1jEJ&Q-G^ftPUFheoA2IHyMGwRBj0wzyRilXN3vC3hH$zfNmPgCReav8gC}q z8I|xd9#)$I6jO0XHU7%y(FlAi6afHd$yKZJ?I!<0BLJy{zzd2}B~XEYY;pw&@;@h0 znM$^l{C9%@oTu^zCD4d~Y;w*6^J7V(k1s#?K8E~Xf&gr%@(Jbk5(2WxIS&A;NYbtn z^^iOH)abj2y(zSSvRjGtAu`Lk`(M+ym7-bYIz{eniSMQWf9+%nz-`RR^LipS0&pP^ zfHw+Vlod*-1|dDPc^?qWO9#u5ev}d~CGSfcfFm^8p@doyl1o4v&I%6^g=HQRt_f zqy)+klugb_0PqT7eYdM5pDgNR7*8P&;0mQ4!a4*`yKs;B>FB;m(Jm(6r(6IUX?$1- zycQrtpXCz*^V86i*POEM67iTk^HcK#9f1-A-f;zLmnXO;00io{2yBGjkyGHVJee|; zk@L?K00wdf@YaIgdsI_nruAwue=c3+z$1_lVI(&3c?;JJE?3XYkI>$Vc`4I|HGpZ? zxvuvgz;zG%>HnJ}zye-H&opt(@p|Yf<$+v}*EYI=M}Q=9l#nAux~K-?n%}Ue`@5~K z4L~Ob7G*Hm1;AoU04rS^0C__oZwk`I2LL8o0?00#sqG-T`V^c@VFNHo>j@43taNPv z?qNRDH0h+LmROE}m97mywnc3HFDRcyoKZJ0fb_1HY>#&v{Z1**19BU+x&tLf%tqG= gz-EfLY7=>YpVzBGK>G&vo&W#<07*qoM6N<$g1OA7n*aa+ literal 0 HcmV?d00001