Merge pull request #28 from saturnclientmc/animation-settings

Animation settings
This commit is contained in:
2026-02-24 18:36:53 -08:00
committed by GitHub
59 changed files with 481 additions and 265 deletions
@@ -2,8 +2,8 @@ package org.saturnclient.modules;
import java.util.Map; import java.util.Map;
import org.saturnclient.saturnclient.config.Property.NamedProperty; import org.saturnclient.saturnclient.config.manager.Property;
import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.manager.Property.NamedProperty;
public class ModDimensions { public class ModDimensions {
public Property<Integer> x = Property.integer(0); public Property<Integer> x = Property.integer(0);
@@ -1,9 +1,9 @@
package org.saturnclient.modules; package org.saturnclient.modules;
import org.saturnclient.saturnclient.config.ConfigManager;
import org.saturnclient.ui2.resources.Textures; 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.ui2.RenderScope;
import org.saturnclient.saturnclient.config.Property.NamedProperty;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
@@ -5,7 +5,7 @@ import org.saturnclient.modules.ModDimensions;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; import org.saturnclient.modules.ModuleDetails;
import org.saturnclient.saturnclient.SaturnClient; 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.RenderScope;
import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.EquipmentSlot;
@@ -5,7 +5,7 @@ import java.util.Objects;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; import org.saturnclient.modules.ModuleDetails;
import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.manager.Property;
public class AutoSprint extends Module { public class AutoSprint extends Module {
private static Property<Boolean> enabled = Property.bool(false); private static Property<Boolean> enabled = Property.bool(false);
@@ -7,7 +7,7 @@ import org.saturnclient.modules.HudMod;
import org.saturnclient.modules.ModDimensions; import org.saturnclient.modules.ModDimensions;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; 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.RenderScope;
import org.saturnclient.ui2.resources.Fonts; import org.saturnclient.ui2.resources.Fonts;
@@ -5,7 +5,7 @@ import org.saturnclient.modules.ModDimensions;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; import org.saturnclient.modules.ModuleDetails;
import org.saturnclient.saturnclient.SaturnClient; 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.RenderScope;
import org.saturnclient.ui2.resources.Fonts; import org.saturnclient.ui2.resources.Fonts;
@@ -3,7 +3,7 @@ package org.saturnclient.modules.mods;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; import org.saturnclient.modules.ModuleDetails;
import org.saturnclient.saturnclient.SaturnClient; 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.RenderScope;
import org.saturnclient.ui2.resources.Textures; import org.saturnclient.ui2.resources.Textures;
@@ -5,7 +5,7 @@ import org.saturnclient.modules.ModDimensions;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; import org.saturnclient.modules.ModuleDetails;
import org.saturnclient.saturnclient.SaturnClient; 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.RenderScope;
import org.saturnclient.ui2.resources.Fonts; import org.saturnclient.ui2.resources.Fonts;
@@ -5,7 +5,7 @@ import org.saturnclient.modules.ModDimensions;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; import org.saturnclient.modules.ModuleDetails;
import org.saturnclient.saturnclient.SaturnClient; 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.RenderScope;
import org.saturnclient.ui2.resources.Fonts; import org.saturnclient.ui2.resources.Fonts;
@@ -4,7 +4,7 @@ import org.lwjgl.glfw.GLFW;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; import org.saturnclient.modules.ModuleDetails;
import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.manager.Property;
import net.minecraft.client.option.Perspective; import net.minecraft.client.option.Perspective;
@@ -2,7 +2,7 @@ package org.saturnclient.modules.mods;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; import org.saturnclient.modules.ModuleDetails;
import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.manager.Property;
public class Fullbright extends Module { public class Fullbright extends Module {
private static Property<Boolean> enabled = Property.bool(false); private static Property<Boolean> enabled = Property.bool(false);
@@ -5,7 +5,7 @@ import org.saturnclient.modules.ModDimensions;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; import org.saturnclient.modules.ModuleDetails;
import org.saturnclient.saturnclient.SaturnClient; 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.RenderScope;
import org.saturnclient.ui2.resources.Fonts; import org.saturnclient.ui2.resources.Fonts;
@@ -4,7 +4,7 @@ import org.saturnclient.modules.Module;
import org.saturnclient.modules.HudMod; import org.saturnclient.modules.HudMod;
import org.saturnclient.modules.ModDimensions; import org.saturnclient.modules.ModDimensions;
import org.saturnclient.saturnclient.SaturnClient; 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.RenderScope;
import org.saturnclient.modules.ModuleDetails; import org.saturnclient.modules.ModuleDetails;
@@ -3,7 +3,7 @@ package org.saturnclient.modules.mods;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; import org.saturnclient.modules.ModuleDetails;
import org.saturnclient.modules.mods.utils.HealthRenderState; 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; import net.minecraft.client.render.entity.state.LivingEntityRenderState;
@@ -2,7 +2,7 @@ package org.saturnclient.modules.mods;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; import org.saturnclient.modules.ModuleDetails;
import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.manager.Property;
public class NoFog extends Module { public class NoFog extends Module {
private static Property<Boolean> enabled = Property.bool(false); private static Property<Boolean> enabled = Property.bool(false);
@@ -4,7 +4,7 @@ import org.saturnclient.modules.HudMod;
import org.saturnclient.modules.ModDimensions; import org.saturnclient.modules.ModDimensions;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; 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.RenderScope;
import org.saturnclient.ui2.resources.Fonts; import org.saturnclient.ui2.resources.Fonts;
@@ -5,7 +5,7 @@ import org.saturnclient.modules.ModDimensions;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; import org.saturnclient.modules.ModuleDetails;
import org.saturnclient.saturnclient.SaturnClient; 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.RenderScope;
import org.saturnclient.ui2.resources.Fonts; import org.saturnclient.ui2.resources.Fonts;
@@ -7,7 +7,7 @@ import org.saturnclient.modules.ModDimensions;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; import org.saturnclient.modules.ModuleDetails;
import org.saturnclient.saturnclient.SaturnClient; 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.RenderScope;
import net.minecraft.client.resource.language.I18n; import net.minecraft.client.resource.language.I18n;
@@ -4,7 +4,7 @@ import org.saturnclient.modules.HudMod;
import org.saturnclient.modules.ModDimensions; import org.saturnclient.modules.ModDimensions;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; 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.RenderScope;
import org.saturnclient.ui2.resources.Fonts; import org.saturnclient.ui2.resources.Fonts;
@@ -3,7 +3,7 @@ package org.saturnclient.modules.mods;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.modules.ModuleDetails; import org.saturnclient.modules.ModuleDetails;
import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.manager.Property;
public class Zoom extends Module { public class Zoom extends Module {
private static Property<Boolean> enabled = Property.bool(false); private static Property<Boolean> enabled = Property.bool(false);
@@ -8,8 +8,8 @@ import net.minecraft.client.util.math.MatrixStack;
import org.saturnclient.modules.ModManager; import org.saturnclient.modules.ModManager;
import org.saturnclient.saturnclient.client.ServiceClient; import org.saturnclient.saturnclient.client.ServiceClient;
import org.saturnclient.saturnclient.config.ConfigManager; import org.saturnclient.saturnclient.config.Config;
import org.saturnclient.saturnclient.config.SaturnClientConfig; import org.saturnclient.saturnclient.config.manager.ConfigManager;
import org.saturnclient.saturnclient.cosmetics.Emotes; import org.saturnclient.saturnclient.cosmetics.Emotes;
import org.saturnclient.saturnclient.cosmetics.Hats; import org.saturnclient.saturnclient.cosmetics.Hats;
import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks;
@@ -38,7 +38,7 @@ public class SaturnClient implements ModInitializer {
public void onInitialize() { public void onInitialize() {
LOGGER.info("Initializing " + MOD_ID); LOGGER.info("Initializing " + MOD_ID);
client = MinecraftClient.getInstance(); client = MinecraftClient.getInstance();
SaturnClientConfig.init(); Config.init();
ModManager.init(); ModManager.init();
client.execute(() -> { client.execute(() -> {
@@ -3,7 +3,7 @@ package org.saturnclient.saturnclient.client.player;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import org.saturnclient.saturnclient.config.SaturnClientConfig; import org.saturnclient.saturnclient.config.Config;
import net.minecraft.util.Formatting; import net.minecraft.util.Formatting;
@@ -54,6 +54,6 @@ public class Roles {
} }
public static String getSaturnIndicator() { public static String getSaturnIndicator() {
return SaturnClientConfig.realisticLogo.value ? "" : ""; return Config.realisticLogo.value ? "" : "";
} }
} }
@@ -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<Integer> duration;
public final Property<Integer> stagger;
public final Property<Integer> 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);
}
}
@@ -1,14 +1,13 @@
package org.saturnclient.saturnclient.config; package org.saturnclient.saturnclient.config;
import java.util.function.Function;
import org.lwjgl.glfw.GLFW; 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 org.saturnclient.ui2.resources.Textures;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
public class SaturnClientConfig { public class Config {
public static ConfigManager config; public static ConfigManager config;
public static Property<Boolean> realisticLogo = Property.bool(false); public static Property<Boolean> realisticLogo = Property.bool(false);
@@ -16,19 +15,11 @@ public class SaturnClientConfig {
public static Property<Boolean> bendyCloaks = Property.bool(true); public static Property<Boolean> bendyCloaks = Property.bool(true);
public static Property<Integer> openEmoteWheel = Property.keybinding(GLFW.GLFW_KEY_B); public static Property<Integer> openEmoteWheel = Property.keybinding(GLFW.GLFW_KEY_B);
public static Property<Boolean> stagger = Property.bool(true); public static Property<Boolean> stagger = Property.bool(true);
public static Property<Integer> animationCurve = Property.select(1, "Ease In Out", "Ease Out");
public static Identifier getLogo() { public static Identifier getLogo() {
return realisticLogo.value ? Textures.REALISTIC_LOGO : Textures.LOGO; return realisticLogo.value ? Textures.REALISTIC_LOGO : Textures.LOGO;
} }
public static Function<Double, Double> getAnimationCurve() {
switch (animationCurve.value) {
case 1: return Curve::easeOutCubic;
default: return Curve::easeInOutCubic;
}
}
public static void init() { public static void init() {
config = new ConfigManager("Saturn Client"); config = new ConfigManager("Saturn Client");
config.property("Realistic logo", realisticLogo); config.property("Realistic logo", realisticLogo);
@@ -36,9 +27,11 @@ public class SaturnClientConfig {
config.property("Open Emote Wheel", openEmoteWheel); config.property("Open Emote Wheel", openEmoteWheel);
config.property("Bendy Cloaks", bendyCloaks); config.property("Bendy Cloaks", bendyCloaks);
config.property("Stagger Animations", stagger); config.property("Stagger Animations", stagger);
config.property("Animation Curve", animationCurve);
// Initialize a sub namespace for theme // Initialize a sub namespace for theme
Theme.init(config); Theme.init(config);
// Initialize a sub namespace for animations
AnimationConfig.init(config);
} }
} }
@@ -1,5 +1,8 @@
package org.saturnclient.saturnclient.config; package org.saturnclient.saturnclient.config;
import org.saturnclient.saturnclient.config.manager.ConfigManager;
import org.saturnclient.saturnclient.config.manager.Property;
public class Theme { public class Theme {
// Main UI background (slightly warm dark to match Saturn tone) // Main UI background (slightly warm dark to match Saturn tone)
public static final Property<Integer> BACKGROUND = Property.color(0xFF12100D); public static final Property<Integer> BACKGROUND = Property.color(0xFF12100D);
@@ -26,8 +29,8 @@ public class Theme {
public static final Property<Integer> BG_RADIUS = Property.integer(12); public static final Property<Integer> BG_RADIUS = Property.integer(12);
public static final Property<Integer> WIDGET_RADIUS = Property.integer(10); public static final Property<Integer> WIDGET_RADIUS = Property.integer(10);
// Font (keeping your current system) // Font
public static Property<Integer> FONT = Property.font(1); public static final Property<Integer> FONT = Property.font(1);
public static void init(ConfigManager parent) { public static void init(ConfigManager parent) {
ConfigManager config = new ConfigManager(parent, "UI Style"); ConfigManager config = new ConfigManager(parent, "UI Style");
@@ -1,4 +1,4 @@
package org.saturnclient.saturnclient.config; package org.saturnclient.saturnclient.config.manager;
import com.google.gson.*; import com.google.gson.*;
import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.SaturnClient;
@@ -1,4 +1,4 @@
package org.saturnclient.saturnclient.config; package org.saturnclient.saturnclient.config.manager;
import java.util.Map; import java.util.Map;
@@ -1,7 +1,7 @@
package org.saturnclient.saturnclient.cosmetics; package org.saturnclient.saturnclient.cosmetics;
import org.saturnclient.saturnclient.client.player.SaturnPlayer; 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 org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks;
import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.OverlayTexture;
@@ -339,7 +339,7 @@ public class CloakFeatureRenderer extends FeatureRenderer<PlayerEntityRenderStat
rotation = 0.0f; rotation = 0.0f;
} }
if (!SaturnClientConfig.bendyCloaks.value) { if (!Config.bendyCloaks.value) {
curve = 0.0f; curve = 0.0f;
} }
@@ -7,7 +7,7 @@ import net.minecraft.client.util.InputUtil;
import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.saturnclient.client.ServiceClient; import org.saturnclient.saturnclient.client.ServiceClient;
import org.saturnclient.saturnclient.config.SaturnClientConfig; import org.saturnclient.saturnclient.config.Config;
import org.saturnclient.ui2.screens.EmoteWheel; import org.saturnclient.ui2.screens.EmoteWheel;
import org.saturnclient.ui2.screens.ShiftMenu; import org.saturnclient.ui2.screens.ShiftMenu;
@@ -39,7 +39,7 @@ public class KeyInputHandler {
client.setScreen(new ShiftMenu()); client.setScreen(new ShiftMenu());
} }
if (SaturnClientConfig.openEmoteWheel.wasKeyPressed() && client.currentScreen == null && !InputUtil.isKeyPressed(client.getWindow().getHandle(), GLFW.GLFW_KEY_F3)) { if (Config.openEmoteWheel.wasKeyPressed() && client.currentScreen == null && !InputUtil.isKeyPressed(client.getWindow().getHandle(), GLFW.GLFW_KEY_F3)) {
client.setScreen(new EmoteWheel()); client.setScreen(new EmoteWheel());
} }
@@ -9,7 +9,7 @@ import org.saturnclient.modules.HudMod;
import org.saturnclient.modules.ModDimensions; import org.saturnclient.modules.ModDimensions;
import org.saturnclient.modules.ModManager; import org.saturnclient.modules.ModManager;
import org.saturnclient.modules.Module; import org.saturnclient.modules.Module;
import org.saturnclient.saturnclient.config.ConfigManager; import org.saturnclient.saturnclient.config.manager.ConfigManager;
import org.saturnclient.saturnclient.mixin.DrawContextAccessor; import org.saturnclient.saturnclient.mixin.DrawContextAccessor;
import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.RenderScope;
import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.SaturnScreen;
@@ -1,6 +1,6 @@
package org.saturnclient.saturnclient.mixin; package org.saturnclient.saturnclient.mixin;
import org.saturnclient.saturnclient.config.SaturnClientConfig; import org.saturnclient.saturnclient.config.Config;
import org.saturnclient.ui2.screens.TitleMenu; import org.saturnclient.ui2.screens.TitleMenu;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@@ -14,7 +14,7 @@ import net.minecraft.client.gui.screen.TitleScreen;
public class SetScreenMixin { public class SetScreenMixin {
@ModifyVariable(method = "setScreen", at = @At("HEAD"), argsOnly = true) @ModifyVariable(method = "setScreen", at = @At("HEAD"), argsOnly = true)
private Screen replaceTitleScreen(Screen screen) { private Screen replaceTitleScreen(Screen screen) {
if (SaturnClientConfig.saturnTitleScreen.value) { if (Config.saturnTitleScreen.value) {
if (screen instanceof TitleScreen) if (screen instanceof TitleScreen)
return new TitleMenu(); return new TitleMenu();
if (screen == null && ((MinecraftClient) (Object) this).world == null) if (screen == null && ((MinecraftClient) (Object) this).world == null)
@@ -1,9 +1,6 @@
package org.saturnclient.ui2; package org.saturnclient.ui2;
import java.util.function.Function;
import org.saturnclient.ui2.anim.Animation; import org.saturnclient.ui2.anim.Animation;
import org.saturnclient.ui2.anim.Curve;
public class Element { public class Element {
public int x; public int x;
@@ -14,7 +11,6 @@ public class Element {
public boolean focused; public boolean focused;
public Animation animation; public Animation animation;
public float scale = 1.0f; public float scale = 1.0f;
public Function<Double, Double> curve = Curve::easeInOutCubic;
public Integer duration = null; // Element duration, will fade out if not null public Integer duration = null; // Element duration, will fade out if not null
public void render(RenderScope renderScope, ElementContext ctx) { public void render(RenderScope renderScope, ElementContext ctx) {
@@ -43,7 +39,7 @@ public class Element {
public void playAnimationFrame(long elapsed) { public void playAnimationFrame(long elapsed) {
if (this.animation != null && elapsed >= this.animation.delay) { 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); .apply(Math.min(1.0, (double) (elapsed - this.animation.delay) / this.animation.duration)), this);
} }
} }
@@ -86,12 +82,6 @@ public class Element {
return this; return this;
} }
public Element animation(Animation animation, Function<Double, Double> curve) {
this.animation = animation;
this.curve = curve;
return this;
}
public Element scale(float scale) { public Element scale(float scale) {
this.scale = scale; this.scale = scale;
return this; return this;
@@ -1,10 +1,31 @@
package org.saturnclient.ui2.anim; package org.saturnclient.ui2.anim;
import java.util.function.Function;
import org.saturnclient.saturnclient.config.AnimationConfig;
import org.saturnclient.ui2.Element; import org.saturnclient.ui2.Element;
public abstract class Animation { public abstract class Animation {
public int duration; public int duration;
public int delay = 0; public int delay = 0;
public Function<Double, Double> 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) { Animation(int duration) {
this.duration = duration; this.duration = duration;
@@ -9,12 +9,8 @@ public class Curve {
return (x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2); 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) { public static double easeInOutBack(double x) {
double c1 = 1.70158; double c1 = 2.5;
double c2 = c1 * 1.525; double c2 = c1 * 1.525;
if (x < 0.5) { if (x < 0.5) {
@@ -1,5 +1,6 @@
package org.saturnclient.ui2.anim; package org.saturnclient.ui2.anim;
import org.saturnclient.saturnclient.config.AnimationConfig;
import org.saturnclient.ui2.Element; import org.saturnclient.ui2.Element;
public class Fade extends Animation { public class Fade extends Animation {
@@ -9,6 +10,10 @@ public class Fade extends Animation {
super(duration); super(duration);
} }
public Fade(AnimationConfig config) {
super(config);
}
@Override @Override
public void tick(double progress, Element element) { public void tick(double progress, Element element) {
element.opacity = Math.max(0.1f, targetOpacity * (float) progress); element.opacity = Math.max(0.1f, targetOpacity * (float) progress);
@@ -1,5 +1,6 @@
package org.saturnclient.ui2.anim; package org.saturnclient.ui2.anim;
import org.saturnclient.saturnclient.config.AnimationConfig;
import org.saturnclient.ui2.Element; import org.saturnclient.ui2.Element;
public class FadeOut extends Animation { public class FadeOut extends Animation {
@@ -9,6 +10,10 @@ public class FadeOut extends Animation {
super(duration); super(duration);
} }
public FadeOut(AnimationConfig config) {
super(config);
}
@Override @Override
public void tick(double progress, Element element) { public void tick(double progress, Element element) {
element.opacity = targetOpacity - (float) progress; element.opacity = targetOpacity - (float) progress;
@@ -1,5 +1,6 @@
package org.saturnclient.ui2.anim; package org.saturnclient.ui2.anim;
import org.saturnclient.saturnclient.config.AnimationConfig;
import org.saturnclient.ui2.Element; import org.saturnclient.ui2.Element;
public class SlideFade extends Animation { public class SlideFade extends Animation {
@@ -12,6 +13,12 @@ public class SlideFade extends Animation {
this.slideY = new SlideY(duration, offset); 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 @Override
public void tick(double progress, Element element) { public void tick(double progress, Element element) {
fade.delay = this.delay; fade.delay = this.delay;
@@ -1,11 +1,20 @@
package org.saturnclient.ui2.anim; package org.saturnclient.ui2.anim;
import org.saturnclient.saturnclient.config.AnimationConfig;
import org.saturnclient.ui2.Element; import org.saturnclient.ui2.Element;
public class SlideX extends Animation { public class SlideX extends Animation {
int offset = 20; int offset = 20;
int maxOffset = 20; double startX;
int elementX;
public SlideX(AnimationConfig config) {
super(config);
}
public SlideX(AnimationConfig config, int offset) {
super(config);
this.offset = offset;
}
public SlideX(int duration) { public SlideX(int duration) {
super(duration); super(duration);
@@ -14,23 +23,17 @@ public class SlideX extends Animation {
public SlideX(int duration, int offset) { public SlideX(int duration, int offset) {
super(duration); super(duration);
this.offset = offset; 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 @Override
public void init(Element element) { public void init(Element element) {
element.x -= offset; startX = element.x - offset;
elementX = element.x; element.x = (int) startX;
}
@Override
public void tick(double progress, Element element) {
double currentX = startX + offset * progress;
element.x = (int) currentX;
} }
} }
@@ -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;
}
}
@@ -1,28 +1,28 @@
package org.saturnclient.ui2.anim; package org.saturnclient.ui2.anim;
import org.saturnclient.saturnclient.config.AnimationConfig;
import org.saturnclient.ui2.Element; import org.saturnclient.ui2.Element;
public class SlideY extends Animation { public class SlideY extends Animation {
int offset = 20; int offset = 20;
int maxOffset = 20;
double startY; double startY;
public SlideY(AnimationConfig config) {
super(config);
}
public SlideY(AnimationConfig config, int offset) {
super(config);
this.offset = offset;
}
public SlideY(int duration) { public SlideY(int duration) {
super(duration); super(duration);
} }
public SlideY(int duration, int offset) { public SlideY(int duration, int offset) {
super(duration); super(duration);
this.offset = offset; this.offset = offset;
this.maxOffset = offset;
}
public SlideY(int duration, int offset, int maxOffset) {
super(duration);
this.offset = offset;
this.maxOffset = offset;
} }
@Override @Override
@@ -1,7 +1,7 @@
package org.saturnclient.ui2.components; package org.saturnclient.ui2.components;
import org.saturnclient.saturnclient.SaturnClient; 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.saturnclient.config.Theme;
import org.saturnclient.ui2.resources.Textures; import org.saturnclient.ui2.resources.Textures;
import org.saturnclient.ui2.Element; import org.saturnclient.ui2.Element;
@@ -35,7 +35,7 @@ public class Sidebar extends Element {
SaturnClient.client.setScreen(new ModMenu()); SaturnClient.client.setScreen(new ModMenu());
}, false), }, false),
new Sidebar.SidebarComponent(Textures.SETTINGS, () -> { new Sidebar.SidebarComponent(Textures.SETTINGS, () -> {
SaturnClient.client.setScreen(new ConfigEditor(SaturnClientConfig.config)); SaturnClient.client.setScreen(new ConfigEditor(Config.config));
}, false), }, false),
new Sidebar.SidebarComponent(Textures.SHIRT, () -> { new Sidebar.SidebarComponent(Textures.SHIRT, () -> {
@@ -1,7 +1,7 @@
package org.saturnclient.ui2.components.inputs; package org.saturnclient.ui2.components.inputs;
import org.saturnclient.saturnclient.config.ConfigManager; import org.saturnclient.saturnclient.config.manager.ConfigManager;
import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.manager.Property;
import org.saturnclient.ui2.resources.Fonts; import org.saturnclient.ui2.resources.Fonts;
public class FloatInput extends Input { public class FloatInput extends Input {
@@ -2,7 +2,7 @@ package org.saturnclient.ui2.components.inputs;
import java.awt.Color; 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.Element;
import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.ElementContext;
import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.RenderScope;
@@ -1,7 +1,7 @@
package org.saturnclient.ui2.components.inputs; package org.saturnclient.ui2.components.inputs;
import org.saturnclient.saturnclient.config.ConfigManager; import org.saturnclient.saturnclient.config.manager.ConfigManager;
import org.saturnclient.saturnclient.config.Property; import org.saturnclient.saturnclient.config.manager.Property;
import org.saturnclient.ui2.resources.Fonts; import org.saturnclient.ui2.resources.Fonts;
public class IntInput extends Input { public class IntInput extends Input {
@@ -1,8 +1,8 @@
package org.saturnclient.ui2.components.inputs; package org.saturnclient.ui2.components.inputs;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import org.saturnclient.saturnclient.config.Property;
import org.saturnclient.saturnclient.config.Theme; import org.saturnclient.saturnclient.config.Theme;
import org.saturnclient.saturnclient.config.manager.Property;
import org.saturnclient.ui2.Element; import org.saturnclient.ui2.Element;
import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.ElementContext;
import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.RenderScope;
@@ -1,7 +1,7 @@
package org.saturnclient.ui2.components.inputs; package org.saturnclient.ui2.components.inputs;
import org.saturnclient.saturnclient.config.Property;
import org.saturnclient.saturnclient.config.Theme; import org.saturnclient.saturnclient.config.Theme;
import org.saturnclient.saturnclient.config.manager.Property;
import org.saturnclient.ui2.Element; import org.saturnclient.ui2.Element;
import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.ElementContext;
import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.RenderScope;
@@ -1,7 +1,7 @@
package org.saturnclient.ui2.components.inputs; package org.saturnclient.ui2.components.inputs;
import org.saturnclient.saturnclient.config.Property;
import org.saturnclient.saturnclient.config.Theme; import org.saturnclient.saturnclient.config.Theme;
import org.saturnclient.saturnclient.config.manager.Property;
import org.saturnclient.ui2.Element; import org.saturnclient.ui2.Element;
import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.ElementContext;
import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.RenderScope;
@@ -3,7 +3,8 @@ package org.saturnclient.ui2.elements;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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.Element;
import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.ElementContext;
import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.RenderScope;
@@ -17,8 +18,12 @@ public class AnimationStagger extends Element {
this.delay = delay; this.delay = delay;
} }
public AnimationStagger(AnimationConfig config) {
this.delay = config.stagger.value;
}
public void draw(Element element) { public void draw(Element element) {
if (!SaturnClientConfig.stagger.value) { if (!Config.stagger.value) {
element.animation = null; element.animation = null;
} }
@@ -32,7 +37,6 @@ public class AnimationStagger extends Element {
this.width = Math.max(this.width, element.x + element.width); this.width = Math.max(this.width, element.x + element.width);
} }
@Override @Override
public void render(RenderScope renderScope, ElementContext ctx) { public void render(RenderScope renderScope, ElementContext ctx) {
ElementRenderer.render(children, ctx.elapsed, renderScope, ElementRenderer.render(children, ctx.elapsed, renderScope,
@@ -1,7 +1,7 @@
package org.saturnclient.ui2.elements; package org.saturnclient.ui2.elements;
import org.saturnclient.saturnclient.config.Property;
import org.saturnclient.saturnclient.config.Theme; import org.saturnclient.saturnclient.config.Theme;
import org.saturnclient.saturnclient.config.manager.Property;
import org.saturnclient.ui2.Element; import org.saturnclient.ui2.Element;
import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.ElementContext;
import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.RenderScope;
@@ -3,8 +3,8 @@ package org.saturnclient.ui2.elements;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.saturnclient.saturnclient.config.Property;
import org.saturnclient.saturnclient.config.Theme; import org.saturnclient.saturnclient.config.Theme;
import org.saturnclient.saturnclient.config.manager.Property;
import org.saturnclient.ui2.Element; import org.saturnclient.ui2.Element;
import org.saturnclient.ui2.ElementContext; import org.saturnclient.ui2.ElementContext;
import org.saturnclient.ui2.RenderScope; import org.saturnclient.ui2.RenderScope;
@@ -2,9 +2,9 @@ package org.saturnclient.ui2.screens;
import java.util.Map; 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.Theme;
import org.saturnclient.saturnclient.config.manager.ConfigManager;
import org.saturnclient.saturnclient.config.manager.Property;
import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.SaturnScreen;
import org.saturnclient.ui2.components.Sidebar; import org.saturnclient.ui2.components.Sidebar;
import org.saturnclient.ui2.components.inputs.FloatInput; import org.saturnclient.ui2.components.inputs.FloatInput;
@@ -2,12 +2,14 @@ package org.saturnclient.ui2.screens;
import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.saturnclient.client.ServiceClient; 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.saturnclient.cosmetics.Emotes;
import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.SaturnScreen;
import org.saturnclient.ui2.Utils; import org.saturnclient.ui2.Utils;
import org.saturnclient.ui2.anim.Fade; import org.saturnclient.ui2.anim.Fade;
import org.saturnclient.ui2.anim.SlideY; import org.saturnclient.ui2.anim.SlideY;
import org.saturnclient.ui2.elements.AnimationStagger;
import org.saturnclient.ui2.elements.ImageTexture; import org.saturnclient.ui2.elements.ImageTexture;
import org.saturnclient.ui2.elements.TextureButton; import org.saturnclient.ui2.elements.TextureButton;
import org.saturnclient.ui2.resources.Textures; import org.saturnclient.ui2.resources.Textures;
@@ -29,10 +31,23 @@ public class EmoteWheel extends SaturnScreen {
int row = 0; int row = 0;
int col = 0; int col = 0;
draw(new ImageTexture(Textures.LOGO_TEXT).dimensions(98, 10).centerOffset(width, height, 0, -105) // =============================
.animation(new Fade(700))); // Logo
draw(new ImageTexture(SaturnClientConfig.getLogo()).dimensions(98, 98).centerOffset(width, height, 0, -149) // =============================
.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)));
// =============================
// Navigation Buttons
// =============================
draw(new TextureButton(Textures.LEFT, () -> { draw(new TextureButton(Textures.LEFT, () -> {
if (page > 1) { if (page > 1) {
@@ -40,18 +55,29 @@ public class EmoteWheel extends SaturnScreen {
elements.clear(); elements.clear();
ui(); 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, () -> { draw(new TextureButton(Textures.RIGHT, () -> {
if ((8 * page) < Emotes.availableEmotes.size()) { if ((page * 8) < Emotes.availableEmotes.size()) {
page++; page++;
elements.clear(); elements.clear();
ui(); 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) { while (row < 3) {
int idx = (row * 3 + col) * page;
int idx = (row * 3 + col) + ((page - 1) * 8);
if (row == 1 && col == 1) { if (row == 1 && col == 1) {
col++; col++;
@@ -59,21 +85,35 @@ public class EmoteWheel extends SaturnScreen {
String emote = Utils.getOrNull(Emotes.availableEmotes, idx); String emote = Utils.getOrNull(Emotes.availableEmotes, idx);
draw(new TextureButton(Textures.getEmotePreview(emote), () -> { emoteStagger.draw(
if (emote == null) { new TextureButton(Textures.getEmotePreview(emote), () -> {
if (emote == null)
return; return;
}
AnimationStack animationStack = PlayerAnimationAccess.getPlayerAnimLayer(SaturnClient.client.player); AnimationStack animationStack = PlayerAnimationAccess.getPlayerAnimLayer(
if (animationStack.isActive() && animationStack.getPriority() == 1000) { SaturnClient.client.player);
if (animationStack.isActive()
&& animationStack.getPriority() == 1000) {
animationStack.removeLayer(1000); animationStack.removeLayer(1000);
} }
animationStack.addAnimLayer(1000,
PlayerAnimationRegistry.getAnimation(Identifier.of("saturnclient", animationStack.addAnimLayer(
emote)).playAnimation()); 1000,
PlayerAnimationRegistry
.getAnimation(
Identifier.of("saturnclient", emote))
.playAnimation());
ServiceClient.emote(emote); ServiceClient.emote(emote);
close(); close();
}).dimensions(70, 70).centerOffset(width, height, -80 + (col * 80), -35 + (row * 80)) })
.animation(new Fade(700))); .dimensions(70, 70)
.centerOffset(width, height,
-80 + (col * 80),
-35 + (row * 80))
.animation(new SlideY(AnimationConfig.emoteWheel, 12)));
if (col < 2) { if (col < 2) {
col++; col++;
@@ -82,6 +122,8 @@ public class EmoteWheel extends SaturnScreen {
row++; row++;
} }
} }
draw(emoteStagger);
} }
@Override @Override
@@ -2,7 +2,7 @@ package org.saturnclient.ui2.screens;
import org.saturnclient.modules.ModManager; import org.saturnclient.modules.ModManager;
import org.saturnclient.modules.Module; 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.SaturnScreen;
import org.saturnclient.ui2.anim.SlideFade; import org.saturnclient.ui2.anim.SlideFade;
import org.saturnclient.ui2.components.SaturnModule; import org.saturnclient.ui2.components.SaturnModule;
@@ -27,13 +27,13 @@ public class ModMenu extends SaturnScreen {
int row = 0; int row = 0;
int col = 0; int col = 0;
AnimationStagger moduleStagger = new AnimationStagger(20); AnimationStagger moduleStagger = new AnimationStagger(AnimationConfig.modMenu);
for (Module mod : ModManager.ALL_MODS) { for (Module mod : ModManager.ALL_MODS) {
moduleStagger.draw( moduleStagger.draw(
new SaturnModule(mod) new SaturnModule(mod)
.position((160 + g) * col, (50 + g) * row) .position((160 + g) * col, (50 + g) * row)
.animation(new SlideFade(600, -12), SaturnClientConfig.getAnimationCurve())); .animation(new SlideFade(AnimationConfig.modMenu, -12)));
if (col == 2) { if (col == 2) {
col = 0; col = 0;
@@ -1,7 +1,8 @@
package org.saturnclient.ui2.screens; package org.saturnclient.ui2.screens;
import org.saturnclient.saturnclient.SaturnClient; 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.saturnclient.menus.HudEditor;
import org.saturnclient.ui2.resources.Textures; import org.saturnclient.ui2.resources.Textures;
import org.saturnclient.ui2.screens.cosmetics.CloakMenu; import org.saturnclient.ui2.screens.cosmetics.CloakMenu;
@@ -24,12 +25,12 @@ public class ShiftMenu extends SaturnScreen {
draw(new ImageTexture(Textures.LOGO_TEXT) draw(new ImageTexture(Textures.LOGO_TEXT)
.dimensions(98, 10) .dimensions(98, 10)
.centerOffset(width, height, 0, -36) .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) .dimensions(98, 98)
.centerOffset(width, height, 0, -80) .centerOffset(width, height, 0, -80)
.animation(new SlideY(700, -20))); .animation(new SlideY(AnimationConfig.logo, -20)));
// Spacing and sizes // Spacing and sizes
int btnWidth = 120; int btnWidth = 120;
@@ -37,22 +38,23 @@ public class ShiftMenu extends SaturnScreen {
int spacing = 4; int spacing = 4;
// Create stagger // Create stagger
AnimationStagger stagger = new AnimationStagger(50);
AnimationStagger stagger = new AnimationStagger(AnimationConfig.shiftMenu.stagger.value);
stagger.draw(new TextureButton(Textures.HUD_ICON, () -> { stagger.draw(new TextureButton(Textures.HUD_ICON, () -> {
client.setScreen(new HudEditor()); client.setScreen(new HudEditor());
}).dimensions(btnHeight, btnHeight).position(0, 0) }).dimensions(btnHeight, btnHeight).position(0, 0)
.animation(new Fade(300))); .animation(new Fade(AnimationConfig.shiftMenu)));
stagger.draw(new Button("Settings", () -> { stagger.draw(new Button("Settings", () -> {
SaturnClient.client.setScreen(new ModMenu()); SaturnClient.client.setScreen(new ModMenu());
}).dimensions(btnWidth, btnHeight).position(btnHeight + spacing, 0) }).dimensions(btnWidth, btnHeight).position(btnHeight + spacing, 0)
.animation(new Fade(300))); .animation(new Fade(AnimationConfig.shiftMenu)));
stagger.draw(new TextureButton(Textures.COSMETICS, () -> { stagger.draw(new TextureButton(Textures.COSMETICS, () -> {
client.setScreen(new CloakMenu()); client.setScreen(new CloakMenu());
}).dimensions(btnHeight, btnHeight).position(btnWidth + btnHeight + (spacing * 2), 0) }).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 the stagger at the absolute center of the screen
draw(stagger.dimensions(btnWidth + (btnHeight * 2) + (spacing * 2), btnHeight).centerOffset(width, height, 0, draw(stagger.dimensions(btnWidth + (btnHeight * 2) + (spacing * 2), btnHeight).centerOffset(width, height, 0,
@@ -1,7 +1,8 @@
package org.saturnclient.ui2.screens; package org.saturnclient.ui2.screens;
import org.saturnclient.saturnclient.SaturnClient; 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.saturnclient.menus.HudEditor;
import org.saturnclient.ui2.resources.Textures; import org.saturnclient.ui2.resources.Textures;
import org.saturnclient.ui2.screens.cosmetics.CloakMenu; import org.saturnclient.ui2.screens.cosmetics.CloakMenu;
@@ -28,46 +29,52 @@ public class TitleMenu extends SaturnScreen {
public void ui() { public void ui() {
backgroundBlur = 0; backgroundBlur = 0;
draw(new ImageTexture(Textures.LOGO_TEXT).dimensions(98, 10).centerOffset(width, height, 0, -36) draw(new ImageTexture(Textures.LOGO_TEXT).dimensions(98, 10).centerOffset(width, height, 0, -105)
.animation(new Fade(700))); .animation(new Fade(AnimationConfig.logo.duration.value)));
draw(new ImageTexture(SaturnClientConfig.getLogo()).dimensions(98, 98).centerOffset(width, height, 0, -82) draw(new ImageTexture(Config.getLogo()).dimensions(98, 98).centerOffset(width, height, 0, -149)
.animation(new SlideY(700, -20))); .animation(new SlideY(AnimationConfig.logo, -20)));
AnimationStagger mainButtonStagger = new AnimationStagger(120); AnimationStagger mainButtonStagger = new AnimationStagger(AnimationConfig.mainMenu);
mainButtonStagger.draw(new Button("SINGLEPLAYER", () -> { mainButtonStagger.draw(new Button("SINGLEPLAYER", () -> {
client.setScreen(new SelectWorldScreen(new TitleMenu())); 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", () -> { mainButtonStagger.draw(new Button("MULTIPLAYER", () -> {
client.setScreen(new MultiplayerScreen(new TitleMenu())); 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", () -> { mainButtonStagger.draw(new Button("OPTIONS", () -> {
client.setScreen(new OptionsScreen(new TitleMenu(), SaturnClient.client.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", () -> { mainButtonStagger.draw(new Button("QUIT", () -> {
client.scheduleStop(); 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)); draw(mainButtonStagger.dimensions(289, 143).centerOffset(width, height, 0, 60));
int s = Fonts.getHeight() + 20; 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, () -> { saturnStagger.draw(new TextureButton(Textures.HUD_ICON, () -> {
client.setScreen(new HudEditor()); 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, () -> { saturnStagger.draw(new TextureButton(Textures.SETTINGS, () -> {
SaturnClient.client.setScreen(new ModMenu()); 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, () -> { saturnStagger.draw(new TextureButton(Textures.CLOAK, () -> {
client.setScreen(new CloakMenu()); 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)); draw(saturnStagger.dimensions(((s + 2) * 2) + s, s).centerHorizontal(width, height, 0, 8));
} }
@@ -2,12 +2,16 @@ package org.saturnclient.ui2.screens.cosmetics;
import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.saturnclient.client.player.SaturnPlayer; import org.saturnclient.saturnclient.client.player.SaturnPlayer;
import org.saturnclient.saturnclient.config.AnimationConfig;
import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks;
import org.saturnclient.ui2.resources.Textures; import org.saturnclient.ui2.resources.Textures;
import org.saturnclient.ui2.SaturnScreen; 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.CosmeticPreview;
import org.saturnclient.ui2.components.Sidebar; import org.saturnclient.ui2.components.Sidebar;
import org.saturnclient.ui2.components.SkinPreview; import org.saturnclient.ui2.components.SkinPreview;
import org.saturnclient.ui2.elements.AnimationStagger;
import org.saturnclient.ui2.elements.Scroll; import org.saturnclient.ui2.elements.Scroll;
import org.saturnclient.ui2.elements.TabMenu; import org.saturnclient.ui2.elements.TabMenu;
import org.saturnclient.ui2.elements.TabMenu.TabMenuComponent; import org.saturnclient.ui2.elements.TabMenu.TabMenuComponent;
@@ -29,11 +33,18 @@ public class CloakMenu extends SaturnScreen {
SaturnPlayer player = SaturnPlayer.get(); SaturnPlayer player = SaturnPlayer.get();
AnimationStagger stagger = new AnimationStagger(AnimationConfig.cosmeticsMenu);
if (player != null) { if (player != null) {
for (String cloak : Cloaks.availableCloaks) { for (String cloak : Cloaks.availableCloaks) {
scroll.draw(new CosmeticPreview(cloak == player.cloak, Textures.getCloakPreview(cloak), () -> {
Cloaks.setCloak(cloak); stagger.draw(
}).position((50 + g) * col, (111 + g) * row)); 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) { if (col == 5) {
col = 0; col = 0;
@@ -44,19 +55,29 @@ public class CloakMenu extends SaturnScreen {
} }
} }
scroll.draw(stagger);
int scrollWidth = 480 + 10 + (g * 2) + (p * 2); 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, draw(new TabMenu(0,
new TabMenuComponent(Textures.CLOAK, () -> { new TabMenuComponent(Textures.CLOAK, () -> {
}), }),
new TabMenuComponent(Textures.HAT, () -> { new TabMenuComponent(Textures.HAT, () -> {
SaturnClient.client.setScreen(new HatMenu()); SaturnClient.client.setScreen(new HatMenu());
})).centerOffset(width, height, 0, -195)); }))
.centerOffset(width, height, 0, -195));
} }
} }
@@ -2,12 +2,16 @@ package org.saturnclient.ui2.screens.cosmetics;
import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.saturnclient.client.player.SaturnPlayer; import org.saturnclient.saturnclient.client.player.SaturnPlayer;
import org.saturnclient.saturnclient.config.AnimationConfig;
import org.saturnclient.saturnclient.cosmetics.Hats; import org.saturnclient.saturnclient.cosmetics.Hats;
import org.saturnclient.ui2.resources.Textures; import org.saturnclient.ui2.resources.Textures;
import org.saturnclient.ui2.SaturnScreen; 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.CosmeticPreview;
import org.saturnclient.ui2.components.Sidebar; import org.saturnclient.ui2.components.Sidebar;
import org.saturnclient.ui2.components.SkinPreview; import org.saturnclient.ui2.components.SkinPreview;
import org.saturnclient.ui2.elements.AnimationStagger;
import org.saturnclient.ui2.elements.Scroll; import org.saturnclient.ui2.elements.Scroll;
import org.saturnclient.ui2.elements.TabMenu; import org.saturnclient.ui2.elements.TabMenu;
import org.saturnclient.ui2.elements.TabMenu.TabMenuComponent; import org.saturnclient.ui2.elements.TabMenu.TabMenuComponent;
@@ -29,11 +33,19 @@ public class HatMenu extends SaturnScreen {
SaturnPlayer player = SaturnPlayer.get(); SaturnPlayer player = SaturnPlayer.get();
AnimationStagger stagger = new AnimationStagger(AnimationConfig.cosmeticsMenu);
if (player != null) { if (player != null) {
for (String hat : Hats.availableHats) { for (String hat : Hats.availableHats) {
scroll.draw(new CosmeticPreview(hat == player.hat, Textures.getHatPreview(hat), () -> {
Hats.setHat(hat); stagger.draw(
}).dimensions(50, 50).position((50 + g) * col, (50 + g) * row)); 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) { if (col == 5) {
col = 0; col = 0;
@@ -44,19 +56,29 @@ public class HatMenu extends SaturnScreen {
} }
} }
scroll.draw(stagger);
int scrollWidth = 480 + 10 + (g * 2) + (p * 2); 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, draw(new TabMenu(1,
new TabMenuComponent(Textures.CLOAK, () -> { new TabMenuComponent(Textures.CLOAK, () -> {
SaturnClient.client.setScreen(new CloakMenu()); SaturnClient.client.setScreen(new CloakMenu());
}), }),
new TabMenuComponent(Textures.HAT, () -> { new TabMenuComponent(Textures.HAT, () -> {
})).centerOffset(width, height, 0, -195)); }))
.centerOffset(width, height, 0, -195));
} }
} }
@@ -3,12 +3,16 @@ package org.saturnclient.ui2.screens.store;
import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.saturnclient.client.ServiceClient; import org.saturnclient.saturnclient.client.ServiceClient;
import org.saturnclient.saturnclient.client.player.SaturnPlayer; import org.saturnclient.saturnclient.client.player.SaturnPlayer;
import org.saturnclient.saturnclient.config.AnimationConfig;
import org.saturnclient.saturnclient.config.Theme; import org.saturnclient.saturnclient.config.Theme;
import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks;
import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.SaturnScreen;
import org.saturnclient.ui2.Utils; 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.CosmeticPreview;
import org.saturnclient.ui2.components.Sidebar; import org.saturnclient.ui2.components.Sidebar;
import org.saturnclient.ui2.elements.AnimationStagger;
import org.saturnclient.ui2.elements.ImageTexture; import org.saturnclient.ui2.elements.ImageTexture;
import org.saturnclient.ui2.elements.Notification.NotificationKind; import org.saturnclient.ui2.elements.Notification.NotificationKind;
import org.saturnclient.ui2.elements.Scroll; import org.saturnclient.ui2.elements.Scroll;
@@ -45,41 +49,37 @@ public class CloakStore extends SaturnScreen {
SaturnPlayer player = SaturnPlayer.get(); SaturnPlayer player = SaturnPlayer.get();
AnimationStagger stagger = new AnimationStagger(AnimationConfig.cosmeticsMenu);
if (player != null) { if (player != null) {
for (String cloak : Cloaks.ALL_CLOAKS) { for (String cloak : Cloaks.ALL_CLOAKS) {
if (!Cloaks.availableCloaks.contains(cloak)) { if (!Cloaks.availableCloaks.contains(cloak)) {
int x = (50 + gx) * col; int x = (50 + gx) * col;
int y = (111 + gy) * row; int y = (111 + gy) * row;
scroll.draw(new CosmeticPreview(cloak == player.cloak, Textures.getCloakPreview(cloak), () -> { stagger.draw(
long now = System.currentTimeMillis(); new CosmeticPreview(
if (now - lastPurchaseTime >= 3000) { cloak == player.cloak,
Utils.notify(NotificationKind.Info, "Purchase processing", "Please wait"); Textures.getCloakPreview(cloak),
ServiceClient.buyCloak(cloak); () -> handlePurchase(cloak))
lastPurchaseTime = now; .position(x, y)
new Thread(() -> { .animation(new SlideY(AnimationConfig.cosmeticsMenu, 16)));
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));
String t = "100"; 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) stagger.draw(
.position(x + Fonts.getWidth(t, Theme.FONT.value) - 1, y + 112).scale(0.5f)); 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) { if (col == 8) {
col = 0; col = 0;
@@ -91,17 +91,54 @@ public class CloakStore extends SaturnScreen {
} }
} }
scroll.draw(stagger);
int scrollWidth = 480 + 40 + (gx * 2) + (p * 2); 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, draw(new TabMenu(0,
new TabMenuComponent(Textures.CLOAK, () -> { new TabMenuComponent(Textures.CLOAK, () -> {
}), }),
new TabMenuComponent(Textures.HAT, () -> { new TabMenuComponent(Textures.HAT, () -> {
SaturnClient.client.setScreen(new HatStore()); 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");
}
} }
} }
@@ -3,12 +3,16 @@ package org.saturnclient.ui2.screens.store;
import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.saturnclient.client.ServiceClient; import org.saturnclient.saturnclient.client.ServiceClient;
import org.saturnclient.saturnclient.client.player.SaturnPlayer; import org.saturnclient.saturnclient.client.player.SaturnPlayer;
import org.saturnclient.saturnclient.config.AnimationConfig;
import org.saturnclient.saturnclient.config.Theme; import org.saturnclient.saturnclient.config.Theme;
import org.saturnclient.saturnclient.cosmetics.Hats; import org.saturnclient.saturnclient.cosmetics.Hats;
import org.saturnclient.ui2.SaturnScreen; import org.saturnclient.ui2.SaturnScreen;
import org.saturnclient.ui2.Utils; 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.CosmeticPreview;
import org.saturnclient.ui2.components.Sidebar; import org.saturnclient.ui2.components.Sidebar;
import org.saturnclient.ui2.elements.AnimationStagger;
import org.saturnclient.ui2.elements.ImageTexture; import org.saturnclient.ui2.elements.ImageTexture;
import org.saturnclient.ui2.elements.Notification.NotificationKind; import org.saturnclient.ui2.elements.Notification.NotificationKind;
import org.saturnclient.ui2.elements.Scroll; import org.saturnclient.ui2.elements.Scroll;
@@ -45,41 +49,38 @@ public class HatStore extends SaturnScreen {
SaturnPlayer player = SaturnPlayer.get(); SaturnPlayer player = SaturnPlayer.get();
AnimationStagger stagger = new AnimationStagger(AnimationConfig.cosmeticsMenu);
if (player != null) { if (player != null) {
for (String hat : Hats.ALL_HATS) { for (String hat : Hats.ALL_HATS) {
if (!Hats.availableHats.contains(hat)) { if (!Hats.availableHats.contains(hat)) {
int x = (50 + gx) * col; int x = (50 + gx) * col;
int y = (50 + gy) * row; int y = (50 + gy) * row;
scroll.draw(new CosmeticPreview(hat == player.hat, Textures.getHatPreview(hat), () -> { stagger.draw(
long now = System.currentTimeMillis(); new CosmeticPreview(
if (now - lastPurchaseTime >= 3000) { hat == player.hat,
Utils.notify(NotificationKind.Info, "Purchase processing", "Please wait"); Textures.getHatPreview(hat),
ServiceClient.buyHat(hat); () -> handlePurchase(hat))
lastPurchaseTime = now; .dimensions(50, 50)
new Thread(() -> { .position(x, y)
try { .animation(new SlideY(AnimationConfig.cosmeticsMenu, 16)));
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));
String t = "50"; 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) stagger.draw(
.position(x + Fonts.getWidth(t, Theme.FONT.value) + 4, y + 52).scale(0.5f)); 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) { if (col == 8) {
col = 0; col = 0;
@@ -91,17 +92,54 @@ public class HatStore extends SaturnScreen {
} }
} }
scroll.draw(stagger);
int scrollWidth = 480 + 40 + (gx * 2) + (p * 2); 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, draw(new TabMenu(1,
new TabMenuComponent(Textures.CLOAK, () -> { new TabMenuComponent(Textures.CLOAK, () -> {
SaturnClient.client.setScreen(new CloakStore()); SaturnClient.client.setScreen(new CloakStore());
}), }),
new TabMenuComponent(Textures.HAT, () -> { 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");
}
} }
} }