Emote file reference
Everything a Body Language emote file can contain, body parts, angles, easing, sounds and particles.
An emote is a JSON file at assets/<namespace>/emotes/<name>.json in a resource pack. Its id is
<namespace>:<name>, and its name in the list comes from the language key emote.<namespace>.<name>. If the file is
in a subfolder, the slash becomes a dot in the key. For a walkthrough, see
Making your own emotes.
The file
| Field | Needed? | What it is |
|---|---|---|
length |
Yes | How long the emote is, in ticks (20 a second). 1 to 1200 (one minute). |
keyframes |
Yes | The list of keyframes (below). At least one must move something. |
loop |
No | true repeats the emote until the player moves. Default false: it plays once, then ends. |
order |
No | Where it comes in the emote list, lowest first. Default 1000, so pack emotes come after the built-in ones. |
hidden |
No | true keeps it off the wheel and the list. The built-in Hug and High-five use this. |
events |
No | Sounds and particles at set times (below). |
Keyframes
Each keyframe has a time t (0 to length, in ticks, decimals allowed) and any of these parts, each as three numbers
[x, y, z]:
| Part | What moves |
|---|---|
head |
The head (angles) |
body |
The body (angles) |
right_arm, left_arm |
The arms, from the shoulder (angles) |
right_leg, left_leg |
The legs, from the hip (angles) |
torso |
The whole upper body bends at the hips: body, head and arms together (angles) |
root_rotation |
Turns the whole player round the hips (angles) |
root_offset |
Moves the whole player, in pixels (16 to a block) |
A part only moves if a keyframe mentions it; parts that aren’t in any keyframe are left as the game has them (so a waving player’s legs still look normal). Keyframes don’t have to mention every part, and they can come in any order.
Before its first keyframe, a part holds that keyframe’s pose; after its last, it holds the last one. In a looping emote it moves from the last keyframe round to the first again.
Angles
Angles are in degrees, the same way round as Minecraft’s player model:
- Arms and legs, X: negative swings forward. -90 points an arm straight ahead, -180 straight up. Positive swings back.
- Arms, Z: swings a lowered arm out to its own side: positive for the right arm, negative for the left. Once an
arm is raised past level it works the other way round, so arms up in a V are
[-166, 0, -30]for the right arm and[-166, 0, 30]for the left. - Head, X: positive looks down, negative looks up. Y turns it left and right.
- Torso, X: positive bows forward.
- Root offset:
[x, y, z]in pixels, and positive Y is down. Sitting on the ground is about[0, 11, 0].
The “right” arm and leg are the player’s own right, which is on your left when they face you.
Easing
ease on a keyframe sets how the motion arrives at it from the keyframe before:
ease |
Motion |
|---|---|
in_out |
Starts slow, speeds up, slows down (the default) |
in |
Starts slow and speeds up |
out |
Starts fast and slows down. Good for snappy moves |
linear |
Steady speed |
step |
Holds still, then jumps to the new pose at the keyframe’s time |
Events
events play a sound and/or particles at a set time:
"events": [
{ "t": 9, "sound": "tgemotes:clap", "particle": "minecraft:crit", "count": 4, "at": [0, 1.35, 0.4] }
]
| Field | What it is |
|---|---|
t |
When, in ticks (0 to length). In a looping emote it plays each time round. |
sound |
A sound id, such as minecraft:entity.player.levelup or one from your pack’s sounds.json. Optional. |
particle |
A particle id, such as minecraft:heart or minecraft:note. Only particles that need no extra settings work. Optional. |
count |
How many particles, 0 to 50. Default 1. |
at |
Where, in blocks from the player’s feet: [to their right, up, forwards]. Default [0, 1, 0]. |
Only the player’s own game and nearby players with the mod and the same pack play them.
Mistakes
A file with a mistake is skipped and the game log says why, in a line like:
Skipping emote mypack:raise_the_roof: keyframe time 25 is outside 0 to 20
The usual ones: a missing length or keyframes, a keyframe or event time outside 0 to length, a misspelt part
name (“unknown body part”), a part without exactly three numbers, or an unknown ease. Fix the file and press
F3 + T to reload.