diff --git a/src/main/java/org/saturnclient/modules/ModDimensions.java b/src/main/java/org/saturnclient/modules/ModDimensions.java index c09b096..77f6e6f 100644 --- a/src/main/java/org/saturnclient/modules/ModDimensions.java +++ b/src/main/java/org/saturnclient/modules/ModDimensions.java @@ -2,8 +2,8 @@ package org.saturnclient.modules; import java.util.Map; -import org.saturnclient.saturnclient.config.Property.NamedProperty; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; +import org.saturnclient.saturnclient.config.manager.Property.NamedProperty; public class ModDimensions { public Property x = Property.integer(0); diff --git a/src/main/java/org/saturnclient/modules/Module.java b/src/main/java/org/saturnclient/modules/Module.java index bedc306..6c719d6 100644 --- a/src/main/java/org/saturnclient/modules/Module.java +++ b/src/main/java/org/saturnclient/modules/Module.java @@ -1,9 +1,9 @@ package org.saturnclient.modules; -import org.saturnclient.saturnclient.config.ConfigManager; import org.saturnclient.ui2.resources.Textures; +import org.saturnclient.saturnclient.config.manager.ConfigManager; +import org.saturnclient.saturnclient.config.manager.Property.NamedProperty; import org.saturnclient.ui2.RenderScope; -import org.saturnclient.saturnclient.config.Property.NamedProperty; import net.minecraft.util.Identifier; diff --git a/src/main/java/org/saturnclient/modules/mods/ArmorDisplay.java b/src/main/java/org/saturnclient/modules/mods/ArmorDisplay.java index 248072b..5778b71 100644 --- a/src/main/java/org/saturnclient/modules/mods/ArmorDisplay.java +++ b/src/main/java/org/saturnclient/modules/mods/ArmorDisplay.java @@ -5,7 +5,7 @@ import org.saturnclient.modules.ModDimensions; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; import org.saturnclient.saturnclient.SaturnClient; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.RenderScope; import net.minecraft.entity.EquipmentSlot; diff --git a/src/main/java/org/saturnclient/modules/mods/AutoSprint.java b/src/main/java/org/saturnclient/modules/mods/AutoSprint.java index 7352e63..7a413b4 100644 --- a/src/main/java/org/saturnclient/modules/mods/AutoSprint.java +++ b/src/main/java/org/saturnclient/modules/mods/AutoSprint.java @@ -5,7 +5,7 @@ import java.util.Objects; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; import org.saturnclient.saturnclient.SaturnClient; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; public class AutoSprint extends Module { private static Property enabled = Property.bool(false); diff --git a/src/main/java/org/saturnclient/modules/mods/Clock.java b/src/main/java/org/saturnclient/modules/mods/Clock.java index 10170fa..2492162 100644 --- a/src/main/java/org/saturnclient/modules/mods/Clock.java +++ b/src/main/java/org/saturnclient/modules/mods/Clock.java @@ -7,7 +7,7 @@ import org.saturnclient.modules.HudMod; import org.saturnclient.modules.ModDimensions; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.resources.Fonts; diff --git a/src/main/java/org/saturnclient/modules/mods/Coordinates.java b/src/main/java/org/saturnclient/modules/mods/Coordinates.java index 1f9c5dc..7ad5c0b 100644 --- a/src/main/java/org/saturnclient/modules/mods/Coordinates.java +++ b/src/main/java/org/saturnclient/modules/mods/Coordinates.java @@ -5,7 +5,7 @@ import org.saturnclient.modules.ModDimensions; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; import org.saturnclient.saturnclient.SaturnClient; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.resources.Fonts; diff --git a/src/main/java/org/saturnclient/modules/mods/Crosshair.java b/src/main/java/org/saturnclient/modules/mods/Crosshair.java index 1681c7e..5a4ed46 100644 --- a/src/main/java/org/saturnclient/modules/mods/Crosshair.java +++ b/src/main/java/org/saturnclient/modules/mods/Crosshair.java @@ -3,7 +3,7 @@ package org.saturnclient.modules.mods; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; import org.saturnclient.saturnclient.SaturnClient; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.resources.Textures; diff --git a/src/main/java/org/saturnclient/modules/mods/DayCounter.java b/src/main/java/org/saturnclient/modules/mods/DayCounter.java index 318e928..bbb0b25 100644 --- a/src/main/java/org/saturnclient/modules/mods/DayCounter.java +++ b/src/main/java/org/saturnclient/modules/mods/DayCounter.java @@ -5,7 +5,7 @@ import org.saturnclient.modules.ModDimensions; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; import org.saturnclient.saturnclient.SaturnClient; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.resources.Fonts; diff --git a/src/main/java/org/saturnclient/modules/mods/Fps.java b/src/main/java/org/saturnclient/modules/mods/Fps.java index afaea6c..f788e71 100644 --- a/src/main/java/org/saturnclient/modules/mods/Fps.java +++ b/src/main/java/org/saturnclient/modules/mods/Fps.java @@ -5,7 +5,7 @@ import org.saturnclient.modules.ModDimensions; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; import org.saturnclient.saturnclient.SaturnClient; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.resources.Fonts; diff --git a/src/main/java/org/saturnclient/modules/mods/Freelook.java b/src/main/java/org/saturnclient/modules/mods/Freelook.java index 4ad51e0..e894211 100644 --- a/src/main/java/org/saturnclient/modules/mods/Freelook.java +++ b/src/main/java/org/saturnclient/modules/mods/Freelook.java @@ -4,7 +4,7 @@ import org.lwjgl.glfw.GLFW; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; import org.saturnclient.saturnclient.SaturnClient; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; import net.minecraft.client.option.Perspective; diff --git a/src/main/java/org/saturnclient/modules/mods/Fullbright.java b/src/main/java/org/saturnclient/modules/mods/Fullbright.java index 682e1e2..7c4a3d3 100644 --- a/src/main/java/org/saturnclient/modules/mods/Fullbright.java +++ b/src/main/java/org/saturnclient/modules/mods/Fullbright.java @@ -2,7 +2,7 @@ package org.saturnclient.modules.mods; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; public class Fullbright extends Module { private static Property enabled = Property.bool(false); diff --git a/src/main/java/org/saturnclient/modules/mods/HealthDisplay.java b/src/main/java/org/saturnclient/modules/mods/HealthDisplay.java index a3cd80f..e831ec2 100644 --- a/src/main/java/org/saturnclient/modules/mods/HealthDisplay.java +++ b/src/main/java/org/saturnclient/modules/mods/HealthDisplay.java @@ -5,7 +5,7 @@ import org.saturnclient.modules.ModDimensions; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; import org.saturnclient.saturnclient.SaturnClient; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.resources.Fonts; diff --git a/src/main/java/org/saturnclient/modules/mods/Keystrokes.java b/src/main/java/org/saturnclient/modules/mods/Keystrokes.java index 7b356ea..f67e755 100644 --- a/src/main/java/org/saturnclient/modules/mods/Keystrokes.java +++ b/src/main/java/org/saturnclient/modules/mods/Keystrokes.java @@ -4,7 +4,7 @@ import org.saturnclient.modules.Module; import org.saturnclient.modules.HudMod; import org.saturnclient.modules.ModDimensions; import org.saturnclient.saturnclient.SaturnClient; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.RenderScope; import org.saturnclient.modules.ModuleDetails; diff --git a/src/main/java/org/saturnclient/modules/mods/Nametags.java b/src/main/java/org/saturnclient/modules/mods/Nametags.java index c1ebeb9..5f4948f 100644 --- a/src/main/java/org/saturnclient/modules/mods/Nametags.java +++ b/src/main/java/org/saturnclient/modules/mods/Nametags.java @@ -3,7 +3,7 @@ package org.saturnclient.modules.mods; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; import org.saturnclient.modules.mods.utils.HealthRenderState; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; import net.minecraft.client.render.entity.state.LivingEntityRenderState; diff --git a/src/main/java/org/saturnclient/modules/mods/NoFog.java b/src/main/java/org/saturnclient/modules/mods/NoFog.java index 14c3ace..bd8d17e 100644 --- a/src/main/java/org/saturnclient/modules/mods/NoFog.java +++ b/src/main/java/org/saturnclient/modules/mods/NoFog.java @@ -2,7 +2,7 @@ package org.saturnclient.modules.mods; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; public class NoFog extends Module { private static Property enabled = Property.bool(false); diff --git a/src/main/java/org/saturnclient/modules/mods/Ping.java b/src/main/java/org/saturnclient/modules/mods/Ping.java index e75d5ad..06c103d 100644 --- a/src/main/java/org/saturnclient/modules/mods/Ping.java +++ b/src/main/java/org/saturnclient/modules/mods/Ping.java @@ -4,7 +4,7 @@ import org.saturnclient.modules.HudMod; import org.saturnclient.modules.ModDimensions; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.resources.Fonts; diff --git a/src/main/java/org/saturnclient/modules/mods/Speedometer.java b/src/main/java/org/saturnclient/modules/mods/Speedometer.java index ddb17f2..ec3663c 100644 --- a/src/main/java/org/saturnclient/modules/mods/Speedometer.java +++ b/src/main/java/org/saturnclient/modules/mods/Speedometer.java @@ -5,7 +5,7 @@ import org.saturnclient.modules.ModDimensions; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; import org.saturnclient.saturnclient.SaturnClient; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.resources.Fonts; diff --git a/src/main/java/org/saturnclient/modules/mods/StatusEffects.java b/src/main/java/org/saturnclient/modules/mods/StatusEffects.java index e25dd27..3d4a1e0 100644 --- a/src/main/java/org/saturnclient/modules/mods/StatusEffects.java +++ b/src/main/java/org/saturnclient/modules/mods/StatusEffects.java @@ -7,7 +7,7 @@ import org.saturnclient.modules.ModDimensions; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; import org.saturnclient.saturnclient.SaturnClient; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.RenderScope; import net.minecraft.client.resource.language.I18n; diff --git a/src/main/java/org/saturnclient/modules/mods/Tps.java b/src/main/java/org/saturnclient/modules/mods/Tps.java index 923adb9..a8eb977 100644 --- a/src/main/java/org/saturnclient/modules/mods/Tps.java +++ b/src/main/java/org/saturnclient/modules/mods/Tps.java @@ -4,7 +4,7 @@ import org.saturnclient.modules.HudMod; import org.saturnclient.modules.ModDimensions; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.resources.Fonts; diff --git a/src/main/java/org/saturnclient/modules/mods/Zoom.java b/src/main/java/org/saturnclient/modules/mods/Zoom.java index 32dc738..cd9d28a 100644 --- a/src/main/java/org/saturnclient/modules/mods/Zoom.java +++ b/src/main/java/org/saturnclient/modules/mods/Zoom.java @@ -3,7 +3,7 @@ package org.saturnclient.modules.mods; import org.lwjgl.glfw.GLFW; import org.saturnclient.modules.Module; import org.saturnclient.modules.ModuleDetails; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; public class Zoom extends Module { private static Property enabled = Property.bool(false); diff --git a/src/main/java/org/saturnclient/saturnclient/SaturnClient.java b/src/main/java/org/saturnclient/saturnclient/SaturnClient.java index 1894a58..945e3d7 100644 --- a/src/main/java/org/saturnclient/saturnclient/SaturnClient.java +++ b/src/main/java/org/saturnclient/saturnclient/SaturnClient.java @@ -8,8 +8,8 @@ import net.minecraft.client.util.math.MatrixStack; import org.saturnclient.modules.ModManager; import org.saturnclient.saturnclient.client.ServiceClient; -import org.saturnclient.saturnclient.config.ConfigManager; -import org.saturnclient.saturnclient.config.SaturnClientConfig; +import org.saturnclient.saturnclient.config.Config; +import org.saturnclient.saturnclient.config.manager.ConfigManager; import org.saturnclient.saturnclient.cosmetics.Emotes; import org.saturnclient.saturnclient.cosmetics.Hats; import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; @@ -38,7 +38,7 @@ public class SaturnClient implements ModInitializer { public void onInitialize() { LOGGER.info("Initializing " + MOD_ID); client = MinecraftClient.getInstance(); - SaturnClientConfig.init(); + Config.init(); ModManager.init(); client.execute(() -> { diff --git a/src/main/java/org/saturnclient/saturnclient/client/player/Roles.java b/src/main/java/org/saturnclient/saturnclient/client/player/Roles.java index 8771960..fdc47cb 100644 --- a/src/main/java/org/saturnclient/saturnclient/client/player/Roles.java +++ b/src/main/java/org/saturnclient/saturnclient/client/player/Roles.java @@ -3,7 +3,7 @@ package org.saturnclient.saturnclient.client.player; import java.util.Map; import java.util.UUID; -import org.saturnclient.saturnclient.config.SaturnClientConfig; +import org.saturnclient.saturnclient.config.Config; import net.minecraft.util.Formatting; @@ -54,6 +54,6 @@ public class Roles { } public static String getSaturnIndicator() { - return SaturnClientConfig.realisticLogo.value ? "" : ""; + return Config.realisticLogo.value ? "" : ""; } } diff --git a/src/main/java/org/saturnclient/saturnclient/config/AnimationConfig.java b/src/main/java/org/saturnclient/saturnclient/config/AnimationConfig.java new file mode 100644 index 0000000..c2bcd62 --- /dev/null +++ b/src/main/java/org/saturnclient/saturnclient/config/AnimationConfig.java @@ -0,0 +1,55 @@ +package org.saturnclient.saturnclient.config; + +import org.saturnclient.saturnclient.config.manager.ConfigManager; +import org.saturnclient.saturnclient.config.manager.Property; + +public class AnimationConfig { + public static ConfigManager config; + + // Logo + public static final AnimationConfig logo = new AnimationConfig(true, 700, 0); + + // Main menu + public static final AnimationConfig mainMenu = new AnimationConfig(true, 700, 120); + + // Mod menu + public static final AnimationConfig modMenu = new AnimationConfig(true, 700, 30); + + // Shift menu + public static final AnimationConfig shiftMenu = new AnimationConfig(true, 300, 120); + + // Cosmetics menu + public static final AnimationConfig cosmeticsMenu = new AnimationConfig(true, 700, 40); + + // Emote wheel + public static final AnimationConfig emoteWheel = new AnimationConfig(true, 700, 80); + + public static void init(ConfigManager parent) { + config = new ConfigManager(parent, "Animations"); + + logo.init("Logo"); + mainMenu.init("Main Menu"); + modMenu.init("Mod Menu"); + shiftMenu.init("Shift Menu"); + cosmeticsMenu.init("Cosmetics Menu"); + emoteWheel.init("Emote Wheel"); + } + + // Animation properties + public final Property duration; + public final Property stagger; + public final Property curve; + + public AnimationConfig(boolean enabled, int delay, int stagger) { + this.duration = Property.integer(delay); + this.stagger = Property.integer(stagger); + this.curve = Property.select(1, "Ease In Out Cubic", "Ease Out Cubic", "Ease In Out Back"); + } + + public void init(String name) { + // config.property("Enable " + name + " Animations", this.enabled); + config.property(name + " Duration", this.duration); + config.property(name + " Stagger", this.stagger); + config.property(name + " Curve", this.curve); + } +} diff --git a/src/main/java/org/saturnclient/saturnclient/config/SaturnClientConfig.java b/src/main/java/org/saturnclient/saturnclient/config/Config.java similarity index 70% rename from src/main/java/org/saturnclient/saturnclient/config/SaturnClientConfig.java rename to src/main/java/org/saturnclient/saturnclient/config/Config.java index 31afbc8..08a5b90 100644 --- a/src/main/java/org/saturnclient/saturnclient/config/SaturnClientConfig.java +++ b/src/main/java/org/saturnclient/saturnclient/config/Config.java @@ -1,14 +1,13 @@ package org.saturnclient.saturnclient.config; -import java.util.function.Function; - import org.lwjgl.glfw.GLFW; -import org.saturnclient.ui2.anim.Curve; +import org.saturnclient.saturnclient.config.manager.ConfigManager; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.resources.Textures; import net.minecraft.util.Identifier; -public class SaturnClientConfig { +public class Config { public static ConfigManager config; public static Property realisticLogo = Property.bool(false); @@ -16,19 +15,11 @@ public class SaturnClientConfig { public static Property bendyCloaks = Property.bool(true); public static Property openEmoteWheel = Property.keybinding(GLFW.GLFW_KEY_B); public static Property stagger = Property.bool(true); - public static Property animationCurve = Property.select(1, "Ease In Out", "Ease Out"); public static Identifier getLogo() { return realisticLogo.value ? Textures.REALISTIC_LOGO : Textures.LOGO; } - public static Function getAnimationCurve() { - switch (animationCurve.value) { - case 1: return Curve::easeOutCubic; - default: return Curve::easeInOutCubic; - } - } - public static void init() { config = new ConfigManager("Saturn Client"); config.property("Realistic logo", realisticLogo); @@ -36,9 +27,11 @@ public class SaturnClientConfig { config.property("Open Emote Wheel", openEmoteWheel); config.property("Bendy Cloaks", bendyCloaks); config.property("Stagger Animations", stagger); - config.property("Animation Curve", animationCurve); // Initialize a sub namespace for theme Theme.init(config); + + // Initialize a sub namespace for animations + AnimationConfig.init(config); } } diff --git a/src/main/java/org/saturnclient/saturnclient/config/Theme.java b/src/main/java/org/saturnclient/saturnclient/config/Theme.java index 29cb887..bf58fae 100644 --- a/src/main/java/org/saturnclient/saturnclient/config/Theme.java +++ b/src/main/java/org/saturnclient/saturnclient/config/Theme.java @@ -1,5 +1,8 @@ package org.saturnclient.saturnclient.config; +import org.saturnclient.saturnclient.config.manager.ConfigManager; +import org.saturnclient.saturnclient.config.manager.Property; + public class Theme { // Main UI background (slightly warm dark to match Saturn tone) public static final Property BACKGROUND = Property.color(0xFF12100D); @@ -26,8 +29,8 @@ public class Theme { public static final Property BG_RADIUS = Property.integer(12); public static final Property WIDGET_RADIUS = Property.integer(10); - // Font (keeping your current system) - public static Property FONT = Property.font(1); + // Font + public static final Property FONT = Property.font(1); public static void init(ConfigManager parent) { ConfigManager config = new ConfigManager(parent, "UI Style"); diff --git a/src/main/java/org/saturnclient/saturnclient/config/ConfigManager.java b/src/main/java/org/saturnclient/saturnclient/config/manager/ConfigManager.java similarity index 98% rename from src/main/java/org/saturnclient/saturnclient/config/ConfigManager.java rename to src/main/java/org/saturnclient/saturnclient/config/manager/ConfigManager.java index bc628b1..9bdc10d 100644 --- a/src/main/java/org/saturnclient/saturnclient/config/ConfigManager.java +++ b/src/main/java/org/saturnclient/saturnclient/config/manager/ConfigManager.java @@ -1,4 +1,4 @@ -package org.saturnclient.saturnclient.config; +package org.saturnclient.saturnclient.config.manager; import com.google.gson.*; import org.saturnclient.saturnclient.SaturnClient; diff --git a/src/main/java/org/saturnclient/saturnclient/config/Property.java b/src/main/java/org/saturnclient/saturnclient/config/manager/Property.java similarity index 99% rename from src/main/java/org/saturnclient/saturnclient/config/Property.java rename to src/main/java/org/saturnclient/saturnclient/config/manager/Property.java index 2d7dd2e..45ef2b5 100644 --- a/src/main/java/org/saturnclient/saturnclient/config/Property.java +++ b/src/main/java/org/saturnclient/saturnclient/config/manager/Property.java @@ -1,4 +1,4 @@ -package org.saturnclient.saturnclient.config; +package org.saturnclient.saturnclient.config.manager; import java.util.Map; diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java index bafc998..6dc23bd 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java @@ -1,7 +1,7 @@ package org.saturnclient.saturnclient.cosmetics; import org.saturnclient.saturnclient.client.player.SaturnPlayer; -import org.saturnclient.saturnclient.config.SaturnClientConfig; +import org.saturnclient.saturnclient.config.Config; import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; import net.minecraft.client.render.OverlayTexture; @@ -339,7 +339,7 @@ public class CloakFeatureRenderer extends FeatureRenderer curve = Curve::easeInOutCubic; public Integer duration = null; // Element duration, will fade out if not null public void render(RenderScope renderScope, ElementContext ctx) { @@ -43,7 +39,7 @@ public class Element { public void playAnimationFrame(long elapsed) { if (this.animation != null && elapsed >= this.animation.delay) { - this.animation.tick(this.curve + this.animation.tick(this.animation.curve .apply(Math.min(1.0, (double) (elapsed - this.animation.delay) / this.animation.duration)), this); } } @@ -86,12 +82,6 @@ public class Element { return this; } - public Element animation(Animation animation, Function curve) { - this.animation = animation; - this.curve = curve; - return this; - } - public Element scale(float scale) { this.scale = scale; return this; diff --git a/src/main/java/org/saturnclient/ui2/anim/Animation.java b/src/main/java/org/saturnclient/ui2/anim/Animation.java index 5fa328b..142ff78 100644 --- a/src/main/java/org/saturnclient/ui2/anim/Animation.java +++ b/src/main/java/org/saturnclient/ui2/anim/Animation.java @@ -1,10 +1,31 @@ package org.saturnclient.ui2.anim; +import java.util.function.Function; + +import org.saturnclient.saturnclient.config.AnimationConfig; import org.saturnclient.ui2.Element; public abstract class Animation { public int duration; public int delay = 0; + public Function curve = Curve::easeInOutCubic; + + Animation(AnimationConfig config) { + this.duration = config.duration.value; + switch (config.curve.value) { + case 0: + this.curve = Curve::easeInOutCubic; + break; + case 1: + this.curve = Curve::easeOutCubic; + break; + case 2: + this.curve = Curve::easeInOutBack; + break; + default: + break; + } + } Animation(int duration) { this.duration = duration; diff --git a/src/main/java/org/saturnclient/ui2/anim/Curve.java b/src/main/java/org/saturnclient/ui2/anim/Curve.java index c7f0a1c..ab9b811 100644 --- a/src/main/java/org/saturnclient/ui2/anim/Curve.java +++ b/src/main/java/org/saturnclient/ui2/anim/Curve.java @@ -9,12 +9,8 @@ public class Curve { return (x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2); } - public static double easeInOutCubicReverse(double x) { - return -(x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2); - } - public static double easeInOutBack(double x) { - double c1 = 1.70158; + double c1 = 2.5; double c2 = c1 * 1.525; if (x < 0.5) { diff --git a/src/main/java/org/saturnclient/ui2/anim/Fade.java b/src/main/java/org/saturnclient/ui2/anim/Fade.java index db75ae6..68a0329 100644 --- a/src/main/java/org/saturnclient/ui2/anim/Fade.java +++ b/src/main/java/org/saturnclient/ui2/anim/Fade.java @@ -1,5 +1,6 @@ package org.saturnclient.ui2.anim; +import org.saturnclient.saturnclient.config.AnimationConfig; import org.saturnclient.ui2.Element; public class Fade extends Animation { @@ -9,6 +10,10 @@ public class Fade extends Animation { super(duration); } + public Fade(AnimationConfig config) { + super(config); + } + @Override public void tick(double progress, Element element) { element.opacity = Math.max(0.1f, targetOpacity * (float) progress); diff --git a/src/main/java/org/saturnclient/ui2/anim/FadeOut.java b/src/main/java/org/saturnclient/ui2/anim/FadeOut.java index 77d93f6..76f39c9 100644 --- a/src/main/java/org/saturnclient/ui2/anim/FadeOut.java +++ b/src/main/java/org/saturnclient/ui2/anim/FadeOut.java @@ -1,5 +1,6 @@ package org.saturnclient.ui2.anim; +import org.saturnclient.saturnclient.config.AnimationConfig; import org.saturnclient.ui2.Element; public class FadeOut extends Animation { @@ -9,6 +10,10 @@ public class FadeOut extends Animation { super(duration); } + public FadeOut(AnimationConfig config) { + super(config); + } + @Override public void tick(double progress, Element element) { element.opacity = targetOpacity - (float) progress; diff --git a/src/main/java/org/saturnclient/ui2/anim/SlideFade.java b/src/main/java/org/saturnclient/ui2/anim/SlideFade.java index c407cc0..e0a24b4 100644 --- a/src/main/java/org/saturnclient/ui2/anim/SlideFade.java +++ b/src/main/java/org/saturnclient/ui2/anim/SlideFade.java @@ -1,5 +1,6 @@ package org.saturnclient.ui2.anim; +import org.saturnclient.saturnclient.config.AnimationConfig; import org.saturnclient.ui2.Element; public class SlideFade extends Animation { @@ -12,6 +13,12 @@ public class SlideFade extends Animation { this.slideY = new SlideY(duration, offset); } + public SlideFade(AnimationConfig config, int offset) { + super(config); + this.fade = new Fade(duration); + this.slideY = new SlideY(duration, offset); + } + @Override public void tick(double progress, Element element) { fade.delay = this.delay; diff --git a/src/main/java/org/saturnclient/ui2/anim/SlideX.java b/src/main/java/org/saturnclient/ui2/anim/SlideX.java index 58d5e8c..b759865 100644 --- a/src/main/java/org/saturnclient/ui2/anim/SlideX.java +++ b/src/main/java/org/saturnclient/ui2/anim/SlideX.java @@ -1,11 +1,20 @@ package org.saturnclient.ui2.anim; +import org.saturnclient.saturnclient.config.AnimationConfig; import org.saturnclient.ui2.Element; public class SlideX extends Animation { int offset = 20; - int maxOffset = 20; - int elementX; + double startX; + + public SlideX(AnimationConfig config) { + super(config); + } + + public SlideX(AnimationConfig config, int offset) { + super(config); + this.offset = offset; + } public SlideX(int duration) { super(duration); @@ -14,23 +23,17 @@ public class SlideX extends Animation { public SlideX(int duration, int offset) { super(duration); this.offset = offset; - this.maxOffset = offset; - } - - public SlideX(int duration, int offset, int maxOffset) { - super(duration); - this.offset = offset; - this.maxOffset = maxOffset; // ✅ fixed - } - - @Override - public void tick(double progress, Element element) { - element.x = elementX + (int) (offset * progress); } @Override public void init(Element element) { - element.x -= offset; - elementX = element.x; + startX = element.x - offset; + element.x = (int) startX; + } + + @Override + public void tick(double progress, Element element) { + double currentX = startX + offset * progress; + element.x = (int) currentX; } } diff --git a/src/main/java/org/saturnclient/ui2/anim/SlideXAbsolute.java b/src/main/java/org/saturnclient/ui2/anim/SlideXAbsolute.java deleted file mode 100644 index 75a3121..0000000 --- a/src/main/java/org/saturnclient/ui2/anim/SlideXAbsolute.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.saturnclient.ui2.anim; - -import org.saturnclient.ui2.Element; - -public class SlideXAbsolute extends Animation { - int offset = 20; - int maxOffset = 20; - int elementX; - - public SlideXAbsolute(int duration) { - super(duration); - } - - public SlideXAbsolute(int duration, int offset) { - super(duration); - this.offset = offset; - this.maxOffset = offset; - } - - public SlideXAbsolute(int duration, int offset, int maxOffset) { - super(duration); - this.offset = offset; - this.maxOffset = maxOffset; - } - - @Override - public void tick(double progress, Element element) { - element.x = elementX + (int) (offset * progress); - } - - @Override - public void init(Element element) { - elementX = element.x; - } -} diff --git a/src/main/java/org/saturnclient/ui2/anim/SlideY.java b/src/main/java/org/saturnclient/ui2/anim/SlideY.java index 5ca5a97..5c4ce09 100644 --- a/src/main/java/org/saturnclient/ui2/anim/SlideY.java +++ b/src/main/java/org/saturnclient/ui2/anim/SlideY.java @@ -1,28 +1,28 @@ package org.saturnclient.ui2.anim; +import org.saturnclient.saturnclient.config.AnimationConfig; import org.saturnclient.ui2.Element; public class SlideY extends Animation { int offset = 20; - int maxOffset = 20; double startY; + public SlideY(AnimationConfig config) { + super(config); + } + + public SlideY(AnimationConfig config, int offset) { + super(config); + this.offset = offset; + } + public SlideY(int duration) { super(duration); } public SlideY(int duration, int offset) { super(duration); - this.offset = offset; - this.maxOffset = offset; - } - - public SlideY(int duration, int offset, int maxOffset) { - super(duration); - - this.offset = offset; - this.maxOffset = offset; } @Override diff --git a/src/main/java/org/saturnclient/ui2/components/Sidebar.java b/src/main/java/org/saturnclient/ui2/components/Sidebar.java index 7d6e002..bbb7ef7 100644 --- a/src/main/java/org/saturnclient/ui2/components/Sidebar.java +++ b/src/main/java/org/saturnclient/ui2/components/Sidebar.java @@ -1,7 +1,7 @@ package org.saturnclient.ui2.components; import org.saturnclient.saturnclient.SaturnClient; -import org.saturnclient.saturnclient.config.SaturnClientConfig; +import org.saturnclient.saturnclient.config.Config; import org.saturnclient.saturnclient.config.Theme; import org.saturnclient.ui2.resources.Textures; import org.saturnclient.ui2.Element; @@ -35,7 +35,7 @@ public class Sidebar extends Element { SaturnClient.client.setScreen(new ModMenu()); }, false), new Sidebar.SidebarComponent(Textures.SETTINGS, () -> { - SaturnClient.client.setScreen(new ConfigEditor(SaturnClientConfig.config)); + SaturnClient.client.setScreen(new ConfigEditor(Config.config)); }, false), new Sidebar.SidebarComponent(Textures.SHIRT, () -> { diff --git a/src/main/java/org/saturnclient/ui2/components/inputs/FloatInput.java b/src/main/java/org/saturnclient/ui2/components/inputs/FloatInput.java index e3d365f..d1d3b37 100644 --- a/src/main/java/org/saturnclient/ui2/components/inputs/FloatInput.java +++ b/src/main/java/org/saturnclient/ui2/components/inputs/FloatInput.java @@ -1,7 +1,7 @@ package org.saturnclient.ui2.components.inputs; -import org.saturnclient.saturnclient.config.ConfigManager; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.ConfigManager; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.resources.Fonts; public class FloatInput extends Input { diff --git a/src/main/java/org/saturnclient/ui2/components/inputs/HexInput.java b/src/main/java/org/saturnclient/ui2/components/inputs/HexInput.java index aa49018..92830a1 100644 --- a/src/main/java/org/saturnclient/ui2/components/inputs/HexInput.java +++ b/src/main/java/org/saturnclient/ui2/components/inputs/HexInput.java @@ -2,7 +2,7 @@ package org.saturnclient.ui2.components.inputs; import java.awt.Color; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.Element; import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.RenderScope; diff --git a/src/main/java/org/saturnclient/ui2/components/inputs/IntInput.java b/src/main/java/org/saturnclient/ui2/components/inputs/IntInput.java index 9a8d741..af43dc8 100644 --- a/src/main/java/org/saturnclient/ui2/components/inputs/IntInput.java +++ b/src/main/java/org/saturnclient/ui2/components/inputs/IntInput.java @@ -1,7 +1,7 @@ package org.saturnclient.ui2.components.inputs; -import org.saturnclient.saturnclient.config.ConfigManager; -import org.saturnclient.saturnclient.config.Property; +import org.saturnclient.saturnclient.config.manager.ConfigManager; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.resources.Fonts; public class IntInput extends Input { diff --git a/src/main/java/org/saturnclient/ui2/components/inputs/KeybindingSelector.java b/src/main/java/org/saturnclient/ui2/components/inputs/KeybindingSelector.java index f85d76e..e4ebafc 100644 --- a/src/main/java/org/saturnclient/ui2/components/inputs/KeybindingSelector.java +++ b/src/main/java/org/saturnclient/ui2/components/inputs/KeybindingSelector.java @@ -1,8 +1,8 @@ package org.saturnclient.ui2.components.inputs; import org.lwjgl.glfw.GLFW; -import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.Theme; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.Element; import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.RenderScope; diff --git a/src/main/java/org/saturnclient/ui2/components/inputs/Select.java b/src/main/java/org/saturnclient/ui2/components/inputs/Select.java index 31aeedf..59c2c65 100644 --- a/src/main/java/org/saturnclient/ui2/components/inputs/Select.java +++ b/src/main/java/org/saturnclient/ui2/components/inputs/Select.java @@ -1,7 +1,7 @@ package org.saturnclient.ui2.components.inputs; -import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.Theme; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.Element; import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.RenderScope; diff --git a/src/main/java/org/saturnclient/ui2/components/inputs/Toggle.java b/src/main/java/org/saturnclient/ui2/components/inputs/Toggle.java index e692ad9..0ff8705 100644 --- a/src/main/java/org/saturnclient/ui2/components/inputs/Toggle.java +++ b/src/main/java/org/saturnclient/ui2/components/inputs/Toggle.java @@ -1,7 +1,7 @@ package org.saturnclient.ui2.components.inputs; -import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.Theme; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.Element; import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.RenderScope; diff --git a/src/main/java/org/saturnclient/ui2/elements/AnimationStagger.java b/src/main/java/org/saturnclient/ui2/elements/AnimationStagger.java index c908b82..f2b8778 100644 --- a/src/main/java/org/saturnclient/ui2/elements/AnimationStagger.java +++ b/src/main/java/org/saturnclient/ui2/elements/AnimationStagger.java @@ -3,7 +3,8 @@ package org.saturnclient.ui2.elements; import java.util.ArrayList; import java.util.List; -import org.saturnclient.saturnclient.config.SaturnClientConfig; +import org.saturnclient.saturnclient.config.AnimationConfig; +import org.saturnclient.saturnclient.config.Config; import org.saturnclient.ui2.Element; import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.RenderScope; @@ -17,8 +18,12 @@ public class AnimationStagger extends Element { this.delay = delay; } + public AnimationStagger(AnimationConfig config) { + this.delay = config.stagger.value; + } + public void draw(Element element) { - if (!SaturnClientConfig.stagger.value) { + if (!Config.stagger.value) { element.animation = null; } @@ -29,10 +34,9 @@ public class AnimationStagger extends Element { ElementRenderer.draw(children, element); this.height = Math.max(this.height, element.y + element.height); - this.width = Math.max(this.width, element.x + element.width); + this.width = Math.max(this.width, element.x + element.width); } - @Override public void render(RenderScope renderScope, ElementContext ctx) { ElementRenderer.render(children, ctx.elapsed, renderScope, diff --git a/src/main/java/org/saturnclient/ui2/elements/Notification.java b/src/main/java/org/saturnclient/ui2/elements/Notification.java index 0da60c7..72fae8d 100644 --- a/src/main/java/org/saturnclient/ui2/elements/Notification.java +++ b/src/main/java/org/saturnclient/ui2/elements/Notification.java @@ -1,7 +1,7 @@ package org.saturnclient.ui2.elements; -import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.Theme; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.Element; import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.RenderScope; diff --git a/src/main/java/org/saturnclient/ui2/elements/Scroll.java b/src/main/java/org/saturnclient/ui2/elements/Scroll.java index b9c8848..780e9b8 100644 --- a/src/main/java/org/saturnclient/ui2/elements/Scroll.java +++ b/src/main/java/org/saturnclient/ui2/elements/Scroll.java @@ -3,8 +3,8 @@ package org.saturnclient.ui2.elements; import java.util.ArrayList; import java.util.List; -import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.Theme; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.Element; import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.RenderScope; diff --git a/src/main/java/org/saturnclient/ui2/screens/ConfigEditor.java b/src/main/java/org/saturnclient/ui2/screens/ConfigEditor.java index c56ed4a..52d2f55 100644 --- a/src/main/java/org/saturnclient/ui2/screens/ConfigEditor.java +++ b/src/main/java/org/saturnclient/ui2/screens/ConfigEditor.java @@ -2,9 +2,9 @@ package org.saturnclient.ui2.screens; import java.util.Map; -import org.saturnclient.saturnclient.config.ConfigManager; -import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.Theme; +import org.saturnclient.saturnclient.config.manager.ConfigManager; +import org.saturnclient.saturnclient.config.manager.Property; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.components.Sidebar; import org.saturnclient.ui2.components.inputs.FloatInput; diff --git a/src/main/java/org/saturnclient/ui2/screens/EmoteWheel.java b/src/main/java/org/saturnclient/ui2/screens/EmoteWheel.java index 55d6fe1..e087a43 100644 --- a/src/main/java/org/saturnclient/ui2/screens/EmoteWheel.java +++ b/src/main/java/org/saturnclient/ui2/screens/EmoteWheel.java @@ -2,12 +2,14 @@ package org.saturnclient.ui2.screens; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.client.ServiceClient; -import org.saturnclient.saturnclient.config.SaturnClientConfig; +import org.saturnclient.saturnclient.config.AnimationConfig; +import org.saturnclient.saturnclient.config.Config; import org.saturnclient.saturnclient.cosmetics.Emotes; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.Utils; import org.saturnclient.ui2.anim.Fade; import org.saturnclient.ui2.anim.SlideY; +import org.saturnclient.ui2.elements.AnimationStagger; import org.saturnclient.ui2.elements.ImageTexture; import org.saturnclient.ui2.elements.TextureButton; import org.saturnclient.ui2.resources.Textures; @@ -29,10 +31,23 @@ public class EmoteWheel extends SaturnScreen { int row = 0; int col = 0; - draw(new ImageTexture(Textures.LOGO_TEXT).dimensions(98, 10).centerOffset(width, height, 0, -105) - .animation(new Fade(700))); - draw(new ImageTexture(SaturnClientConfig.getLogo()).dimensions(98, 98).centerOffset(width, height, 0, -149) - .animation(new SlideY(700, -20))); + // ============================= + // Logo + // ============================= + + draw(new ImageTexture(Textures.LOGO_TEXT) + .dimensions(98, 10) + .centerOffset(width, height, 0, -105) + .animation(new Fade(AnimationConfig.logo.duration.value))); + + draw(new ImageTexture(Config.getLogo()) + .dimensions(98, 98) + .centerOffset(width, height, 0, -149) + .animation(new SlideY(AnimationConfig.logo, -20))); + + // ============================= + // Navigation Buttons + // ============================= draw(new TextureButton(Textures.LEFT, () -> { if (page > 1) { @@ -40,18 +55,29 @@ public class EmoteWheel extends SaturnScreen { elements.clear(); ui(); } - }).dimensions(30, 30).centerOffset(width, height, -20, 45).animation(new Fade(700))); + }).dimensions(30, 30) + .centerOffset(width, height, -50, 105) + .animation(new Fade(500))); draw(new TextureButton(Textures.RIGHT, () -> { - if ((8 * page) < Emotes.availableEmotes.size()) { + if ((page * 8) < Emotes.availableEmotes.size()) { page++; elements.clear(); ui(); } - }).dimensions(30, 30).centerOffset(width, height, 20, 45).animation(new Fade(700))); + }).dimensions(30, 30) + .centerOffset(width, height, 50, 105) + .animation(new Fade(500))); + + // ============================= + // Emote Grid (Staggered) + // ============================= + + AnimationStagger emoteStagger = new AnimationStagger(AnimationConfig.emoteWheel); while (row < 3) { - int idx = (row * 3 + col) * page; + + int idx = (row * 3 + col) + ((page - 1) * 8); if (row == 1 && col == 1) { col++; @@ -59,21 +85,35 @@ public class EmoteWheel extends SaturnScreen { String emote = Utils.getOrNull(Emotes.availableEmotes, idx); - draw(new TextureButton(Textures.getEmotePreview(emote), () -> { - if (emote == null) { - return; - } - AnimationStack animationStack = PlayerAnimationAccess.getPlayerAnimLayer(SaturnClient.client.player); - if (animationStack.isActive() && animationStack.getPriority() == 1000) { - animationStack.removeLayer(1000); - } - animationStack.addAnimLayer(1000, - PlayerAnimationRegistry.getAnimation(Identifier.of("saturnclient", - emote)).playAnimation()); - ServiceClient.emote(emote); - close(); - }).dimensions(70, 70).centerOffset(width, height, -80 + (col * 80), -35 + (row * 80)) - .animation(new Fade(700))); + emoteStagger.draw( + new TextureButton(Textures.getEmotePreview(emote), () -> { + + if (emote == null) + return; + + AnimationStack animationStack = PlayerAnimationAccess.getPlayerAnimLayer( + SaturnClient.client.player); + + if (animationStack.isActive() + && animationStack.getPriority() == 1000) { + animationStack.removeLayer(1000); + } + + animationStack.addAnimLayer( + 1000, + PlayerAnimationRegistry + .getAnimation( + Identifier.of("saturnclient", emote)) + .playAnimation()); + + ServiceClient.emote(emote); + close(); + }) + .dimensions(70, 70) + .centerOffset(width, height, + -80 + (col * 80), + -35 + (row * 80)) + .animation(new SlideY(AnimationConfig.emoteWheel, 12))); if (col < 2) { col++; @@ -82,6 +122,8 @@ public class EmoteWheel extends SaturnScreen { row++; } } + + draw(emoteStagger); } @Override diff --git a/src/main/java/org/saturnclient/ui2/screens/ModMenu.java b/src/main/java/org/saturnclient/ui2/screens/ModMenu.java index 2d3af9f..44b1aca 100644 --- a/src/main/java/org/saturnclient/ui2/screens/ModMenu.java +++ b/src/main/java/org/saturnclient/ui2/screens/ModMenu.java @@ -2,7 +2,7 @@ package org.saturnclient.ui2.screens; import org.saturnclient.modules.ModManager; import org.saturnclient.modules.Module; -import org.saturnclient.saturnclient.config.SaturnClientConfig; +import org.saturnclient.saturnclient.config.AnimationConfig; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.anim.SlideFade; import org.saturnclient.ui2.components.SaturnModule; @@ -27,13 +27,13 @@ public class ModMenu extends SaturnScreen { int row = 0; int col = 0; - AnimationStagger moduleStagger = new AnimationStagger(20); + AnimationStagger moduleStagger = new AnimationStagger(AnimationConfig.modMenu); for (Module mod : ModManager.ALL_MODS) { moduleStagger.draw( new SaturnModule(mod) .position((160 + g) * col, (50 + g) * row) - .animation(new SlideFade(600, -12), SaturnClientConfig.getAnimationCurve())); + .animation(new SlideFade(AnimationConfig.modMenu, -12))); if (col == 2) { col = 0; diff --git a/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java b/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java index 6277afe..185120b 100644 --- a/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java +++ b/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java @@ -1,7 +1,8 @@ package org.saturnclient.ui2.screens; import org.saturnclient.saturnclient.SaturnClient; -import org.saturnclient.saturnclient.config.SaturnClientConfig; +import org.saturnclient.saturnclient.config.AnimationConfig; +import org.saturnclient.saturnclient.config.Config; import org.saturnclient.saturnclient.menus.HudEditor; import org.saturnclient.ui2.resources.Textures; import org.saturnclient.ui2.screens.cosmetics.CloakMenu; @@ -24,12 +25,12 @@ public class ShiftMenu extends SaturnScreen { draw(new ImageTexture(Textures.LOGO_TEXT) .dimensions(98, 10) .centerOffset(width, height, 0, -36) - .animation(new Fade(700))); + .animation(new Fade(AnimationConfig.logo.duration.value))); - draw(new ImageTexture(SaturnClientConfig.getLogo()) + draw(new ImageTexture(Config.getLogo()) .dimensions(98, 98) .centerOffset(width, height, 0, -80) - .animation(new SlideY(700, -20))); + .animation(new SlideY(AnimationConfig.logo, -20))); // Spacing and sizes int btnWidth = 120; @@ -37,22 +38,23 @@ public class ShiftMenu extends SaturnScreen { int spacing = 4; // Create stagger - AnimationStagger stagger = new AnimationStagger(50); + + AnimationStagger stagger = new AnimationStagger(AnimationConfig.shiftMenu.stagger.value); stagger.draw(new TextureButton(Textures.HUD_ICON, () -> { client.setScreen(new HudEditor()); }).dimensions(btnHeight, btnHeight).position(0, 0) - .animation(new Fade(300))); + .animation(new Fade(AnimationConfig.shiftMenu))); stagger.draw(new Button("Settings", () -> { SaturnClient.client.setScreen(new ModMenu()); }).dimensions(btnWidth, btnHeight).position(btnHeight + spacing, 0) - .animation(new Fade(300))); + .animation(new Fade(AnimationConfig.shiftMenu))); stagger.draw(new TextureButton(Textures.COSMETICS, () -> { client.setScreen(new CloakMenu()); }).dimensions(btnHeight, btnHeight).position(btnWidth + btnHeight + (spacing * 2), 0) - .animation(new Fade(300))); + .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, diff --git a/src/main/java/org/saturnclient/ui2/screens/TitleMenu.java b/src/main/java/org/saturnclient/ui2/screens/TitleMenu.java index ebffa12..b689f86 100644 --- a/src/main/java/org/saturnclient/ui2/screens/TitleMenu.java +++ b/src/main/java/org/saturnclient/ui2/screens/TitleMenu.java @@ -1,7 +1,8 @@ package org.saturnclient.ui2.screens; import org.saturnclient.saturnclient.SaturnClient; -import org.saturnclient.saturnclient.config.SaturnClientConfig; +import org.saturnclient.saturnclient.config.AnimationConfig; +import org.saturnclient.saturnclient.config.Config; import org.saturnclient.saturnclient.menus.HudEditor; import org.saturnclient.ui2.resources.Textures; import org.saturnclient.ui2.screens.cosmetics.CloakMenu; @@ -28,46 +29,52 @@ public class TitleMenu extends SaturnScreen { public void ui() { backgroundBlur = 0; - draw(new ImageTexture(Textures.LOGO_TEXT).dimensions(98, 10).centerOffset(width, height, 0, -36) - .animation(new Fade(700))); - draw(new ImageTexture(SaturnClientConfig.getLogo()).dimensions(98, 98).centerOffset(width, height, 0, -82) - .animation(new SlideY(700, -20))); + draw(new ImageTexture(Textures.LOGO_TEXT).dimensions(98, 10).centerOffset(width, height, 0, -105) + .animation(new Fade(AnimationConfig.logo.duration.value))); + draw(new ImageTexture(Config.getLogo()).dimensions(98, 98).centerOffset(width, height, 0, -149) + .animation(new SlideY(AnimationConfig.logo, -20))); - AnimationStagger mainButtonStagger = new AnimationStagger(120); + AnimationStagger mainButtonStagger = new AnimationStagger(AnimationConfig.mainMenu); mainButtonStagger.draw(new Button("SINGLEPLAYER", () -> { client.setScreen(new SelectWorldScreen(new TitleMenu())); - }).scale(0.69f).dimensions(420, 52).position(0, 0).animation(new SlideFade(1000, -10))); + }).scale(0.69f).dimensions(420, 52).position(0, 0) + .animation(new SlideFade(AnimationConfig.mainMenu, -10))); mainButtonStagger.draw(new Button("MULTIPLAYER", () -> { client.setScreen(new MultiplayerScreen(new TitleMenu())); - }).scale(0.69f).dimensions(420, 52).position(0, 40).animation(new SlideFade(1000, -10))); + }).scale(0.69f).dimensions(420, 52).position(0, 40) + .animation(new SlideFade(AnimationConfig.mainMenu, -10))); mainButtonStagger.draw(new Button("OPTIONS", () -> { client.setScreen(new OptionsScreen(new TitleMenu(), SaturnClient.client.options)); - }).scale(0.69f).dimensions(206, 52).position(0, 80).animation(new SlideFade(1000, -10))); + }).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(1000, -10))); + }).scale(0.69f).dimensions(206, 52).position(146, 80) + .animation(new SlideFade(AnimationConfig.mainMenu, -10))); draw(mainButtonStagger.dimensions(289, 143).centerOffset(width, height, 0, 60)); int s = Fonts.getHeight() + 20; - AnimationStagger saturnStagger = new AnimationStagger(180); + AnimationStagger saturnStagger = new AnimationStagger(AnimationConfig.mainMenu.stagger.value); saturnStagger.draw(new TextureButton(Textures.HUD_ICON, () -> { client.setScreen(new HudEditor()); - }).dimensions(s, s).position(0, 0).animation(new SlideFade(1000, s + 8))); + }).dimensions(s, s).position(0, 0).animation(new SlideFade(AnimationConfig.mainMenu, s + 8))); saturnStagger.draw(new TextureButton(Textures.SETTINGS, () -> { SaturnClient.client.setScreen(new ModMenu()); - }).dimensions(s, s).position(s + 2, 0).animation(new SlideFade(1000, s + 8))); + }).dimensions(s, s).position(s + 2, 0) + .animation(new SlideFade(AnimationConfig.mainMenu, s + 8))); saturnStagger.draw(new TextureButton(Textures.CLOAK, () -> { client.setScreen(new CloakMenu()); - }).dimensions(s, s).position((s + 2) * 2, 0).animation(new SlideFade(1000, s + 8))); + }).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/ui2/screens/cosmetics/CloakMenu.java b/src/main/java/org/saturnclient/ui2/screens/cosmetics/CloakMenu.java index 2abb28d..c537a31 100644 --- a/src/main/java/org/saturnclient/ui2/screens/cosmetics/CloakMenu.java +++ b/src/main/java/org/saturnclient/ui2/screens/cosmetics/CloakMenu.java @@ -2,12 +2,16 @@ package org.saturnclient.ui2.screens.cosmetics; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.client.player.SaturnPlayer; +import org.saturnclient.saturnclient.config.AnimationConfig; import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; import org.saturnclient.ui2.resources.Textures; import org.saturnclient.ui2.SaturnScreen; +import org.saturnclient.ui2.anim.Fade; +import org.saturnclient.ui2.anim.SlideY; import org.saturnclient.ui2.components.CosmeticPreview; import org.saturnclient.ui2.components.Sidebar; import org.saturnclient.ui2.components.SkinPreview; +import org.saturnclient.ui2.elements.AnimationStagger; import org.saturnclient.ui2.elements.Scroll; import org.saturnclient.ui2.elements.TabMenu; import org.saturnclient.ui2.elements.TabMenu.TabMenuComponent; @@ -29,11 +33,18 @@ public class CloakMenu extends SaturnScreen { SaturnPlayer player = SaturnPlayer.get(); + AnimationStagger stagger = new AnimationStagger(AnimationConfig.cosmeticsMenu); + if (player != null) { for (String cloak : Cloaks.availableCloaks) { - scroll.draw(new CosmeticPreview(cloak == player.cloak, Textures.getCloakPreview(cloak), () -> { - Cloaks.setCloak(cloak); - }).position((50 + g) * col, (111 + g) * row)); + + 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; @@ -44,19 +55,29 @@ public class CloakMenu extends SaturnScreen { } } + scroll.draw(stagger); + int scrollWidth = 480 + 10 + (g * 2) + (p * 2); - draw(scroll.dimensions(scrollWidth, 350).center(width, height)); + 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)); + 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::close).centerOffset(width, height, -(scrollWidth / 2 + 20), 0)); + draw(new Sidebar(2, this::close) + .centerOffset(width, height, -(scrollWidth / 2 + 20), 0) + .animation(new Fade(400))); draw(new TabMenu(0, new TabMenuComponent(Textures.CLOAK, () -> { }), new TabMenuComponent(Textures.HAT, () -> { SaturnClient.client.setScreen(new HatMenu()); - })).centerOffset(width, height, 0, -195)); + })) + .centerOffset(width, height, 0, -195)); } } diff --git a/src/main/java/org/saturnclient/ui2/screens/cosmetics/HatMenu.java b/src/main/java/org/saturnclient/ui2/screens/cosmetics/HatMenu.java index 06deb3c..be2d1a5 100644 --- a/src/main/java/org/saturnclient/ui2/screens/cosmetics/HatMenu.java +++ b/src/main/java/org/saturnclient/ui2/screens/cosmetics/HatMenu.java @@ -2,12 +2,16 @@ package org.saturnclient.ui2.screens.cosmetics; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.client.player.SaturnPlayer; +import org.saturnclient.saturnclient.config.AnimationConfig; import org.saturnclient.saturnclient.cosmetics.Hats; import org.saturnclient.ui2.resources.Textures; import org.saturnclient.ui2.SaturnScreen; +import org.saturnclient.ui2.anim.Fade; +import org.saturnclient.ui2.anim.SlideY; import org.saturnclient.ui2.components.CosmeticPreview; import org.saturnclient.ui2.components.Sidebar; import org.saturnclient.ui2.components.SkinPreview; +import org.saturnclient.ui2.elements.AnimationStagger; import org.saturnclient.ui2.elements.Scroll; import org.saturnclient.ui2.elements.TabMenu; import org.saturnclient.ui2.elements.TabMenu.TabMenuComponent; @@ -29,11 +33,19 @@ public class HatMenu extends SaturnScreen { SaturnPlayer player = SaturnPlayer.get(); + AnimationStagger stagger = new AnimationStagger(AnimationConfig.cosmeticsMenu); + if (player != null) { for (String hat : Hats.availableHats) { - scroll.draw(new CosmeticPreview(hat == player.hat, Textures.getHatPreview(hat), () -> { - Hats.setHat(hat); - }).dimensions(50, 50).position((50 + g) * col, (50 + g) * row)); + + 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; @@ -44,19 +56,29 @@ public class HatMenu extends SaturnScreen { } } + scroll.draw(stagger); + int scrollWidth = 480 + 10 + (g * 2) + (p * 2); - draw(scroll.dimensions(scrollWidth, 350).center(width, height)); + draw(scroll + .dimensions(scrollWidth, 350) + .center(width, height)); - draw(new SkinPreview(170f, true).scale(3.5f).position(scroll.x + (scrollWidth - 220), scroll.y + 40)); + 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::close).centerOffset(width, height, -(scrollWidth / 2 + 20), 0)); + draw(new Sidebar(2, this::close) + .centerOffset(width, height, -(scrollWidth / 2 + 20), 0) + .animation(new Fade(400))); draw(new TabMenu(1, new TabMenuComponent(Textures.CLOAK, () -> { SaturnClient.client.setScreen(new CloakMenu()); }), new TabMenuComponent(Textures.HAT, () -> { - })).centerOffset(width, height, 0, -195)); + })) + .centerOffset(width, height, 0, -195)); } } diff --git a/src/main/java/org/saturnclient/ui2/screens/store/CloakStore.java b/src/main/java/org/saturnclient/ui2/screens/store/CloakStore.java index d13b099..e26449c 100644 --- a/src/main/java/org/saturnclient/ui2/screens/store/CloakStore.java +++ b/src/main/java/org/saturnclient/ui2/screens/store/CloakStore.java @@ -3,12 +3,16 @@ package org.saturnclient.ui2.screens.store; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.client.ServiceClient; import org.saturnclient.saturnclient.client.player.SaturnPlayer; +import org.saturnclient.saturnclient.config.AnimationConfig; import org.saturnclient.saturnclient.config.Theme; import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.Utils; +import org.saturnclient.ui2.anim.Fade; +import org.saturnclient.ui2.anim.SlideY; import org.saturnclient.ui2.components.CosmeticPreview; import org.saturnclient.ui2.components.Sidebar; +import org.saturnclient.ui2.elements.AnimationStagger; import org.saturnclient.ui2.elements.ImageTexture; import org.saturnclient.ui2.elements.Notification.NotificationKind; import org.saturnclient.ui2.elements.Scroll; @@ -45,41 +49,37 @@ public class CloakStore extends SaturnScreen { 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; - scroll.draw(new CosmeticPreview(cloak == player.cloak, Textures.getCloakPreview(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 e) { - e.printStackTrace(); - } - RenderSystem.recordRenderCall(() -> { - SaturnClient.client.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"); - } - }).position(x, y)); + stagger.draw( + new CosmeticPreview( + cloak == player.cloak, + Textures.getCloakPreview(cloak), + () -> handlePurchase(cloak)) + .position(x, y) + .animation(new SlideY(AnimationConfig.cosmeticsMenu, 16))); String t = "100"; - scroll.draw(new Text(t).position(x + Fonts.centerX(50, t, Theme.FONT.value), y + 113).scale(0.5f)); + stagger.draw( + new Text(t) + .position(x + Fonts.centerX(50, t, Theme.FONT.value), y + 113) + .scale(0.5f) + .animation(new Fade(400))); - scroll.draw(new ImageTexture(Textures.COINS).dimensions(16, 16) - .position(x + Fonts.getWidth(t, Theme.FONT.value) - 1, y + 112).scale(0.5f)); + 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; @@ -91,17 +91,54 @@ public class CloakStore extends SaturnScreen { } } + scroll.draw(stagger); + int scrollWidth = 480 + 40 + (gx * 2) + (p * 2); - draw(scroll.dimensions(scrollWidth, 350).centerOffset(width, height, 15, 0)); + draw(scroll + .dimensions(scrollWidth, 350) + .centerOffset(width, height, 15, 0)); - draw(new Sidebar(5, this::close).centerOffset(width, height, -((scrollWidth - 30) / 2 + 20), 0)); + draw(new Sidebar(5, this::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, () -> { SaturnClient.client.setScreen(new HatStore()); - })).centerOffset(width, height, 0, -195)); + })) + .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(() -> { + SaturnClient.client.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/ui2/screens/store/HatStore.java b/src/main/java/org/saturnclient/ui2/screens/store/HatStore.java index 7a3de0a..098e09d 100644 --- a/src/main/java/org/saturnclient/ui2/screens/store/HatStore.java +++ b/src/main/java/org/saturnclient/ui2/screens/store/HatStore.java @@ -3,12 +3,16 @@ package org.saturnclient.ui2.screens.store; import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.client.ServiceClient; import org.saturnclient.saturnclient.client.player.SaturnPlayer; +import org.saturnclient.saturnclient.config.AnimationConfig; import org.saturnclient.saturnclient.config.Theme; import org.saturnclient.saturnclient.cosmetics.Hats; import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.Utils; +import org.saturnclient.ui2.anim.Fade; +import org.saturnclient.ui2.anim.SlideY; import org.saturnclient.ui2.components.CosmeticPreview; import org.saturnclient.ui2.components.Sidebar; +import org.saturnclient.ui2.elements.AnimationStagger; import org.saturnclient.ui2.elements.ImageTexture; import org.saturnclient.ui2.elements.Notification.NotificationKind; import org.saturnclient.ui2.elements.Scroll; @@ -45,41 +49,38 @@ public class HatStore extends SaturnScreen { 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; - scroll.draw(new CosmeticPreview(hat == player.hat, Textures.getHatPreview(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 e) { - e.printStackTrace(); - } - RenderSystem.recordRenderCall(() -> { - SaturnClient.client.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"); - } - }).dimensions(50, 50).position(x, y)); + 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"; - scroll.draw(new Text(t).position(x + Fonts.centerX(50, t, Theme.FONT.value), y + 53).scale(0.5f)); + stagger.draw( + new Text(t) + .position(x + Fonts.centerX(50, t, Theme.FONT.value), y + 53) + .scale(0.5f) + .animation(new Fade(400))); - scroll.draw(new ImageTexture(Textures.COINS).dimensions(16, 16) - .position(x + Fonts.getWidth(t, Theme.FONT.value) + 4, y + 52).scale(0.5f)); + 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; @@ -91,17 +92,54 @@ public class HatStore extends SaturnScreen { } } + scroll.draw(stagger); + int scrollWidth = 480 + 40 + (gx * 2) + (p * 2); - draw(scroll.dimensions(scrollWidth, 350).centerOffset(width, height, 15, 0)); + draw(scroll + .dimensions(scrollWidth, 350) + .centerOffset(width, height, 15, 0)); - draw(new Sidebar(5, this::close).centerOffset(width, height, -((scrollWidth - 30) / 2 + 20), 0)); + draw(new Sidebar(5, this::close) + .centerOffset(width, height, -((scrollWidth - 30) / 2 + 20), 0) + .animation(new Fade(400))); draw(new TabMenu(1, new TabMenuComponent(Textures.CLOAK, () -> { SaturnClient.client.setScreen(new CloakStore()); }), new TabMenuComponent(Textures.HAT, () -> { - })).centerOffset(width, height, 0, -195)); + })) + .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(() -> { + SaturnClient.client.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"); + } } }