Making your own emotes
Add new emotes to Body Language with a resource pack, step by step, starting from a looping "raise the roof".
Every Body Language emote is a small text file (JSON) that says where the player’s head, arms and legs should be at each moment. A resource pack can add new ones. They show up in the emote list (N) and can go on your wheel like the built-in emotes.
This page walks through making one. The emote file reference lists everything a file can contain.
1. Make the resource pack
In your game folder’s resourcepacks folder, make a folder for your pack with these files in it:
my-emotes/
├── pack.mcmeta
└── assets/
└── mypack/
├── emotes/
│ └── raise_the_roof.json
└── lang/
└── en_us.json
mypack is your pack’s namespace: any short name in lowercase letters, numbers and underscores. Use your own so
your emotes never clash with someone else’s.
pack.mcmeta tells Minecraft it’s a resource pack (34 is the pack format for 1.21.1):
{
"pack": {
"pack_format": 34,
"description": "My emotes"
}
}
2. Write the emote
assets/mypack/emotes/raise_the_roof.json pumps both arms up and down until you move:
{
"length": 20,
"loop": true,
"order": 500,
"keyframes": [
{ "t": 0, "right_arm": [-160, 0, 15], "left_arm": [-160, 0, -15] },
{ "t": 10, "right_arm": [-180, 0, 5], "left_arm": [-180, 0, -5] },
{ "t": 20, "right_arm": [-160, 0, 15], "left_arm": [-160, 0, -15] }
]
}
lengthis how long one go takes, in ticks. There are 20 ticks in a second, so this is one second.loop: truerepeats it until the player moves. Leave it out for an emote that plays once.orderis where it comes in the emote list: lower numbers first. The built-in emotes use 0 to 220.- Each keyframe says where body parts are at time
t. Body Language moves smoothly from one keyframe to the next.
The angles are in degrees. For the arms, -180 on the first number points the arm straight up (-90 points it forward), and the third number swings it out to the side. The reference explains each part.
For a looping emote, make the last keyframe the same as the first, so it flows round without a jump.
3. Give it a name
assets/mypack/lang/en_us.json gives the emote its name in the list:
{
"emote.mypack.raise_the_roof": "Raise the Roof"
}
The key is emote.<namespace>.<file name>. Without one, the list uses the file name, tidied up. You can add other
languages’ files (fr_fr.json and so on) the same way.
4. Try it
- Turn the pack on in Options › Resource Packs.
- Press N: Raise the Roof is in the list. Click it.
- Change the file, save it, and press F3 + T in game to reload. Your changes show straight away.
If your emote doesn’t appear, there’s a mistake in the file. Body Language skips it and writes the reason to the game
log, in a line starting Skipping emote mypack:raise_the_roof:, for example “keyframe time 25 is outside 0 to 20”.
Sharing it
Zip the pack (the files inside my-emotes, not the folder itself) and share it. On a server with Body Language,
other players need the same pack to see your new emote: the server passes on which emote you’re doing, and each
player’s game needs the file to know what it looks like. The server itself doesn’t need the pack.
Tips
- Start from a built-in emote. They’re in the Body Language jar (open it like a zip) under
assets/tgemotes/emotes/. - A pack can replace a built-in emote: put a file with the same name in
assets/tgemotes/emotes/. - Small moves of the head and body (a few degrees) make an emote feel alive.
- Keep raised arms close to straight up, out to the sides, or folded in: a straight arm held out forward and up, about 30 to 60 degrees above level, reads as a Nazi salute. Body Language’s own emotes are checked for it automatically.
- Add a sound or particles at a set moment with events, like the claps in Clap.