From 6c460c20e52d6b9c546236d028a61b205cd75b56 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Sat, 7 Mar 2026 17:01:53 +0100 Subject: [PATCH] Refactored --- .../saturnclient/ui/screens/ConfigEditor.java | 131 ++++++++++++++++ .../org/saturnclient/ui/screens/ModMenu.java | 56 +++++++ .../saturnclient/ui/screens/ShiftMenu.java | 62 ++++++++ .../saturnclient/ui/screens/TitleMenu.java | 78 ++++++++++ .../ui/screens/cosmetics/CloakMenu.java | 83 ++++++++++ .../ui/screens/cosmetics/HatMenu.java | 84 ++++++++++ .../ui/screens/store/CloakStore.java | 142 +++++++++++++++++ .../ui/screens/store/HatStore.java | 143 ++++++++++++++++++ 8 files changed, 779 insertions(+) create mode 100644 src/main/java/org/saturnclient/ui/screens/ConfigEditor.java create mode 100644 src/main/java/org/saturnclient/ui/screens/ModMenu.java create mode 100644 src/main/java/org/saturnclient/ui/screens/ShiftMenu.java create mode 100644 src/main/java/org/saturnclient/ui/screens/TitleMenu.java create mode 100644 src/main/java/org/saturnclient/ui/screens/cosmetics/CloakMenu.java create mode 100644 src/main/java/org/saturnclient/ui/screens/cosmetics/HatMenu.java create mode 100644 src/main/java/org/saturnclient/ui/screens/store/CloakStore.java create mode 100644 src/main/java/org/saturnclient/ui/screens/store/HatStore.java diff --git a/src/main/java/org/saturnclient/ui/screens/ConfigEditor.java b/src/main/java/org/saturnclient/ui/screens/ConfigEditor.java new file mode 100644 index 0000000..4701989 --- /dev/null +++ b/src/main/java/org/saturnclient/ui/screens/ConfigEditor.java @@ -0,0 +1,131 @@ +package org.saturnclient.ui.screens; + +import java.util.Map; + +import org.saturnclient.config.Theme; +import org.saturnclient.config.manager.ConfigManager; +import org.saturnclient.config.manager.Property; +import org.saturnclient.ui.SaturnScreen; +import org.saturnclient.ui.components.Sidebar; +import org.saturnclient.ui.components.inputs.FloatInput; +import org.saturnclient.ui.components.inputs.HexInput; +import org.saturnclient.ui.components.inputs.IntInput; +import org.saturnclient.ui.components.inputs.KeybindingSelector; +import org.saturnclient.ui.components.inputs.Select; +import org.saturnclient.ui.components.inputs.Toggle; +import org.saturnclient.ui.elements.Scroll; +import org.saturnclient.ui.elements.Text; +import org.saturnclient.ui.resources.Fonts; + +public class ConfigEditor extends SaturnScreen { + private ConfigManager config; + + public ConfigEditor(ConfigManager config) { + super("Config Editor"); + + this.config = config; + } + + @Override + public void ui() { + int p = 10; + int g = 10; + + Scroll scroll = new Scroll(p); + + drawProperties(scroll, config.getProperties(), 0, 0, 480 + 10 + (g * 2)); + + int scrollWidth = 480 + 10 + (g * 2) + (p * 2); + + draw(scroll.dimensions(scrollWidth, 350).center(width, height)); + + draw(new Sidebar(1, this.provider::close).centerOffset(width, height, -(scrollWidth / 2 + 20), 0)); + } + + @SuppressWarnings("unchecked") + private int drawProperties(Scroll configScroll, Map> properties, int row, int col, int w) { + for (Map.Entry> propEntry : properties.entrySet()) { + Property prop = propEntry.getValue(); + String propName = propEntry.getKey(); + boolean full = isFull(prop); + + // Always reset to col 0 if full-width component needs to be drawn mid-row + if (full && col != 0) { + col = 0; + row++; + } + + int modX = (w / 2) * col; // two-column layout + int modY = 25 * row; + + if (prop.getType() == Property.PropertyType.NAMESPACE) { + configScroll.draw( + new Text( + propName).position(Fonts.centerX(520, propName, Theme.FONT.value), modY + 1) + .scale(0.7f)); + } else { + configScroll.draw( + new Text( + propName).position(modX, modY + 1).scale(0.7f)); + } + + switch (prop.getType()) { + case BOOLEAN: + configScroll.draw( + new Toggle((Property) prop) + .position(modX + (w / 2) - 40, modY) + .scale(0.5f)); + break; + + case HEX: + configScroll.draw(new HexInput((Property) prop).position(w / 2, modY)); + break; + + case INTEGER: + configScroll.draw(new IntInput((Property) prop).position(w / 2, modY)); + break; + + case FLOAT: + configScroll.draw(new FloatInput((Property) prop).position(w / 2, modY)); + break; + + case NAMESPACE: + Map> nestedProperties = (Map>) prop.value; + row = drawProperties(configScroll, nestedProperties, row + 1, col, w); + break; + + case SELECT: + configScroll.draw(new Select((Property) prop).position(w / 2, modY)); + break; + + case KEYBINDING: + configScroll.draw(new KeybindingSelector((Property) prop).position(w / 2, modY)); + break; + + case STRING: + } + + if (full) { + row++; // full-width takes a whole row + col = 0; + } else { + col++; + if (col > 1) { // max 2 columns + col = 0; + row++; + } + } + } + + return row; + } + + public static boolean isFull(Property prop) { + switch (prop.getType()) { + case BOOLEAN: + return false; + default: + return true; + } + } +} diff --git a/src/main/java/org/saturnclient/ui/screens/ModMenu.java b/src/main/java/org/saturnclient/ui/screens/ModMenu.java new file mode 100644 index 0000000..2c7e38c --- /dev/null +++ b/src/main/java/org/saturnclient/ui/screens/ModMenu.java @@ -0,0 +1,56 @@ +package org.saturnclient.ui.screens; + +import org.saturnclient.modules.ModManager; +import org.saturnclient.modules.Module; +import org.saturnclient.config.AnimationConfig; +import org.saturnclient.ui.SaturnScreen; +import org.saturnclient.ui.anim.SlideFade; +import org.saturnclient.ui.components.SaturnModule; +import org.saturnclient.ui.components.Sidebar; +import org.saturnclient.ui.elements.AnimationStagger; +import org.saturnclient.ui.elements.ImageTexture; +import org.saturnclient.ui.elements.Scroll; +import org.saturnclient.ui.resources.Textures; + +public class ModMenu extends SaturnScreen { + public ModMenu() { + super("Mod Menu"); + } + + @Override + public void ui() { + int p = 10; + int g = 10; + + Scroll scroll = new Scroll(p); + + int row = 0; + int col = 0; + + AnimationStagger moduleStagger = new AnimationStagger(AnimationConfig.modMenu); + + for (Module mod : ModManager.MODS) { + moduleStagger.draw( + new SaturnModule(mod) + .position((160 + g) * col, (50 + g) * row) + .animation(new SlideFade(AnimationConfig.modMenu, -12))); + + if (col == 2) { + col = 0; + row++; + } else { + col++; + } + } + + scroll.draw(moduleStagger); + + int scrollWidth = 480 + 10 + (g * 2) + (p * 2); + + draw(scroll.dimensions(scrollWidth, 350).center(width, height)); + + draw(new Sidebar(0, this.provider::close).centerOffset(width, height, -(scrollWidth / 2 + 20), 0)); + + draw(new ImageTexture(Textures.LOGO_TEXT_BIG).dimensions(180, 18).position(width - 180 - 20, height - 18 - 20)); + } +} diff --git a/src/main/java/org/saturnclient/ui/screens/ShiftMenu.java b/src/main/java/org/saturnclient/ui/screens/ShiftMenu.java new file mode 100644 index 0000000..fc2c062 --- /dev/null +++ b/src/main/java/org/saturnclient/ui/screens/ShiftMenu.java @@ -0,0 +1,62 @@ +package org.saturnclient.ui.screens; + +import org.saturnclient.common.minecraft.MinecraftProvider; +import org.saturnclient.config.AnimationConfig; +import org.saturnclient.config.Config; +import org.saturnclient.ui.SaturnScreen; +import org.saturnclient.ui.anim.Fade; +import org.saturnclient.ui.anim.SlideY; +import org.saturnclient.ui.elements.AnimationStagger; +import org.saturnclient.ui.elements.Button; +import org.saturnclient.ui.elements.ImageTexture; +import org.saturnclient.ui.elements.TextureButton; +import org.saturnclient.ui.resources.Textures; +import org.saturnclient.ui.screens.cosmetics.CloakMenu; + +public class ShiftMenu extends SaturnScreen { + public ShiftMenu() { + super("Shift Menu"); + } + + @Override + public void ui() { + // Logo animations (unchanged) + draw(new ImageTexture(Textures.LOGO_TEXT) + .dimensions(98, 10) + .centerOffset(width, height, 0, -36) + .animation(new Fade(AnimationConfig.logo.duration.value))); + + draw(new ImageTexture(Config.getLogo()) + .dimensions(98, 98) + .centerOffset(width, height, 0, -80) + .animation(new SlideY(AnimationConfig.logo, -20))); + + // Spacing and sizes + int btnWidth = 120; + int btnHeight = 40; + int spacing = 4; + + // Create stagger + + AnimationStagger stagger = new AnimationStagger(AnimationConfig.shiftMenu.stagger.value); + + stagger.draw(new TextureButton(Textures.HUD_ICON, () -> { + MinecraftProvider.PROVIDER.setScreen(new HudEditor()); + }).dimensions(btnHeight, btnHeight).position(0, 0) + .animation(new Fade(AnimationConfig.shiftMenu))); + + stagger.draw(new Button("Settings", () -> { + MinecraftProvider.PROVIDER.setScreen(new ModMenu()); + }).dimensions(btnWidth, btnHeight).position(btnHeight + spacing, 0) + .animation(new Fade(AnimationConfig.shiftMenu))); + + stagger.draw(new TextureButton(Textures.COSMETICS, () -> { + MinecraftProvider.PROVIDER.setScreen(new CloakMenu()); + }).dimensions(btnHeight, btnHeight).position(btnWidth + btnHeight + (spacing * 2), 0) + .animation(new Fade(AnimationConfig.shiftMenu))); + + // Draw the stagger at the absolute center of the screen + draw(stagger.dimensions(btnWidth + (btnHeight * 2) + (spacing * 2), btnHeight).centerOffset(width, height, 0, + 0)); + } +} diff --git a/src/main/java/org/saturnclient/ui/screens/TitleMenu.java b/src/main/java/org/saturnclient/ui/screens/TitleMenu.java new file mode 100644 index 0000000..9c224d6 --- /dev/null +++ b/src/main/java/org/saturnclient/ui/screens/TitleMenu.java @@ -0,0 +1,78 @@ +package org.saturnclient.ui.screens; + +import org.saturnclient.common.minecraft.MinecraftProvider; +import org.saturnclient.config.AnimationConfig; +import org.saturnclient.config.Config; +import org.saturnclient.ui.SaturnScreen; +import org.saturnclient.ui.anim.Fade; +import org.saturnclient.ui.anim.SlideFade; +import org.saturnclient.ui.anim.SlideY; +import org.saturnclient.ui.elements.AnimationStagger; +import org.saturnclient.ui.elements.Button; +import org.saturnclient.ui.elements.ImageTexture; +import org.saturnclient.ui.elements.TextureButton; +import org.saturnclient.ui.resources.Fonts; +import org.saturnclient.ui.resources.Textures; +import org.saturnclient.ui.screens.cosmetics.CloakMenu; + +public class TitleMenu extends SaturnScreen { + public TitleMenu() { + super("Title Menu"); + } + + @Override + public void ui() { + backgroundBlur = 0; + + draw(new ImageTexture(Textures.LOGO_TEXT).dimensions(98, 10).centerOffset(width, height, 0, -40) + .animation(new Fade(AnimationConfig.logo.duration.value))); + draw(new ImageTexture(Config.getLogo()).dimensions(98, 98).centerOffset(width, height, 0, -84) + .animation(new SlideY(AnimationConfig.logo, -20))); + + AnimationStagger mainButtonStagger = new AnimationStagger(AnimationConfig.mainMenu); + + // TODO implement all of these + + mainButtonStagger.draw(new Button("SINGLEPLAYER", () -> { + // MinecraftProvider.PROVIDER.setScreen(new SelectWorldScreen(new TitleMenu())); + }).scale(0.69f).dimensions(420, 52).position(0, 0) + .animation(new SlideFade(AnimationConfig.mainMenu, -10))); + + mainButtonStagger.draw(new Button("MULTIPLAYER", () -> { + // MinecraftProvider.PROVIDER.setScreen(new MultiplayerScreen(new TitleMenu())); + }).scale(0.69f).dimensions(420, 52).position(0, 40) + .animation(new SlideFade(AnimationConfig.mainMenu, -10))); + + mainButtonStagger.draw(new Button("OPTIONS", () -> { + // MinecraftProvider.PROVIDER.setScreen(new OptionsScreen(new TitleMenu(), SaturnClient.client.options)); + }).scale(0.69f).dimensions(206, 52).position(0, 80) + .animation(new SlideFade(AnimationConfig.mainMenu, -10))); + + mainButtonStagger.draw(new Button("QUIT", () -> { + // client.scheduleStop(); + }).scale(0.69f).dimensions(206, 52).position(146, 80) + .animation(new SlideFade(AnimationConfig.mainMenu, -10))); + + draw(mainButtonStagger.dimensions(289, 143).centerOffset(width, height, 0, 50)); + + int s = Fonts.getHeight() + 20; + + AnimationStagger saturnStagger = new AnimationStagger(AnimationConfig.mainMenu.stagger.value); + + saturnStagger.draw(new TextureButton(Textures.HUD_ICON, () -> { + MinecraftProvider.PROVIDER.setScreen(new HudEditor()); + }).dimensions(s, s).position(0, 0).animation(new SlideFade(AnimationConfig.mainMenu, s + 8))); + + saturnStagger.draw(new TextureButton(Textures.SETTINGS, () -> { + MinecraftProvider.PROVIDER.setScreen(new ModMenu()); + }).dimensions(s, s).position(s + 2, 0) + .animation(new SlideFade(AnimationConfig.mainMenu, s + 8))); + + saturnStagger.draw(new TextureButton(Textures.CLOAK, () -> { + MinecraftProvider.PROVIDER.setScreen(new CloakMenu()); + }).dimensions(s, s).position((s + 2) * 2, 0) + .animation(new SlideFade(AnimationConfig.mainMenu, s + 8))); + + draw(saturnStagger.dimensions(((s + 2) * 2) + s, s).centerHorizontal(width, height, 0, 8)); + } +} diff --git a/src/main/java/org/saturnclient/ui/screens/cosmetics/CloakMenu.java b/src/main/java/org/saturnclient/ui/screens/cosmetics/CloakMenu.java new file mode 100644 index 0000000..2c43b4f --- /dev/null +++ b/src/main/java/org/saturnclient/ui/screens/cosmetics/CloakMenu.java @@ -0,0 +1,83 @@ +package org.saturnclient.ui.screens.cosmetics; + +import org.saturnclient.client.player.SaturnPlayer; +// import org.saturnclient.cosmetics.cloak.Cloaks; +import org.saturnclient.common.minecraft.MinecraftProvider; +import org.saturnclient.config.AnimationConfig; +import org.saturnclient.ui.SaturnScreen; +import org.saturnclient.ui.anim.Fade; +import org.saturnclient.ui.anim.SlideY; +import org.saturnclient.ui.components.CosmeticPreview; +import org.saturnclient.ui.components.Sidebar; +import org.saturnclient.ui.components.SkinPreview; +import org.saturnclient.ui.elements.AnimationStagger; +import org.saturnclient.ui.elements.Scroll; +import org.saturnclient.ui.elements.TabMenu; +import org.saturnclient.ui.elements.TabMenu.TabMenuComponent; +import org.saturnclient.ui.resources.Textures; + +public class CloakMenu extends SaturnScreen { + public CloakMenu() { + super("Cloaks Menu"); + } + + @Override + public void ui() { + int p = 10; + int g = 10; + + Scroll scroll = new Scroll(p); + + int row = 0; + int col = 0; + + SaturnPlayer player = SaturnPlayer.get(); + + AnimationStagger stagger = new AnimationStagger(AnimationConfig.cosmeticsMenu); + + if (player != null) { + // for (String cloak : Cloaks.availableCloaks) { + + // stagger.draw( + // new CosmeticPreview( + // cloak == player.cloak, + // Textures.getCloakPreview(cloak), + // () -> Cloaks.setCloak(cloak)) + // .position((50 + g) * col, (111 + g) * row) + // .animation(new SlideY(AnimationConfig.cosmeticsMenu, 14))); + + // if (col == 5) { + // col = 0; + // row++; + // } else { + // col++; + // } + // } + } + + scroll.draw(stagger); + + int scrollWidth = 480 + 10 + (g * 2) + (p * 2); + + draw(scroll + .dimensions(scrollWidth, 350) + .center(width, height)); + + draw(new SkinPreview(-30.0f, false) + .scale(3.5f) + .position(scroll.x + (scrollWidth - 220), scroll.y + 40) + .animation(new Fade(500))); + + draw(new Sidebar(2, this.provider::close) + .centerOffset(width, height, -(scrollWidth / 2 + 20), 0) + .animation(new Fade(400))); + + draw(new TabMenu(0, + new TabMenuComponent(Textures.CLOAK, () -> { + }), + new TabMenuComponent(Textures.HAT, () -> { + MinecraftProvider.PROVIDER.setScreen(new HatMenu()); + })) + .centerOffset(width, height, 0, -195)); + } +} diff --git a/src/main/java/org/saturnclient/ui/screens/cosmetics/HatMenu.java b/src/main/java/org/saturnclient/ui/screens/cosmetics/HatMenu.java new file mode 100644 index 0000000..982fde3 --- /dev/null +++ b/src/main/java/org/saturnclient/ui/screens/cosmetics/HatMenu.java @@ -0,0 +1,84 @@ +package org.saturnclient.ui.screens.cosmetics; + +import org.saturnclient.client.player.SaturnPlayer; +// import org.saturnclient.cosmetics.hat.Hats; +import org.saturnclient.common.minecraft.MinecraftProvider; +import org.saturnclient.config.AnimationConfig; +import org.saturnclient.ui.SaturnScreen; +import org.saturnclient.ui.anim.Fade; +import org.saturnclient.ui.anim.SlideY; +import org.saturnclient.ui.components.CosmeticPreview; +import org.saturnclient.ui.components.Sidebar; +import org.saturnclient.ui.components.SkinPreview; +import org.saturnclient.ui.elements.AnimationStagger; +import org.saturnclient.ui.elements.Scroll; +import org.saturnclient.ui.elements.TabMenu; +import org.saturnclient.ui.elements.TabMenu.TabMenuComponent; +import org.saturnclient.ui.resources.Textures; + +public class HatMenu extends SaturnScreen { + public HatMenu() { + super("Hats Menu"); + } + + @Override + public void ui() { + int p = 10; + int g = 10; + + Scroll scroll = new Scroll(p); + + int row = 0; + int col = 0; + + SaturnPlayer player = SaturnPlayer.get(); + + AnimationStagger stagger = new AnimationStagger(AnimationConfig.cosmeticsMenu); + + if (player != null) { + // for (String hat : Hats.availableHats) { + + // stagger.draw( + // new CosmeticPreview( + // hat == player.hat, + // Textures.getHatPreview(hat), + // () -> Hats.setHat(hat)) + // .dimensions(50, 50) + // .position((50 + g) * col, (50 + g) * row) + // .animation(new SlideY(AnimationConfig.cosmeticsMenu, 14))); + + // if (col == 5) { + // col = 0; + // row++; + // } else { + // col++; + // } + // } + } + + scroll.draw(stagger); + + int scrollWidth = 480 + 10 + (g * 2) + (p * 2); + + draw(scroll + .dimensions(scrollWidth, 350) + .center(width, height)); + + draw(new SkinPreview(170f, true) + .scale(3.5f) + .position(scroll.x + (scrollWidth - 220), scroll.y + 40) + .animation(new Fade(500))); + + draw(new Sidebar(2, this.provider::close) + .centerOffset(width, height, -(scrollWidth / 2 + 20), 0) + .animation(new Fade(400))); + + draw(new TabMenu(1, + new TabMenuComponent(Textures.CLOAK, () -> { + MinecraftProvider.PROVIDER.setScreen(new CloakMenu()); + }), + new TabMenuComponent(Textures.HAT, () -> { + })) + .centerOffset(width, height, 0, -195)); + } +} diff --git a/src/main/java/org/saturnclient/ui/screens/store/CloakStore.java b/src/main/java/org/saturnclient/ui/screens/store/CloakStore.java new file mode 100644 index 0000000..7091ff7 --- /dev/null +++ b/src/main/java/org/saturnclient/ui/screens/store/CloakStore.java @@ -0,0 +1,142 @@ +package org.saturnclient.ui.screens.store; + +// import org.saturnclient.cosmetics.cloak.Cloaks; +import org.saturnclient.client.ServiceClient; +import org.saturnclient.client.player.SaturnPlayer; +import org.saturnclient.common.minecraft.MinecraftProvider; +import org.saturnclient.config.AnimationConfig; +import org.saturnclient.config.Theme; +import org.saturnclient.ui.SaturnScreen; +import org.saturnclient.ui.anim.Fade; +import org.saturnclient.ui.anim.SlideY; +import org.saturnclient.ui.components.CosmeticPreview; +import org.saturnclient.ui.components.Sidebar; +import org.saturnclient.ui.elements.AnimationStagger; +import org.saturnclient.ui.elements.ImageTexture; +import org.saturnclient.ui.elements.Scroll; +import org.saturnclient.ui.elements.TabMenu; +import org.saturnclient.ui.elements.Text; +import org.saturnclient.ui.elements.TabMenu.TabMenuComponent; +import org.saturnclient.ui.resources.Fonts; +import org.saturnclient.ui.resources.Textures; + +// import com.mojang.blaze3d.systems.RenderSystem; + +public class CloakStore extends SaturnScreen { + private long lastPurchaseTime = 0; + + public CloakStore() { + super("Cloak Store"); + } + + public CloakStore(long lastPurchaseTime) { + super("Cloak Store"); + this.lastPurchaseTime = lastPurchaseTime; + } + + @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 = SaturnPlayer.get(); + + AnimationStagger stagger = new AnimationStagger(AnimationConfig.cosmeticsMenu); + + if (player != null) { + // for (String cloak : Cloaks.ALL_CLOAKS) { + // if (!Cloaks.availableCloaks.contains(cloak)) { + + // int x = (50 + gx) * col; + // int y = (111 + gy) * row; + + // stagger.draw( + // new CosmeticPreview( + // cloak == player.cloak, + // Textures.getCloakPreview(cloak), + // () -> handlePurchase(cloak)) + // .position(x, y) + // .animation(new SlideY(AnimationConfig.cosmeticsMenu, 16))); + + // String t = "100"; + + // stagger.draw( + // new Text(t) + // .position(x + Fonts.centerX(50, t, Theme.FONT.value), y + 113) + // .scale(0.5f) + // .animation(new Fade(400))); + + // stagger.draw( + // new ImageTexture(Textures.COINS) + // .dimensions(16, 16) + // .position(x + Fonts.getWidth(t, Theme.FONT.value) - 1, y + 112) + // .scale(0.5f) + // .animation(new Fade(400))); + + // if (col == 8) { + // col = 0; + // row++; + // } else { + // col++; + // } + // } + // } + } + + scroll.draw(stagger); + + int scrollWidth = 480 + 40 + (gx * 2) + (p * 2); + + draw(scroll + .dimensions(scrollWidth, 350) + .centerOffset(width, height, 15, 0)); + + draw(new Sidebar(5, this.provider::close) + .centerOffset(width, height, -((scrollWidth - 30) / 2 + 20), 0) + .animation(new Fade(400))); + + draw(new TabMenu(0, + new TabMenuComponent(Textures.CLOAK, () -> { + }), + new TabMenuComponent(Textures.HAT, () -> { + MinecraftProvider.PROVIDER.setScreen(new HatStore()); + })) + .centerOffset(width, height, 0, -195)); + } + + private void handlePurchase(String cloak) { + long now = System.currentTimeMillis(); + + if (now - lastPurchaseTime >= 3000) { + // Utils.notify(NotificationKind.Info, "Purchase processing", "Please wait"); + + ServiceClient.buyCloak(cloak); + lastPurchaseTime = now; + + new Thread(() -> { + try { + Thread.sleep(5000); + } catch (InterruptedException ignored) { + } + + // RenderSystem.recordRenderCall(() -> { + // MinecraftProvider.PROVIDER.setScreen(new CloakStore(now)); + // // Utils.notify(NotificationKind.Success, + // // "Purchase complete", + // // "Congrats, enjoy your new cloak!"); + // }); + }).start(); + + } else { + // Utils.notify(NotificationKind.Error, + // "Timeout error", + // "Please wait 3 seconds"); + } + } +} diff --git a/src/main/java/org/saturnclient/ui/screens/store/HatStore.java b/src/main/java/org/saturnclient/ui/screens/store/HatStore.java new file mode 100644 index 0000000..d9d7c08 --- /dev/null +++ b/src/main/java/org/saturnclient/ui/screens/store/HatStore.java @@ -0,0 +1,143 @@ +package org.saturnclient.ui.screens.store; + +// import org.saturnclient.cosmetics.hat.Hats; +import org.saturnclient.client.ServiceClient; +import org.saturnclient.client.player.SaturnPlayer; +import org.saturnclient.common.minecraft.MinecraftProvider; +import org.saturnclient.config.AnimationConfig; +import org.saturnclient.config.Theme; +import org.saturnclient.ui.SaturnScreen; +import org.saturnclient.ui.anim.Fade; +import org.saturnclient.ui.anim.SlideY; +import org.saturnclient.ui.components.CosmeticPreview; +import org.saturnclient.ui.components.Sidebar; +import org.saturnclient.ui.elements.AnimationStagger; +import org.saturnclient.ui.elements.ImageTexture; +import org.saturnclient.ui.elements.Scroll; +import org.saturnclient.ui.elements.TabMenu; +import org.saturnclient.ui.elements.Text; +import org.saturnclient.ui.elements.TabMenu.TabMenuComponent; +import org.saturnclient.ui.resources.Fonts; +import org.saturnclient.ui.resources.Textures; + +// import com.mojang.blaze3d.systems.RenderSystem; + +public class HatStore extends SaturnScreen { + private long lastPurchaseTime = 0; + + public HatStore() { + super("Hat Store"); + } + + public HatStore(long lastPurchaseTime) { + super("Hat Store"); + this.lastPurchaseTime = lastPurchaseTime; + } + + @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 = SaturnPlayer.get(); + + AnimationStagger stagger = new AnimationStagger(AnimationConfig.cosmeticsMenu); + + if (player != null) { + // for (String hat : Hats.ALL_HATS) { + // if (!Hats.availableHats.contains(hat)) { + + // int x = (50 + gx) * col; + // int y = (50 + gy) * row; + + // stagger.draw( + // new CosmeticPreview( + // hat == player.hat, + // Textures.getHatPreview(hat), + // () -> handlePurchase(hat)) + // .dimensions(50, 50) + // .position(x, y) + // .animation(new SlideY(AnimationConfig.cosmeticsMenu, 16))); + + // String t = "50"; + + // stagger.draw( + // new Text(t) + // .position(x + Fonts.centerX(50, t, Theme.FONT.value), y + 53) + // .scale(0.5f) + // .animation(new Fade(400))); + + // stagger.draw( + // new ImageTexture(Textures.COINS) + // .dimensions(16, 16) + // .position(x + Fonts.getWidth(t, Theme.FONT.value) + 4, y + 52) + // .scale(0.5f) + // .animation(new Fade(400))); + + // if (col == 8) { + // col = 0; + // row++; + // } else { + // col++; + // } + // } + // } + } + + scroll.draw(stagger); + + int scrollWidth = 480 + 40 + (gx * 2) + (p * 2); + + draw(scroll + .dimensions(scrollWidth, 350) + .centerOffset(width, height, 15, 0)); + + draw(new Sidebar(5, this.provider::close) + .centerOffset(width, height, -((scrollWidth - 30) / 2 + 20), 0) + .animation(new Fade(400))); + + draw(new TabMenu(1, + new TabMenuComponent(Textures.CLOAK, () -> { + MinecraftProvider.PROVIDER.setScreen(new CloakStore()); + }), + new TabMenuComponent(Textures.HAT, () -> { + })) + .centerOffset(width, height, 0, -195)); + } + + private void handlePurchase(String hat) { + long now = System.currentTimeMillis(); + + if (now - lastPurchaseTime >= 3000) { + // Utils.notify(NotificationKind.Info, "Purchase processing", "Please wait"); + + ServiceClient.buyHat(hat); + lastPurchaseTime = now; + + new Thread(() -> { + try { + Thread.sleep(5000); + } catch (InterruptedException ignored) { + } + + // RenderSystem.recordRenderCall(() -> { + // MinecraftProvider.PROVIDER.setScreen(new HatStore(now)); + // // Utils.notify(NotificationKind.Success, + // // "Purchase complete", + // // "Congrats, enjoy your new hat!"); + // }); + }).start(); + + } else { + // Utils.notify(NotificationKind.Error, + // "Timeout error", + // "Please wait 3 seconds"); + } + } +}