# emotes 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`. - `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 `, `/emotes stop` and `/emotes info`. Press F5 to see yourself. 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. ## How it hooks in 1. `LivingEntityRendererMixin` samples the entity's current pose into its render state (players only). 2. `HumanoidModelMixin` applies that pose at the end of `HumanoidModel.setupAnim`. `PlayerModel` and the armor layers both go through this method, so armor follows the pose. Both hook points exist unchanged in every supported version. Version-specific code goes behind Stonecutter comments: ```java //? if >=1.21.9 { import net.minecraft.client.renderer.entity.state.AvatarRenderState; //?} else /*import net.minecraft.client.renderer.entity.state.PlayerRenderState;*/ ``` Bending (`BoneTransform.bend` / `bendAxis`) is part of the model but isn't rendered yet. ## Commands ```sh ./gradlew :core:test # core unit tests ./gradlew :1.21.11:runTestmodClient # launch the game with the tester (run dir: ./run) ./gradlew :1.21.4:compileTestmodJava # quick compile check for one version ./gradlew buildAll # every version's jar → build/libs// GITEA_TOKEN=... ./gradlew publish # publish core + every version to Gitea ``` The active version is set in `stonecutter.gradle.kts` (`stonecutter active "..."`), and it's the version whose code is uncommented in `src/`. Switch versions with the Stonecutter IntelliJ plugin or the `Set active project to ` Gradle task. Run `Reset active project` before committing, so the tree is committed with `vcsVersion` (1.21.11) active. Loom 1.18 needs a Java 25 JVM to run Gradle, so the build is pinned to Loom 1.17 until the toolchain moves. Minecraft 26.x will need that upgrade. ## Publishing Artifacts go to the `saturnclientmc` organization's Maven registry: `https://git.selimaj.dev/api/packages/saturnclientmc/maven`. Use a token with `package:write`, set as `GITEA_TOKEN` or `-PgiteaToken=...`.