From e40aa1353b9d66f2fa19c55e3984ec271c05e7eb Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Sat, 26 Sep 2026 20:51:52 +0200 Subject: [PATCH] Load Emotecraft emotes into a registry and add a whole-player bone - core: EmotecraftLoader reads Emotecraft / player-animation-lib JSON into a KeyframeAnimation (per-channel keyframes with Easing), following player-animation-lib's reader: absolute pivots become offsets, body (and torso before version 3) is the whole player in blocks, angles are degrees unless "degrees": false, turn adds whole turns, and loops jump back to returnTick after endTick. Emote and EmoteRegistry hold emotes by ID with their name, description and author. Animation.loopStart lets loops restart after an intro. Uses Jackson 2.17.0, the version Saturn Client ships. - Bone.ROOT moves the whole player around its middle (0.7 blocks above the feet), through the model's root part, so armor and held items follow. - fabric: Emotes.registry() and Emotes.play(uuid, id). Core and Jackson are bundled in the jar. - testmod: loads Saturn's six emotes into the library's registry (/emotes play), and keeps its test animations in a separate registry (/emotes test). The gametest shoots the loaded emotes too. Blending with the vanilla pose is issue #4. Co-Authored-By: Claude Opus 5.5 --- README.md | 37 +- build.gradle.kts | 6 +- core/build.gradle.kts | 3 + .../saturnclient/emotes/core/Animation.java | 8 + .../emotes/core/AnimationPlayer.java | 14 +- .../org/saturnclient/emotes/core/Bone.java | 7 + .../org/saturnclient/emotes/core/Emote.java | 9 + .../emotes/core/EmoteRegistry.java | 47 + .../emotes/core/format/Easing.java | 116 + .../emotes/core/format/EmotecraftLoader.java | 172 + .../emotes/core/format/KeyframeAnimation.java | 165 + .../emotes/core/AnimationPlayerTest.java | 30 + .../emotes/core/EmoteRegistryTest.java | 71 + .../emotes/core/format/EasingTest.java | 44 + .../core/format/EmotecraftLoaderTest.java | 133 + .../core/format/KeyframeAnimationTest.java | 80 + core/src/test/resources/emotes/back_flip.json | 1385 +++++ core/src/test/resources/emotes/cry.json | 305 + core/src/test/resources/emotes/facepalm.json | 389 ++ .../src/test/resources/emotes/front_flip.json | 697 +++ core/src/test/resources/emotes/giga_chad.json | 5135 +++++++++++++++++ core/src/test/resources/emotes/tpose.json | 354 ++ .../saturnclient/emotes/fabric/Emotes.java | 19 + .../emotes/fabric/PoseApplier.java | 26 +- .../emotes/testmod/EmotesGameTest.java | 42 +- .../emotes/testmod/EmotesTestmod.java | 56 +- .../emotes/testmod/TestAnimations.java | 17 +- .../player_animations/back_flip.json | 1385 +++++ .../player_animations/cry.json | 305 + .../player_animations/facepalm.json | 389 ++ .../player_animations/front_flip.json | 697 +++ .../player_animations/giga_chad.json | 5135 +++++++++++++++++ .../player_animations/tpose.json | 354 ++ 33 files changed, 17596 insertions(+), 36 deletions(-) create mode 100644 core/src/main/java/org/saturnclient/emotes/core/Emote.java create mode 100644 core/src/main/java/org/saturnclient/emotes/core/EmoteRegistry.java create mode 100644 core/src/main/java/org/saturnclient/emotes/core/format/Easing.java create mode 100644 core/src/main/java/org/saturnclient/emotes/core/format/EmotecraftLoader.java create mode 100644 core/src/main/java/org/saturnclient/emotes/core/format/KeyframeAnimation.java create mode 100644 core/src/test/java/org/saturnclient/emotes/core/EmoteRegistryTest.java create mode 100644 core/src/test/java/org/saturnclient/emotes/core/format/EasingTest.java create mode 100644 core/src/test/java/org/saturnclient/emotes/core/format/EmotecraftLoaderTest.java create mode 100644 core/src/test/java/org/saturnclient/emotes/core/format/KeyframeAnimationTest.java create mode 100644 core/src/test/resources/emotes/back_flip.json create mode 100644 core/src/test/resources/emotes/cry.json create mode 100644 core/src/test/resources/emotes/facepalm.json create mode 100644 core/src/test/resources/emotes/front_flip.json create mode 100644 core/src/test/resources/emotes/giga_chad.json create mode 100644 core/src/test/resources/emotes/tpose.json create mode 100644 src/testmod/resources/assets/saturn_emotes_testmod/player_animations/back_flip.json create mode 100644 src/testmod/resources/assets/saturn_emotes_testmod/player_animations/cry.json create mode 100644 src/testmod/resources/assets/saturn_emotes_testmod/player_animations/facepalm.json create mode 100644 src/testmod/resources/assets/saturn_emotes_testmod/player_animations/front_flip.json create mode 100644 src/testmod/resources/assets/saturn_emotes_testmod/player_animations/giga_chad.json create mode 100644 src/testmod/resources/assets/saturn_emotes_testmod/player_animations/tpose.json diff --git a/README.md b/README.md index 65021e1..ab9eba7 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,15 @@ A player emote library for Saturn Client, with limb bending. ## Layout - `core/`: Minecraft-independent animation model (`Bone`, `BoneTransform`, `Pose`, `Animation`, - `AnimationPlayer`). Plain Java 21 with JUnit tests. Published as `org.saturnclient:emotes-core`. + `AnimationPlayer`), keyframes and easings, the Emotecraft JSON loader and the `EmoteRegistry`. + Plain Java 21 plus Jackson, with JUnit tests. Published as `org.saturnclient:emotes-core`. - `src/main/`: the Fabric mod that puts poses on player models. It's built once per Minecraft version with [Stonecutter](https://stonecutter.kikugie.dev/) and published as - `org.saturnclient:emotes-fabric:+`, with `core` bundled inside the jar. -- `src/testmod/`: a dev-only tester mod that is never published. It adds `/emotes play `, + `org.saturnclient:emotes-fabric:+`, with `core` and Jackson 2.17.0 (the version Saturn + Client ships) bundled inside the jar. +- `src/testmod/`: a dev-only tester mod that is never published. It loads Saturn's emotes into the + library's registry and keeps its own hand-written test animations in a separate registry. + `/emotes play ` plays a registered emote, `/emotes test ` a test animation, and there's `/emotes stop` and `/emotes info`. Press F5 to see yourself. It also has a Fabric client gametest that creates a world and screenshots each animation from the front and side, into `versions//build/run/clientGameTest/screenshots/`. @@ -17,6 +21,33 @@ A player emote library for Saturn Client, with limb bending. Supported versions: 1.21.4 to 1.21.11, the same range as Saturn Client. Each version's Fabric API version is set in `stonecutter.properties.toml`. The code uses Mojang mappings. +## Using it + +```java +// At startup: load emotes (Emotecraft / player-animation-lib JSON) into the registry. +try (InputStream in = MyMod.class.getResourceAsStream("/assets/mymod/player_animations/facepalm.json")) { + Emotes.registry().loadEmotecraft("facepalm", in); +} + +Emotes.play(player.getUUID(), "facepalm"); // false if there's no such emote +Emotes.play(player.getUUID(), animation); // or any Animation, e.g. written in code +Emotes.stop(player.getUUID()); +Emotes.playing(player.getUUID()); // Optional +``` + +Emotes work for any player you can see, run on game ticks, and a non-looping one stops by itself. +`Emotes.registry().all()` lists the emotes with their name, description and author, for an emote wheel. + +An `Animation` returns a `Pose` for a time in ticks: a `BoneTransform` (offset in model pixels, +pitch/yaw/roll in radians, bend and bend axis) for any of `ROOT` (the whole player), `HEAD`, `BODY`, +`RIGHT_ARM`, `LEFT_ARM`, `RIGHT_LEG` and `LEFT_LEG`. Bones it doesn't set keep their vanilla pose. +`KeyframeAnimation` builds one from keyframes and `Easing`s. + +`EmotecraftLoader` follows player-animation-lib's reader: absolute part pivots become offsets, +`body` (and `torso` before format version 3) is the whole player in blocks, angles are degrees unless +`"degrees": false`, `turn` adds whole turns, and loops jump back to `returnTick` after `endTick`. Scale +channels, `easingArg` and blending with the vanilla pose aren't supported yet (issue #4). + ## How it hooks in 1. `LivingEntityRendererMixin` samples the entity's current pose into its render state (players only). diff --git a/build.gradle.kts b/build.gradle.kts index bd816cf..61d970f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -70,9 +70,13 @@ dependencies { modImplementation("net.fabricmc:fabric-loader:${property("deps.fabric_loader")}") fapi("fabric-api-base", "fabric-lifecycle-events-v1") - // The core is Minecraft-independent; ship it inside the mod jar. + // The core is Minecraft-independent; ship it inside the mod jar, with the Jackson it reads emotes + // with (the version Saturn Client ships too, so the game only loads one). api(project(":core")) include(project(":core")) + for (module in listOf("jackson-databind", "jackson-core", "jackson-annotations")) { + include("com.fasterxml.jackson.core:$module:2.17.0") + } for (module in listOf("fabric-command-api-v2", "fabric-client-gametest-api-v1")) { "modTestmodImplementation"(fabricApi.module(module, sc.properties["deps.fabric_api"])) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index d974baf..5289b58 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -11,6 +11,9 @@ repositories { } dependencies { + // Same version Saturn Client ships, so only one copy ends up in the game. + implementation("com.fasterxml.jackson.core:jackson-databind:2.17.0") + testImplementation(platform("org.junit:junit-bom:5.13.4")) testImplementation("org.junit.jupiter:junit-jupiter") testRuntimeOnly("org.junit.platform:junit-platform-launcher") diff --git a/core/src/main/java/org/saturnclient/emotes/core/Animation.java b/core/src/main/java/org/saturnclient/emotes/core/Animation.java index 88c6a9f..6548400 100644 --- a/core/src/main/java/org/saturnclient/emotes/core/Animation.java +++ b/core/src/main/java/org/saturnclient/emotes/core/Animation.java @@ -14,4 +14,12 @@ public interface Animation { default boolean loops() { return false; } + + /** + * Where a looping animation starts again after reaching {@link #length()}, in ticks. The part + * before it plays once, like an intro. + */ + default float loopStart() { + return 0; + } } diff --git a/core/src/main/java/org/saturnclient/emotes/core/AnimationPlayer.java b/core/src/main/java/org/saturnclient/emotes/core/AnimationPlayer.java index d1ecbf8..e0334bb 100644 --- a/core/src/main/java/org/saturnclient/emotes/core/AnimationPlayer.java +++ b/core/src/main/java/org/saturnclient/emotes/core/AnimationPlayer.java @@ -18,10 +18,18 @@ public final class AnimationPlayer { public float time(long tick, float partialTick) { float elapsed = Math.max(0, tick - startTick + partialTick); float length = animation.length(); - if (animation.loops() && length > 0) { - return elapsed % length; + if (!animation.loops()) { + return Math.min(elapsed, length); } - return Math.min(elapsed, length); + if (elapsed < length) { + return elapsed; + } + float loopStart = animation.loopStart(); + float loopLength = length - loopStart; + if (loopLength <= 0) { + return length; + } + return loopStart + (elapsed - length) % loopLength; } public boolean isFinished(long tick) { diff --git a/core/src/main/java/org/saturnclient/emotes/core/Bone.java b/core/src/main/java/org/saturnclient/emotes/core/Bone.java index 7339f95..74132ed 100644 --- a/core/src/main/java/org/saturnclient/emotes/core/Bone.java +++ b/core/src/main/java/org/saturnclient/emotes/core/Bone.java @@ -2,7 +2,14 @@ package org.saturnclient.emotes.core; /** The parts of the player model an animation can move. */ public enum Bone { + /** + * The whole player. Offsets are in model pixels (Y down, like the other bones), and rotations turn + * the whole model around its middle, 12.8 pixels below the neck (0.7 blocks above the feet). Used + * for flips, spins and jumps. + */ + ROOT, HEAD, + /** The torso. It bends from the hips; see {@code LimbBend#anchoredAtEnd}. */ BODY, RIGHT_ARM, LEFT_ARM, diff --git a/core/src/main/java/org/saturnclient/emotes/core/Emote.java b/core/src/main/java/org/saturnclient/emotes/core/Emote.java new file mode 100644 index 0000000..56dddc0 --- /dev/null +++ b/core/src/main/java/org/saturnclient/emotes/core/Emote.java @@ -0,0 +1,9 @@ +package org.saturnclient.emotes.core; + +/** + * An animation with the details a player sees, like in an emote wheel. + * + * @param id identifies the emote, for example in network messages ("facepalm") + */ +public record Emote(String id, String name, String description, String author, Animation animation) { +} diff --git a/core/src/main/java/org/saturnclient/emotes/core/EmoteRegistry.java b/core/src/main/java/org/saturnclient/emotes/core/EmoteRegistry.java new file mode 100644 index 0000000..1d74899 --- /dev/null +++ b/core/src/main/java/org/saturnclient/emotes/core/EmoteRegistry.java @@ -0,0 +1,47 @@ +package org.saturnclient.emotes.core; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.saturnclient.emotes.core.format.EmotecraftLoader; + +/** Emotes by ID, in the order they were added. Safe to use from any thread. */ +public final class EmoteRegistry { + private final Map emotes = new LinkedHashMap<>(); + + /** Adds the emote, replacing any with the same ID. */ + public synchronized Emote register(Emote emote) { + emotes.put(emote.id(), emote); + return emote; + } + + /** Reads an emote in Emotecraft's JSON format and registers it under {@code id}. */ + public Emote loadEmotecraft(String id, InputStream json) throws IOException { + return register(EmotecraftLoader.load(id, json)); + } + + public synchronized Optional get(String id) { + return Optional.ofNullable(emotes.get(id)); + } + + public synchronized List all() { + return List.copyOf(emotes.values()); + } + + public synchronized List ids() { + return new ArrayList<>(emotes.keySet()); + } + + public synchronized boolean remove(String id) { + return emotes.remove(id) != null; + } + + public synchronized void clear() { + emotes.clear(); + } +} diff --git a/core/src/main/java/org/saturnclient/emotes/core/format/Easing.java b/core/src/main/java/org/saturnclient/emotes/core/format/Easing.java new file mode 100644 index 0000000..f81a51e --- /dev/null +++ b/core/src/main/java/org/saturnclient/emotes/core/format/Easing.java @@ -0,0 +1,116 @@ +package org.saturnclient.emotes.core.format; + +import java.util.Locale; + +/** + * Easing curves between keyframes (see easings.net). Each maps progress through a segment, from 0 + * to 1, to how far the value has moved. + */ +public enum Easing { + LINEAR, + /** Holds the earlier keyframe's value until the next one. */ + CONSTANT, + INSINE, OUTSINE, INOUTSINE, + INQUAD, OUTQUAD, INOUTQUAD, + INCUBIC, OUTCUBIC, INOUTCUBIC, + INQUART, OUTQUART, INOUTQUART, + INQUINT, OUTQUINT, INOUTQUINT, + INEXPO, OUTEXPO, INOUTEXPO, + INCIRC, OUTCIRC, INOUTCIRC, + INBACK, OUTBACK, INOUTBACK, + INELASTIC, OUTELASTIC, INOUTELASTIC, + INBOUNCE, OUTBOUNCE, INOUTBOUNCE; + + private static final double BACK = 1.70158; + private static final double BACK_INOUT = BACK * 1.525; + + /** + * Reads an Emotecraft easing name. Case and underscores don't matter, and the optional "EASE" + * prefix is dropped ("EASEINOUTQUAD" and "inOutQuad" both work). Unknown names are linear. + */ + public static Easing fromName(String name) { + if (name == null) { + return LINEAR; + } + String key = name.toUpperCase(Locale.ROOT).replace("_", ""); + if (key.startsWith("EASE")) { + key = key.substring(4); + } + try { + return valueOf(key); + } catch (IllegalArgumentException e) { + return LINEAR; + } + } + + public float apply(float progress) { + double t = Math.max(0, Math.min(1, progress)); + return (float) switch (this) { + case LINEAR -> t; + case CONSTANT -> t < 1 ? 0 : 1; + case INSINE -> 1 - Math.cos(t * Math.PI / 2); + case OUTSINE -> Math.sin(t * Math.PI / 2); + case INOUTSINE -> -(Math.cos(Math.PI * t) - 1) / 2; + case INQUAD -> in(t, 2); + case OUTQUAD -> out(t, 2); + case INOUTQUAD -> inOut(t, 2); + case INCUBIC -> in(t, 3); + case OUTCUBIC -> out(t, 3); + case INOUTCUBIC -> inOut(t, 3); + case INQUART -> in(t, 4); + case OUTQUART -> out(t, 4); + case INOUTQUART -> inOut(t, 4); + case INQUINT -> in(t, 5); + case OUTQUINT -> out(t, 5); + case INOUTQUINT -> inOut(t, 5); + case INEXPO -> t == 0 ? 0 : Math.pow(2, 10 * t - 10); + case OUTEXPO -> t == 1 ? 1 : 1 - Math.pow(2, -10 * t); + case INOUTEXPO -> t == 0 || t == 1 ? t + : t < 0.5 ? Math.pow(2, 20 * t - 10) / 2 : (2 - Math.pow(2, -20 * t + 10)) / 2; + case INCIRC -> 1 - Math.sqrt(1 - t * t); + case OUTCIRC -> Math.sqrt(1 - (t - 1) * (t - 1)); + case INOUTCIRC -> t < 0.5 ? (1 - Math.sqrt(1 - 4 * t * t)) / 2 + : (Math.sqrt(1 - Math.pow(-2 * t + 2, 2)) + 1) / 2; + case INBACK -> (BACK + 1) * t * t * t - BACK * t * t; + case OUTBACK -> 1 + (BACK + 1) * Math.pow(t - 1, 3) + BACK * Math.pow(t - 1, 2); + case INOUTBACK -> t < 0.5 + ? Math.pow(2 * t, 2) * ((BACK_INOUT + 1) * 2 * t - BACK_INOUT) / 2 + : (Math.pow(2 * t - 2, 2) * ((BACK_INOUT + 1) * (t * 2 - 2) + BACK_INOUT) + 2) / 2; + case INELASTIC -> t == 0 || t == 1 ? t + : -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 10.75) * (2 * Math.PI / 3)); + case OUTELASTIC -> t == 0 || t == 1 ? t + : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * (2 * Math.PI / 3)) + 1; + case INOUTELASTIC -> t == 0 || t == 1 ? t + : t < 0.5 ? -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * (2 * Math.PI / 4.5))) / 2 + : Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1; + case INBOUNCE -> 1 - bounce(1 - t); + case OUTBOUNCE -> bounce(t); + case INOUTBOUNCE -> t < 0.5 ? (1 - bounce(1 - 2 * t)) / 2 : (1 + bounce(2 * t - 1)) / 2; + }; + } + + private static double in(double t, int power) { + return Math.pow(t, power); + } + + private static double out(double t, int power) { + return 1 - Math.pow(1 - t, power); + } + + private static double inOut(double t, int power) { + return t < 0.5 ? Math.pow(2, power - 1) * Math.pow(t, power) : 1 - Math.pow(-2 * t + 2, power) / 2; + } + + private static double bounce(double t) { + double n = 7.5625; + double d = 2.75; + if (t < 1 / d) { + return n * t * t; + } else if (t < 2 / d) { + return n * (t -= 1.5 / d) * t + 0.75; + } else if (t < 2.5 / d) { + return n * (t -= 2.25 / d) * t + 0.9375; + } + return n * (t -= 2.625 / d) * t + 0.984375; + } +} diff --git a/core/src/main/java/org/saturnclient/emotes/core/format/EmotecraftLoader.java b/core/src/main/java/org/saturnclient/emotes/core/format/EmotecraftLoader.java new file mode 100644 index 0000000..4ac34e6 --- /dev/null +++ b/core/src/main/java/org/saturnclient/emotes/core/format/EmotecraftLoader.java @@ -0,0 +1,172 @@ +package org.saturnclient.emotes.core.format; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +import org.saturnclient.emotes.core.Bone; +import org.saturnclient.emotes.core.Emote; +import org.saturnclient.emotes.core.format.KeyframeAnimation.Channel; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * Reads emotes in Emotecraft's JSON format, following player-animation-lib's reader: + * + *
+ * { "version": 1, "name": ..., "description": ..., "author": ...,
+ *   "emote": { "isLoop": ..., "returnTick": ..., "endTick": ..., "stopTick": ..., "degrees": ...,
+ *              "moves": [ { "tick": 10, "easing": "INOUTQUAD", "turn": 0,
+ *                           "rightArm": { "pitch": -1.9, "bend": -0.9 } }, ... ] } }
+ * 
+ * + *

Parts are {@code head}, {@code torso}, {@code rightArm}, {@code leftArm}, {@code rightLeg}, + * {@code leftLeg} and {@code body} (the whole player, {@link Bone#ROOT}). Before format version 3, + * {@code torso} also means the whole player. Axes are {@code x}, {@code y}, {@code z}, {@code pitch}, + * {@code yaw}, {@code roll}, {@code bend} and {@code axis}. Values are converted to this library's + * conventions: + *

    + *
  • Part positions are absolute pivots (the right arm rests at x = -5, y = 2), so the rest pivot is + * subtracted to get an offset.
  • + *
  • Whole-player positions are in blocks with Y up, and its rotations are around the world axes + * before Minecraft flips the model, so X, Y, pitch and yaw change sign.
  • + *
  • Emotecraft bends the other way, so {@code bend} changes sign.
  • + *
  • Angles are in degrees unless {@code "degrees": false}.
  • + *
  • {@code turn} adds whole turns to the move's angles, for spins and flips.
  • + *
  • Looping emotes jump back to {@code returnTick} after {@code endTick}, and only loop when they + * have a {@code returnTick}.
  • + *
+ * + *

Not supported: {@code scaleX}/{@code scaleY}/{@code scaleZ}, {@code easingArg}, and the blend with + * the vanilla pose before the first keyframe and between {@code endTick} and {@code stopTick} (the + * first and last keyframes are held instead). + */ +public final class EmotecraftLoader { + private static final ObjectMapper MAPPER = new ObjectMapper(); + + private static final Map PARTS = Map.of( + "body", Bone.ROOT, + "head", Bone.HEAD, + "torso", Bone.BODY, // Bone.ROOT before version 3 + + "rightArm", Bone.RIGHT_ARM, + "leftArm", Bone.LEFT_ARM, + "rightLeg", Bone.RIGHT_LEG, + "leftLeg", Bone.LEFT_LEG); + + private static final Map AXES = Map.of( + "x", Channel.X, + "y", Channel.Y, + "z", Channel.Z, + "pitch", Channel.PITCH, + "yaw", Channel.YAW, + "roll", Channel.ROLL, + "bend", Channel.BEND, + "axis", Channel.BEND_AXIS); + + /** Emotecraft's rest pivots, {x, y, z} in model pixels. */ + private static final Map REST_PIVOTS = Map.of( + Bone.RIGHT_ARM, new float[] { -5, 2, 0 }, + Bone.LEFT_ARM, new float[] { 5, 2, 0 }, + Bone.RIGHT_LEG, new float[] { -1.9f, 12, 0.1f }, + Bone.LEFT_LEG, new float[] { 1.9f, 12, 0.1f }); + + private static final float FULL_TURN = (float) (2 * Math.PI); + + private EmotecraftLoader() { + } + + public static Emote load(String id, InputStream json) throws IOException { + return read(id, MAPPER.readTree(json)); + } + + public static Emote load(String id, String json) throws IOException { + return read(id, MAPPER.readTree(json)); + } + + private static Emote read(String id, JsonNode root) throws IOException { + JsonNode emote = root.path("emote"); + JsonNode moves = emote.path("moves"); + if (!moves.isArray()) { + throw new IOException("Emote " + id + " has no \"emote.moves\" array"); + } + int version = root.path("version").asInt(1); + boolean degrees = bool(emote.path("degrees"), true); + + KeyframeAnimation.Builder animation = KeyframeAnimation.builder() + .easeBefore(bool(emote.path("easeBeforeKeyframe"), false)); + float lastTick = 0; + for (JsonNode move : moves) { + float tick = (float) move.path("tick").asDouble(); + lastTick = Math.max(lastTick, tick); + Easing easing = Easing.fromName(move.path("easing").asText(null)); + float turn = (float) move.path("turn").asDouble(0) * FULL_TURN; + + for (Map.Entry part : PARTS.entrySet()) { + JsonNode axes = move.get(part.getKey()); + if (axes == null || !axes.isObject()) { + continue; + } + Bone bone = part.getKey().equals("torso") && version < 3 ? Bone.ROOT : part.getValue(); + for (Map.Entry axis : AXES.entrySet()) { + JsonNode value = axes.get(axis.getKey()); + if (value != null && value.isNumber()) { + float converted = convert(bone, axis.getValue(), value.floatValue(), degrees, turn); + animation.keyframe(bone, axis.getValue(), tick, converted, easing); + } + } + } + } + + float endTick = (float) emote.path("endTick").asDouble(lastTick); + if (bool(emote.path("isLoop"), false) && emote.has("returnTick")) { + // endTick itself plays before jumping back. + float returnTick = (float) emote.path("returnTick").asDouble(); + animation.length(endTick + 1).loop(returnTick <= endTick ? returnTick : 0); + } else { + animation.length((float) emote.path("stopTick").asDouble(endTick)); + } + + return new Emote(id, text(root.path("name"), id), text(root.path("description"), ""), + text(root.path("author"), ""), animation.build()); + } + + private static float convert(Bone bone, Channel channel, float value, boolean degrees, float turn) { + return switch (channel) { + case X, Y, Z -> { + if (bone == Bone.ROOT) { + // Blocks to pixels, and into model space, where X and Y point the other way. + yield channel == Channel.Z ? value * 16 : -value * 16; + } + float[] rest = REST_PIVOTS.get(bone); + yield rest == null ? value : value - rest[channel.ordinal()]; + } + case PITCH, YAW, ROLL -> { + float radians = angle(value, degrees, turn); + yield bone == Bone.ROOT && channel != Channel.ROLL ? -radians : radians; + } + case BEND -> -angle(value, degrees, turn); + case BEND_AXIS -> angle(value, degrees, turn); + }; + } + + private static float angle(float value, boolean degrees, float turn) { + return (degrees ? (float) Math.toRadians(value) : value) + turn; + } + + /** Emotecraft writes booleans both as JSON booleans and as "true"/"false" strings. */ + private static boolean bool(JsonNode node, boolean fallback) { + if (node.isBoolean()) { + return node.booleanValue(); + } + if (node.isTextual()) { + return Boolean.parseBoolean(node.textValue()); + } + return fallback; + } + + private static String text(JsonNode node, String fallback) { + return node.isTextual() ? node.textValue() : fallback; + } +} diff --git a/core/src/main/java/org/saturnclient/emotes/core/format/KeyframeAnimation.java b/core/src/main/java/org/saturnclient/emotes/core/format/KeyframeAnimation.java new file mode 100644 index 0000000..09ef38b --- /dev/null +++ b/core/src/main/java/org/saturnclient/emotes/core/format/KeyframeAnimation.java @@ -0,0 +1,165 @@ +package org.saturnclient.emotes.core.format; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; + +import org.saturnclient.emotes.core.Animation; +import org.saturnclient.emotes.core.Bone; +import org.saturnclient.emotes.core.BoneTransform; +import org.saturnclient.emotes.core.Pose; + +/** + * An animation made of keyframes: for each bone, each {@link Channel} has its own list of values at + * given ticks, and values in between follow the segment's {@link Easing}. + * + *

A bone with any keyframes gets a full {@link BoneTransform} each frame. Its channels without + * keyframes are 0. Bones without keyframes keep their vanilla pose. Before a channel's first keyframe + * and after its last one, it holds that keyframe's value. + */ +public final class KeyframeAnimation implements Animation { + /** The fields of a {@link BoneTransform}, in the same units. */ + public enum Channel { + X, Y, Z, PITCH, YAW, ROLL, BEND, BEND_AXIS + } + + public record Keyframe(float tick, float value, Easing easing) { + } + + private final Map> tracks; + private final float length; + private final boolean loops; + private final float loopStart; + private final boolean easeBefore; + + private KeyframeAnimation(Builder builder) { + this.tracks = new EnumMap<>(Bone.class); + builder.keyframes.forEach((bone, channels) -> { + Map sorted = new EnumMap<>(Channel.class); + channels.forEach((channel, keyframes) -> sorted.put(channel, sortedUnique(keyframes))); + tracks.put(bone, sorted); + }); + this.length = builder.length; + this.loops = builder.loops; + this.loopStart = builder.loopStart; + this.easeBefore = builder.easeBefore; + } + + public static Builder builder() { + return new Builder(); + } + + @Override + public float length() { + return length; + } + + @Override + public boolean loops() { + return loops; + } + + @Override + public float loopStart() { + return loopStart; + } + + /** The keyframes of one channel, sorted by tick, or an empty array. */ + public Keyframe[] keyframes(Bone bone, Channel channel) { + Map channels = tracks.get(bone); + Keyframe[] keyframes = channels == null ? null : channels.get(channel); + return keyframes == null ? new Keyframe[0] : keyframes.clone(); + } + + @Override + public Pose sample(float tick) { + Pose.Builder pose = Pose.builder(); + float[] values = new float[Channel.values().length]; + for (Map.Entry> track : tracks.entrySet()) { + Arrays.fill(values, 0); + for (Map.Entry channel : track.getValue().entrySet()) { + values[channel.getKey().ordinal()] = valueAt(channel.getValue(), tick); + } + pose.set(track.getKey(), new BoneTransform(values[0], values[1], values[2], values[3], values[4], + values[5], values[6], values[7])); + } + return pose.build(); + } + + private float valueAt(Keyframe[] keyframes, float tick) { + if (tick <= keyframes[0].tick()) { + return keyframes[0].value(); + } + for (int i = 0; i + 1 < keyframes.length; i++) { + Keyframe from = keyframes[i]; + Keyframe to = keyframes[i + 1]; + if (tick < to.tick()) { + float progress = (tick - from.tick()) / (to.tick() - from.tick()); + Easing easing = easeBefore ? to.easing() : from.easing(); + return from.value() + (to.value() - from.value()) * easing.apply(progress); + } + } + return keyframes[keyframes.length - 1].value(); + } + + /** Sorts by tick. Of several keyframes on the same tick, the last one added wins. */ + private static Keyframe[] sortedUnique(List keyframes) { + List sorted = new ArrayList<>(keyframes); + sorted.sort(Comparator.comparingDouble(Keyframe::tick)); // Stable, so the added order is kept + List unique = new ArrayList<>(sorted.size()); + for (Keyframe keyframe : sorted) { + if (!unique.isEmpty() && unique.get(unique.size() - 1).tick() == keyframe.tick()) { + unique.set(unique.size() - 1, keyframe); + } else { + unique.add(keyframe); + } + } + return unique.toArray(Keyframe[]::new); + } + + public static final class Builder { + private final Map>> keyframes = new EnumMap<>(Bone.class); + private float length; + private boolean loops; + private float loopStart; + private boolean easeBefore; + + private Builder() { + } + + public Builder keyframe(Bone bone, Channel channel, float tick, float value, Easing easing) { + keyframes.computeIfAbsent(bone, b -> new EnumMap<>(Channel.class)) + .computeIfAbsent(channel, c -> new ArrayList<>()) + .add(new Keyframe(tick, value, easing)); + return this; + } + + /** Length in ticks. A looping animation repeats from {@code loopStart} after this. */ + public Builder length(float length) { + this.length = length; + return this; + } + + public Builder loop(float loopStart) { + this.loops = true; + this.loopStart = loopStart; + return this; + } + + /** + * Whether a segment uses the easing of the keyframe it moves towards. By default it uses the + * easing of the keyframe it starts from, like Emotecraft's original format. + */ + public Builder easeBefore(boolean easeBefore) { + this.easeBefore = easeBefore; + return this; + } + + public KeyframeAnimation build() { + return new KeyframeAnimation(this); + } + } +} diff --git a/core/src/test/java/org/saturnclient/emotes/core/AnimationPlayerTest.java b/core/src/test/java/org/saturnclient/emotes/core/AnimationPlayerTest.java index 5bf39c8..1e696ba 100644 --- a/core/src/test/java/org/saturnclient/emotes/core/AnimationPlayerTest.java +++ b/core/src/test/java/org/saturnclient/emotes/core/AnimationPlayerTest.java @@ -57,4 +57,34 @@ class AnimationPlayerTest { AnimationPlayer player = new AnimationPlayer(headSpin(20, false), 100); assertEquals(0f, player.time(90, 0), 1e-6); } + + @Test + void loopsRestartFromLoopStart() { + Animation withIntro = new Animation() { + @Override + public Pose sample(float tick) { + return Pose.builder().set(Bone.HEAD, BoneTransform.rotation(0, tick, 0)).build(); + } + + @Override + public float length() { + return 20; + } + + @Override + public boolean loops() { + return true; + } + + @Override + public float loopStart() { + return 5; + } + }; + AnimationPlayer player = new AnimationPlayer(withIntro, 0); + assertEquals(3, player.time(3, 0), 1e-6); // intro plays once + assertEquals(19, player.time(19, 0), 1e-6); + assertEquals(5, player.time(20, 0), 1e-6); // then 5..20 repeats + assertEquals(7, player.time(37, 0), 1e-6); + } } diff --git a/core/src/test/java/org/saturnclient/emotes/core/EmoteRegistryTest.java b/core/src/test/java/org/saturnclient/emotes/core/EmoteRegistryTest.java new file mode 100644 index 0000000..80f8b05 --- /dev/null +++ b/core/src/test/java/org/saturnclient/emotes/core/EmoteRegistryTest.java @@ -0,0 +1,71 @@ +package org.saturnclient.emotes.core; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +import org.junit.jupiter.api.Test; + +class EmoteRegistryTest { + private static Emote emote(String id) { + return new Emote(id, id, "", "", new Animation() { + @Override + public Pose sample(float tick) { + return Pose.EMPTY; + } + + @Override + public float length() { + return 1; + } + }); + } + + @Test + void findsEmotesById() { + EmoteRegistry registry = new EmoteRegistry(); + Emote wave = registry.register(emote("wave")); + assertSame(wave, registry.get("wave").orElseThrow()); + assertTrue(registry.get("dab").isEmpty()); + } + + @Test + void keepsTheOrderEmotesWereAdded() { + EmoteRegistry registry = new EmoteRegistry(); + registry.register(emote("b")); + registry.register(emote("a")); + registry.register(emote("c")); + assertEquals(List.of("b", "a", "c"), registry.ids()); + } + + @Test + void replacesEmotesWithTheSameId() { + EmoteRegistry registry = new EmoteRegistry(); + registry.register(emote("wave")); + Emote replacement = registry.register(emote("wave")); + assertEquals(1, registry.all().size()); + assertSame(replacement, registry.get("wave").orElseThrow()); + } + + @Test + void removesEmotes() { + EmoteRegistry registry = new EmoteRegistry(); + registry.register(emote("wave")); + assertTrue(registry.remove("wave")); + assertFalse(registry.remove("wave")); + } + + @Test + void loadsEmotecraftFiles() throws IOException { + EmoteRegistry registry = new EmoteRegistry(); + try (InputStream in = getClass().getResourceAsStream("/emotes/cry.json")) { + registry.loadEmotecraft("cry", in); + } + assertEquals("T_T", registry.get("cry").orElseThrow().description()); + } +} diff --git a/core/src/test/java/org/saturnclient/emotes/core/format/EasingTest.java b/core/src/test/java/org/saturnclient/emotes/core/format/EasingTest.java new file mode 100644 index 0000000..4f160da --- /dev/null +++ b/core/src/test/java/org/saturnclient/emotes/core/format/EasingTest.java @@ -0,0 +1,44 @@ +package org.saturnclient.emotes.core.format; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +class EasingTest { + @Test + void everyEasingStartsAtZeroAndEndsAtOne() { + for (Easing easing : Easing.values()) { + assertEquals(0, easing.apply(0), 1e-5, easing.name()); + assertEquals(1, easing.apply(1), 1e-5, easing.name()); + } + } + + @Test + void symmetricEasingsAreHalfwayAtTheMiddle() { + for (Easing easing : new Easing[] { Easing.LINEAR, Easing.INOUTSINE, Easing.INOUTQUAD, Easing.INOUTCUBIC, + Easing.INOUTQUART, Easing.INOUTQUINT, Easing.INOUTEXPO, Easing.INOUTCIRC }) { + assertEquals(0.5, easing.apply(0.5f), 1e-5, easing.name()); + } + } + + @Test + void inIsSlowAtFirstAndOutIsFast() { + assertEquals(0.25, Easing.INQUAD.apply(0.5f), 1e-6); + assertEquals(0.75, Easing.OUTQUAD.apply(0.5f), 1e-6); + } + + @Test + void constantHoldsUntilTheEnd() { + assertEquals(0, Easing.CONSTANT.apply(0.99f), 1e-6); + } + + @Test + void readsEmotecraftNames() { + assertEquals(Easing.INOUTQUAD, Easing.fromName("INOUTQUAD")); + assertEquals(Easing.INOUTQUAD, Easing.fromName("EASEINOUTQUAD")); + assertEquals(Easing.OUTSINE, Easing.fromName("easeOutSine")); + assertEquals(Easing.INBOUNCE, Easing.fromName("in_bounce")); + assertEquals(Easing.LINEAR, Easing.fromName("wobbly")); + assertEquals(Easing.LINEAR, Easing.fromName(null)); + } +} diff --git a/core/src/test/java/org/saturnclient/emotes/core/format/EmotecraftLoaderTest.java b/core/src/test/java/org/saturnclient/emotes/core/format/EmotecraftLoaderTest.java new file mode 100644 index 0000000..44c276c --- /dev/null +++ b/core/src/test/java/org/saturnclient/emotes/core/format/EmotecraftLoaderTest.java @@ -0,0 +1,133 @@ +package org.saturnclient.emotes.core.format; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.io.InputStream; + +import org.junit.jupiter.api.Test; +import org.saturnclient.emotes.core.Bone; +import org.saturnclient.emotes.core.BoneTransform; +import org.saturnclient.emotes.core.Emote; + +/** Loads the emotes Saturn Client ships (copied into test resources). */ +class EmotecraftLoaderTest { + private static Emote load(String id) throws IOException { + try (InputStream in = EmotecraftLoaderTest.class.getResourceAsStream("/emotes/" + id + ".json")) { + return EmotecraftLoader.load(id, in); + } + } + + private static Emote inline(String moves, String emoteFields) throws IOException { + return EmotecraftLoader.load("test", "{\"emote\": {" + emoteFields + "\"moves\": [" + moves + "]}}"); + } + + private static BoneTransform bone(Emote emote, Bone bone, float tick) { + return emote.animation().sample(tick).get(bone).orElseThrow(); + } + + @Test + void loadsEveryShippedEmote() throws IOException { + for (String id : new String[] { "back_flip", "cry", "facepalm", "front_flip", "giga_chad", "tpose" }) { + Emote emote = load(id); + assertEquals(id, emote.id()); + assertFalse(emote.animation().sample(emote.animation().length() / 2).isEmpty(), id); + } + } + + @Test + void readsDetails() throws IOException { + Emote emote = load("facepalm"); + assertEquals("facepalm", emote.name()); + assertEquals("just facepalm", emote.description()); + assertEquals("dsty", emote.author()); + } + + @Test + void readsTiming() throws IOException { + // facepalm: plays once until stopTick 61. + Emote facepalm = load("facepalm"); + assertFalse(facepalm.animation().loops()); + assertEquals(61, facepalm.animation().length(), 1e-6); + + // cry: loops back to returnTick 5 after playing endTick 60. + Emote cry = load("cry"); + assertTrue(cry.animation().loops()); + assertEquals(61, cry.animation().length(), 1e-6); + assertEquals(5, cry.animation().loopStart(), 1e-6); + + // back_flip writes isLoop as the string "false". + assertFalse(load("back_flip").animation().loops()); + } + + @Test + void turnsPivotsIntoOffsets() throws IOException { + // tpose's arms start at their rest pivots (x = ±5, y = 2), which is no offset. + BoneTransform arm = bone(load("tpose"), Bone.RIGHT_ARM, 0); + assertEquals(0, arm.x(), 1e-5); + assertEquals(0, arm.y(), 1e-5); + assertEquals(0, arm.z(), 1e-5); + } + + @Test + void flipsTheBendDirection() throws IOException { + // cry bends the elbows by -0.96 in Emotecraft terms: towards the face. + assertEquals(0.96f, bone(load("cry"), Bone.RIGHT_ARM, 30).bend(), 0.01); + } + + @Test + void mapsTheWholeBodyToRoot() throws IOException { + // front_flip turns "body" pitch to -2π by tick 15, which is a forward flip: +2π around model X. + Emote flip = load("front_flip"); + assertEquals(2 * Math.PI, bone(flip, Bone.ROOT, 15).pitch(), 0.01); + } + + @Test + void treatsTheTorsoAsTheWholeBodyBeforeVersion3() throws IOException { + // back_flip has no version (so 1) and flips with "torso". + assertEquals(-2 * Math.PI, bone(load("back_flip"), Bone.ROOT, 70).pitch(), 0.01); + assertTrue(load("back_flip").animation().sample(40).get(Bone.BODY).isEmpty()); + + String move = "{\"tick\": 0, \"torso\": {\"pitch\": 1}}"; + Emote version3 = EmotecraftLoader.load("v3", + "{\"version\": 3, \"emote\": {\"degrees\": false, \"moves\": [" + move + "]}}"); + assertEquals(1, bone(version3, Bone.BODY, 0).pitch(), 1e-6); + } + + @Test + void convertsRootOffsetsFromBlocks() throws IOException { + Emote emote = inline("{\"tick\": 0, \"body\": {\"x\": 1, \"y\": 0.5, \"z\": 0.25}}", ""); + BoneTransform root = bone(emote, Bone.ROOT, 0); + assertEquals(-16, root.x(), 1e-5); + assertEquals(-8, root.y(), 1e-5); + assertEquals(4, root.z(), 1e-5); + } + + @Test + void anglesAreInDegreesUnlessSaidOtherwise() throws IOException { + Emote emote = inline("{\"tick\": 0, \"head\": {\"pitch\": 90}}", ""); + assertEquals(Math.PI / 2, bone(emote, Bone.HEAD, 0).pitch(), 1e-5); + Emote radians = inline("{\"tick\": 0, \"head\": {\"pitch\": 1.5}}", "\"degrees\": false,"); + assertEquals(1.5, bone(radians, Bone.HEAD, 0).pitch(), 1e-5); + } + + @Test + void onlyLoopsWithAReturnTick() throws IOException { + assertFalse(inline("{\"tick\": 0, \"head\": {\"yaw\": 1}}", "\"isLoop\": true, \"endTick\": 10,") + .animation().loops()); + } + + @Test + void addsTurns() throws IOException { + Emote emote = inline("{\"tick\": 0, \"turn\": 1, \"head\": {\"yaw\": 0.5}}", "\"degrees\": false,"); + assertEquals(0.5 + 2 * Math.PI, bone(emote, Bone.HEAD, 0).yaw(), 1e-5); + } + + @Test + void rejectsFilesWithoutMoves() { + assertThrows(IOException.class, () -> EmotecraftLoader.load("broken", "{\"emote\": {}}")); + } +} diff --git a/core/src/test/java/org/saturnclient/emotes/core/format/KeyframeAnimationTest.java b/core/src/test/java/org/saturnclient/emotes/core/format/KeyframeAnimationTest.java new file mode 100644 index 0000000..ee5915b --- /dev/null +++ b/core/src/test/java/org/saturnclient/emotes/core/format/KeyframeAnimationTest.java @@ -0,0 +1,80 @@ +package org.saturnclient.emotes.core.format; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; +import org.saturnclient.emotes.core.Bone; +import org.saturnclient.emotes.core.BoneTransform; +import org.saturnclient.emotes.core.format.KeyframeAnimation.Channel; + +class KeyframeAnimationTest { + private static BoneTransform head(KeyframeAnimation animation, float tick) { + return animation.sample(tick).get(Bone.HEAD).orElseThrow(); + } + + @Test + void interpolatesBetweenKeyframes() { + KeyframeAnimation animation = KeyframeAnimation.builder() + .keyframe(Bone.HEAD, Channel.PITCH, 0, 0, Easing.LINEAR) + .keyframe(Bone.HEAD, Channel.PITCH, 10, 1, Easing.LINEAR) + .length(10).build(); + assertEquals(0.25f, head(animation, 2.5f).pitch(), 1e-6); + } + + @Test + void segmentsUseTheEasingOfTheKeyframeTheyStartFrom() { + KeyframeAnimation animation = KeyframeAnimation.builder() + .keyframe(Bone.HEAD, Channel.PITCH, 0, 0, Easing.INQUAD) + .keyframe(Bone.HEAD, Channel.PITCH, 10, 1, Easing.LINEAR) + .length(10).build(); + assertEquals(0.25f, head(animation, 5).pitch(), 1e-6); + } + + @Test + void easeBeforeUsesTheEasingOfTheNextKeyframe() { + KeyframeAnimation animation = KeyframeAnimation.builder() + .keyframe(Bone.HEAD, Channel.PITCH, 0, 0, Easing.INQUAD) + .keyframe(Bone.HEAD, Channel.PITCH, 10, 1, Easing.LINEAR) + .easeBefore(true).length(10).build(); + assertEquals(0.5f, head(animation, 5).pitch(), 1e-6); + } + + @Test + void holdsTheFirstAndLastValues() { + KeyframeAnimation animation = KeyframeAnimation.builder() + .keyframe(Bone.HEAD, Channel.YAW, 5, 1, Easing.LINEAR) + .keyframe(Bone.HEAD, Channel.YAW, 10, 2, Easing.LINEAR) + .length(20).build(); + assertEquals(1, head(animation, 0).yaw(), 1e-6); + assertEquals(2, head(animation, 15).yaw(), 1e-6); + } + + @Test + void channelsWithoutKeyframesAreZeroAndBonesWithoutKeyframesAreLeftAlone() { + KeyframeAnimation animation = KeyframeAnimation.builder() + .keyframe(Bone.HEAD, Channel.YAW, 0, 1, Easing.LINEAR) + .length(10).build(); + assertEquals(0, head(animation, 0).pitch(), 1e-6); + assertTrue(animation.sample(0).get(Bone.BODY).isEmpty()); + } + + @Test + void laterKeyframesOnTheSameTickWin() { + KeyframeAnimation animation = KeyframeAnimation.builder() + .keyframe(Bone.HEAD, Channel.ROLL, 5, 1, Easing.LINEAR) + .keyframe(Bone.HEAD, Channel.ROLL, 5, 3, Easing.LINEAR) + .length(10).build(); + assertEquals(1, animation.keyframes(Bone.HEAD, Channel.ROLL).length); + assertEquals(3, head(animation, 5).roll(), 1e-6); + } + + @Test + void keyframesCanBeAddedOutOfOrder() { + KeyframeAnimation animation = KeyframeAnimation.builder() + .keyframe(Bone.HEAD, Channel.PITCH, 10, 1, Easing.LINEAR) + .keyframe(Bone.HEAD, Channel.PITCH, 0, 0, Easing.LINEAR) + .length(10).build(); + assertEquals(0.5f, head(animation, 5).pitch(), 1e-6); + } +} diff --git a/core/src/test/resources/emotes/back_flip.json b/core/src/test/resources/emotes/back_flip.json new file mode 100644 index 0000000..3a15c12 --- /dev/null +++ b/core/src/test/resources/emotes/back_flip.json @@ -0,0 +1,1385 @@ +{ + "name": "back_flip", + "author": "Kale Ko", + "description": "Makes You Do A Back Flip", + "uuid": "ebfb1e69-330a-4970-8bca-f5625c90681a", + "emote":{ + "isLoop": "false", + "returnTick": 2, + "beginTick":0, + "endTick":80, + "stopTick":81, + "degrees":false, + "moves":[ + + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "head":{ + "y":-0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "head":{ + "y":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "head":{ + "z":-0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "head":{ + "z":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "head":{ + "x":-0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "head":{ + "x":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "head":{ + "yaw":-0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "head":{ + "yaw":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "head":{ + "roll":0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "head":{ + "roll":0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "head":{ + "pitch":-0.2994975745677948 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "head":{ + "pitch":-0.0 + } + }, + { + "tick":10, + "easing": "EASEOUTQUAD", + "turn": 0, + "torso":{ + "yaw":0.0 + } + }, + { + "tick":15, + "easing": "EASEINSINE", + "turn": 0, + "torso":{ + "yaw":0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "yaw":0.0 + } + }, + { + "tick":55, + "easing": "EASEOUTSINE", + "turn": 0, + "torso":{ + "yaw":0.0 + } + }, + { + "tick":70, + "easing": "CONSTANT", + "turn": 0, + "torso":{ + "yaw":0.0 + } + }, + { + "tick":71, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "yaw":0.0 + } + }, + { + "tick":10, + "easing": "EASEOUTQUAD", + "turn": 0, + "torso":{ + "roll":-0.0 + } + }, + { + "tick":15, + "easing": "EASEINSINE", + "turn": 0, + "torso":{ + "roll":0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "roll":0.0 + } + }, + { + "tick":55, + "easing": "EASEOUTSINE", + "turn": 0, + "torso":{ + "roll":0.0 + } + }, + { + "tick":70, + "easing": "CONSTANT", + "turn": 0, + "torso":{ + "roll":0.0 + } + }, + { + "tick":71, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "roll":-0.0 + } + }, + { + "tick":10, + "easing": "EASEOUTQUAD", + "turn": 0, + "torso":{ + "pitch":0.0 + } + }, + { + "tick":15, + "easing": "EASEINSINE", + "turn": 0, + "torso":{ + "pitch":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "pitch":0.9649674892425537 + } + }, + { + "tick":55, + "easing": "EASEOUTSINE", + "turn": 0, + "torso":{ + "pitch":5.110422611236572 + } + }, + { + "tick":70, + "easing": "CONSTANT", + "turn": 0, + "torso":{ + "pitch":6.2831854820251465 + } + }, + { + "tick":71, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "pitch":0.0 + } + }, + { + "tick":10, + "easing": "EASEOUTQUAD", + "turn": 0, + "torso":{ + "y":-0.05682346969842911 + } + }, + { + "tick":40, + "easing": "EASEINQUAD", + "turn": 0, + "torso":{ + "y":1.46522855758667 + } + }, + { + "tick":71, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "y":0.0 + } + }, + { + "tick":10, + "easing": "EASEOUTQUAD", + "turn": 0, + "torso":{ + "x":0.0 + } + }, + { + "tick":40, + "easing": "EASEINQUAD", + "turn": 0, + "torso":{ + "x":0.0 + } + }, + { + "tick":71, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "x":0.0 + } + }, + { + "tick":10, + "easing": "EASEOUTQUAD", + "turn": 0, + "torso":{ + "z":-0.0 + } + }, + { + "tick":40, + "easing": "EASEINQUAD", + "turn": 0, + "torso":{ + "z":-0.0 + } + }, + { + "tick":71, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "z":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "rightArm":{ + "yaw":-0.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "rightArm":{ + "yaw":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "yaw":-0.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightArm":{ + "yaw":-0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "yaw":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "rightArm":{ + "roll":-0.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "rightArm":{ + "roll":0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "roll":-0.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightArm":{ + "roll":-0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "roll":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "rightArm":{ + "y":2.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "rightArm":{ + "y":2.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "y":2.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightArm":{ + "y":2.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "y":2.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "rightArm":{ + "z":-0.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "rightArm":{ + "z":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "z":-0.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightArm":{ + "z":-0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "z":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "rightArm":{ + "x":-5.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "rightArm":{ + "x":-5.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "x":-5.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightArm":{ + "x":-5.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "x":-5.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "rightArm":{ + "pitch":-0.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "rightArm":{ + "pitch":-3.4906585216522217 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "pitch":-3.665191411972046 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightArm":{ + "pitch":-2.7925267219543457 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "pitch":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "leftArm":{ + "roll":0.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "leftArm":{ + "roll":0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "roll":0.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftArm":{ + "roll":0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "roll":0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "leftArm":{ + "yaw":-0.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "leftArm":{ + "yaw":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "yaw":-0.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftArm":{ + "yaw":-0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "yaw":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "leftArm":{ + "pitch":0.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "leftArm":{ + "pitch":-3.4906585216522217 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "pitch":-3.665191411972046 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftArm":{ + "pitch":-2.7925267219543457 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "pitch":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "leftArm":{ + "y":2.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "leftArm":{ + "y":2.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "y":2.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftArm":{ + "y":2.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "y":2.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "leftArm":{ + "z":-0.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "leftArm":{ + "z":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "z":-0.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftArm":{ + "z":-0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "z":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "leftArm":{ + "x":5.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "leftArm":{ + "x":5.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "x":5.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftArm":{ + "x":5.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "x":5.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "rightLeg":{ + "yaw":-0.0 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "yaw":-0.0 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "yaw":-0.0 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "yaw":-0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "yaw":-0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "yaw":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "rightLeg":{ + "roll":-0.0 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "roll":-0.0 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "roll":0.0 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "roll":0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "roll":0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "roll":0.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "rightLeg":{ + "pitch":-0.0 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "pitch":0.2617993950843811 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "pitch":-0.0 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "pitch":0.45378559827804565 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "pitch":-0.1745329201221466 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "pitch":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "rightLeg":{ + "x":-1.9 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "x":-1.9 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "x":-1.9 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "x":-1.9 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "x":-1.9 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "x":-1.9 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "rightLeg":{ + "y":12.0 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "y":12.0 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "y":12.0 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "y":12.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "y":12.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "y":12.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "rightLeg":{ + "z":0.1 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "z":0.1 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "z":0.1 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "z":0.1 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "z":0.1 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "z":0.1 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "leftLeg":{ + "yaw":-0.0 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "yaw":-0.0 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "yaw":-0.0 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "yaw":-0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "yaw":-0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "yaw":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "leftLeg":{ + "roll":0.0 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "roll":-0.0 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "roll":-0.0 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "roll":-0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "roll":-0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "roll":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "leftLeg":{ + "pitch":-0.0 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "pitch":0.2617993950843811 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "pitch":-0.0 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "pitch":0.45378559827804565 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "pitch":-0.1745329201221466 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "pitch":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "leftLeg":{ + "y":12.0 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "y":12.0 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "y":12.0 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "y":12.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "y":12.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "y":12.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "leftLeg":{ + "z":-0.1 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "z":-0.1 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "z":-0.1 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "z":-0.1 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "z":-0.1 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "z":-0.1 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "leftLeg":{ + "x":1.9 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "x":1.9 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "x":1.9 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "x":1.9 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "x":1.9 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "x":1.9 + } + } + ] + } +} \ No newline at end of file diff --git a/core/src/test/resources/emotes/cry.json b/core/src/test/resources/emotes/cry.json new file mode 100644 index 0000000..d6a1817 --- /dev/null +++ b/core/src/test/resources/emotes/cry.json @@ -0,0 +1,305 @@ +{ + "version": 1, + "valid": true, + "name": "cry", + "description": "T_T", + "author": "dsty", + "emote": { + "beginTick": 0, + "endTick": 60, + "stopTick": 61, + "isLoop": true, + "returnTick": 5, + "nsfw": false, + "degrees": false, + "moves": [ + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "x": -0.0 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "x": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "y": -0.0 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "y": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "z": -0.0 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "z": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.34134695 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.22808763 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.21269174 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.32248768 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.0874397 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.17582592 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.21476103 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "head": { + "yaw": -6.320644E-4 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.029434478 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.039604172 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.037607383 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.050604735 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "head": { + "roll": -0.00930274 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0010032838 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "head": { + "roll": -0.009209918 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "head": { + "roll": -0.012478679 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "head": { + "roll": 0.031160546 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "y": 2.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -1.8700758 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.4349194 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.4970688 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "bend": -0.9622451 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "x": 5.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "y": 2.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -1.9203311 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.6307226 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.2971223 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "bend": -0.8864816 + } + } + ] + } +} \ No newline at end of file diff --git a/core/src/test/resources/emotes/facepalm.json b/core/src/test/resources/emotes/facepalm.json new file mode 100644 index 0000000..cf79018 --- /dev/null +++ b/core/src/test/resources/emotes/facepalm.json @@ -0,0 +1,389 @@ +{ + "version": 1, + "valid": true, + "name": "facepalm", + "description": "just facepalm", + "author": "dsty", + "emote": { + "beginTick": 0, + "endTick": 60, + "stopTick": 61, + "isLoop": false, + "returnTick": 2, + "nsfw": false, + "degrees": false, + "moves": [ + { + "tick": 10, + "easing": "INOUTQUAD", + "head": { + "x": -0.0 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "x": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "head": { + "y": -0.0 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "y": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "head": { + "z": -0.0 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "z": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.067995355 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.14453278 + } + }, + { + "tick": 30, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.11871816 + } + }, + { + "tick": 40, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.19018666 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.20064461 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.060454715 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.086299464 + } + }, + { + "tick": 30, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.087619215 + } + }, + { + "tick": 40, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.083825104 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.036273066 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0041144555 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "head": { + "roll": 0.12942825 + } + }, + { + "tick": 30, + "easing": "INOUTQUAD", + "head": { + "roll": -0.050149817 + } + }, + { + "tick": 40, + "easing": "INOUTQUAD", + "head": { + "roll": 0.08701207 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "head": { + "roll": 0.08676299 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "x": -3.8523226 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "rightArm": { + "x": -3.8523226 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "y": 2.0 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "rightArm": { + "y": 2.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -2.0664942 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -2.074402 + } + }, + { + "tick": 30, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -2.074402 + } + }, + { + "tick": 40, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -2.02932 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -2.02932 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.47555572 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.5093512 + } + }, + { + "tick": 30, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.5093512 + } + }, + { + "tick": 40, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.38563538 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.38563538 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.20147677 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.20521602 + } + }, + { + "tick": 30, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.3274244 + } + }, + { + "tick": 40, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.30787703 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.40478125 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "bend": -0.49199954 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "bend": -0.54730254 + } + }, + { + "tick": 40, + "easing": "INOUTQUAD", + "rightArm": { + "bend": -0.52019864 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "rightArm": { + "bend": -0.0 + } + } + ] + } +} \ No newline at end of file diff --git a/core/src/test/resources/emotes/front_flip.json b/core/src/test/resources/emotes/front_flip.json new file mode 100644 index 0000000..c97d782 --- /dev/null +++ b/core/src/test/resources/emotes/front_flip.json @@ -0,0 +1,697 @@ +{ + "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 + } + } + ] + } +} \ No newline at end of file diff --git a/core/src/test/resources/emotes/giga_chad.json b/core/src/test/resources/emotes/giga_chad.json new file mode 100644 index 0000000..da2ae51 --- /dev/null +++ b/core/src/test/resources/emotes/giga_chad.json @@ -0,0 +1,5135 @@ +{ + "version": 1, + "valid": true, + "name": "giga_chad", + "description": "The Chaddest of them all", + "author": "Wah0o", + "emote": { + "beginTick": 0, + "endTick": 165, + "stopTick": 166, + "isLoop": true, + "returnTick": 5, + "nsfw": false, + "degrees": false, + "moves": [ + { + "tick": 4, + "easing": "INOUTQUAD", + "head": { + "x": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "x": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "head": { + "x": -0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "head": { + "y": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "y": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "head": { + "y": -0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "head": { + "z": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "z": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "head": { + "z": -0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.0 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.0 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.13989598 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.13989598 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.032506067 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.032506067 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.0 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.0 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.04490119 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.04490119 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.0 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.0 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.13459775 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.13459775 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "head": { + "pitch": -1.5314963 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "head": { + "pitch": -1.5314963 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "head": { + "pitch": -1.1120538 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "head": { + "pitch": -1.1120538 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.14775816 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.14775816 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.037381746 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.037381746 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.037799735 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.037799735 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.060097966 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.060097966 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "head": { + "pitch": -1.286084 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "head": { + "pitch": -1.286084 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.4168441 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.4168441 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "head": { + "yaw": -1.00269 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "head": { + "yaw": -1.00269 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.11216698 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.11216698 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.24195862 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.24195862 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.002758297 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.002758297 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.0013488329 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.0013488329 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0029103598 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0029103598 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "head": { + "yaw": -1.4095863 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "head": { + "yaw": -1.4095863 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "head": { + "yaw": 1.0407902E-4 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "head": { + "yaw": 1.0407902E-4 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.15502043 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.15502043 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.20529102 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.20529102 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.013530715 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.013530715 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.4168441 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "head": { + "roll": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "head": { + "roll": 0.21926047 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "head": { + "roll": 0.21926047 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "head": { + "roll": -0.025936412 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "head": { + "roll": -0.025936412 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "head": { + "roll": -0.0 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "head": { + "roll": -0.0 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "head": { + "roll": 0.015539514 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "head": { + "roll": 0.015539514 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "head": { + "roll": 0.054117903 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "head": { + "roll": 0.054117903 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "head": { + "roll": 9.091206E-5 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "head": { + "roll": 9.091206E-5 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0027981726 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0027981726 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "head": { + "roll": 0.78003484 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "head": { + "roll": 0.78003484 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0014062009 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0014062009 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "head": { + "roll": -0.0 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "head": { + "roll": -0.0 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0016081737 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0016081737 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "head": { + "roll": 0.017228942 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "head": { + "roll": 0.017228942 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "head": { + "roll": -0.018058004 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "head": { + "roll": -0.018058004 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "head": { + "roll": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -1.9 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -2.252326 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -2.252326 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -2.9982228 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -2.9982228 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -2.5480254 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -2.5480254 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -1.9 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -1.9 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -1.7722428 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -1.7722428 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -3.169594 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -3.169594 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -2.252326 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 12.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 10.195459 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 10.195459 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 10.277176 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 10.277176 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 10.025742 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 10.025742 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 12.0 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 12.0 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 11.914537 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 11.914537 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 12.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 12.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 10.195459 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightLeg": { + "z": 0.1 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightLeg": { + "z": -2.9733403 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightLeg": { + "z": -2.9733403 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightLeg": { + "z": -3.4964054 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightLeg": { + "z": -3.4964054 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightLeg": { + "z": 0.1 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightLeg": { + "z": 0.1 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightLeg": { + "z": -1.5458566 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightLeg": { + "z": -1.5458566 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightLeg": { + "z": -2.9733403 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.33713692 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.33713692 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.3196764 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.3196764 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.0 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.0 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.027517445 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.027517445 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.047809538 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.047809538 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.0026976853 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.0026976853 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.03274877 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.03274877 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.007906961 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.007906961 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.07262061 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.07262061 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 5.0244353E-10 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 5.0244353E-10 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.0 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.0 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.22003074 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.22003074 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -1.5668823 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -1.5668823 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.9465621 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.9465621 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.33713692 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.37796307 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.37796307 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.76882756 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.76882756 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.27188113 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.27188113 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.26609528 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.26609528 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.2948 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.2948 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.26220575 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.26220575 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.039796446 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.039796446 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.39853075 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.39853075 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 2.5175512E-5 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 2.5175512E-5 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.38755667 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.38755667 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.10965421 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.10965421 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.660008 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.660008 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": -0.018245801 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": -0.018245801 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 1.5213028 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 1.5213028 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.6063431 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.6063431 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.37796307 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -0.025020538 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -0.025020538 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.048341107 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.048341107 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.069259174 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.069259174 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.1402302 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.1402302 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.20118771 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.20118771 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.095185064 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.095185064 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -7.341183E-7 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -7.341183E-7 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.21809976 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.21809976 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 6.93035E-4 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 6.93035E-4 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.061397005 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.061397005 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -0.0 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.0 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.22244482 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.22244482 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.08971669 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.08971669 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 2.2946439 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 2.2946439 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -0.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -0.025020538 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.9686313 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.9686313 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.0 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.0 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightArm": { + "x": -6.0498323 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightArm": { + "x": -6.0498323 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.9686313 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightArm": { + "y": 2.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "y": 2.0 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightArm": { + "y": 2.0 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightArm": { + "y": 3.9937258 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightArm": { + "y": 3.9937258 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightArm": { + "y": 2.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "z": -1.961665 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightArm": { + "z": -1.961665 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightArm": { + "z": -1.9947729E-8 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightArm": { + "z": -1.9947729E-8 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightArm": { + "z": -1.961665 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 0.0 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 0.0 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.87733024 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.87733024 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.8773303 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.8773303 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.0 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.0 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.037967823 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.037967823 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 0.67362005 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 0.67362005 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.67564476 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.67564476 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -3.142549 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -3.142549 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 2.9807994 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 2.9807994 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 1.693267 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 1.693267 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.0014576487 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.0014576487 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 0.65763783 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 0.65763783 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -3.4441948 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -3.4441948 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -3.149893 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -3.149893 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.65401036 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.65401036 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -3.1320117 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -3.1320117 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.7990288 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.7990288 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.8078986 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.8078986 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.8078987 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.8078987 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.31803387 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.31803387 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.14138679 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.14138679 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.0 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.0 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.9297993 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.9297993 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 0.2030788 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 0.2030788 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 1.0315573 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 1.0315573 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 0.010718631 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 0.010718631 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.049475487 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.049475487 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.21283935 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.21283935 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 0.88883036 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 0.88883036 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.0376238 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.0376238 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 1.4946102 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 1.4946102 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -1.3037015 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -1.3037015 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.7990288 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.30187678 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.30187678 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.2721525 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.2721525 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.18416819 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.18416819 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.09789227 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.09789227 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.2198998 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.2198998 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.48504347 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.48504347 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.67907065 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.67907065 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -6.110932E-5 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -6.110932E-5 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 4.3807907 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 4.3807907 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.009480219 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.009480219 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.029465547 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.029465547 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.6154332 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.6154332 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.8863503 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.8863503 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 1.5616314E-4 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 1.5616314E-4 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 1.8965981 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 1.8965981 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.2532393 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.2532393 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.30187678 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftArm": { + "x": 5.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "x": 5.0 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "leftArm": { + "x": 5.0 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "leftArm": { + "x": 2.9568586 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "leftArm": { + "x": 2.9568586 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "leftArm": { + "x": 5.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftArm": { + "x": 5.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftArm": { + "y": 2.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "y": 4.0875206 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftArm": { + "y": 4.0875206 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftArm": { + "y": 2.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftArm": { + "y": 2.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftArm": { + "y": 4.0875206 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "leftArm": { + "z": -2.203474 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "leftArm": { + "z": -2.203474 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.51976997 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.51976997 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.6709974 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.6709974 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.6709973 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.6709973 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.0 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.0 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.30776563 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.30776563 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.65677315 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.65677315 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -1.6417192 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -1.6417192 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 3.1355157 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 3.1355157 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.0010496362 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.0010496362 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 1.6392988 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 1.6392988 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.0025698922 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.0025698922 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.5024246 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.5024246 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -2.8041947 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -2.8041947 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -3.1532238 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -3.1532238 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.0 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.0 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -1.1308259 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -1.1308259 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.51976997 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 1.172347 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 1.172347 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.037808705 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.037808705 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.037808713 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.037808713 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.62366265 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.62366265 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.7531556 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.7531556 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.0 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.0 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 1.2664338 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 1.2664338 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.13954905 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.13954905 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.013174082 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.013174082 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.010205563 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.010205563 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.06644766 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.06644766 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.010088136 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.010088136 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.6029994 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.6029994 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.03762318 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.03762318 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.0 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.0 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.44563633 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.44563633 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 1.172347 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.48641014 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.48641014 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.10834044 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.10834044 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.5676788 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.5676788 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.07504642 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.07504642 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.006862871 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.006862871 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.5692944 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.5692944 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.0 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.0 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -2.8592016E-5 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -2.8592016E-5 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -1.7287096 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -1.7287096 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.009529364 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.009529364 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.038684685 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.038684685 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.31971967 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.31971967 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.88968116 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.88968116 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 2.188246E-4 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 2.188246E-4 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -2.1538641 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -2.1538641 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.48641014 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftLeg": { + "x": 1.9 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftLeg": { + "x": 2.338033 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftLeg": { + "x": 2.338033 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftLeg": { + "x": 2.4034452 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftLeg": { + "x": 2.4034452 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftLeg": { + "x": 1.9 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftLeg": { + "x": 1.9 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftLeg": { + "x": 2.338033 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 12.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 9.917855 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 9.917855 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 10.922021 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 10.922021 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 10.576937 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 10.576937 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 12.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 12.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 9.917855 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftLeg": { + "z": -0.1 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftLeg": { + "z": -3.7886016 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftLeg": { + "z": -3.7886016 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftLeg": { + "z": -3.7174206 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftLeg": { + "z": -3.7174206 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftLeg": { + "z": -0.1 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftLeg": { + "z": -0.1 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftLeg": { + "z": -3.7886016 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.28943428 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.28943428 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.29512814 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.29512814 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.0 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.0 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.01708789 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.01708789 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.04704775 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.04704775 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.0030718336 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.0030718336 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.043501973 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.043501973 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.0 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.0 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -1.5781744 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -1.5781744 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 3.203295E-12 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 3.203295E-12 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.13094698 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.13094698 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.109108955 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.109108955 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -1.5687531 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -1.5687531 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.28943428 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.24234551 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.24234551 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.04647371 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.04647371 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.046473704 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.046473704 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.14872508 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.14872508 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.27384213 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.27384213 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.22910896 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.22910896 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.29659358 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.29659358 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.09799422 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.09799422 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.0 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.0 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": 0.009622238 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": 0.009622238 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.37212652 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.37212652 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": 0.22992273 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": 0.22992273 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.297723 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.297723 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.01908363 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.01908363 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.0 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.0 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.16646482 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.16646482 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.24234551 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.07622462 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.07622462 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.066452764 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.066452764 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.18356355 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.18356355 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.04682022 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.04682022 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.0011612747 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.0011612747 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.16643818 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.16643818 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.09162157 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.09162157 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -1.1308775E-5 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -1.1308775E-5 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": 0.19563156 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": 0.19563156 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": 0.009551507 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": 0.009551507 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.08669772 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.08669772 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.02894436 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.02894436 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.1509232 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.1509232 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.1525886 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.1525886 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.73833025 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.73833025 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": 0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.07622462 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "body": { + "x": -0.04586473 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "body": { + "x": 0.019460544 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "body": { + "x": -0.14749607 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "body": { + "x": -0.055940144 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "body": { + "x": -0.04586473 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "body": { + "x": 0.019460544 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "body": { + "x": -0.16599017 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "body": { + "x": -0.15493058 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "body": { + "x": -0.1035458 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "body": { + "x": 0.025333587 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "body": { + "x": -0.11034301 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "body": { + "x": -0.21000633 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "body": { + "x": 0.26974648 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "body": { + "x": -0.22764045 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "body": { + "x": -0.15241866 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "body": { + "x": -0.16667084 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "body": { + "x": -0.21193272 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "body": { + "x": -0.29072618 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "body": { + "x": 0.2166983 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "body": { + "x": -0.14110439 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "body": { + "x": -0.04586473 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "body": { + "y": -0.1720419 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "body": { + "y": -0.1720419 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "body": { + "y": -0.1720419 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "body": { + "y": -0.1720419 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "body": { + "y": 0.5178939 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "body": { + "y": 0.5178939 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "body": { + "y": 0.28458548 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "body": { + "y": 0.28458548 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "body": { + "y": 0.4809237 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "body": { + "y": 0.4809237 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "body": { + "y": 0.4706339 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "body": { + "y": 0.4706339 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "body": { + "y": -0.1720419 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "body": { + "z": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "body": { + "z": -0.0 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "body": { + "z": -0.0 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "body": { + "z": 0.011486796 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "body": { + "z": 0.011486796 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "body": { + "z": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "body": { + "z": -0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "body": { + "pitch": 0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "body": { + "pitch": 0.0 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "body": { + "pitch": -0.0 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "body": { + "pitch": 0.23216064 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "body": { + "pitch": 0.23216064 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "body": { + "pitch": 0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "body": { + "pitch": 0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "body": { + "yaw": -1.3986131 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "body": { + "yaw": -1.3986131 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "body": { + "yaw": -0.07036926 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "body": { + "yaw": -0.07036926 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "body": { + "yaw": -0.07036925 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "body": { + "yaw": -0.07036925 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "body": { + "yaw": 1.5803477 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "body": { + "yaw": 1.5803477 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "body": { + "yaw": -0.11275339 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "body": { + "yaw": -0.11275339 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.43098667 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.43098667 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "body": { + "yaw": -1.5896086 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "body": { + "yaw": -1.5896086 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "body": { + "roll": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "body": { + "roll": -0.0 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "body": { + "roll": 0.0 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "body": { + "roll": -0.10164733 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "body": { + "roll": -0.10164733 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "body": { + "roll": -0.0 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "body": { + "roll": -0.0 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "body": { + "roll": -0.061503474 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "body": { + "roll": -0.061503474 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "body": { + "roll": -0.037977725 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "body": { + "roll": -0.037977725 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "body": { + "roll": -0.010051205 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "body": { + "roll": -0.010051205 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "body": { + "roll": -3.1445053 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "body": { + "roll": -3.1445053 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "body": { + "roll": 1.7155838 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "body": { + "roll": 1.7155838 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "body": { + "roll": -1.6908722 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "body": { + "roll": -1.6908722 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "body": { + "roll": -0.0 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "body": { + "roll": 0.0 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "body": { + "roll": 0.030365204 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "body": { + "roll": 0.030365204 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "body": { + "roll": -3.145151 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "body": { + "roll": -3.145151 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "body": { + "roll": 2.160377 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "body": { + "roll": 2.160377 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "body": { + "roll": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "body": { + "roll": -0.0 + } + } + ] + } +} \ No newline at end of file diff --git a/core/src/test/resources/emotes/tpose.json b/core/src/test/resources/emotes/tpose.json new file mode 100644 index 0000000..abd421f --- /dev/null +++ b/core/src/test/resources/emotes/tpose.json @@ -0,0 +1,354 @@ +{ + "version": 1, + "valid": true, + "name": "tpose", + "description": "MENACING", + "author": "stephanieisdumb", + "emote": { + "beginTick": 0, + "endTick": 80, + "stopTick": 81, + "isLoop": true, + "returnTick": 20, + "nsfw": false, + "degrees": false, + "moves": [ + { + "tick": 10, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.0 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "x": -6.0 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "rightArm": { + "x": -6.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "rightArm": { + "y": 2.0 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "y": 3.0 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "rightArm": { + "y": 3.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -1.0704756 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.0 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 0.059108086 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.61077195 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.0 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.008776078 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.6060502 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 1.5707964 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 1.5765934 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 1.5707964 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "rightArm": { + "bend": -1.3806202 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "bend": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "leftArm": { + "x": 5.0 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "leftArm": { + "x": 6.0 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "leftArm": { + "x": 6.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "leftArm": { + "y": 2.0 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "leftArm": { + "y": 3.0 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "leftArm": { + "y": 3.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -1.0045553 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.0 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.010133168 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.44322997 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.0 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.038214765 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.5571526 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -1.5707964 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -1.5692185 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -1.5707964 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "leftArm": { + "bend": -1.3810014 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "leftArm": { + "bend": -0.0 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.0 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.0 + } + } + ] + } +} \ No newline at end of file diff --git a/src/main/java/org/saturnclient/emotes/fabric/Emotes.java b/src/main/java/org/saturnclient/emotes/fabric/Emotes.java index 957fd76..b5e2ca0 100644 --- a/src/main/java/org/saturnclient/emotes/fabric/Emotes.java +++ b/src/main/java/org/saturnclient/emotes/fabric/Emotes.java @@ -7,6 +7,8 @@ import java.util.concurrent.ConcurrentHashMap; import org.saturnclient.emotes.core.Animation; import org.saturnclient.emotes.core.AnimationPlayer; +import org.saturnclient.emotes.core.Emote; +import org.saturnclient.emotes.core.EmoteRegistry; import org.saturnclient.emotes.core.Pose; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,6 +22,7 @@ public final class Emotes implements ClientModInitializer { public static final String VERSION = /*$ mod_version*/ "0.1.0"; public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); + private static final EmoteRegistry REGISTRY = new EmoteRegistry(); private static final Map PLAYING = new ConcurrentHashMap<>(); private static long tick; @@ -31,11 +34,27 @@ public final class Emotes implements ClientModInitializer { }); } + /** The emotes {@link #play(UUID, String)} looks up. Load or register emotes into it at startup. */ + public static EmoteRegistry registry() { + return REGISTRY; + } + /** Starts {@code animation} on the player, replacing whatever they were playing. */ public static void play(UUID player, Animation animation) { PLAYING.put(player, new AnimationPlayer(animation, tick)); } + /** + * Starts the registered emote {@code id} on the player. + * + * @return false if no emote has that ID, in which case nothing changes + */ + public static boolean play(UUID player, String id) { + Optional emote = REGISTRY.get(id); + emote.ifPresent(e -> play(player, e.animation())); + return emote.isPresent(); + } + public static void stop(UUID player) { PLAYING.remove(player); } diff --git a/src/main/java/org/saturnclient/emotes/fabric/PoseApplier.java b/src/main/java/org/saturnclient/emotes/fabric/PoseApplier.java index ef1e305..ec97240 100644 --- a/src/main/java/org/saturnclient/emotes/fabric/PoseApplier.java +++ b/src/main/java/org/saturnclient/emotes/fabric/PoseApplier.java @@ -23,9 +23,17 @@ public final class PoseApplier { private PoseApplier() { } + /** Where {@link Bone#ROOT} turns around, in model pixels below the neck (0.7 blocks above the feet). */ + private static final float ROOT_PIVOT_Y = 12.8f; + public static void apply(HumanoidModel model, Pose pose) { + pose.get(Bone.ROOT).ifPresent(transform -> applyRoot(model.root(), transform)); + LimbBend bodyBend = null; for (Bone bone : Bone.values()) { + if (bone == Bone.ROOT) { + continue; + } ModelPart part = part(model, bone); BoneTransform transform = pose.get(bone).orElse(null); if (transform != null) { @@ -49,6 +57,7 @@ public final class PoseApplier { private static ModelPart part(HumanoidModel model, Bone bone) { return switch (bone) { + case ROOT -> model.root(); case HEAD -> model.head; case BODY -> model.body; case RIGHT_ARM -> model.rightArm; @@ -68,6 +77,21 @@ public final class PoseApplier { part.zRot = transform.roll(); } + /** + * The root part turns around its own pivot, which is at the neck. Move it so the model turns around + * its middle instead: a point p ends up at offset + pivot + R (p - pivot). + */ + private static void applyRoot(ModelPart root, BoneTransform transform) { + root.xRot = transform.pitch(); + root.yRot = transform.yaw(); + root.zRot = transform.roll(); + Vector3f pivot = new Vector3f(0, ROOT_PIVOT_Y, 0); + Vector3f turned = rotation(root).transform(new Vector3f(pivot)); + root.x += transform.x() + pivot.x - turned.x; + root.y += transform.y() + pivot.y - turned.y; + root.z += transform.z() + pivot.z - turned.z; + } + private static LimbBend bend(Bone bone, BoneTransform transform) { if (transform == null || transform.bend() == 0) { return null; @@ -78,7 +102,7 @@ public final class PoseApplier { float bend = transform.bend(); float axis = transform.bendAxis(); return switch (bone) { - case HEAD -> null; + case ROOT, HEAD -> null; case RIGHT_ARM, LEFT_ARM -> new LimbBend(-2, 10, bend, axis, SHARPNESS, 12); case RIGHT_LEG, LEFT_LEG -> new LimbBend(0, 12, bend, axis, SHARPNESS, 12); // The hips stay on the legs and the chest leans. diff --git a/src/testmod/java/org/saturnclient/emotes/testmod/EmotesGameTest.java b/src/testmod/java/org/saturnclient/emotes/testmod/EmotesGameTest.java index 48fbff7..816fed7 100644 --- a/src/testmod/java/org/saturnclient/emotes/testmod/EmotesGameTest.java +++ b/src/testmod/java/org/saturnclient/emotes/testmod/EmotesGameTest.java @@ -1,5 +1,6 @@ package org.saturnclient.emotes.testmod; +import org.saturnclient.emotes.core.EmoteRegistry; import org.saturnclient.emotes.fabric.Emotes; import net.fabricmc.fabric.api.client.gametest.v1.FabricClientGameTest; @@ -15,19 +16,35 @@ import net.minecraft.client.CameraType; public final class EmotesGameTest implements FabricClientGameTest { private static final String MINECRAFT = /*$ minecraft*/ "1.21.11"; - /** Animation name, the tick to screenshot it at, and the angles to look from (0 is the front). */ + /** What to play, the tick to screenshot it at, and the angles to look from (0 is the front). */ private static final Shot[] SHOTS = { - new Shot("tpose", 10, 0, 90), - new Shot("bend", 20, 0, 90), - new Shot("flap", 15, 0, 90), - new Shot("squat", 20, 0, 90), - new Shot("bow", 20, 0, 90), + Shot.test("tpose", 10, 0, 90), + Shot.test("bend", 20, 0, 90), + Shot.test("flap", 15, 0, 90), + Shot.test("squat", 20, 0, 90), + Shot.test("bow", 20, 0, 90), // Top and bottom of the bounce. - new Shot("twerk", 16, 0, 90, 150), - new Shot("twerk", 4, 0, 90, 150), + Shot.test("twerk", 16, 0, 90, 150), + Shot.test("twerk", 4, 0, 90, 150), + // Saturn's emotes, loaded from Emotecraft JSON into the library's registry. + Shot.emote("facepalm", 40, 0, 90), + Shot.emote("cry", 30, 0, 90), + Shot.emote("tpose", 30, 0), + Shot.emote("front_flip", 9, 90), + Shot.emote("back_flip", 30, 90), + Shot.emote("back_flip", 50, 90), + Shot.emote("giga_chad", 60, 0, 90), }; - private record Shot(String animation, int tick, float... angles) { + /** A test animation or a registered emote, named apart in screenshots since IDs can repeat. */ + private record Shot(EmoteRegistry registry, String prefix, String id, int tick, float... angles) { + static Shot test(String id, int tick, float... angles) { + return new Shot(TestAnimations.REGISTRY, "test-", id, tick, angles); + } + + static Shot emote(String id, int tick, float... angles) { + return new Shot(Emotes.registry(), "", id, tick, angles); + } } @Override @@ -42,17 +59,18 @@ public final class EmotesGameTest implements FabricClientGameTest { for (Shot shot : SHOTS) { context.runOnClient(client -> Emotes.play(client.player.getUUID(), - TestAnimations.ALL.get(shot.animation()))); + shot.registry().get(shot.id()).orElseThrow().animation())); context.waitTicks(shot.tick()); for (float angle : shot.angles()) { - screenshot(context, shot.animation() + "-t" + shot.tick() + "-" + (int) angle, angle); + screenshot(context, shot.prefix() + shot.id() + "-t" + shot.tick() + "-" + (int) angle, angle); } context.runOnClient(client -> Emotes.stop(client.player.getUUID())); } // A held item should come out of the fist on the bent forearm. singleplayer.getServer().runCommand("give @a diamond_sword"); - context.runOnClient(client -> Emotes.play(client.player.getUUID(), TestAnimations.ALL.get("hold"))); + context.runOnClient(client -> Emotes.play(client.player.getUUID(), + TestAnimations.REGISTRY.get("hold").orElseThrow().animation())); context.waitTicks(10); screenshot(context, "hold-0", 0); screenshot(context, "hold-90", 90); diff --git a/src/testmod/java/org/saturnclient/emotes/testmod/EmotesTestmod.java b/src/testmod/java/org/saturnclient/emotes/testmod/EmotesTestmod.java index fa09878..92c1103 100644 --- a/src/testmod/java/org/saturnclient/emotes/testmod/EmotesTestmod.java +++ b/src/testmod/java/org/saturnclient/emotes/testmod/EmotesTestmod.java @@ -3,9 +3,13 @@ package org.saturnclient.emotes.testmod; import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument; import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; -import java.util.TreeSet; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Optional; -import org.saturnclient.emotes.core.Animation; +import org.saturnclient.emotes.core.Emote; +import org.saturnclient.emotes.core.EmoteRegistry; import org.saturnclient.emotes.fabric.Emotes; import org.spongepowered.asm.mixin.MixinEnvironment; @@ -18,46 +22,70 @@ import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.network.chat.Component; /** - * Dev-only tester. In game: {@code /emotes play }, {@code /emotes stop}, {@code /emotes info}. + * Dev-only tester. In game: {@code /emotes play } plays an emote from the library's registry + * (Saturn's emotes, loaded here), {@code /emotes test } plays one of the testmod's own + * {@link TestAnimations}, and there's {@code /emotes stop} and {@code /emotes info}. * Switch to third person (F5) to see yourself. */ public final class EmotesTestmod implements ClientModInitializer { private static final String MINECRAFT = /*$ minecraft*/ "1.21.11"; + /** Saturn Client's emotes, in Emotecraft's format, from assets/saturn_emotes_testmod/player_animations. */ + static final List EMOTECRAFT_EMOTES = List.of("back_flip", "cry", "facepalm", "front_flip", + "giga_chad", "tpose"); @Override public void onInitializeClient() { // Applies every mixin now, so a broken target crashes at startup instead of in a world. MixinEnvironment.getCurrentEnvironment().audit(); Emotes.LOGGER.info("Mixin audit passed on Minecraft {}", MINECRAFT); + loadEmotes(); ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register( literal("emotes") - .then(literal("play").then(argument("name", StringArgumentType.word()) + .then(literal("play").then(argument("id", StringArgumentType.word()) .suggests((ctx, builder) -> { - TestAnimations.ALL.keySet().forEach(builder::suggest); + Emotes.registry().ids().forEach(builder::suggest); return builder.buildFuture(); }) - .executes(EmotesTestmod::play))) + .executes(ctx -> play(ctx, Emotes.registry(), "id")))) + .then(literal("test").then(argument("name", StringArgumentType.word()) + .suggests((ctx, builder) -> { + TestAnimations.REGISTRY.ids().forEach(builder::suggest); + return builder.buildFuture(); + }) + .executes(ctx -> play(ctx, TestAnimations.REGISTRY, "name")))) .then(literal("stop").executes(ctx -> { Emotes.stop(ctx.getSource().getPlayer().getUUID()); return 1; })) .then(literal("info").executes(ctx -> { ctx.getSource().sendFeedback(Component.literal("Saturn Emotes " + Emotes.VERSION - + " on Minecraft " + MINECRAFT + ". Animations: " - + String.join(", ", new TreeSet<>(TestAnimations.ALL.keySet())))); + + " on Minecraft " + MINECRAFT + ". Emotes: " + + String.join(", ", Emotes.registry().ids()) + ". Test animations: " + + String.join(", ", TestAnimations.REGISTRY.ids()))); return 1; })))); } - private static int play(CommandContext ctx) { - String name = StringArgumentType.getString(ctx, "name"); - Animation animation = TestAnimations.ALL.get(name); - if (animation == null) { - ctx.getSource().sendError(Component.literal("Unknown animation: " + name)); + private static void loadEmotes() { + for (String id : EMOTECRAFT_EMOTES) { + String path = "/assets/saturn_emotes_testmod/player_animations/" + id + ".json"; + try (InputStream in = EmotesTestmod.class.getResourceAsStream(path)) { + Emotes.registry().loadEmotecraft(id, in); + } catch (IOException | NullPointerException e) { + Emotes.LOGGER.error("Couldn't load emote {}", id, e); + } + } + } + + private static int play(CommandContext ctx, EmoteRegistry registry, String argument) { + String id = StringArgumentType.getString(ctx, argument); + Optional emote = registry.get(id); + if (emote.isEmpty()) { + ctx.getSource().sendError(Component.literal("Unknown: " + id)); return 0; } - Emotes.play(ctx.getSource().getPlayer().getUUID(), animation); + Emotes.play(ctx.getSource().getPlayer().getUUID(), emote.get().animation()); return 1; } } diff --git a/src/testmod/java/org/saturnclient/emotes/testmod/TestAnimations.java b/src/testmod/java/org/saturnclient/emotes/testmod/TestAnimations.java index 6573576..f0e697d 100644 --- a/src/testmod/java/org/saturnclient/emotes/testmod/TestAnimations.java +++ b/src/testmod/java/org/saturnclient/emotes/testmod/TestAnimations.java @@ -1,18 +1,24 @@ package org.saturnclient.emotes.testmod; import java.util.Map; +import java.util.TreeMap; import java.util.function.Function; import org.saturnclient.emotes.core.Animation; import org.saturnclient.emotes.core.Bone; +import org.saturnclient.emotes.core.Emote; +import org.saturnclient.emotes.core.EmoteRegistry; import org.saturnclient.emotes.core.BoneTransform; import org.saturnclient.emotes.core.Pose; -/** Hand-written animations for checking that poses reach the model on every version. */ +/** + * Hand-written animations for checking that poses reach the model on every version. They live in the + * testmod's own registry, separate from the library's {@code Emotes.registry()}. + */ final class TestAnimations { private static final float HALF_PI = (float) (Math.PI / 2); - static final Map ALL = Map.of( + private static final Map ALL = Map.of( // Right arm raised, waving side to side. Tests rotation. "wave", of(40, true, t -> Pose.builder() .set(Bone.RIGHT_ARM, BoneTransform.rotation((float) Math.PI, 0, @@ -75,6 +81,13 @@ final class TestAnimations { private TestAnimations() { } + static final EmoteRegistry REGISTRY = new EmoteRegistry(); + + static { + new TreeMap<>(ALL).forEach((id, animation) -> + REGISTRY.register(new Emote(id, id, "Test animation", "Saturn Emotes testmod", animation))); + } + /** * Squatting with knees out and hips pushed back, bouncing the hips about 2.5 times a second. The * torso tips forward around the hips and bends backwards, so the lower back arches in (not a diff --git a/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/back_flip.json b/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/back_flip.json new file mode 100644 index 0000000..3a15c12 --- /dev/null +++ b/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/back_flip.json @@ -0,0 +1,1385 @@ +{ + "name": "back_flip", + "author": "Kale Ko", + "description": "Makes You Do A Back Flip", + "uuid": "ebfb1e69-330a-4970-8bca-f5625c90681a", + "emote":{ + "isLoop": "false", + "returnTick": 2, + "beginTick":0, + "endTick":80, + "stopTick":81, + "degrees":false, + "moves":[ + + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "head":{ + "y":-0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "head":{ + "y":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "head":{ + "z":-0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "head":{ + "z":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "head":{ + "x":-0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "head":{ + "x":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "head":{ + "yaw":-0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "head":{ + "yaw":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "head":{ + "roll":0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "head":{ + "roll":0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "head":{ + "pitch":-0.2994975745677948 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "head":{ + "pitch":-0.0 + } + }, + { + "tick":10, + "easing": "EASEOUTQUAD", + "turn": 0, + "torso":{ + "yaw":0.0 + } + }, + { + "tick":15, + "easing": "EASEINSINE", + "turn": 0, + "torso":{ + "yaw":0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "yaw":0.0 + } + }, + { + "tick":55, + "easing": "EASEOUTSINE", + "turn": 0, + "torso":{ + "yaw":0.0 + } + }, + { + "tick":70, + "easing": "CONSTANT", + "turn": 0, + "torso":{ + "yaw":0.0 + } + }, + { + "tick":71, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "yaw":0.0 + } + }, + { + "tick":10, + "easing": "EASEOUTQUAD", + "turn": 0, + "torso":{ + "roll":-0.0 + } + }, + { + "tick":15, + "easing": "EASEINSINE", + "turn": 0, + "torso":{ + "roll":0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "roll":0.0 + } + }, + { + "tick":55, + "easing": "EASEOUTSINE", + "turn": 0, + "torso":{ + "roll":0.0 + } + }, + { + "tick":70, + "easing": "CONSTANT", + "turn": 0, + "torso":{ + "roll":0.0 + } + }, + { + "tick":71, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "roll":-0.0 + } + }, + { + "tick":10, + "easing": "EASEOUTQUAD", + "turn": 0, + "torso":{ + "pitch":0.0 + } + }, + { + "tick":15, + "easing": "EASEINSINE", + "turn": 0, + "torso":{ + "pitch":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "pitch":0.9649674892425537 + } + }, + { + "tick":55, + "easing": "EASEOUTSINE", + "turn": 0, + "torso":{ + "pitch":5.110422611236572 + } + }, + { + "tick":70, + "easing": "CONSTANT", + "turn": 0, + "torso":{ + "pitch":6.2831854820251465 + } + }, + { + "tick":71, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "pitch":0.0 + } + }, + { + "tick":10, + "easing": "EASEOUTQUAD", + "turn": 0, + "torso":{ + "y":-0.05682346969842911 + } + }, + { + "tick":40, + "easing": "EASEINQUAD", + "turn": 0, + "torso":{ + "y":1.46522855758667 + } + }, + { + "tick":71, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "y":0.0 + } + }, + { + "tick":10, + "easing": "EASEOUTQUAD", + "turn": 0, + "torso":{ + "x":0.0 + } + }, + { + "tick":40, + "easing": "EASEINQUAD", + "turn": 0, + "torso":{ + "x":0.0 + } + }, + { + "tick":71, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "x":0.0 + } + }, + { + "tick":10, + "easing": "EASEOUTQUAD", + "turn": 0, + "torso":{ + "z":-0.0 + } + }, + { + "tick":40, + "easing": "EASEINQUAD", + "turn": 0, + "torso":{ + "z":-0.0 + } + }, + { + "tick":71, + "easing": "LINEAR", + "turn": 0, + "torso":{ + "z":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "rightArm":{ + "yaw":-0.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "rightArm":{ + "yaw":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "yaw":-0.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightArm":{ + "yaw":-0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "yaw":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "rightArm":{ + "roll":-0.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "rightArm":{ + "roll":0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "roll":-0.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightArm":{ + "roll":-0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "roll":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "rightArm":{ + "y":2.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "rightArm":{ + "y":2.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "y":2.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightArm":{ + "y":2.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "y":2.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "rightArm":{ + "z":-0.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "rightArm":{ + "z":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "z":-0.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightArm":{ + "z":-0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "z":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "rightArm":{ + "x":-5.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "rightArm":{ + "x":-5.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "x":-5.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightArm":{ + "x":-5.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "x":-5.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "rightArm":{ + "pitch":-0.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "rightArm":{ + "pitch":-3.4906585216522217 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "pitch":-3.665191411972046 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightArm":{ + "pitch":-2.7925267219543457 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightArm":{ + "pitch":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "leftArm":{ + "roll":0.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "leftArm":{ + "roll":0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "roll":0.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftArm":{ + "roll":0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "roll":0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "leftArm":{ + "yaw":-0.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "leftArm":{ + "yaw":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "yaw":-0.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftArm":{ + "yaw":-0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "yaw":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "leftArm":{ + "pitch":0.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "leftArm":{ + "pitch":-3.4906585216522217 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "pitch":-3.665191411972046 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftArm":{ + "pitch":-2.7925267219543457 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "pitch":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "leftArm":{ + "y":2.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "leftArm":{ + "y":2.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "y":2.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftArm":{ + "y":2.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "y":2.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "leftArm":{ + "z":-0.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "leftArm":{ + "z":-0.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "z":-0.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftArm":{ + "z":-0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "z":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINSINE", + "turn": 0, + "leftArm":{ + "x":5.0 + } + }, + { + "tick":15, + "easing": "EASEOUTQUART", + "turn": 0, + "leftArm":{ + "x":5.0 + } + }, + { + "tick":24, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "x":5.0 + } + }, + { + "tick":55, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftArm":{ + "x":5.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftArm":{ + "x":5.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "rightLeg":{ + "yaw":-0.0 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "yaw":-0.0 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "yaw":-0.0 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "yaw":-0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "yaw":-0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "yaw":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "rightLeg":{ + "roll":-0.0 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "roll":-0.0 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "roll":0.0 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "roll":0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "roll":0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "roll":0.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "rightLeg":{ + "pitch":-0.0 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "pitch":0.2617993950843811 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "pitch":-0.0 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "pitch":0.45378559827804565 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "pitch":-0.1745329201221466 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "pitch":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "rightLeg":{ + "x":-1.9 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "x":-1.9 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "x":-1.9 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "x":-1.9 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "x":-1.9 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "x":-1.9 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "rightLeg":{ + "y":12.0 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "y":12.0 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "y":12.0 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "y":12.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "y":12.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "y":12.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "rightLeg":{ + "z":0.1 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "z":0.1 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "z":0.1 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "rightLeg":{ + "z":0.1 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "z":0.1 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "rightLeg":{ + "z":0.1 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "leftLeg":{ + "yaw":-0.0 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "yaw":-0.0 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "yaw":-0.0 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "yaw":-0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "yaw":-0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "yaw":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "leftLeg":{ + "roll":0.0 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "roll":-0.0 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "roll":-0.0 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "roll":-0.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "roll":-0.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "roll":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "leftLeg":{ + "pitch":-0.0 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "pitch":0.2617993950843811 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "pitch":-0.0 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "pitch":0.45378559827804565 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "pitch":-0.1745329201221466 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "pitch":-0.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "leftLeg":{ + "y":12.0 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "y":12.0 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "y":12.0 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "y":12.0 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "y":12.0 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "y":12.0 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "leftLeg":{ + "z":-0.1 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "z":-0.1 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "z":-0.1 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "z":-0.1 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "z":-0.1 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "z":-0.1 + } + }, + { + "tick":1, + "easing": "EASEINOUTQUAD", + "turn": 0, + "leftLeg":{ + "x":1.9 + } + }, + { + "tick":5, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "x":1.9 + } + }, + { + "tick":15, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "x":1.9 + } + }, + { + "tick":24, + "easing": "EASEINOUTSINE", + "turn": 0, + "leftLeg":{ + "x":1.9 + } + }, + { + "tick":55, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "x":1.9 + } + }, + { + "tick":70, + "easing": "LINEAR", + "turn": 0, + "leftLeg":{ + "x":1.9 + } + } + ] + } +} \ No newline at end of file diff --git a/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/cry.json b/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/cry.json new file mode 100644 index 0000000..d6a1817 --- /dev/null +++ b/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/cry.json @@ -0,0 +1,305 @@ +{ + "version": 1, + "valid": true, + "name": "cry", + "description": "T_T", + "author": "dsty", + "emote": { + "beginTick": 0, + "endTick": 60, + "stopTick": 61, + "isLoop": true, + "returnTick": 5, + "nsfw": false, + "degrees": false, + "moves": [ + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "x": -0.0 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "x": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "y": -0.0 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "y": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "z": -0.0 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "z": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.34134695 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.22808763 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.21269174 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.32248768 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.0874397 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.17582592 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.21476103 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "head": { + "yaw": -6.320644E-4 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.029434478 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.039604172 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.037607383 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.050604735 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "head": { + "roll": -0.00930274 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0010032838 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "head": { + "roll": -0.009209918 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "head": { + "roll": -0.012478679 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "head": { + "roll": 0.031160546 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "y": 2.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -1.8700758 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.4349194 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.4970688 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "bend": -0.9622451 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "x": 5.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "y": 2.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -1.9203311 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.6307226 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.2971223 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "bend": -0.8864816 + } + } + ] + } +} \ No newline at end of file diff --git a/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/facepalm.json b/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/facepalm.json new file mode 100644 index 0000000..cf79018 --- /dev/null +++ b/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/facepalm.json @@ -0,0 +1,389 @@ +{ + "version": 1, + "valid": true, + "name": "facepalm", + "description": "just facepalm", + "author": "dsty", + "emote": { + "beginTick": 0, + "endTick": 60, + "stopTick": 61, + "isLoop": false, + "returnTick": 2, + "nsfw": false, + "degrees": false, + "moves": [ + { + "tick": 10, + "easing": "INOUTQUAD", + "head": { + "x": -0.0 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "x": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "head": { + "y": -0.0 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "y": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "head": { + "z": -0.0 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "z": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.067995355 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.14453278 + } + }, + { + "tick": 30, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.11871816 + } + }, + { + "tick": 40, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.19018666 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.20064461 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.060454715 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.086299464 + } + }, + { + "tick": 30, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.087619215 + } + }, + { + "tick": 40, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.083825104 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.036273066 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0041144555 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "head": { + "roll": 0.12942825 + } + }, + { + "tick": 30, + "easing": "INOUTQUAD", + "head": { + "roll": -0.050149817 + } + }, + { + "tick": 40, + "easing": "INOUTQUAD", + "head": { + "roll": 0.08701207 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "head": { + "roll": 0.08676299 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "x": -3.8523226 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "rightArm": { + "x": -3.8523226 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "y": 2.0 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "rightArm": { + "y": 2.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -2.0664942 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -2.074402 + } + }, + { + "tick": 30, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -2.074402 + } + }, + { + "tick": 40, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -2.02932 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -2.02932 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.47555572 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.5093512 + } + }, + { + "tick": 30, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.5093512 + } + }, + { + "tick": 40, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.38563538 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.38563538 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.20147677 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.20521602 + } + }, + { + "tick": 30, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.3274244 + } + }, + { + "tick": 40, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.30787703 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.40478125 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "bend": -0.49199954 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "bend": -0.54730254 + } + }, + { + "tick": 40, + "easing": "INOUTQUAD", + "rightArm": { + "bend": -0.52019864 + } + }, + { + "tick": 60, + "easing": "INOUTQUAD", + "rightArm": { + "bend": -0.0 + } + } + ] + } +} \ No newline at end of file diff --git a/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/front_flip.json b/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/front_flip.json new file mode 100644 index 0000000..c97d782 --- /dev/null +++ b/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/front_flip.json @@ -0,0 +1,697 @@ +{ + "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 + } + } + ] + } +} \ No newline at end of file diff --git a/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/giga_chad.json b/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/giga_chad.json new file mode 100644 index 0000000..da2ae51 --- /dev/null +++ b/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/giga_chad.json @@ -0,0 +1,5135 @@ +{ + "version": 1, + "valid": true, + "name": "giga_chad", + "description": "The Chaddest of them all", + "author": "Wah0o", + "emote": { + "beginTick": 0, + "endTick": 165, + "stopTick": 166, + "isLoop": true, + "returnTick": 5, + "nsfw": false, + "degrees": false, + "moves": [ + { + "tick": 4, + "easing": "INOUTQUAD", + "head": { + "x": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "x": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "head": { + "x": -0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "head": { + "y": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "y": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "head": { + "y": -0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "head": { + "z": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "z": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "head": { + "z": -0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.0 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.0 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.13989598 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.13989598 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.032506067 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.032506067 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.0 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.0 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.04490119 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.04490119 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.0 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.0 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.13459775 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.13459775 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "head": { + "pitch": -1.5314963 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "head": { + "pitch": -1.5314963 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "head": { + "pitch": -1.1120538 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "head": { + "pitch": -1.1120538 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.14775816 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.14775816 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.037381746 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.037381746 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.037799735 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.037799735 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.060097966 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.060097966 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "head": { + "pitch": -1.286084 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "head": { + "pitch": -1.286084 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "head": { + "pitch": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "head": { + "pitch": 0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.4168441 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.4168441 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "head": { + "yaw": -1.00269 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "head": { + "yaw": -1.00269 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.11216698 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.11216698 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.24195862 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.24195862 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.002758297 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.002758297 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.0013488329 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.0013488329 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0029103598 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0029103598 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "head": { + "yaw": -1.4095863 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "head": { + "yaw": -1.4095863 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "head": { + "yaw": 1.0407902E-4 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "head": { + "yaw": 1.0407902E-4 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.15502043 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.15502043 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.20529102 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "head": { + "yaw": 0.20529102 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.013530715 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.013530715 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "head": { + "yaw": -0.4168441 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "head": { + "roll": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "head": { + "roll": 0.21926047 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "head": { + "roll": 0.21926047 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "head": { + "roll": -0.025936412 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "head": { + "roll": -0.025936412 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "head": { + "roll": -0.0 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "head": { + "roll": -0.0 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "head": { + "roll": 0.015539514 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "head": { + "roll": 0.015539514 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "head": { + "roll": 0.054117903 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "head": { + "roll": 0.054117903 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "head": { + "roll": 9.091206E-5 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "head": { + "roll": 9.091206E-5 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0027981726 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0027981726 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "head": { + "roll": 0.78003484 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "head": { + "roll": 0.78003484 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0014062009 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0014062009 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "head": { + "roll": -0.0 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "head": { + "roll": -0.0 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0016081737 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0016081737 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "head": { + "roll": 0.017228942 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "head": { + "roll": 0.017228942 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "head": { + "roll": -0.018058004 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "head": { + "roll": -0.018058004 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "head": { + "roll": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "head": { + "roll": 0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -1.9 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -2.252326 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -2.252326 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -2.9982228 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -2.9982228 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -2.5480254 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -2.5480254 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -1.9 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -1.9 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -1.7722428 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -1.7722428 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -3.169594 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -3.169594 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightLeg": { + "x": -2.252326 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 12.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 10.195459 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 10.195459 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 10.277176 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 10.277176 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 10.025742 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 10.025742 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 12.0 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 12.0 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 11.914537 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 11.914537 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 12.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 12.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightLeg": { + "y": 10.195459 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightLeg": { + "z": 0.1 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightLeg": { + "z": -2.9733403 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightLeg": { + "z": -2.9733403 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightLeg": { + "z": -3.4964054 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightLeg": { + "z": -3.4964054 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightLeg": { + "z": 0.1 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightLeg": { + "z": 0.1 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightLeg": { + "z": -1.5458566 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightLeg": { + "z": -1.5458566 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightLeg": { + "z": -2.9733403 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.33713692 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.33713692 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.3196764 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.3196764 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.0 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.0 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.027517445 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.027517445 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.047809538 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.047809538 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.0026976853 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.0026976853 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.03274877 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.03274877 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.007906961 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.007906961 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.07262061 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.07262061 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 5.0244353E-10 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 5.0244353E-10 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.0 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.0 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.22003074 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.22003074 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -1.5668823 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -1.5668823 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.9465621 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.9465621 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": -0.33713692 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.37796307 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.37796307 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.76882756 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.76882756 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.27188113 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.27188113 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.26609528 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.26609528 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.2948 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.2948 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.26220575 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.26220575 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.039796446 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.039796446 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.39853075 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.39853075 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 2.5175512E-5 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 2.5175512E-5 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.38755667 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.38755667 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.10965421 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.10965421 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.660008 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.660008 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": -0.018245801 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": -0.018245801 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 1.5213028 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 1.5213028 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.6063431 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.6063431 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightLeg": { + "yaw": 0.37796307 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -0.025020538 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -0.025020538 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.048341107 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.048341107 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.069259174 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.069259174 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.1402302 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.1402302 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.20118771 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.20118771 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.095185064 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.095185064 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -7.341183E-7 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -7.341183E-7 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.21809976 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.21809976 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 6.93035E-4 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 6.93035E-4 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.061397005 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.061397005 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -0.0 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.0 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.22244482 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.22244482 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.08971669 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 0.08971669 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 2.2946439 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": 2.2946439 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -0.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightLeg": { + "roll": -0.025020538 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.9686313 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.9686313 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.0 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.0 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightArm": { + "x": -6.0498323 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightArm": { + "x": -6.0498323 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.9686313 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightArm": { + "y": 2.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "y": 2.0 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightArm": { + "y": 2.0 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightArm": { + "y": 3.9937258 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightArm": { + "y": 3.9937258 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightArm": { + "y": 2.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "z": -1.961665 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightArm": { + "z": -1.961665 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightArm": { + "z": -1.9947729E-8 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightArm": { + "z": -1.9947729E-8 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightArm": { + "z": -1.961665 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 0.0 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 0.0 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.87733024 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.87733024 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.8773303 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.8773303 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.0 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.0 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.037967823 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.037967823 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 0.67362005 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 0.67362005 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.67564476 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.67564476 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -3.142549 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -3.142549 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 2.9807994 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 2.9807994 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 1.693267 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 1.693267 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.0014576487 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.0014576487 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 0.65763783 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 0.65763783 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -3.4441948 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -3.4441948 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -3.149893 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -3.149893 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.65401036 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.65401036 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -3.1320117 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -3.1320117 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.7990288 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.7990288 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.8078986 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.8078986 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.8078987 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.8078987 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.31803387 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.31803387 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.14138679 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.14138679 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.0 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.0 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.9297993 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.9297993 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 0.2030788 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 0.2030788 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 1.0315573 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 1.0315573 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 0.010718631 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 0.010718631 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.049475487 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.049475487 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.21283935 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.21283935 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 0.88883036 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 0.88883036 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.0376238 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.0376238 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 1.4946102 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": 1.4946102 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -1.3037015 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -1.3037015 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.7990288 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.30187678 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.30187678 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.2721525 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.2721525 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.18416819 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.18416819 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.09789227 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.09789227 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.2198998 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.2198998 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.48504347 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.48504347 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.67907065 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.67907065 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -6.110932E-5 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -6.110932E-5 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 4.3807907 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 4.3807907 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.009480219 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.009480219 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.029465547 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.029465547 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.6154332 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.6154332 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.8863503 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.8863503 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 1.5616314E-4 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 1.5616314E-4 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 1.8965981 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 1.8965981 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.2532393 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.2532393 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "rightArm": { + "roll": -0.30187678 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftArm": { + "x": 5.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "x": 5.0 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "leftArm": { + "x": 5.0 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "leftArm": { + "x": 2.9568586 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "leftArm": { + "x": 2.9568586 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "leftArm": { + "x": 5.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftArm": { + "x": 5.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftArm": { + "y": 2.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "y": 4.0875206 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftArm": { + "y": 4.0875206 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftArm": { + "y": 2.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftArm": { + "y": 2.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftArm": { + "y": 4.0875206 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "leftArm": { + "z": -2.203474 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "leftArm": { + "z": -2.203474 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.51976997 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.51976997 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.6709974 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.6709974 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.6709973 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.6709973 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.0 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.0 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.30776563 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.30776563 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.65677315 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.65677315 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -1.6417192 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -1.6417192 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 3.1355157 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 3.1355157 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.0010496362 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.0010496362 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 1.6392988 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 1.6392988 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.0025698922 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.0025698922 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.5024246 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.5024246 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -2.8041947 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -2.8041947 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -3.1532238 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -3.1532238 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.0 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.0 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -1.1308259 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -1.1308259 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -0.51976997 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 1.172347 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 1.172347 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.037808705 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.037808705 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.037808713 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.037808713 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.62366265 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.62366265 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.7531556 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.7531556 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.0 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.0 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 1.2664338 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 1.2664338 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.13954905 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.13954905 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.013174082 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.013174082 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.010205563 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.010205563 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.06644766 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.06644766 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.010088136 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.010088136 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.6029994 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.6029994 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.03762318 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.03762318 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.0 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.0 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.44563633 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.44563633 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 1.172347 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.48641014 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.48641014 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.10834044 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.10834044 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.5676788 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.5676788 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.07504642 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.07504642 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.006862871 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.006862871 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.5692944 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.5692944 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.0 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.0 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -2.8592016E-5 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -2.8592016E-5 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -1.7287096 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -1.7287096 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.009529364 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.009529364 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.038684685 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.038684685 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.31971967 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.31971967 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.88968116 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.88968116 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 2.188246E-4 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 2.188246E-4 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -2.1538641 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -2.1538641 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftArm": { + "roll": 0.48641014 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftLeg": { + "x": 1.9 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftLeg": { + "x": 2.338033 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftLeg": { + "x": 2.338033 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftLeg": { + "x": 2.4034452 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftLeg": { + "x": 2.4034452 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftLeg": { + "x": 1.9 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftLeg": { + "x": 1.9 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftLeg": { + "x": 2.338033 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 12.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 9.917855 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 9.917855 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 10.922021 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 10.922021 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 10.576937 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 10.576937 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 12.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 12.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftLeg": { + "y": 9.917855 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftLeg": { + "z": -0.1 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftLeg": { + "z": -3.7886016 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftLeg": { + "z": -3.7886016 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftLeg": { + "z": -3.7174206 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftLeg": { + "z": -3.7174206 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftLeg": { + "z": -0.1 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftLeg": { + "z": -0.1 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftLeg": { + "z": -3.7886016 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.28943428 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.28943428 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.29512814 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.29512814 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.0 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.0 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.01708789 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.01708789 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.04704775 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.04704775 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.0030718336 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.0030718336 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.043501973 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.043501973 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.0 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.0 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -1.5781744 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -1.5781744 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 3.203295E-12 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 3.203295E-12 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.13094698 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.13094698 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.109108955 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.109108955 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -1.5687531 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -1.5687531 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": -0.28943428 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.24234551 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.24234551 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.04647371 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.04647371 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.046473704 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.046473704 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.14872508 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.14872508 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.27384213 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.27384213 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.22910896 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.22910896 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.29659358 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.29659358 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.09799422 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.09799422 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.0 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.0 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": 0.009622238 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": 0.009622238 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.37212652 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.37212652 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": 0.22992273 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": 0.22992273 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.297723 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.297723 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.01908363 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.01908363 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.0 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.0 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.16646482 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.16646482 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftLeg": { + "yaw": -0.24234551 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.07622462 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.07622462 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.066452764 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.066452764 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.18356355 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.18356355 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.04682022 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.04682022 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.0011612747 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.0011612747 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.16643818 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.16643818 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.09162157 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.09162157 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -1.1308775E-5 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -1.1308775E-5 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": 0.19563156 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": 0.19563156 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": 0.009551507 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": 0.009551507 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.08669772 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.08669772 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.02894436 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.02894436 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.1509232 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.1509232 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.1525886 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.1525886 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.73833025 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.73833025 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": 0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "leftLeg": { + "roll": -0.07622462 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "body": { + "x": -0.04586473 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "body": { + "x": 0.019460544 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "body": { + "x": -0.14749607 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "body": { + "x": -0.055940144 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "body": { + "x": -0.04586473 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "body": { + "x": 0.019460544 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "body": { + "x": -0.16599017 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "body": { + "x": -0.15493058 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "body": { + "x": -0.1035458 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "body": { + "x": 0.025333587 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "body": { + "x": -0.11034301 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "body": { + "x": -0.21000633 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "body": { + "x": 0.26974648 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "body": { + "x": -0.22764045 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "body": { + "x": -0.15241866 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "body": { + "x": -0.16667084 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "body": { + "x": -0.21193272 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "body": { + "x": -0.29072618 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "body": { + "x": 0.2166983 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "body": { + "x": -0.14110439 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "body": { + "x": 0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "body": { + "x": -0.04586473 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "body": { + "y": -0.1720419 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "body": { + "y": -0.1720419 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "body": { + "y": -0.1720419 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "body": { + "y": -0.1720419 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "body": { + "y": 0.5178939 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "body": { + "y": 0.5178939 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "body": { + "y": 0.28458548 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "body": { + "y": 0.28458548 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "body": { + "y": 0.4809237 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "body": { + "y": 0.4809237 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "body": { + "y": 0.4706339 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "body": { + "y": 0.4706339 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 164, + "easing": "INOUTQUAD", + "body": { + "y": 0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "body": { + "y": -0.1720419 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "body": { + "z": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "body": { + "z": -0.0 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "body": { + "z": -0.0 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "body": { + "z": 0.011486796 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "body": { + "z": 0.011486796 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "body": { + "z": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "body": { + "z": -0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "body": { + "pitch": 0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "body": { + "pitch": 0.0 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "body": { + "pitch": -0.0 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "body": { + "pitch": 0.23216064 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "body": { + "pitch": 0.23216064 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "body": { + "pitch": 0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "body": { + "pitch": 0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "body": { + "yaw": -1.3986131 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "body": { + "yaw": -1.3986131 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 34, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 35, + "easing": "INOUTQUAD", + "body": { + "yaw": -0.07036926 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "body": { + "yaw": -0.07036926 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "body": { + "yaw": -0.07036925 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "body": { + "yaw": -0.07036925 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "body": { + "yaw": 1.5803477 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "body": { + "yaw": 1.5803477 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 114, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 115, + "easing": "INOUTQUAD", + "body": { + "yaw": -0.11275339 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "body": { + "yaw": -0.11275339 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.43098667 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.43098667 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "body": { + "yaw": -1.5896086 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "body": { + "yaw": -1.5896086 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "body": { + "yaw": 0.0 + } + }, + { + "tick": 4, + "easing": "INOUTQUAD", + "body": { + "roll": -0.0 + } + }, + { + "tick": 5, + "easing": "INOUTQUAD", + "body": { + "roll": -0.0 + } + }, + { + "tick": 14, + "easing": "INOUTQUAD", + "body": { + "roll": 0.0 + } + }, + { + "tick": 15, + "easing": "INOUTQUAD", + "body": { + "roll": -0.10164733 + } + }, + { + "tick": 24, + "easing": "INOUTQUAD", + "body": { + "roll": -0.10164733 + } + }, + { + "tick": 25, + "easing": "INOUTQUAD", + "body": { + "roll": -0.0 + } + }, + { + "tick": 44, + "easing": "INOUTQUAD", + "body": { + "roll": -0.0 + } + }, + { + "tick": 45, + "easing": "INOUTQUAD", + "body": { + "roll": -0.061503474 + } + }, + { + "tick": 54, + "easing": "INOUTQUAD", + "body": { + "roll": -0.061503474 + } + }, + { + "tick": 55, + "easing": "INOUTQUAD", + "body": { + "roll": -0.037977725 + } + }, + { + "tick": 64, + "easing": "INOUTQUAD", + "body": { + "roll": -0.037977725 + } + }, + { + "tick": 65, + "easing": "INOUTQUAD", + "body": { + "roll": -0.010051205 + } + }, + { + "tick": 74, + "easing": "INOUTQUAD", + "body": { + "roll": -0.010051205 + } + }, + { + "tick": 75, + "easing": "INOUTQUAD", + "body": { + "roll": -3.1445053 + } + }, + { + "tick": 84, + "easing": "INOUTQUAD", + "body": { + "roll": -3.1445053 + } + }, + { + "tick": 85, + "easing": "INOUTQUAD", + "body": { + "roll": 1.7155838 + } + }, + { + "tick": 94, + "easing": "INOUTQUAD", + "body": { + "roll": 1.7155838 + } + }, + { + "tick": 95, + "easing": "INOUTQUAD", + "body": { + "roll": -1.6908722 + } + }, + { + "tick": 104, + "easing": "INOUTQUAD", + "body": { + "roll": -1.6908722 + } + }, + { + "tick": 105, + "easing": "INOUTQUAD", + "body": { + "roll": -0.0 + } + }, + { + "tick": 124, + "easing": "INOUTQUAD", + "body": { + "roll": 0.0 + } + }, + { + "tick": 125, + "easing": "INOUTQUAD", + "body": { + "roll": 0.030365204 + } + }, + { + "tick": 134, + "easing": "INOUTQUAD", + "body": { + "roll": 0.030365204 + } + }, + { + "tick": 135, + "easing": "INOUTQUAD", + "body": { + "roll": -3.145151 + } + }, + { + "tick": 144, + "easing": "INOUTQUAD", + "body": { + "roll": -3.145151 + } + }, + { + "tick": 145, + "easing": "INOUTQUAD", + "body": { + "roll": 2.160377 + } + }, + { + "tick": 154, + "easing": "INOUTQUAD", + "body": { + "roll": 2.160377 + } + }, + { + "tick": 155, + "easing": "INOUTQUAD", + "body": { + "roll": -0.0 + } + }, + { + "tick": 165, + "easing": "INOUTQUAD", + "body": { + "roll": -0.0 + } + } + ] + } +} \ No newline at end of file diff --git a/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/tpose.json b/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/tpose.json new file mode 100644 index 0000000..abd421f --- /dev/null +++ b/src/testmod/resources/assets/saturn_emotes_testmod/player_animations/tpose.json @@ -0,0 +1,354 @@ +{ + "version": 1, + "valid": true, + "name": "tpose", + "description": "MENACING", + "author": "stephanieisdumb", + "emote": { + "beginTick": 0, + "endTick": 80, + "stopTick": 81, + "isLoop": true, + "returnTick": 20, + "nsfw": false, + "degrees": false, + "moves": [ + { + "tick": 10, + "easing": "INOUTQUAD", + "rightArm": { + "x": -5.0 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "x": -6.0 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "rightArm": { + "x": -6.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "rightArm": { + "y": 2.0 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "y": 3.0 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "rightArm": { + "y": 3.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "rightArm": { + "z": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -1.0704756 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.0 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": 0.059108086 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "rightArm": { + "pitch": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.61077195 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.0 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.008776078 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "rightArm": { + "yaw": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 0.6060502 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 1.5707964 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 1.5765934 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "rightArm": { + "roll": 1.5707964 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "rightArm": { + "bend": -1.3806202 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "rightArm": { + "bend": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "leftArm": { + "x": 5.0 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "leftArm": { + "x": 6.0 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "leftArm": { + "x": 6.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "leftArm": { + "y": 2.0 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "leftArm": { + "y": 3.0 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "leftArm": { + "y": 3.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "leftArm": { + "z": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": -1.0045553 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.0 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.010133168 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "leftArm": { + "pitch": 0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.44322997 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.0 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": 0.038214765 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "leftArm": { + "yaw": -0.0 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -0.5571526 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -1.5707964 + } + }, + { + "tick": 50, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -1.5692185 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "leftArm": { + "roll": -1.5707964 + } + }, + { + "tick": 10, + "easing": "INOUTQUAD", + "leftArm": { + "bend": -1.3810014 + } + }, + { + "tick": 20, + "easing": "INOUTQUAD", + "leftArm": { + "bend": -0.0 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "leftLeg": { + "pitch": 0.0 + } + }, + { + "tick": 80, + "easing": "INOUTQUAD", + "rightLeg": { + "pitch": 0.0 + } + } + ] + } +} \ No newline at end of file