Compare commits

...
21 Commits
Author SHA1 Message Date
selimaj-dev e8f686b2d3 Merge pull request 'Remove the upgrade of opaque theme colors from before 0.1.3' (#14) from drop-color-upgrade into master
Reviewed-on: #14
2026-09-30 19:49:03 +00:00
selimaj-devandclaude df5afe99e3 Remove the upgrade of opaque theme colors from before 0.1.3
Configs saved before 0.1.3 (without a menu blur) had their preset
background and primary colors made translucent on load. It's no longer
needed, so Theme drops it, along with ConfigManager.isSaved, which only
it used.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-30 21:47:45 +02:00
selimaj-dev 653738568a Merge pull request 'Rename the Ref methods that share a name with vanilla methods' (#13) from explicit-refs into master
Reviewed-on: #13
2026-09-30 16:03:45 +00:00
selimaj-devandclaude a6a324a61a Rename the Ref methods that share a name with vanilla methods
WindowRef.getWidth/getHeight and ItemStackRef.isEmpty/getMaxDamage
match methods of the classes they're mixed into, so the mixins can't
implement them explicitly. With Mojang's names, Window.getWidth is
also the framebuffer's width rather than the window's. They're now
getWindowWidth/getWindowHeight and isEmptyStack/getMaxItemDamage
(with getItemDamage to match).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-30 17:42:48 +02:00
selimaj-dev b0d75af8c4 Merge pull request 'Fix the None cloak and reorder the sidebar and title dock' (#12) from release-fixes into master
Reviewed-on: #12
2026-09-29 16:34:48 +00:00
selimaj-devandclaude c973e053aa Open Saturn's settings from the title dock and put Saturn first
The Saturn logo in the title screen's dock now opens Saturn's settings instead of the shift menu,
and it comes first: Saturn, mods, cosmetics, then Minecraft's options last. The shift menu is still
on its key in game.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 18:34:24 +02:00
selimaj-devandclaude bbf6b88ed3 Put settings second and the HUD editor last in the sidebar
The order is now mods, settings, cosmetics, HUD editor.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 18:34:24 +02:00
selimaj-devandclaude ba71a5b838 Draw no cloak for "None" instead of the missing texture
"None" is the empty cloak id, but getCurrentCloakTexture still built textures/cloaks/.png from it, so
the renderer drew Minecraft's missing texture. It now returns null for an empty id and for any id
this version has no texture for, and the renderer already skips a null texture.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 18:34:24 +02:00
selimaj-dev 6d5df3057e Merge pull request 'Add seven community emotes and re-export the twerk for emotes 0.1.1' (#11) from new-emotes into master
Reviewed-on: #11
2026-09-29 16:02:00 +00:00
selimaj-devandclaude 2fceb58024 Add seven community emotes and re-export the twerk for emotes 0.1.1
Get the Griddy, Take the L, Dab, Wave, Salute, Shrug and 67, converted from Emotecraft's binary
files with the emotes repo's tools/emotecraft/convert.py. Their authors stay in each file. Their
Emotecraft bends play as the library's curved ones.

Emotes 0.1.1 stopped flipping the torso's bend, so the twerk is re-exported with its torso bends'
signs turned round. It looks the same as before. This needs Saturn on emotes 0.1.1, which the
saturnclient change pointing here does.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 17:57:00 +02:00
selimaj-dev 7e98bbcd6c Merge pull request 'Add a twerk emote and drop the front flip' (#10) from twerk-emote into master
Reviewed-on: #10
2026-09-29 14:53:20 +00:00
selimaj-devandclaude 9ede612089 Add a twerk emote and drop the front flip
The twerk was measured from a 3D preview with the new emote capture tool, then made left/right
symmetric so it sways evenly instead of leaning to one side. The front flip is removed because it
plays wrongly with the new emote library.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 16:52:04 +02:00
selimaj-dev ed2914aaf7 Merge pull request 'Make old opaque theme colors translucent once' (#9) from upgrade-opaque-theme into master
Reviewed-on: #9
2026-09-28 21:10:28 +00:00
selimaj-devandclaude 69c830d466 Make old opaque theme colors translucent once
Configs saved before 0.1.3 hold the old default and preset background
and primary colors fully opaque, so glass didn't show for anyone
updating. On a config without Menu blur (new in 0.1.3), colors that are
an old default or preset get their translucent alpha; colors players
picked stay as they are.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-28 23:05:27 +02:00
selimaj-dev 7d0bfd26c9 Merge pull request 'Add GUI scale and glass, and rework the title screen' (#8) from glass-blur into master
Reviewed-on: #8
2026-09-28 20:01:19 +00:00
selimaj-devandclaude 7cc37b7c74 Tell when glass can be drawn at all
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-28 21:57:10 +02:00
selimaj-devandclaude 524fc36bf3 Say glass is up to the render scope, not the version
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-28 21:55:47 +02:00
selimaj-devandclaude 7bc308155e Split the blur into world, menu and widget blurs
The world or panorama keeps its animated background blur, while glass
behind menus and behind widgets (buttons, the dock, the account chip)
each get a fixed blur of their own. Glass is left out when its blur is 0.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-28 21:35:23 +02:00
selimaj-devandclaude 4d9c629eaf Frost translucent panels with glass
Panels whose background isn't solid draw the blurred game behind them,
cut to the same rounded rectangle texture as the background, where the
version supports glass. Panel screens then leave the rest of the game
unblurred.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-28 20:43:44 +02:00
selimaj-devandclaude 5c0912f0cf Use the background and primary colors' own alpha
Panels, buttons, cards and tiles multiplied the theme's background and
primary colors by a fixed alpha, so they were translucent however the
colors were set. They now use the colors as they are, and the defaults
and presets carry the old translucency in their alpha instead. Popups
stay nearly solid so they're readable over panels.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-28 19:56:24 +02:00
selimaj-devandclaude 3436054112 Draw the color picker from gradient textures
The picker drew its square and bars one pixel at a time, about 10,000
fills a frame. It now stretches four gradient strips, made once, over
them instead.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-28 19:45:04 +02:00
33 changed files with 4009 additions and 773 deletions
@@ -1,7 +1,11 @@
package org.saturnclient.common.ref.game; package org.saturnclient.common.ref.game;
/**
* An item stack. Its methods are implemented in ItemStackMixin, so their names must not match any of
* ItemStack's own methods.
*/
public interface ItemStackRef { public interface ItemStackRef {
public boolean isEmpty(); public boolean isEmptyStack();
public int getMaxDamage(); public int getMaxItemDamage();
public int getDamage(); public int getItemDamage();
} }
@@ -1,9 +1,15 @@
package org.saturnclient.common.ref.render; package org.saturnclient.common.ref.render;
/**
* The game window. Its methods are implemented in WindowMixin, so their names must not match any of
* Window's own methods.
*/
public interface WindowRef { public interface WindowRef {
public int getWidth(); /** The window's width in screen coordinates */
public int getWindowWidth();
public int getHeight(); /** The window's height in screen coordinates */
public int getWindowHeight();
public int getFramebufferWidth(); public int getFramebufferWidth();
@@ -19,17 +19,33 @@ public class Config {
public static BoolProperty saturnTitleScreen = Property.bool(true); public static BoolProperty saturnTitleScreen = Property.bool(true);
public static BoolProperty cloakPhysics = Property.bool(true); public static BoolProperty cloakPhysics = Property.bool(true);
public static BoolProperty stagger = Property.bool(true); public static BoolProperty stagger = Property.bool(true);
/** The world or panorama behind Saturn's screens, faded in as they open */
public static IntProperty backgroundBlur = Property.integer(5).range(0, 10); public static IntProperty backgroundBlur = Property.integer(5).range(0, 10);
/** Glass behind translucent menus (panels), and widgets (buttons, the dock) */
public static IntProperty menuBlur = Property.integer(8).range(0, 20);
public static IntProperty widgetBlur = Property.integer(6).range(0, 20);
// How big Saturn's screens are, relative to Minecraft's GUI scale // How big Saturn's screens are, relative to Minecraft's GUI scale
public static FloatProperty titleScale = guiScale(); public static FloatProperty titleScale = guiScale();
public static FloatProperty menuScale = guiScale(); public static FloatProperty menuScale = guiScale();
public static FloatProperty hudMenuScale = guiScale(); public static FloatProperty hudMenuScale = guiScale();
/** Added in 0.1.3, so a config without it was saved by an older version */
static final String MENU_BLUR = "Menu blur";
public static KeybindingProperty openEmoteWheel = Property.keybinding(GLFWProvider.GLFW_KEY_B); public static KeybindingProperty openEmoteWheel = Property.keybinding(GLFWProvider.GLFW_KEY_B);
private static FloatProperty guiScale() { private static FloatProperty guiScale() {
return Property.floatProp(1f).range(0.5f, 2f, 0.05f).unit("×"); return Property.floatProp(1f).range(0.5f, 2f, 0.05f).unit("×");
} }
/**
* Whether any glass can be drawn: a glass blur is on, and a background it
* goes behind isn't solid.
*/
public static boolean usesGlass() {
boolean translucent = Theme.getPanelBg() >>> 24 < 0xFF || Theme.PRIMARY.value >>> 24 < 0xFF;
return translucent && (menuBlur.value > 0 || widgetBlur.value > 0);
}
public static IdentifierRef getLogo() { public static IdentifierRef getLogo() {
return realisticLogo.value ? Textures.REALISTIC_LOGO : Textures.LOGO; return realisticLogo.value ? Textures.REALISTIC_LOGO : Textures.LOGO;
} }
@@ -43,7 +59,9 @@ public class Config {
config.property("Open Emote Wheel", openEmoteWheel, "The key that opens the emote wheel"); config.property("Open Emote Wheel", openEmoteWheel, "The key that opens the emote wheel");
config.property("Cloak Physics", cloakPhysics, "Let cloaks swing as you move"); config.property("Cloak Physics", cloakPhysics, "Let cloaks swing as you move");
config.property("Stagger Animations", stagger, "Animate list items one after another"); config.property("Stagger Animations", stagger, "Animate list items one after another");
config.property("Background blur", backgroundBlur, "How much the game behind Saturn's screens is blurred"); config.property("World blur", backgroundBlur, "How much the world or panorama behind Saturn's screens is blurred");
config.property(MENU_BLUR, menuBlur, "How much the game is blurred through translucent menus");
config.property("Widget blur", widgetBlur, "How much the game is blurred through translucent buttons and the dock");
config.property("Title screen scale", titleScale, "How big the title screen is, relative to Minecraft's GUI scale"); config.property("Title screen scale", titleScale, "How big the title screen is, relative to Minecraft's GUI scale");
config.property("Menu scale", menuScale, "How big the mods, settings and cosmetics menus are, relative to Minecraft's GUI scale"); config.property("Menu scale", menuScale, "How big the mods, settings and cosmetics menus are, relative to Minecraft's GUI scale");
config.property("HUD menu scale", hudMenuScale, "How big the emote wheel and shift menu are, relative to Minecraft's GUI scale"); config.property("HUD menu scale", hudMenuScale, "How big the emote wheel and shift menu are, relative to Minecraft's GUI scale");
@@ -156,10 +156,17 @@ public class ConfigManager {
* Load only a single property immediately after creation * Load only a single property immediately after creation
*/ */
private void loadSingleProperty(String name, Property prop) { private void loadSingleProperty(String name, Property prop) {
JsonNode element = getSaved(name);
if (element != null) {
prop.loadFromJson(element);
}
}
private JsonNode getSaved(String name) {
JsonNode source = cachedJson != null ? cachedJson : loadAndCache(); JsonNode source = cachedJson != null ? cachedJson : loadAndCache();
if (source == null || !source.isObject()) if (source == null || !source.isObject())
return; return null;
JsonNode currentScope = source; JsonNode currentScope = source;
@@ -170,16 +177,12 @@ public class ConfigManager {
if (next != null && next.isObject()) { if (next != null && next.isObject()) {
currentScope = next; currentScope = next;
} else { } else {
return; return null;
} }
} }
JsonNode element = currentScope.get(name); return currentScope.get(name);
if (element != null) {
prop.loadFromJson(element);
}
} }
/** /**
@@ -10,14 +10,14 @@ import org.saturnclient.config.property.SelectProperty;
public class Theme { public class Theme {
public static ConfigManager config; public static ConfigManager config;
// Main UI background (slightly warm dark to match Saturn tone) // Main UI background (slightly warm dark to match Saturn tone), translucent over the world
public static final ColorProperty BACKGROUND = Property.color(0xFF12100D); public static final ColorProperty BACKGROUND = Property.color(0xD112100D);
// Default text color // Default text color
public static final ColorProperty FOREGROUND = Property.color(0xFFF2E6D2); public static final ColorProperty FOREGROUND = Property.color(0xFFF2E6D2);
// Widget default background (normal state) // Widget default background (normal state), translucent over the world
public static final ColorProperty PRIMARY = Property.color(0xFF1C1915); public static final ColorProperty PRIMARY = Property.color(0xB81C1915);
// Widget text color // Widget text color
public static final ColorProperty PRIMARY_FG = Property.color(0xFFEAD9B8); public static final ColorProperty PRIMARY_FG = Property.color(0xFFEAD9B8);
@@ -62,10 +62,10 @@ public class Theme {
} }
public static final List<Preset> PRESETS = List.of( public static final List<Preset> PRESETS = List.of(
new Preset("Saturn", 0xFF12100D, 0xFFF2E6D2, 0xFF1C1915, 0xFFEAD9B8, 0xFFE2BF7D, 0xFF1A140A, 0xFFE2BF7D), new Preset("Saturn", 0xD112100D, 0xFFF2E6D2, 0xB81C1915, 0xFFEAD9B8, 0xFFE2BF7D, 0xFF1A140A, 0xFFE2BF7D),
new Preset("Midnight", 0xFF0E1117, 0xFFE4EAF5, 0xFF171C26, 0xFFC9D4E8, 0xFF8FB3FF, 0xFF0A1224, 0xFF8FB3FF), new Preset("Midnight", 0xD10E1117, 0xFFE4EAF5, 0xB8171C26, 0xFFC9D4E8, 0xFF8FB3FF, 0xFF0A1224, 0xFF8FB3FF),
new Preset("Amethyst", 0xFF120F17, 0xFFEDE4F7, 0xFF1C1724, 0xFFD8C9EB, 0xFFC79BFF, 0xFF1A0F2A, 0xFFC79BFF), new Preset("Amethyst", 0xD1120F17, 0xFFEDE4F7, 0xB81C1724, 0xFFD8C9EB, 0xFFC79BFF, 0xFF1A0F2A, 0xFFC79BFF),
new Preset("Emerald", 0xFF0D1210, 0xFFE2F2EA, 0xFF16201B, 0xFFC4E0D2, 0xFF7FD1A8, 0xFF0A1F15, 0xFF7FD1A8)); new Preset("Emerald", 0xD10D1210, 0xFFE2F2EA, 0xB816201B, 0xFFC4E0D2, 0xFF7FD1A8, 0xFF0A1F15, 0xFF7FD1A8));
public static void init(ConfigManager parent) { public static void init(ConfigManager parent) {
config = new ConfigManager(parent, "UI Style"); config = new ConfigManager(parent, "UI Style");
@@ -98,10 +98,19 @@ public class Theme {
} }
/** /**
* Translucent background for panels drawn over the world * Background for panels drawn over the world, as translucent as the
* background color is
*/ */
public static int getPanelBg() { public static int getPanelBg() {
return withAlpha(0.82f, BACKGROUND.value); return BACKGROUND.value;
}
/**
* Background for popups, which sit over other panels: the background color,
* kept nearly solid so what's under it doesn't show through
*/
public static int getPopupBg() {
return withAlpha(0.97f, BACKGROUND.value | 0xFF000000);
} }
/** /**
@@ -38,7 +38,14 @@ public class Cloaks {
availableCloaks.add(0, ""); availableCloaks.add(0, "");
} }
/**
* The cloak's texture, or null for no cloak ("", the "None" choice) and for a cloak this version
* has no texture for, which would otherwise draw as the missing texture.
*/
public static IdentifierRef getCurrentCloakTexture(String cloakName) { public static IdentifierRef getCurrentCloakTexture(String cloakName) {
if (cloakName == null || !Arrays.asList(ALL_CLOAKS).contains(cloakName)) {
return null;
}
if (Arrays.asList(ANIMATED_CLOAKS).contains(cloakName)) { if (Arrays.asList(ANIMATED_CLOAKS).contains(cloakName)) {
return IdentifierRef.ofSaturn("textures/cloaks/" + cloakName + ".gif"); return IdentifierRef.ofSaturn("textures/cloaks/" + cloakName + ".gif");
} else { } else {
@@ -17,7 +17,7 @@ import org.saturnclient.ui.Utils;
*/ */
public class Emotes { public class Emotes {
private static final List<String> IDS = List.of("tpose", "back_flip", "facepalm", "cry", "giga_chad", private static final List<String> IDS = List.of("tpose", "back_flip", "facepalm", "cry", "giga_chad",
"front_flip"); "twerk", "get_the_griddy", "take_the_l", "dab", "wave", "salute", "shrug", "67");
private static final EmoteRegistry REGISTRY = new EmoteRegistry(); private static final EmoteRegistry REGISTRY = new EmoteRegistry();
@@ -75,16 +75,16 @@ public class ArmorDisplayMod extends Mod implements HudMod {
int row = 0; int row = 0;
if (useMainHand.value && !mainHand.isEmpty()) { if (useMainHand.value && !mainHand.isEmptyStack()) {
row = renderSlot(scope, mainHand, row); row = renderSlot(scope, mainHand, row);
} }
if (!helmet.isEmpty()) if (!helmet.isEmptyStack())
row = renderSlot(scope, helmet, row); row = renderSlot(scope, helmet, row);
if (!chestplate.isEmpty()) if (!chestplate.isEmptyStack())
row = renderSlot(scope, chestplate, row); row = renderSlot(scope, chestplate, row);
if (!leggings.isEmpty()) if (!leggings.isEmptyStack())
row = renderSlot(scope, leggings, row); row = renderSlot(scope, leggings, row);
if (!boots.isEmpty()) if (!boots.isEmptyStack())
row = renderSlot(scope, boots, row); row = renderSlot(scope, boots, row);
} }
@@ -94,8 +94,8 @@ public class ArmorDisplayMod extends Mod implements HudMod {
private int renderSlot(RenderScope scope, ItemStackRef item, int row) { private int renderSlot(RenderScope scope, ItemStackRef item, int row) {
scope.drawItem(item, 0, 15 * row); scope.drawItem(item, 0, 15 * row);
if (item.getMaxDamage() > 0) { if (item.getMaxItemDamage() > 0) {
int remaining = item.getMaxDamage() - item.getDamage(); int remaining = item.getMaxItemDamage() - item.getItemDamage();
scope.drawText(0.5f, String.valueOf(remaining), scope.drawText(0.5f, String.valueOf(remaining),
17, (15 * row) + 3, 17, (15 * row) + 3,
layout.font.value, layout.fgColor.value); layout.font.value, layout.fgColor.value);
@@ -34,6 +34,14 @@ public interface RenderScope {
if (color == 0) if (color == 0)
return; return;
drawTexture(getRoundedRectangle(width, height, radius), x, y, 0, 0, width, height, color);
}
/**
* The white rounded rectangle that {@link #drawRoundedRectangle} tints, as a
* cached texture.
*/
default IdentifierRef getRoundedRectangle(int width, int height, int radius) {
radius = Math.min(radius, width / 2); radius = Math.min(radius, width / 2);
radius = Math.min(radius, height / 2); radius = Math.min(radius, height / 2);
@@ -42,7 +50,38 @@ public interface RenderScope {
width, height, width, height,
radius, radius); radius, radius);
drawSvgShape(rect, "rounded_" + width + "_" + height + "_" + radius, x, y, width, height, color); return getSvgShape(rect, "rounded_" + width + "_" + height + "_" + radius, width, height);
}
/**
* Frosts a rounded rectangle for a translucent background to be drawn over:
* the game behind the screen, blurred by {@code blur}, cut to exactly the
* shape {@link #drawRoundedRectangle} draws. Render scopes without glass
* draw nothing.
*/
default void drawGlass(int x, int y, int width, int height, int radius, int blur) {
drawGlass(getRoundedRectangle(width, height, radius), x, y, width, height, blur);
}
/**
* Draws the game behind the screen, blurred by {@code blur}, where
* {@code mask}, stretched over the area, is opaque.
*/
default void drawGlass(IdentifierRef mask, int x, int y, int width, int height, int blur) {
}
/**
* A {@link #drawRoundedRectangle} with a border, frosted with glass blurred
* by {@code blur} when the background isn't solid. A blur of 0 leaves it
* plain, showing the screen's own background blur.
*/
default void drawGlassRectangle(int x, int y, int width, int height, int radius, int blur, int thickness,
int background, int border) {
if (blur > 0 && background >>> 24 < 0xFF) {
drawGlass(x, y, width, height, radius, blur);
}
drawRoundedRectangle(x, y, width, height, radius, thickness, background, border);
} }
/** /**
@@ -89,15 +128,22 @@ public interface RenderScope {
* {@code color}. * {@code color}.
*/ */
private void drawSvgShape(String shape, String cacheKey, int x, int y, int width, int height, int color) { private void drawSvgShape(String shape, String cacheKey, int x, int y, int width, int height, int color) {
drawTexture(getSvgShape(shape, cacheKey, width, height), x, y, 0, 0, width, height, color);
}
/**
* {@code shape} (SVG elements in a {@code width} x {@code height} canvas,
* drawn in white) rendered to a cached texture.
*/
private IdentifierRef getSvgShape(String shape, String cacheKey, int width, int height) {
String svg = String.format( String svg = String.format(
"<svg xmlns='http://www.w3.org/2000/svg' width='%d' height='%d'>%s</svg>", "<svg xmlns='http://www.w3.org/2000/svg' width='%d' height='%d'>%s</svg>",
width, height, shape); width, height, shape);
InputStream svgStream = new ByteArrayInputStream(svg.getBytes(StandardCharsets.UTF_8)); InputStream svgStream = new ByteArrayInputStream(svg.getBytes(StandardCharsets.UTF_8));
drawTexture(SvgTexture.getSvg(svgStream, return SvgTexture.getSvg(svgStream, IdentifierRef.ofSaturn("textures/gui/tmp_rect/" + cacheKey),
IdentifierRef.ofSaturn("textures/gui/tmp_rect/" + cacheKey), width * 4, height * 4);
width * 4, height * 4), x, y, 0, 0, width, height, color);
} }
void drawBorder(int x, int y, int width, int height, int color); void drawBorder(int x, int y, int width, int height, int color);
@@ -3,6 +3,7 @@ package org.saturnclient.ui.components;
import org.saturnclient.client.ServiceClient; import org.saturnclient.client.ServiceClient;
import org.saturnclient.common.provider.Providers; import org.saturnclient.common.provider.Providers;
import org.saturnclient.common.ref.asset.IdentifierRef; import org.saturnclient.common.ref.asset.IdentifierRef;
import org.saturnclient.config.Config;
import org.saturnclient.config.Theme; import org.saturnclient.config.Theme;
import org.saturnclient.ui.Element; import org.saturnclient.ui.Element;
import org.saturnclient.ui.ElementContext; import org.saturnclient.ui.ElementContext;
@@ -36,8 +37,8 @@ public class AccountChip extends Element {
@Override @Override
public void render(RenderScope renderScope, ElementContext ctx) { public void render(RenderScope renderScope, ElementContext ctx) {
renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, 1, Theme.getPanelBg(), renderScope.drawGlassRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, Config.widgetBlur.value, 1,
Theme.getBorder()); Theme.getPanelBg(), Theme.getBorder());
// The face, then the hat layer over it, from the 64x64 skin // The face, then the hat layer over it, from the 64x64 skin
IdentifierRef skin = Providers.saturn.getPlayerSkin(); IdentifierRef skin = Providers.saturn.getPlayerSkin();
@@ -60,7 +60,7 @@ public class CosmeticTile extends Element {
int border = isEquipped ? Theme.ACCENT.value int border = isEquipped ? Theme.ACCENT.value
: Theme.withAlpha(hovered ? 0.22f : 0.06f, Theme.FOREGROUND.value); : Theme.withAlpha(hovered ? 0.22f : 0.06f, Theme.FOREGROUND.value);
renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, isEquipped ? 2 : 1, renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, isEquipped ? 2 : 1,
Theme.withAlpha(0.72f, Theme.PRIMARY.value), border); Theme.PRIMARY.value, border);
// Preview, fitted into its area // Preview, fitted into its area
int areaWidth = width - INSET * 2; int areaWidth = width - INSET * 2;
@@ -3,6 +3,7 @@ package org.saturnclient.ui.components;
import java.util.List; import java.util.List;
import org.saturnclient.common.ref.asset.IdentifierRef; import org.saturnclient.common.ref.asset.IdentifierRef;
import org.saturnclient.config.Config;
import org.saturnclient.config.Theme; import org.saturnclient.config.Theme;
import org.saturnclient.ui.Element; import org.saturnclient.ui.Element;
import org.saturnclient.ui.ElementContext; import org.saturnclient.ui.ElementContext;
@@ -32,7 +33,8 @@ public class Dock extends Element {
@Override @Override
public void render(RenderScope renderScope, ElementContext ctx) { public void render(RenderScope renderScope, ElementContext ctx) {
renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value + 4, 1, Theme.getPanelBg(), renderScope.drawGlassRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value + 4, Config.widgetBlur.value, 1,
Theme.getPanelBg(),
Theme.withAlpha(0.1f, Theme.FOREGROUND.value)); Theme.withAlpha(0.1f, Theme.FOREGROUND.value));
for (int i = 0; i < items.size(); i++) { for (int i = 0; i < items.size(); i++) {
@@ -41,7 +41,7 @@ public class EmoteTile extends Element {
boolean hovered = ctx.isHovering(); boolean hovered = ctx.isHovering();
renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, hovered ? 2 : 1, renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, hovered ? 2 : 1,
Theme.withAlpha(0.72f, Theme.PRIMARY.value), Theme.PRIMARY.value,
hovered ? Theme.ACCENT.value : Theme.withAlpha(0.06f, Theme.FOREGROUND.value)); hovered ? Theme.ACCENT.value : Theme.withAlpha(0.06f, Theme.FOREGROUND.value));
int imageSize = height - INSET * 2 - NAME_AREA; int imageSize = height - INSET * 2 - NAME_AREA;
@@ -46,7 +46,7 @@ public class SaturnModule extends Element {
// Card // Card
renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, 1, renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, 1,
Theme.withAlpha(0.72f, Theme.PRIMARY.value), border); Theme.PRIMARY.value, border);
if (enabled) { if (enabled) {
renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value,
@@ -22,9 +22,9 @@ public class Sidebar extends Element {
// Values for the constructor's `active` // Values for the constructor's `active`
public static final int MODS = 0; public static final int MODS = 0;
public static final int COSMETICS = 1; public static final int SETTINGS = 1;
public static final int HUD_EDITOR = 2; public static final int COSMETICS = 2;
public static final int SETTINGS = 3; public static final int HUD_EDITOR = 3;
private static final int LOGO = 32; private static final int LOGO = 32;
private static final int BUTTON = 44; private static final int BUTTON = 44;
@@ -35,11 +35,12 @@ public class Sidebar extends Element {
private record Item(IdentifierRef icon, Runnable onClick) { private record Item(IdentifierRef icon, Runnable onClick) {
} }
// In the order of the constants above
private final Item[] items = { private final Item[] items = {
new Item(Textures.ICON_MODS, () -> Providers.saturn.getClient().setScreen(new ModMenu())), new Item(Textures.ICON_MODS, () -> Providers.saturn.getClient().setScreen(new ModMenu())),
new Item(Textures.ICON_SETTINGS, () -> Providers.saturn.getClient().setScreen(new ClientSettings())),
new Item(Textures.ICON_COSMETICS, () -> Providers.saturn.getClient().setScreen(new CosmeticsMenu())), new Item(Textures.ICON_COSMETICS, () -> Providers.saturn.getClient().setScreen(new CosmeticsMenu())),
new Item(Textures.ICON_HUD_EDITOR, () -> Providers.saturn.getClient().setScreen(new HudEditor())), new Item(Textures.ICON_HUD_EDITOR, () -> Providers.saturn.getClient().setScreen(new HudEditor())),
new Item(Textures.ICON_SETTINGS, () -> Providers.saturn.getClient().setScreen(new ClientSettings())),
}; };
private final int active; private final int active;
@@ -38,7 +38,7 @@ public class ThemePresetCard extends Element {
: Theme.withAlpha(ctx.isHovering() ? 0.22f : 0.06f, Theme.FOREGROUND.value); : Theme.withAlpha(ctx.isHovering() ? 0.22f : 0.06f, Theme.FOREGROUND.value);
renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, active ? 2 : 1, renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, active ? 2 : 1,
Theme.withAlpha(0.72f, Theme.PRIMARY.value), border); Theme.PRIMARY.value, border);
// A panel in the preset's colors: a line of text over an accent and a widget // A panel in the preset's colors: a line of text over an accent and a widget
int previewWidth = width - PADDING * 2; int previewWidth = width - PADDING * 2;
@@ -1,7 +1,10 @@
package org.saturnclient.ui.components.inputs; package org.saturnclient.ui.components.inputs;
import java.awt.Color; import java.awt.Color;
import java.awt.image.BufferedImage;
import org.saturnclient.common.provider.Providers;
import org.saturnclient.common.ref.asset.IdentifierRef;
import org.saturnclient.config.Theme; import org.saturnclient.config.Theme;
import org.saturnclient.config.property.ColorProperty; import org.saturnclient.config.property.ColorProperty;
import org.saturnclient.ui.Element; import org.saturnclient.ui.Element;
@@ -27,6 +30,18 @@ public class ColorPicker extends Element {
private static final int SQUARE_Y = OPACITY_Y + SLIDER_HEIGHT + GAP; private static final int SQUARE_Y = OPACITY_Y + SLIDER_HEIGHT + GAP;
private static final int HUE_Y = SQUARE_Y + SIZE + GAP; private static final int HUE_Y = SQUARE_Y + SIZE + GAP;
// Gradient strips, made once and stretched over each part, so a frame is a
// few draws instead of one per pixel. Tinting the white ones colors them.
private static final int STRIP = 256;
/** White fading out to the right: saturation, over the hue */
private static final IdentifierRef SATURATION = IdentifierRef.ofSaturn("textures/gui/color_picker/saturation");
/** Black fading in downwards: brightness, over the saturation */
private static final IdentifierRef BRIGHTNESS = IdentifierRef.ofSaturn("textures/gui/color_picker/brightness");
/** White fading in to the right, tinted with the color */
private static final IdentifierRef OPACITY = IdentifierRef.ofSaturn("textures/gui/color_picker/opacity");
private static final IdentifierRef HUE = IdentifierRef.ofSaturn("textures/gui/color_picker/hue");
private static boolean stripsRegistered = false;
private final ColorProperty prop; private final ColorProperty prop;
private float hue; private float hue;
@@ -46,8 +61,10 @@ public class ColorPicker extends Element {
@Override @Override
public void render(RenderScope renderScope, ElementContext ctx) { public void render(RenderScope renderScope, ElementContext ctx) {
registerStrips();
renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, 1, renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, 1,
Theme.withAlpha(0.97f, Theme.BACKGROUND.value), Theme.withAlpha(0.14f, Theme.FOREGROUND.value)); Theme.getPopupBg(), Theme.withAlpha(0.14f, Theme.FOREGROUND.value));
renderOpacity(renderScope); renderOpacity(renderScope);
renderSquare(renderScope); renderSquare(renderScope);
@@ -55,22 +72,16 @@ public class ColorPicker extends Element {
} }
private void renderOpacity(RenderScope renderScope) { private void renderOpacity(RenderScope renderScope) {
int rgb = prop.value & 0xFFFFFF; renderScope.drawTexture(OPACITY, PADDING, OPACITY_Y, 0, 0, SIZE, SLIDER_HEIGHT,
for (int x = 0; x < SIZE; x++) { 0xFF000000 | prop.value);
int alpha = (int) (x / (float) SIZE * 255) & 0xFF;
renderScope.fill(PADDING + x, OPACITY_Y, PADDING + x + 1, OPACITY_Y + SLIDER_HEIGHT, (alpha << 24) | rgb);
}
drawMarker(renderScope, PADDING + (int) (opacity * SIZE), OPACITY_Y); drawMarker(renderScope, PADDING + (int) (opacity * SIZE), OPACITY_Y);
} }
private void renderSquare(RenderScope renderScope) { private void renderSquare(RenderScope renderScope) {
for (int x = 0; x < SIZE; x++) { renderScope.fill(PADDING, SQUARE_Y, PADDING + SIZE, SQUARE_Y + SIZE, 0xFF000000 | Color.HSBtoRGB(hue, 1f, 1f));
for (int y = 0; y < SIZE; y++) { renderScope.drawTexture(SATURATION, PADDING, SQUARE_Y, 0, 0, SIZE, SIZE, 0xFFFFFFFF);
int color = Color.HSBtoRGB(hue, x / (float) SIZE, 1f - y / (float) SIZE); renderScope.drawTexture(BRIGHTNESS, PADDING, SQUARE_Y, 0, 0, SIZE, SIZE, 0xFFFFFFFF);
renderScope.fill(PADDING + x, SQUARE_Y + y, PADDING + x + 1, SQUARE_Y + y + 1, 0xFF000000 | color);
}
}
int selX = PADDING + (int) (saturation * SIZE) - 4; int selX = PADDING + (int) (saturation * SIZE) - 4;
int selY = SQUARE_Y + (int) ((1f - brightness) * SIZE) - 4; int selY = SQUARE_Y + (int) ((1f - brightness) * SIZE) - 4;
@@ -79,14 +90,36 @@ public class ColorPicker extends Element {
} }
private void renderHue(RenderScope renderScope) { private void renderHue(RenderScope renderScope) {
for (int x = 0; x < SIZE; x++) { renderScope.drawTexture(HUE, PADDING, HUE_Y, 0, 0, SIZE, SLIDER_HEIGHT, 0xFFFFFFFF);
int color = Color.HSBtoRGB(x / (float) SIZE, 1f, 1f);
renderScope.fill(PADDING + x, HUE_Y, PADDING + x + 1, HUE_Y + SLIDER_HEIGHT, 0xFF000000 | color);
}
drawMarker(renderScope, PADDING + (int) (hue * SIZE), HUE_Y); drawMarker(renderScope, PADDING + (int) (hue * SIZE), HUE_Y);
} }
private static void registerStrips() {
if (stripsRegistered) {
return;
}
BufferedImage saturation = new BufferedImage(STRIP, 1, BufferedImage.TYPE_INT_ARGB);
BufferedImage brightness = new BufferedImage(1, STRIP, BufferedImage.TYPE_INT_ARGB);
BufferedImage opacity = new BufferedImage(STRIP, 1, BufferedImage.TYPE_INT_ARGB);
BufferedImage hue = new BufferedImage(STRIP, 1, BufferedImage.TYPE_INT_ARGB);
for (int i = 0; i < STRIP; i++) {
int alpha = i * 255 / (STRIP - 1);
saturation.setRGB(i, 0, ((255 - alpha) << 24) | 0xFFFFFF);
brightness.setRGB(0, i, alpha << 24);
opacity.setRGB(i, 0, (alpha << 24) | 0xFFFFFF);
hue.setRGB(i, 0, 0xFF000000 | Color.HSBtoRGB(i / (float) STRIP, 1f, 1f));
}
Providers.saturn.registerBufferedImageTexture(SATURATION, saturation);
Providers.saturn.registerBufferedImageTexture(BRIGHTNESS, brightness);
Providers.saturn.registerBufferedImageTexture(OPACITY, opacity);
Providers.saturn.registerBufferedImageTexture(HUE, hue);
stripsRegistered = true;
}
private static void drawMarker(RenderScope renderScope, int x, int sliderY) { private static void drawMarker(RenderScope renderScope, int x, int sliderY) {
renderScope.fill(x - 2, sliderY - 2, x + 2, sliderY + SLIDER_HEIGHT + 2, 0xFFFFFFFF); renderScope.fill(x - 2, sliderY - 2, x + 2, sliderY + SLIDER_HEIGHT + 2, 0xFFFFFFFF);
renderScope.fill(x - 1, sliderY - 1, x + 1, sliderY + SLIDER_HEIGHT + 1, 0xFF000000); renderScope.fill(x - 1, sliderY - 1, x + 1, sliderY + SLIDER_HEIGHT + 1, 0xFF000000);
@@ -38,7 +38,7 @@ public class CurvePreview extends Element {
@Override @Override
public void render(RenderScope renderScope, ElementContext ctx) { public void render(RenderScope renderScope, ElementContext ctx) {
renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, 1, renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, 1,
Theme.withAlpha(0.97f, Theme.BACKGROUND.value), Theme.withAlpha(0.14f, Theme.FOREGROUND.value)); Theme.getPopupBg(), Theme.withAlpha(0.14f, Theme.FOREGROUND.value));
renderScope.drawText(TITLE_SCALE, "PREVIEW", PADDING, PADDING - 2, Theme.FONT.value, Theme.getMutedFg()); renderScope.drawText(TITLE_SCALE, "PREVIEW", PADDING, PADDING - 2, Theme.FONT.value, Theme.getMutedFg());
@@ -45,7 +45,7 @@ public class OptionList extends Element {
@Override @Override
public void render(RenderScope renderScope, ElementContext ctx) { public void render(RenderScope renderScope, ElementContext ctx) {
renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, 1, renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, 1,
Theme.withAlpha(0.97f, Theme.BACKGROUND.value), Theme.withAlpha(0.14f, Theme.FOREGROUND.value)); Theme.getPopupBg(), Theme.withAlpha(0.14f, Theme.FOREGROUND.value));
int visible = Math.min(options.length, MAX_VISIBLE); int visible = Math.min(options.length, MAX_VISIBLE);
hovered = getIndexAt(ctx.mouseX, ctx.mouseY); hovered = getIndexAt(ctx.mouseX, ctx.mouseY);
@@ -1,5 +1,6 @@
package org.saturnclient.ui.elements; package org.saturnclient.ui.elements;
import org.saturnclient.config.Config;
import org.saturnclient.config.Theme; import org.saturnclient.config.Theme;
import org.saturnclient.ui.Element; import org.saturnclient.ui.Element;
import org.saturnclient.ui.ElementContext; import org.saturnclient.ui.ElementContext;
@@ -38,8 +39,8 @@ public class Button extends Element {
* The button's surface, shared with {@link IconButton}. * The button's surface, shared with {@link IconButton}.
*/ */
static void drawSurface(RenderScope renderScope, int width, int height, boolean hovered) { static void drawSurface(RenderScope renderScope, int width, int height, boolean hovered) {
renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, 1, renderScope.drawGlassRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, Config.widgetBlur.value, 1,
hovered ? Theme.withAlpha(0.9f, Theme.PRIMARY.value) : Theme.getPanelBg(), hovered ? Theme.PRIMARY.value : Theme.getPanelBg(),
Theme.withAlpha(hovered ? 0.25f : 0.1f, Theme.FOREGROUND.value)); Theme.withAlpha(hovered ? 0.25f : 0.1f, Theme.FOREGROUND.value));
} }
@@ -20,9 +20,9 @@ public class ImageTexture extends Element {
if (sprite.toString().endsWith(".svg")) { if (sprite.toString().endsWith(".svg")) {
MinecraftClientRef client = Providers.saturn.getClient(); MinecraftClientRef client = Providers.saturn.getClient();
int renderWidth = (int) (width * client.getWindow().getFramebufferWidth() / client.getWindow().getWidth()); int renderWidth = (int) (width * client.getWindow().getFramebufferWidth() / client.getWindow().getWindowWidth());
int renderHeight = (int) (height * client.getWindow().getFramebufferHeight() int renderHeight = (int) (height * client.getWindow().getFramebufferHeight()
/ client.getWindow().getHeight()); / client.getWindow().getWindowHeight());
IdentifierRef pngId = SvgTexture.getSvg(sprite, renderWidth * 2, renderHeight * 2); IdentifierRef pngId = SvgTexture.getSvg(sprite, renderWidth * 2, renderHeight * 2);
@@ -1,12 +1,14 @@
package org.saturnclient.ui.elements; package org.saturnclient.ui.elements;
import org.saturnclient.config.Config;
import org.saturnclient.config.Theme; import org.saturnclient.config.Theme;
import org.saturnclient.ui.Element; import org.saturnclient.ui.Element;
import org.saturnclient.ui.ElementContext; import org.saturnclient.ui.ElementContext;
import org.saturnclient.ui.RenderScope; import org.saturnclient.ui.RenderScope;
/** /**
* The translucent, outlined surface that screens lay their content on. * The translucent, outlined surface that screens lay their content on,
* frosted over the game where glass is supported.
*/ */
public class Panel extends Element { public class Panel extends Element {
@@ -16,7 +18,7 @@ public class Panel extends Element {
} }
public static void drawBackground(RenderScope renderScope, int width, int height) { public static void drawBackground(RenderScope renderScope, int width, int height) {
renderScope.drawRoundedRectangle(0, 0, width, height, Theme.BG_RADIUS.value, 1, renderScope.drawGlassRectangle(0, 0, width, height, Theme.BG_RADIUS.value, Config.menuBlur.value, 1,
Theme.getPanelBg(), Theme.getBorder()); Theme.getPanelBg(), Theme.getBorder());
} }
} }
@@ -131,8 +131,8 @@ public class EmoteWheel extends SaturnScreen {
@Override @Override
public void render(RenderScope renderScope, ElementContext ctx) { public void render(RenderScope renderScope, ElementContext ctx) {
renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, 1, renderScope.drawGlassRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, Config.widgetBlur.value,
Theme.getPanelBg(), Theme.getBorder()); 1, Theme.getPanelBg(), Theme.getBorder());
float titleScale = 0.54f; float titleScale = 0.54f;
drawCentered(renderScope, "EMOTES", titleScale, pages > 1 ? 24 : (height - 10) / 2, Theme.getMutedFg()); drawCentered(renderScope, "EMOTES", titleScale, pages > 1 ? 24 : (height - 10) / 2, Theme.getMutedFg());
@@ -26,8 +26,8 @@ import org.saturnclient.ui.resources.Textures;
/** /**
* Saturn's title screen: the logo over the game's menus in the middle, the * Saturn's title screen: the logo over the game's menus in the middle, the
* player and a quit button in the top corners, and along the bottom a dock of * player and a quit button in the top corners, and along the bottom a dock
* Saturn's screens, the shift menu and Minecraft's options, and the version. * (Saturn's settings, its mods and cosmetics, then Minecraft's options) and the version.
*/ */
public class TitleMenu extends SaturnScreen { public class TitleMenu extends SaturnScreen {
// The logo and wordmark as the shift menu has them: the wordmark over the logo's foot // The logo and wordmark as the shift menu has them: the wordmark over the logo's foot
@@ -106,12 +106,12 @@ public class TitleMenu extends SaturnScreen {
.position(width - TOP_EDGE - QUIT_SIZE, TOP_EDGE) .position(width - TOP_EDGE - QUIT_SIZE, TOP_EDGE)
.animation(step(new SlideFade(AnimationConfig.mainMenu, 8), STEP_QUIT))); .animation(step(new SlideFade(AnimationConfig.mainMenu, 8), STEP_QUIT)));
// Along the bottom: the dock of Saturn's screens, the shift menu and Minecraft's options, and the version // Along the bottom: the dock, Saturn first (its settings) and Minecraft's options last, and the version
Dock dock = new Dock(List.of( Dock dock = new Dock(List.of(
new Dock.Item(Textures.LOGO, () -> Providers.saturn.getClient().setScreen(new ClientSettings())),
new Dock.Item(Textures.ICON_MODS, () -> Providers.saturn.getClient().setScreen(new ModMenu())), new Dock.Item(Textures.ICON_MODS, () -> Providers.saturn.getClient().setScreen(new ModMenu())),
new Dock.Item(Textures.ICON_COSMETICS, new Dock.Item(Textures.ICON_COSMETICS,
() -> Providers.saturn.getClient().setScreen(new CosmeticsMenu())), () -> Providers.saturn.getClient().setScreen(new CosmeticsMenu())),
new Dock.Item(Textures.LOGO, () -> Providers.saturn.getClient().setScreen(new ShiftMenu())),
new Dock.Item(Textures.ICON_SETTINGS, new Dock.Item(Textures.ICON_SETTINGS,
() -> Providers.saturn.getClient().setScreen(MinecraftScreen.Options)))); () -> Providers.saturn.getClient().setScreen(MinecraftScreen.Options))));
draw(dock.position((width - dock.width) / 2, height - EDGE - Dock.HEIGHT) draw(dock.position((width - dock.width) / 2, height - EDGE - Dock.HEIGHT)
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,193 @@
{
"version": 3,
"name": "\u0414\u044d\u0431",
"description": "\u0414\u044d\u0431\u043d\u0438 \u0441\u043e \u0432\u0441\u0435\u043c \u0432\u043a\u0443\u0441\u043e\u043c",
"author": "SPEmotes",
"emote": {
"beginTick": 0,
"endTick": 30,
"stopTick": 31,
"isLoop": false,
"returnTick": 1,
"easeBeforeKeyframe": false,
"degrees": false,
"moves": [
{
"tick": 4,
"easing": "EASEINOUTQUAD",
"rightLeg": {
"x": -1.873698,
"y": 11.100854,
"z": 0.104908,
"pitch": -0.01179,
"yaw": 0.000183,
"roll": 0.037555
}
},
{
"tick": 7,
"easing": "EASEINOUTQUAD",
"rightArm": {
"x": -5.06384,
"y": 3.129459,
"z": -0.028821,
"pitch": 1.006445,
"yaw": 0.326442,
"roll": 1.238234
},
"leftArm": {
"x": 5.0,
"y": 2.0,
"z": 0.0,
"pitch": -1.859405,
"yaw": 0.56235,
"roll": -1.6982
}
},
{
"tick": 8,
"easing": "EASEINOUTQUAD",
"head": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.14541,
"yaw": 0.336522,
"roll": -0.066829
},
"body": {
"x": 0.0,
"y": 0.010776,
"z": 0.0,
"pitch": -0.007742,
"yaw": -0.304674,
"roll": -0.059173
},
"rightArm": {
"bend": -1.042365
},
"leftArm": {
"bend": -1.205889
},
"rightLeg": {
"x": -1.9,
"y": 12.0,
"z": 0.1,
"pitch": -0.023581,
"yaw": 0.001468,
"roll": 0.075111
},
"leftLeg": {
"x": 1.9,
"y": 12.0,
"z": -0.1,
"pitch": 0.025482,
"yaw": -0.467862,
"roll": 0.006087
}
},
{
"tick": 12,
"easing": "EASEINOUTQUAD",
"leftLeg": {
"x": 1.933101,
"y": 11.441392,
"z": -0.084124,
"pitch": 0.021479,
"yaw": -0.538523,
"roll": -0.038416
}
},
{
"tick": 16,
"easing": "EASEINOUTQUAD",
"body": {
"x": 0.0,
"y": 0.010776,
"z": 0.0,
"pitch": -0.043213,
"yaw": 0.303575,
"roll": -0.059152
},
"rightArm": {
"bend": -1.396377
},
"leftArm": {
"bend": 0.0
},
"rightLeg": {
"x": -1.9,
"y": 12.0,
"z": 0.1,
"pitch": -0.018974,
"yaw": 0.303724,
"roll": 0.068059
},
"leftLeg": {
"x": 1.9,
"y": 12.0,
"z": -0.1,
"pitch": 0.017477,
"yaw": -0.548618,
"roll": -0.082919
}
},
{
"tick": 18,
"easing": "EASEINOUTQUAD",
"head": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.291391,
"yaw": 0.542094,
"roll": -0.159259
},
"rightArm": {
"x": -5.06384,
"y": 3.129459,
"z": -0.028821,
"pitch": -1.265057,
"yaw": 0.037433,
"roll": 1.364253
},
"leftArm": {
"x": 5.0,
"y": 2.0,
"z": 0.0,
"pitch": -0.438223,
"yaw": -0.045192,
"roll": -1.798213
}
},
{
"tick": 21,
"easing": "EASEINOUTQUAD",
"head": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.291391,
"yaw": 0.542094,
"roll": -0.159259
},
"rightArm": {
"x": -5.06384,
"y": 3.129459,
"z": -0.028821,
"pitch": -1.265057,
"yaw": 0.037433,
"roll": 1.364253
},
"leftArm": {
"x": 5.0,
"y": 2.0,
"z": 0.0,
"pitch": -0.438223,
"yaw": -0.045192,
"roll": -1.798213
}
}
]
}
}
@@ -1,697 +0,0 @@
{
"version": 1,
"valid": true,
"name": "front_flip",
"description": "Parkour!!!!1",
"author": "DKinchik",
"emote": {
"beginTick": 0,
"endTick": 17,
"stopTick": 18,
"isLoop": false,
"returnTick": 1,
"nsfw": false,
"degrees": false,
"moves": [
{
"tick": 2,
"easing": "INOUTQUAD",
"head": {
"x": -0.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"head": {
"x": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"head": {
"y": -0.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"head": {
"y": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"head": {
"z": -0.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"head": {
"z": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"head": {
"pitch": -0.0
}
},
{
"tick": 5,
"easing": "INOUTQUAD",
"head": {
"pitch": 0.7020477
}
},
{
"tick": 10,
"easing": "INOUTQUAD",
"head": {
"pitch": 0.7020477
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"head": {
"pitch": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"head": {
"yaw": -0.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"head": {
"yaw": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"head": {
"roll": 0.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"head": {
"roll": 0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"rightLeg": {
"x": -1.9
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"rightLeg": {
"x": -1.9
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"rightLeg": {
"y": 11.169379
}
},
{
"tick": 3,
"easing": "INOUTQUAD",
"rightLeg": {
"y": 12.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"rightLeg": {
"y": 12.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"rightLeg": {
"z": -0.39214998
}
},
{
"tick": 3,
"easing": "INOUTQUAD",
"rightLeg": {
"z": 0.1
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"rightLeg": {
"z": 0.1
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"rightLeg": {
"pitch": -0.0
}
},
{
"tick": 3,
"easing": "INOUTQUAD",
"rightLeg": {
"pitch": -0.0
}
},
{
"tick": 5,
"easing": "INOUTQUAD",
"rightLeg": {
"pitch": -1.9707682
}
},
{
"tick": 10,
"easing": "INOUTQUAD",
"rightLeg": {
"pitch": -1.9707682
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"rightLeg": {
"pitch": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"rightLeg": {
"yaw": -0.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"rightLeg": {
"yaw": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"rightLeg": {
"roll": -0.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"rightLeg": {
"roll": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"rightLeg": {
"bend": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"rightArm": {
"x": -5.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"rightArm": {
"x": -5.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"rightArm": {
"y": 2.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"rightArm": {
"y": 2.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"rightArm": {
"z": -0.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"rightArm": {
"z": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"rightArm": {
"pitch": -0.0
}
},
{
"tick": 5,
"easing": "INOUTQUAD",
"rightArm": {
"pitch": -1.3665518
}
},
{
"tick": 10,
"easing": "INOUTQUAD",
"rightArm": {
"pitch": -1.3665518
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"rightArm": {
"pitch": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"rightArm": {
"yaw": -0.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"rightArm": {
"yaw": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"rightArm": {
"roll": -0.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"rightArm": {
"roll": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"rightArm": {
"bend": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"leftArm": {
"x": 5.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"leftArm": {
"x": 5.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"leftArm": {
"y": 2.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"leftArm": {
"y": 2.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"leftArm": {
"z": -0.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"leftArm": {
"z": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"leftArm": {
"pitch": 0.0
}
},
{
"tick": 5,
"easing": "INOUTQUAD",
"leftArm": {
"pitch": -1.0793308
}
},
{
"tick": 10,
"easing": "INOUTQUAD",
"leftArm": {
"pitch": -1.0793308
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"leftArm": {
"pitch": 0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"leftArm": {
"yaw": -0.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"leftArm": {
"yaw": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"leftArm": {
"roll": 0.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"leftArm": {
"roll": 0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"leftArm": {
"bend": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"leftLeg": {
"x": 1.9
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"leftLeg": {
"x": 1.9
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"leftLeg": {
"y": 10.861001
}
},
{
"tick": 3,
"easing": "INOUTQUAD",
"leftLeg": {
"y": 12.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"leftLeg": {
"y": 12.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"leftLeg": {
"z": -0.5082285
}
},
{
"tick": 3,
"easing": "INOUTQUAD",
"leftLeg": {
"z": -0.1
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"leftLeg": {
"z": -0.1
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"leftLeg": {
"pitch": -0.0
}
},
{
"tick": 3,
"easing": "INOUTQUAD",
"leftLeg": {
"pitch": -0.0
}
},
{
"tick": 5,
"easing": "INOUTQUAD",
"leftLeg": {
"pitch": -1.9850811
}
},
{
"tick": 10,
"easing": "INOUTQUAD",
"leftLeg": {
"pitch": -1.9850811
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"leftLeg": {
"pitch": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"leftLeg": {
"yaw": -0.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"leftLeg": {
"yaw": -0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"leftLeg": {
"roll": -0.0
}
},
{
"tick": 15,
"easing": "INOUTQUAD",
"leftLeg": {
"roll": 0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"leftLeg": {
"bend": -0.0
}
},
{
"tick": 2,
"easing": "INQUAD",
"body": {
"x": 0.0
}
},
{
"tick": 16,
"easing": "INQUAD",
"body": {
"x": 0.0
}
},
{
"tick": 2,
"easing": "INQUAD",
"body": {
"y": -0.061333913
}
},
{
"tick": 7,
"easing": "OUTQUAD",
"body": {
"y": 0.48852682
}
},
{
"tick": 15,
"easing": "CONSTANT",
"body": {
"y": 0.0
}
},
{
"tick": 16,
"easing": "INQUAD",
"body": {
"y": 0.0
}
},
{
"tick": 2,
"easing": "INQUAD",
"body": {
"z": -0.0
}
},
{
"tick": 16,
"easing": "INQUAD",
"body": {
"z": -0.0
}
},
{
"tick": 2,
"easing": "INQUAD",
"body": {
"pitch": 0.0
}
},
{
"tick": 7,
"easing": "OUTQUAD",
"body": {
"pitch": -2.8362873
}
},
{
"tick": 15,
"easing": "CONSTANT",
"body": {
"pitch": -6.2831855
}
},
{
"tick": 16,
"easing": "INQUAD",
"body": {
"pitch": 0.0
}
},
{
"tick": 2,
"easing": "INQUAD",
"body": {
"yaw": 0.0
}
},
{
"tick": 16,
"easing": "INQUAD",
"body": {
"yaw": 0.0
}
},
{
"tick": 2,
"easing": "INQUAD",
"body": {
"roll": -0.0
}
},
{
"tick": 16,
"easing": "INQUAD",
"body": {
"roll": 0.0
}
},
{
"tick": 2,
"easing": "INOUTQUAD",
"body": {
"bend": -0.0
}
}
]
}
}
@@ -0,0 +1,825 @@
{
"version": 3,
"name": "Get the Griddy",
"description": "fortnite battlepass",
"author": "SeroRonin",
"emote": {
"beginTick": 0,
"endTick": 91,
"stopTick": 91,
"isLoop": true,
"returnTick": 2,
"easeBeforeKeyframe": false,
"degrees": false,
"moves": [
{
"tick": 1,
"easing": "LINEAR",
"head": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.261799,
"yaw": 0.0,
"roll": 0.0
},
"rightArm": {
"pitch": -0.872665,
"yaw": -0.436332,
"roll": 0.349066
},
"leftLeg": {
"x": 1.9,
"y": 12.0,
"z": -0.1,
"pitch": -0.523599,
"yaw": 0.0,
"roll": 0.0,
"bend": 0.436332
},
"rightLeg": {
"x": -1.9,
"y": 12.0,
"z": 0.1,
"pitch": -0.174533,
"yaw": 0.0,
"roll": 0.0,
"bend": 0.523599
},
"leftArm": {
"x": 5.0,
"y": 2.0,
"z": 0.0,
"pitch": -0.872674,
"yaw": 0.436332,
"roll": -0.349066
},
"body": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.077608,
"yaw": 0.0,
"roll": 0.0
},
"torso": {
"bend": 0.395397
}
},
{
"tick": 4,
"easing": "LINEAR",
"leftLeg": {
"pitch": -0.610865
}
},
{
"tick": 5,
"easing": "LINEAR",
"body": {
"x": 0.0,
"y": 0.0375,
"z": 0.0,
"pitch": 0.033951,
"yaw": 0.0,
"roll": 0.0
},
"torso": {
"bend": 0.377793
}
},
{
"tick": 6,
"easing": "LINEAR",
"head": {
"pitch": 0.191986
},
"leftLeg": {
"bend": 0.959931
},
"rightLeg": {
"bend": 0.523599
}
},
{
"tick": 9,
"easing": "LINEAR",
"head": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.261799,
"yaw": 0.0,
"roll": 0.0
},
"rightArm": {
"pitch": 0.523599,
"yaw": -0.436332,
"roll": 0.226893
},
"leftLeg": {
"pitch": -0.178507,
"bend": 0.523599
},
"rightLeg": {
"pitch": -0.523599,
"bend": 0.436332
},
"leftArm": {
"x": 5.0,
"y": 2.0,
"z": 0.0,
"pitch": 0.52359,
"yaw": 0.436332,
"roll": -0.226893
},
"body": {
"y": 0.0,
"pitch": 0.077608
},
"torso": {
"bend": 0.395397
}
},
{
"tick": 12,
"easing": "LINEAR",
"rightLeg": {
"x": -1.9,
"y": 12.0,
"z": 0.1,
"pitch": -0.610865,
"yaw": 0.0,
"roll": 0.0
},
"body": {
"y": 0.0375,
"pitch": 0.033951
},
"torso": {
"bend": 0.377793
}
},
{
"tick": 13,
"easing": "LINEAR",
"head": {
"pitch": 0.191986
},
"leftLeg": {
"bend": 0.523599
},
"rightLeg": {
"bend": 0.959931
}
},
{
"tick": 16,
"easing": "LINEAR",
"head": {
"pitch": 0.261799,
"yaw": 0.0,
"roll": 0.0
},
"rightArm": {
"pitch": -0.872665,
"roll": 0.349066
},
"leftLeg": {
"x": 1.9,
"y": 12.0,
"z": -0.1,
"pitch": -0.523599,
"yaw": 0.0,
"roll": 0.0,
"bend": 0.436332
},
"rightLeg": {
"pitch": -0.174533,
"bend": 0.523599
},
"leftArm": {
"pitch": -0.872674,
"roll": -0.349066
},
"body": {
"y": 0.0,
"pitch": 0.077608
},
"torso": {
"bend": 0.395397
}
},
{
"tick": 19,
"easing": "LINEAR",
"leftLeg": {
"pitch": -0.610865
}
},
{
"tick": 20,
"easing": "LINEAR",
"body": {
"y": 0.0375,
"pitch": 0.033951
},
"torso": {
"bend": 0.377793
}
},
{
"tick": 21,
"easing": "LINEAR",
"leftLeg": {
"bend": 0.959931
},
"rightLeg": {
"bend": 0.523599
}
},
{
"tick": 24,
"easing": "LINEAR",
"head": {
"pitch": -0.416877,
"yaw": -0.519655,
"roll": 0.21801
},
"rightArm": {
"pitch": 0.523599,
"roll": 0.226893
},
"leftLeg": {
"pitch": -0.178507,
"bend": 0.523599
},
"rightLeg": {
"pitch": -0.523599,
"bend": 0.436332
},
"leftArm": {
"pitch": 0.52359,
"roll": -0.226893
},
"body": {
"y": 0.0,
"pitch": 0.077608
},
"torso": {
"bend": 0.395397
}
},
{
"tick": 27,
"easing": "LINEAR",
"rightLeg": {
"pitch": -0.610865
},
"body": {
"y": 0.0375,
"pitch": 0.033951
},
"torso": {
"bend": 0.377793
}
},
{
"tick": 28,
"easing": "LINEAR",
"head": {
"pitch": -0.457451,
"roll": 0.21801
},
"leftLeg": {
"bend": 0.523599
},
"rightLeg": {
"bend": 0.959931
}
},
{
"tick": 31,
"easing": "LINEAR",
"head": {
"pitch": -0.416877,
"roll": 0.21801
},
"rightArm": {
"pitch": -0.872665,
"roll": 0.349066
},
"leftLeg": {
"pitch": -0.523599,
"bend": 0.436332
},
"rightLeg": {
"pitch": -0.174533,
"bend": 0.523599
},
"leftArm": {
"pitch": -0.872674,
"roll": -0.349066
},
"body": {
"y": 0.0,
"pitch": 0.077608
},
"torso": {
"bend": 0.395397
}
},
{
"tick": 34,
"easing": "LINEAR",
"leftLeg": {
"pitch": -0.610865
}
},
{
"tick": 35,
"easing": "LINEAR",
"body": {
"y": 0.0375,
"pitch": 0.033951
},
"torso": {
"bend": 0.377793
}
},
{
"tick": 36,
"easing": "LINEAR",
"head": {
"pitch": -0.457451,
"roll": 0.21801
},
"leftLeg": {
"bend": 0.959931
},
"rightLeg": {
"bend": 0.523599
}
},
{
"tick": 39,
"easing": "LINEAR",
"head": {
"pitch": -0.416877,
"roll": 0.21801
},
"rightArm": {
"pitch": 0.523599,
"roll": 0.226893
},
"leftLeg": {
"pitch": -0.178507,
"bend": 0.523599
},
"rightLeg": {
"pitch": -0.523599,
"bend": 0.436332
},
"leftArm": {
"pitch": 0.52359,
"roll": -0.226893
},
"body": {
"y": 0.0,
"pitch": 0.077608
},
"torso": {
"bend": 0.395397
}
},
{
"tick": 42,
"easing": "LINEAR",
"rightLeg": {
"pitch": -0.610865
},
"body": {
"y": 0.0375,
"pitch": 0.033951
},
"torso": {
"bend": 0.377793
}
},
{
"tick": 43,
"easing": "LINEAR",
"head": {
"pitch": -0.457451,
"roll": 0.21801
},
"leftLeg": {
"bend": 0.523599
},
"rightLeg": {
"bend": 0.959931
}
},
{
"tick": 46,
"easing": "LINEAR",
"head": {
"pitch": -0.416877,
"yaw": -0.519655,
"roll": 0.21801
},
"rightArm": {
"pitch": -0.872665,
"roll": 0.349066,
"bend": 0.0
},
"leftLeg": {
"pitch": -0.523599,
"bend": 0.436332
},
"rightLeg": {
"pitch": -0.174533,
"bend": 0.523599
},
"leftArm": {
"pitch": -0.872674,
"roll": -0.349066,
"bend": 0.0
},
"body": {
"y": 0.0,
"pitch": 0.077608
},
"torso": {
"bend": 0.395397
}
},
{
"tick": 49,
"easing": "LINEAR",
"leftLeg": {
"pitch": -0.610865
}
},
{
"tick": 50,
"easing": "LINEAR",
"body": {
"y": 0.0375,
"pitch": 0.033951
},
"torso": {
"bend": 0.377793
}
},
{
"tick": 51,
"easing": "LINEAR",
"leftLeg": {
"bend": 0.959931
},
"rightLeg": {
"bend": 0.523599
}
},
{
"tick": 54,
"easing": "LINEAR",
"head": {
"pitch": -0.000488,
"yaw": -0.272548,
"roll": -0.027396
},
"rightArm": {
"pitch": 0.523599,
"roll": 0.226893,
"bend": -0.872665
},
"leftLeg": {
"pitch": -0.178507,
"bend": 0.523599
},
"rightLeg": {
"pitch": -0.523599,
"bend": 0.436332
},
"leftArm": {
"pitch": 0.52359,
"roll": -0.226893,
"bend": -0.872665
},
"body": {
"y": 0.0,
"pitch": 0.077608
},
"torso": {
"bend": 0.395397
}
},
{
"tick": 57,
"easing": "LINEAR",
"rightLeg": {
"pitch": -0.610865
},
"body": {
"y": 0.0375,
"pitch": 0.033951
},
"torso": {
"bend": 0.377793
}
},
{
"tick": 58,
"easing": "LINEAR",
"leftLeg": {
"bend": 0.523599
},
"rightLeg": {
"bend": 0.959931
}
},
{
"tick": 61,
"easing": "LINEAR",
"rightArm": {
"pitch": -0.872665,
"yaw": -0.436332,
"roll": 0.349066
},
"leftLeg": {
"pitch": -0.523599,
"bend": 0.436332
},
"rightLeg": {
"pitch": -0.174533,
"bend": 0.523599
},
"leftArm": {
"pitch": -0.872674,
"yaw": 0.436332,
"roll": -0.349066
},
"body": {
"y": 0.0,
"pitch": 0.077608
},
"torso": {
"bend": 0.395397
}
},
{
"tick": 64,
"easing": "LINEAR",
"leftLeg": {
"pitch": -0.610865
}
},
{
"tick": 65,
"easing": "LINEAR",
"body": {
"y": 0.0375,
"pitch": 0.033951
},
"torso": {
"bend": 0.377793
}
},
{
"tick": 66,
"easing": "LINEAR",
"leftLeg": {
"bend": 0.959931
},
"rightLeg": {
"bend": 0.523599
}
},
{
"tick": 69,
"easing": "LINEAR",
"head": {
"pitch": -0.523599,
"yaw": 0.0,
"roll": 0.0
},
"rightArm": {
"pitch": -2.356194,
"yaw": 0.087266,
"roll": 0.523599
},
"leftLeg": {
"pitch": -0.178507,
"bend": 0.523599
},
"rightLeg": {
"pitch": -0.523599,
"bend": 0.436332
},
"leftArm": {
"pitch": -2.338528,
"yaw": -0.087266,
"roll": -0.523599
},
"body": {
"y": 0.0,
"pitch": 0.077608
},
"torso": {
"bend": 0.395397
}
},
{
"tick": 72,
"easing": "LINEAR",
"rightLeg": {
"pitch": -0.610865
},
"body": {
"y": 0.0375,
"pitch": 0.033951
},
"torso": {
"bend": 0.377793
}
},
{
"tick": 73,
"easing": "LINEAR",
"leftLeg": {
"bend": 0.523599
},
"rightLeg": {
"bend": 0.959931
}
},
{
"tick": 76,
"easing": "LINEAR",
"rightArm": {
"bend": -0.959931
},
"leftLeg": {
"pitch": -0.523599,
"bend": 0.436332
},
"rightLeg": {
"pitch": -0.174533,
"bend": 0.523599
},
"leftArm": {
"bend": -0.959931
},
"body": {
"y": 0.0,
"pitch": 0.077608
},
"torso": {
"bend": 0.395397
}
},
{
"tick": 79,
"easing": "LINEAR",
"leftLeg": {
"pitch": -0.610865
}
},
{
"tick": 80,
"easing": "LINEAR",
"body": {
"y": 0.0375,
"pitch": 0.033951
},
"torso": {
"bend": 0.377793
}
},
{
"tick": 81,
"easing": "LINEAR",
"head": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": -0.523599,
"yaw": 0.0,
"roll": 0.0
},
"rightArm": {
"pitch": -2.181662,
"yaw": 0.0,
"roll": 0.436332
},
"leftLeg": {
"bend": 0.959931
},
"rightLeg": {
"bend": 0.523599
},
"leftArm": {
"pitch": -2.185317,
"yaw": 0.0,
"roll": -0.436332
}
},
{
"tick": 84,
"easing": "LINEAR",
"leftLeg": {
"pitch": -0.178507,
"bend": 0.523599
},
"rightLeg": {
"pitch": -0.523599,
"bend": 0.436332
},
"body": {
"y": 0.0,
"pitch": 0.077608
},
"torso": {
"bend": 0.395397
}
},
{
"tick": 87,
"easing": "LINEAR",
"rightLeg": {
"pitch": -0.610865
},
"body": {
"y": 0.0375,
"pitch": 0.033951
},
"torso": {
"bend": 0.377793
}
},
{
"tick": 88,
"easing": "LINEAR",
"leftLeg": {
"bend": 0.523599
},
"rightLeg": {
"bend": 0.959931
}
},
{
"tick": 91,
"easing": "LINEAR",
"head": {
"pitch": 0.261799
},
"rightArm": {
"pitch": -0.872665,
"yaw": -0.436332,
"roll": 0.349066,
"bend": 0.0
},
"leftLeg": {
"x": 1.9,
"y": 12.0,
"z": -0.1,
"pitch": -0.523599,
"yaw": 0.0,
"roll": 0.0,
"bend": 0.436332
},
"rightLeg": {
"x": -1.9,
"y": 12.0,
"z": 0.1,
"pitch": -0.174533,
"yaw": 0.0,
"roll": 0.0,
"bend": 0.523599
},
"leftArm": {
"x": 5.0,
"y": 2.0,
"z": 0.0,
"pitch": -0.872674,
"yaw": 0.436332,
"roll": -0.349066,
"bend": 0.0
},
"body": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.077608,
"yaw": 0.0,
"roll": 0.0
},
"torso": {
"bend": 0.395397
}
}
]
}
}
@@ -0,0 +1,121 @@
{
"version": 3,
"name": "Salute",
"description": "Hand behind back",
"author": "Wah0o",
"emote": {
"beginTick": 0,
"endTick": 30,
"stopTick": 30,
"isLoop": true,
"returnTick": 12,
"easeBeforeKeyframe": false,
"degrees": false,
"moves": [
{
"tick": 10,
"easing": "EASEINOUTQUAD",
"head": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
},
"body": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
},
"rightArm": {
"x": -5.0,
"y": 2.0,
"z": 0.0,
"pitch": 0.484846,
"yaw": 0.0,
"roll": -0.576996
},
"leftArm": {
"x": 5.0,
"y": 2.0,
"z": 0.0,
"pitch": -2.604544,
"yaw": 0.0,
"roll": -0.400639
},
"rightLeg": {
"x": -1.9,
"y": 12.0,
"z": 0.1,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
},
"leftLeg": {
"x": 1.9,
"y": 12.0,
"z": -0.1,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
}
},
{
"tick": 30,
"easing": "EASEINOUTQUAD",
"head": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
},
"body": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
},
"rightArm": {
"x": -5.0,
"y": 2.0,
"z": 0.0,
"pitch": 0.484846,
"yaw": 0.0,
"roll": -0.576996
},
"leftArm": {
"x": 5.0,
"y": 2.0,
"z": 0.0,
"pitch": -2.604544,
"yaw": 0.0,
"roll": -0.400639
},
"rightLeg": {
"x": -1.9,
"y": 12.0,
"z": 0.1,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
},
"leftLeg": {
"x": 1.9,
"y": 12.0,
"z": -0.1,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
}
}
]
}
}
@@ -0,0 +1,90 @@
{
"version": 3,
"name": "Shrug",
"description": "don't care",
"author": "Wah0o",
"emote": {
"beginTick": 0,
"endTick": 30,
"stopTick": 31,
"isLoop": false,
"returnTick": 1,
"easeBeforeKeyframe": false,
"degrees": false,
"moves": [
{
"tick": 10,
"easing": "EASEINOUTQUAD",
"head": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.0,
"yaw": 0.537013,
"roll": 0.0
}
},
{
"tick": 20,
"easing": "EASEINOUTQUAD",
"head": {
"yaw": -0.449322
},
"rightArm": {
"x": -5.0,
"y": 2.0,
"z": 0.0,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
},
"leftArm": {
"x": 5.0,
"y": 2.0,
"z": 0.0,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
}
},
{
"tick": 25,
"easing": "EASEINOUTQUAD",
"rightArm": {
"y": 0.673667
},
"leftArm": {
"y": 0.738915
}
},
{
"tick": 30,
"easing": "EASEINOUTQUAD",
"head": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
},
"rightArm": {
"x": -5.0,
"y": 2.0,
"z": 0.0,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
},
"leftArm": {
"x": 5.0,
"y": 2.0,
"z": 0.0,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
}
}
]
}
}
@@ -0,0 +1,307 @@
{
"version": 3,
"name": "Take The L",
"description": "Savor the W",
"author": "Landro",
"emote": {
"beginTick": 0,
"endTick": 30,
"stopTick": 30,
"isLoop": true,
"returnTick": 10,
"easeBeforeKeyframe": false,
"degrees": false,
"moves": [
{
"tick": 5,
"easing": "EASEINOUTQUAD",
"head": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
},
"body": {
"y": 0.25,
"roll": 0.0
},
"leftArm": {
"x": 5.76,
"y": 3.28,
"z": -0.64,
"pitch": -1.294932,
"yaw": 0.991577,
"roll": -1.205874,
"bend": -1.057819
},
"rightLeg": {
"x": -1.9,
"y": 12.0,
"z": 0.1,
"pitch": 0.0,
"yaw": 0.261799,
"roll": 0.0,
"bend": 0.0
},
"leftLeg": {
"x": 1.9,
"y": 12.0,
"z": -0.1,
"pitch": 0.0,
"yaw": -0.523599,
"roll": -0.785398
}
},
{
"tick": 8,
"easing": "EASEINOUTQUAD",
"leftLeg": {
"x": 2.9,
"y": 11.0,
"z": -1.1,
"yaw": -0.959931,
"roll": -1.396263,
"bend": 0.785398
}
},
{
"tick": 10,
"easing": "EASEINOUTQUAD",
"head": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.030844,
"yaw": 0.0,
"roll": -0.059719
},
"body": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.0,
"yaw": 0.0,
"roll": -0.087266
},
"rightArm": {
"x": -7.0,
"y": -2.0,
"z": -2.0,
"pitch": -1.416631,
"yaw": -0.785398,
"roll": 4.110391,
"bend": 1.308997
},
"leftArm": {
"x": 5.76,
"y": 3.28,
"z": -0.64,
"pitch": -1.294932,
"yaw": 0.991577,
"roll": -1.205874,
"bend": -1.057819
},
"rightLeg": {
"x": -1.9,
"y": 12.0,
"z": -0.9,
"pitch": -0.174533,
"yaw": 0.261799,
"roll": 0.174533,
"bend": 0.261799
},
"leftLeg": {
"x": 2.9,
"y": 11.0,
"z": -1.1,
"pitch": 0.0,
"yaw": -0.959931,
"roll": -1.570796,
"bend": 0.0
}
},
{
"tick": 12,
"easing": "EASEINOUTQUAD",
"leftLeg": {
"bend": 0.785398
}
},
{
"tick": 15,
"easing": "EASEINOUTQUAD",
"head": {
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
},
"body": {
"y": 0.25,
"roll": 0.0
},
"rightLeg": {
"x": -1.9,
"y": 12.0,
"z": 0.1,
"pitch": 0.0,
"yaw": 0.261799,
"roll": 0.0,
"bend": 0.0
},
"leftLeg": {
"x": 1.9,
"y": 12.0,
"z": -0.1,
"pitch": 0.0,
"yaw": -0.261799,
"roll": 0.0,
"bend": 0.0
}
},
{
"tick": 18,
"easing": "EASEINOUTQUAD",
"rightLeg": {
"x": -2.9,
"y": 11.0,
"z": -0.9,
"yaw": 0.959931,
"roll": 1.396263,
"bend": 0.785398
}
},
{
"tick": 20,
"easing": "EASEINOUTQUAD",
"head": {
"pitch": 0.105365,
"yaw": 0.000794,
"roll": 0.055846
},
"body": {
"y": 0.0,
"roll": 0.087266
},
"rightArm": {
"pitch": -1.132143
},
"rightLeg": {
"x": -2.9,
"y": 11.0,
"z": -0.9,
"yaw": 0.959931,
"roll": 1.570796,
"bend": 0.0
},
"leftLeg": {
"pitch": -0.174533,
"roll": -0.174533,
"bend": 0.261799
}
},
{
"tick": 22,
"easing": "EASEINOUTQUAD",
"rightLeg": {
"bend": 0.785398
}
},
{
"tick": 25,
"easing": "EASEINOUTQUAD",
"head": {
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
},
"body": {
"y": 0.25
},
"rightLeg": {
"x": -1.9,
"y": 12.0,
"z": 0.1,
"pitch": 0.0,
"yaw": 0.261799,
"roll": 0.0,
"bend": 0.0
},
"leftLeg": {
"x": 1.9,
"y": 12.0,
"z": -0.1,
"pitch": 0.0,
"yaw": -0.261799,
"roll": 0.0,
"bend": 0.0
}
},
{
"tick": 28,
"easing": "EASEINOUTQUAD",
"leftLeg": {
"x": 2.9,
"y": 11.0,
"z": -1.1,
"yaw": -0.959931,
"roll": -1.396263,
"bend": 0.785398
}
},
{
"tick": 30,
"easing": "EASEINOUTQUAD",
"head": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.030844,
"yaw": 0.0,
"roll": -0.059719
},
"body": {
"y": 0.0,
"roll": -0.087266
},
"rightArm": {
"x": -7.0,
"y": -2.0,
"z": -2.0,
"pitch": -1.416631,
"yaw": -0.785398,
"roll": 4.110391,
"bend": 1.308997
},
"leftArm": {
"x": 5.76,
"y": 3.28,
"z": -0.64,
"pitch": -1.294932,
"yaw": 0.991577,
"roll": -1.205874,
"bend": -1.057819
},
"rightLeg": {
"x": -1.9,
"y": 12.0,
"z": -0.9,
"pitch": -0.174533,
"yaw": 0.261799,
"roll": 0.174533,
"bend": 0.261799
},
"leftLeg": {
"x": 2.9,
"y": 11.0,
"z": -1.1,
"pitch": 0.0,
"yaw": -0.959931,
"roll": -1.570796,
"bend": 0.0
}
}
]
}
}
@@ -0,0 +1,685 @@
{
"version": 3,
"name": "Twerk",
"description": "Hips back, and bounce",
"author": "Saturn Client",
"emote": {
"degrees": true,
"isLoop": true,
"returnTick": 0,
"endTick": 12,
"stopTick": 13,
"moves": [
{
"tick": 0,
"easing": "LINEAR",
"body": {
"x": -0.0,
"y": 0.0637
},
"head": {
"x": 0.1873,
"y": 7.6654,
"z": -3.9561,
"pitch": 28.4994,
"yaw": 0.5013,
"roll": -0.9013
},
"torso": {
"x": 0.1873,
"y": 7.6654,
"z": -3.9561,
"pitch": 43.8857,
"yaw": -0.2748,
"roll": -0.5704,
"bend": 32.4225,
"axis": 178.4861
},
"rightArm": {
"x": -4.8056,
"y": 9.1559,
"z": -2.5937,
"pitch": 41.2104,
"yaw": 11.1599,
"roll": 11.5835,
"bend": -28.9106,
"axis": -6.4245
},
"leftArm": {
"x": 5.1932,
"y": 9.0568,
"z": -2.5457,
"pitch": 41.2134,
"yaw": -10.0744,
"roll": -11.3678,
"bend": -34.2847,
"axis": 3.7104
},
"rightLeg": {
"x": -1.6738,
"y": 16.311,
"z": 4.4622,
"pitch": -81.0086,
"yaw": 25.937,
"roll": 11.6147,
"bend": -106.5341,
"axis": 178.6748
},
"leftLeg": {
"x": 2.1262,
"y": 16.311,
"z": 4.4622,
"pitch": -80.1541,
"yaw": -23.1741,
"roll": -15.9396,
"bend": -109.5512,
"axis": 186.6826
}
},
{
"tick": 1,
"easing": "LINEAR",
"head": {
"y": 7.3213,
"z": -3.9546
},
"torso": {
"y": 7.3213,
"z": -3.9546,
"pitch": 44.2163,
"roll": -1.2208,
"bend": 31.983
},
"rightArm": {
"y": 8.8595,
"z": -2.4569,
"pitch": 40.8328,
"roll": 6.2457,
"bend": -30.0698,
"axis": -6.2466
},
"leftArm": {
"y": 8.6462,
"z": -2.6643,
"pitch": 39.718,
"roll": -11.4772,
"bend": -31.5341,
"axis": 5.9068
},
"rightLeg": {
"y": 15.9102,
"pitch": -75.926,
"yaw": 24.5861,
"roll": 13.5142,
"bend": -102.1127
},
"leftLeg": {
"y": 15.9102,
"pitch": -75.5106,
"yaw": -27.5028,
"roll": -13.7351,
"bend": -102.8428,
"axis": 189.6313
}
},
{
"tick": 2,
"easing": "LINEAR",
"head": {
"x": -0.8055,
"y": 8.1689
},
"torso": {
"x": -0.8055,
"y": 8.1689,
"bend": 38.1002
},
"rightArm": {
"x": -5.6879,
"y": 9.7845,
"axis": -3.7942
},
"leftArm": {
"x": 4.2976,
"y": 9.2523,
"pitch": 44.6401,
"yaw": -6.835,
"roll": -16.9446,
"bend": -32.4677
},
"rightLeg": {
"y": 16.2659,
"pitch": -78.5245,
"yaw": 20.2182,
"roll": 19.5894,
"bend": -107.209
},
"leftLeg": {
"y": 16.2659,
"pitch": -79.0541,
"bend": -104.5866
}
},
{
"tick": 3,
"easing": "LINEAR",
"head": {
"x": -1.5256,
"y": 9.7364,
"z": -4.854,
"pitch": 34.1426
},
"torso": {
"x": -1.5256,
"y": 9.7364,
"z": -4.854,
"pitch": 51.4994,
"roll": -5.723,
"bend": 46.2958,
"axis": 171.0835
},
"rightArm": {
"x": -6.3053,
"y": 11.4659,
"z": -3.0779,
"pitch": 49.8778,
"yaw": 10.9541,
"roll": 9.4174,
"bend": -29.3297
},
"leftArm": {
"x": 3.6347,
"y": 10.4699,
"z": -3.5025,
"pitch": 51.8029,
"roll": -24.6351,
"axis": 3.6087
},
"rightLeg": {
"z": 4.6288,
"yaw": 18.5052,
"roll": 21.802,
"bend": -116.6488,
"axis": 171.6123
},
"leftLeg": {
"z": 4.6288,
"pitch": -87.1428,
"yaw": -23.4405,
"axis": 180.9108
}
},
{
"tick": 4,
"easing": "LINEAR",
"head": {
"x": -1.8731,
"y": 10.6957,
"z": -5.0099,
"pitch": 33.2442,
"yaw": 3.9201,
"roll": -6.0227
},
"torso": {
"x": -1.8731,
"y": 10.6957,
"z": -5.0099,
"pitch": 52.4228,
"yaw": 3.8511,
"roll": -5.9949,
"bend": 49.0159,
"axis": 172.2434
},
"rightArm": {
"x": -6.5993,
"y": 12.418,
"z": -3.0931,
"pitch": 51.1349,
"yaw": 8.0105,
"axis": -8.2902
},
"leftArm": {
"x": 3.3186,
"y": 11.3757,
"z": -3.7647,
"pitch": 53.8923,
"yaw": -6.0212,
"roll": -27.197,
"bend": -39.6549,
"axis": 5.9148
},
"rightLeg": {
"x": -2.3763,
"y": 17.9026,
"pitch": -93.1557,
"bend": -122.9048,
"axis": 170.6601
},
"leftLeg": {
"x": 1.4237,
"y": 17.9026,
"pitch": -93.1369,
"bend": -121.5363
}
},
{
"tick": 5,
"easing": "LINEAR",
"head": {
"x": -1.4047,
"y": 9.9389,
"pitch": 28.9007,
"yaw": 3.2148
},
"torso": {
"x": -1.4047,
"y": 9.9389,
"yaw": 3.7305,
"bend": 43.4407
},
"rightArm": {
"x": -6.2198,
"y": 11.5114,
"pitch": 48.4737,
"yaw": 7.9932,
"bend": -38.6811
},
"leftArm": {
"x": 3.7446,
"y": 10.9738,
"z": -3.474,
"roll": -23.505,
"bend": -36.714
},
"rightLeg": {
"y": 17.761,
"pitch": -92.4411,
"roll": 20.4558,
"bend": -121.9263
},
"leftLeg": {
"y": 17.761,
"pitch": -92.379,
"yaw": -26.2774,
"roll": -17.4598,
"bend": -120.6269,
"axis": 184.7551
}
},
{
"tick": 6,
"easing": "LINEAR",
"head": {
"x": -0.5445,
"y": 8.2919,
"z": -4.1286,
"pitch": 27.4449
},
"torso": {
"x": -0.5445,
"y": 8.2919,
"z": -4.1286,
"pitch": 44.9959,
"roll": -0.1331,
"bend": 35.1937
},
"rightArm": {
"x": -5.5003,
"y": 9.7189,
"z": -2.5814,
"yaw": 10.117,
"roll": 11.6263,
"bend": -36.6136,
"axis": -2.9818
},
"leftArm": {
"x": 4.4989,
"y": 9.6953,
"z": -2.8477,
"pitch": 43.3362,
"yaw": -10.8396,
"bend": -30.325
},
"rightLeg": {
"y": 16.7832,
"z": 4.4556,
"yaw": 20.579,
"axis": 174.8949
},
"leftLeg": {
"y": 16.7832,
"z": 4.4556,
"roll": -13.3635,
"axis": 181.9013
}
},
{
"tick": 7,
"easing": "LINEAR",
"head": {
"y": 7.335,
"z": -3.8955,
"yaw": -1.2543,
"roll": 1.9551
},
"torso": {
"y": 7.335,
"z": -3.8955,
"pitch": 43.6308,
"yaw": -0.6674,
"bend": 31.2968
},
"rightArm": {
"y": 8.7024,
"z": -2.5743,
"pitch": 39.7281,
"roll": 11.0094,
"bend": -32.4336,
"axis": -5.1024
},
"leftArm": {
"y": 8.8585,
"z": -2.4579,
"pitch": 40.3248,
"roll": -8.1427,
"bend": -29.1361,
"axis": 6.7593
},
"rightLeg": {
"x": -2.0654,
"y": 16.0076,
"pitch": -76.8625,
"yaw": 25.941,
"roll": 14.4188,
"bend": -105.4043,
"axis": 171.2628
},
"leftLeg": {
"x": 1.7346,
"y": 16.0076,
"pitch": -77.6408,
"yaw": -25.7135,
"roll": -11.5799,
"bend": -103.133,
"axis": 182.0395
}
},
{
"tick": 8,
"easing": "LINEAR",
"head": {
"x": 0.5149,
"y": 7.6114,
"z": -4.1189
},
"torso": {
"x": 0.5149,
"y": 7.6114,
"z": -4.1189,
"pitch": 45.5567,
"roll": 1.9,
"bend": 34.3817,
"axis": 185.8808
},
"rightArm": {
"x": -4.5647,
"y": 8.8445,
"z": -2.8129,
"pitch": 41.452,
"yaw": 7.1089,
"roll": 13.4728,
"bend": -31.5905,
"axis": -5.4945
},
"leftArm": {
"y": 9.1765,
"z": -2.5698,
"pitch": 42.5806,
"roll": -6.1009,
"bend": -30.5432
},
"rightLeg": {
"y": 16.0062,
"pitch": -76.3427,
"yaw": 27.2082,
"roll": 13.8298,
"bend": -102.5222,
"axis": 171.6254
},
"leftLeg": {
"y": 16.0062,
"pitch": -76.2516,
"bend": -103.6369
}
},
{
"tick": 9,
"easing": "LINEAR",
"torso": {
"axis": 188.354
},
"rightArm": {
"y": 9.8245,
"axis": -3.4265
},
"leftArm": {
"yaw": -11.6764,
"roll": -8.5612,
"bend": -29.2921,
"axis": 3.7762
},
"rightLeg": {
"y": 16.6561,
"z": 4.6178,
"yaw": 23.9791,
"bend": -108.5895,
"axis": 177.6256
},
"leftLeg": {
"y": 16.6561,
"z": 4.6178,
"pitch": -82.2218,
"yaw": -18.7129,
"roll": -21.3727
}
},
{
"tick": 10,
"easing": "LINEAR",
"head": {
"x": 1.7868,
"y": 10.3947,
"z": -4.9963,
"pitch": 34.2919,
"roll": 5.9583
},
"torso": {
"x": 1.7868,
"y": 10.3947,
"z": -4.9963,
"pitch": 52.5511,
"roll": 6.3235,
"bend": 48.7324,
"axis": 188.7341
},
"rightArm": {
"x": -3.3947,
"y": 11.0427,
"z": -3.69,
"pitch": 53.7658,
"yaw": 6.158,
"roll": 26.7903,
"bend": -38.4178
},
"leftArm": {
"x": 6.5243,
"y": 12.1424,
"z": -3.1327,
"pitch": 51.0522,
"bend": -30.9765,
"axis": 7.1451
},
"rightLeg": {
"x": -1.4452,
"y": 17.5819,
"pitch": -90.7807,
"bend": -118.2986,
"axis": 178.4542
},
"leftLeg": {
"x": 2.3548,
"y": 17.5819,
"pitch": -90.4714,
"roll": -21.4522,
"bend": -120.5366,
"axis": 189.2421
}
},
{
"tick": 11,
"easing": "LINEAR",
"head": {
"x": 1.7369,
"y": 10.5273,
"z": -4.8864,
"yaw": -3.8864,
"roll": 5.3801
},
"torso": {
"x": 1.7369,
"y": 10.5273,
"z": -4.8864,
"pitch": 51.13,
"yaw": -4.0928,
"bend": 47.0625
},
"rightArm": {
"x": -3.4451,
"y": 11.352,
"z": -3.6905,
"pitch": 52.2992,
"yaw": 6.6309,
"roll": 26.0007,
"bend": -39.1249,
"axis": -6.422
},
"leftArm": {
"x": 6.4911,
"y": 12.1855,
"pitch": 50.212,
"yaw": -7.4219,
"bend": -36.9681,
"axis": 7.7245
},
"rightLeg": {
"y": 17.9759,
"pitch": -93.724,
"yaw": 26.1749,
"roll": 17.9629,
"bend": -122.4062,
"axis": 175.2086
},
"leftLeg": {
"y": 17.9759,
"pitch": -93.8978,
"bend": -123.3927,
"axis": 188.3051
}
},
{
"tick": 12,
"easing": "LINEAR",
"head": {
"pitch": 27.4876
},
"rightArm": {
"y": 10.3597,
"roll": 19.9926
},
"leftArm": {
"bend": -38.4293,
"axis": 3.7703
},
"rightLeg": {
"y": 17.3175,
"pitch": -89.3376,
"bend": -116.6299
},
"leftLeg": {
"y": 17.3175,
"pitch": -89.0719,
"yaw": -19.2542,
"roll": -19.5116,
"bend": -118.7259,
"axis": 185.0963
}
},
{
"tick": 13,
"easing": "LINEAR",
"body": {
"x": -0.0,
"y": 0.0637
},
"head": {
"x": 0.1873,
"y": 7.6654,
"z": -3.9561,
"pitch": 28.4994,
"yaw": 0.5013,
"roll": -0.9013
},
"torso": {
"x": 0.1873,
"y": 7.6654,
"z": -3.9561,
"pitch": 43.8857,
"yaw": -0.2748,
"roll": -0.5704,
"bend": 32.4225,
"axis": 178.4861
},
"rightArm": {
"x": -4.8056,
"y": 9.1559,
"z": -2.5937,
"pitch": 41.2104,
"yaw": 11.1599,
"roll": 11.5835,
"bend": -28.9106,
"axis": -6.4245
},
"leftArm": {
"x": 5.1932,
"y": 9.0568,
"z": -2.5457,
"pitch": 41.2134,
"yaw": -10.0744,
"roll": -11.3678,
"bend": -34.2847,
"axis": 3.7104
},
"rightLeg": {
"x": -1.6738,
"y": 16.311,
"z": 4.4622,
"pitch": -81.0086,
"yaw": 25.937,
"roll": 11.6147,
"bend": -106.5341,
"axis": 178.6748
},
"leftLeg": {
"x": 2.1262,
"y": 16.311,
"z": 4.4622,
"pitch": -80.1541,
"yaw": -23.1741,
"roll": -15.9396,
"bend": -109.5512,
"axis": 186.6826
}
}
]
}
}
@@ -0,0 +1,353 @@
{
"version": 3,
"name": "smooth wave",
"description": "my first animation",
"author": "operatordoge739",
"emote": {
"beginTick": 0,
"endTick": 80,
"stopTick": 81,
"isLoop": false,
"returnTick": 1,
"easeBeforeKeyframe": false,
"degrees": false,
"moves": [
{
"tick": 8,
"easing": "EASEINOUTQUAD",
"body": {
"pitch": -0.040079,
"yaw": -0.062839,
"roll": 0.013404
}
},
{
"tick": 16,
"easing": "EASEINOUTQUAD",
"head": {
"pitch": 0.079561,
"yaw": 0.00633,
"roll": 0.104675
},
"body": {
"pitch": 0.015338,
"yaw": -0.101444,
"roll": 0.071169
},
"rightArm": {
"x": -5.642361,
"y": 3.445788,
"z": -0.219398,
"pitch": -2.739643,
"yaw": 1.23244,
"roll": 0.274965
},
"leftArm": {
"x": 5.348845,
"y": 2.06144,
"z": 0.456518,
"pitch": -0.071698,
"yaw": -0.032049,
"roll": -0.245309
},
"rightLeg": {
"x": -2.024828,
"y": 12.367789,
"z": 0.062098,
"pitch": 0.005119,
"yaw": 0.188187,
"roll": 0.013892
},
"leftLeg": {
"pitch": -0.015376,
"yaw": -0.018557,
"roll": -0.147605
}
},
{
"tick": 23,
"easing": "EASEINOUTQUAD",
"body": {
"pitch": 0.015075,
"yaw": -0.096037,
"roll": 0.011298
},
"rightArm": {
"x": -5.569975,
"y": 3.783614,
"z": -0.392365,
"pitch": -2.998378,
"yaw": 0.910442,
"roll": -0.644675
},
"rightLeg": {
"x": -2.022849,
"y": 12.008524,
"z": 0.109452,
"pitch": 0.007948,
"yaw": 0.194292,
"roll": 0.061405
},
"leftLeg": {
"x": 1.828612,
"y": 11.783937,
"z": -0.067588
}
},
{
"tick": 25,
"easing": "EASEINOUTQUAD",
"head": {
"pitch": 0.03656,
"yaw": -0.056306,
"roll": -0.010938
}
},
{
"tick": 26,
"easing": "EASEINOUTQUAD",
"leftArm": {
"x": 5.232569,
"y": 2.037472,
"z": 0.40348,
"pitch": -0.120718,
"yaw": -0.007399,
"roll": -0.1239
}
},
{
"tick": 30,
"easing": "EASEINOUTQUAD",
"body": {
"pitch": 0.019292,
"yaw": -0.103782,
"roll": 0.055881
},
"rightArm": {
"pitch": -2.902291,
"yaw": 1.150272,
"roll": -0.061632
}
},
{
"tick": 31,
"easing": "EASEINOUTQUAD",
"rightLeg": {
"x": -1.991897,
"y": 12.157447,
"z": 0.059089,
"pitch": 0.005119,
"yaw": 0.188187,
"roll": 0.013892
},
"leftLeg": {
"pitch": -0.015376,
"yaw": -0.018557,
"roll": -0.147605
}
},
{
"tick": 32,
"easing": "EASEINOUTQUAD",
"head": {
"pitch": 0.075163,
"yaw": -0.055531,
"roll": -0.039248
}
},
{
"tick": 36,
"easing": "EASEINOUTQUAD",
"leftArm": {
"x": 5.232738,
"y": 2.536962,
"z": 0.337457,
"pitch": -0.123332,
"yaw": -0.017768,
"roll": -0.198156
}
},
{
"tick": 37,
"easing": "EASEINOUTQUAD",
"rightArm": {
"pitch": -2.802795,
"yaw": 1.020531,
"roll": -0.376307
}
},
{
"tick": 39,
"easing": "EASEINOUTQUAD",
"body": {
"pitch": 0.01081,
"yaw": -0.089193,
"roll": 0.004038
}
},
{
"tick": 41,
"easing": "EASEINOUTQUAD",
"head": {
"pitch": 0.10722,
"yaw": -0.023033,
"roll": 0.072739
}
},
{
"tick": 44,
"easing": "EASEINOUTQUAD",
"leftLeg": {
"x": 2.093371,
"y": 12.180333,
"z": -0.403448,
"pitch": 0.017084,
"yaw": -0.010917,
"roll": -0.023916
}
},
{
"tick": 46,
"easing": "EASEINOUTQUAD",
"leftArm": {
"x": 5.094209,
"y": 2.963737,
"z": 0.290066,
"pitch": -0.130177,
"yaw": 0.00407,
"roll": -0.014502
}
},
{
"tick": 49,
"easing": "EASEINOUTQUAD",
"body": {
"pitch": -0.035429,
"yaw": -0.084483,
"roll": 0.015859
}
},
{
"tick": 56,
"easing": "EASEINOUTQUAD",
"head": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
}
},
{
"tick": 57,
"easing": "EASEINOUTQUAD",
"body": {
"pitch": 0.015473,
"yaw": -0.095783,
"roll": 0.000252
}
},
{
"tick": 59,
"easing": "EASEINOUTQUAD",
"leftArm": {
"x": 5.211452,
"y": 2.287216,
"z": 0.189115,
"pitch": 0.007903,
"yaw": -0.010692,
"roll": -0.024953
}
},
{
"tick": 60,
"easing": "EASEINOUTQUAD",
"rightArm": {
"x": -5.0,
"y": 2.0,
"z": 0.0,
"pitch": 0.093257,
"yaw": 0.058088,
"roll": 0.082813
}
},
{
"tick": 68,
"easing": "EASEINOUTQUAD",
"rightArm": {
"x": -5.0,
"y": 2.0,
"z": 0.0,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
},
"rightLeg": {
"x": -1.9,
"y": 12.0,
"z": 0.1,
"pitch": 0.000513,
"yaw": 0.10914,
"roll": -0.004835
},
"leftLeg": {
"x": 1.9,
"y": 12.0,
"z": -0.1,
"pitch": 0.000177,
"yaw": -0.167171,
"roll": -0.002612
}
},
{
"tick": 72,
"easing": "EASEINOUTQUAD",
"leftArm": {
"x": 5.0,
"y": 2.0,
"z": 0.0,
"pitch": 0.053822,
"yaw": -0.009281,
"roll": -0.012456
}
},
{
"tick": 77,
"easing": "EASEINOUTQUAD",
"leftLeg": {
"x": 1.9,
"y": 12.0,
"z": -0.1,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
}
},
{
"tick": 78,
"easing": "EASEINOUTQUAD",
"leftArm": {
"x": 5.0,
"y": 2.0,
"z": 0.0,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
}
},
{
"tick": 80,
"easing": "EASEINOUTQUAD",
"rightLeg": {
"x": -1.9,
"y": 12.0,
"z": 0.1,
"pitch": 0.0,
"yaw": 0.0,
"roll": 0.0
}
}
]
}
}