Privacy
Language: Magyar

How to create custom animations

Make your own third person animation for Punchy! Moves in Blockbench or Punchy! Studio, from the rig to a clip playing in game.

This page has not been translated into Hungarian yet, so it is shown in English. Read in English

On this page

You can make your own full-body animation for Punchy! Moves and see it play on your player in third person. This page takes you from the rig to a clip that plays in game, in Blockbench or in Punchy! Studio. It is for anyone who wants to add a wave, a bow, a sword swing or a new walk to a pack.

The clips on this page come from the example pack provided by Crafto, Fluid & Foolish, the animation pack used for the Punchy! Moves demos on this wiki. You can follow along with your own clips or look at how the example pack’s are made.

Before you start

  • Punchy! Moves installed (Getting started has the steps). Finished clips play in game, so you need the mod to see your work.
  • For the Blockbench path: Blockbench 4.8 or newer (checked in 5.2.2), plus the Punchy! Moves rig and plugin. You get them from The Blockbench rig or from Punchy! Studio.
  • For the Punchy! Studio path: Punchy! Studio. It works inside Minecraft, so you animate on your own skin and see the result in the game itself.
  • Blender: the Blender tab has no steps yet, so the steps here are for Blockbench and Punchy! Studio.

A clip is only half of the job. The clip says how the body moves. A compat file says when it plays. Both paths below end with the two together, and the sections after them show other ways to wire a clip.

Make your first clip

Tool

In Blockbench

You will make a short bow called bow_greeting, give it an easing curve and a happy face, export it into a resource pack and play it from the emote wheel.

Set up the rig

  1. In Blockbench, choose File > Plugins and click Load Plugin from File (the file icon beside the search box). Pick punchy_moves_rig.js.

    Blockbench loads the plugin again every time it starts, so keep the file where it is.

    Loading the Punchy! Moves plugin from its file.
  2. Open the rig: punchy_moves_player.bbmodel, or punchy_moves_player_slim.bbmodel if your skin has slim arms.

    The rig open, with the face board beside the head.
  3. In the Moves Face panel, click Use a skin and pick your skin, a 64 by 64 PNG. The panel says which eyes it found.

  4. Open the Animate tab. The example_wave animation of the rig shows a wave, a head tilt, a happy look, a blink and a glance.

Studio makes the same rig for any pack with File > Export Blockbench Rig, with bones for that pack’s own looks and eye shapes. See The Blockbench rig for the files and the whole rig.

Exporting the rig from Punchy! Studio.

Look at a finished pack first

To see how a real clip is built, import animations from the example pack provided by Crafto and play two of them. The example pack keeps its clips in several animation files under assets/punchy_moves/animations/, so import the file that holds the clip you want to look at.

  1. In the Animations panel, choose Animation > Import Animations (the same button sits above the animation list) and pick the file that holds normal_forward, the example pack’s walking loop.
  2. Leave every box in Select Animations to Import ticked and press OK.
  3. Pick normal_forward in the Animations panel and press the play button under the viewport. The legs and arms swing in a loop.
  4. Import the file that holds sword_attack_1 the same way, pick it and play it. It plays once. Click a bone such as right_arm to see its keys in the timeline.
Importing animations from the example pack and playing a walking loop and a sword swing on the rig.

Add a new animation and key it

  1. In the Animations panel, press the + button (Add Animation).

  2. In the dialog, set Name to bow_greeting. Write the plain name: this is the name a compat file will use, and it is case-sensitive.

  3. Set Loop Mode to Play Once and press Confirm.

    Only Loop makes Punchy! Moves loop a clip. Hold On Last Frame plays once in the mod, so leave it for clips that should not repeat.

  4. Select head in the outliner, with the playhead at 0. Add a rotation key with the + beside Rotation in the timeline.

  5. Move the playhead to 0.5 s. Turn the head down with the rotate tool until it bows. Judge it by the head in the viewport: the keyframe panel shows about -28 on X. The exported file holds 28, because Blockbench’s export flips the sign of X and Y rotation.

  6. Move to 1.0 s and key the same pose again so the bow holds. Then go to 1.6 s and set the rotation back to 0.

  7. In the Moves Face panel, under Look, pick happy and press Key with the playhead at 0. The panel also keys Face mix at 1 when the clip has none yet.

    The head shows the face for the keys at the playhead as you scrub or play. To key the eyes or a channel such as the pupils, use Eye shapes and Channels at the playhead in the same panel. See Faces in packs and clips.

  8. Press play to check the motion.

The Add Animation dialog, then the first keys on the head and a look. The steps above set Play Once and the bow pose.

Shape the motion with easing

  1. Right-click the key at 0.5 s in the timeline.

  2. Choose Easing (Punchy Moves), then Back, then Out.

  3. Play the clip again. The head now dips past the bow and settles back into it.

    The easing shapes the motion into the key you picked. The rig plays it as Punchy! Moves does, and the export writes it.

  4. For a smooth curve through your keys, set a key’s Interpolation to Smooth in the keyframe panel. Linear keeps an even pace.

Easing (Punchy Moves) > Back > Out on the bow.

The menu offers None and ten curve families of easings.net, each as In, Out or In and out: Sine, Quad, Cubic, Quart, Quint, Expo, Circ, Back, Elastic and Bounce. Back and Elastic overshoot, and Bounce bounces.

Export the clip

  1. Choose Animation > Export Animations.
  2. In Select Animations to Export, tick bow_greeting and untick example_wave, then press Confirm.
  3. Save the file as bow_greeting.animation.json inside your pack, in assets/punchy_moves/animations/.
Animation > Export Animations, with only bow_greeting ticked.

The file Blockbench writes looks like this, trimmed to what we keyed. Your numbers will differ a little.

This is the file when the 0.5 s and 1.0 s keys have Interpolation set to Smooth (step 4 above). Left on Linear, the 0.5 key is written as { "post": [28, 0, 0], "easing": "easeOutBack" } and the 1.0 key as [28, 0, 0].

{
  "format_version": "1.8.0",
  "animations": {
    "bow_greeting": {
      "animation_length": 1.6,
      "bones": {
        "head": {
          "rotation": {
            "0.0": [0, 0, 0],
            "0.5": { "pre": [28, 0, 0], "post": [28, 0, 0], "lerp_mode": "catmullrom", "easing": "easeOutBack" },
            "1.0": { "post": [28, 0, 0], "lerp_mode": "catmullrom" },
            "1.6": [0, 0, 0]
          }
        },
        "face_mix": { "position": [0, 1, 0] },
        "face_look_happy": { "position": [0, 1, 0] }
      }
    }
  }
}

This is a complete clip file. To build the pack below without Blockbench, save this JSON as bow_greeting.animation.json yourself.

Put it in a pack and play it

A resource pack needs a pack.mcmeta, your animation file and a compat file. Make this folder in your resourcepacks folder:

My Moves Pack/
  pack.mcmeta
  assets/
    punchy_moves/
      animations/
        bow_greeting.animation.json
      compat/
        my_moves_pack.json

pack.mcmeta, with the resource format of Minecraft 1.21.11. On another version, put that version’s number from the table on Resource packs in place of the 75s:

{
  "pack": {
    "description": "My Punchy Moves pack",
    "pack_format": 75,
    "min_format": 75,
    "max_format": 75
  }
}

compat/my_moves_pack.json puts the bow on the emote wheel:

{
  "format_version": 2,
  "defaults": { "animations": {} },
  "emotes": {
    "entries": [
      { "id": "bow_greeting", "display_name": "Bow", "animation": "bow_greeting", "face": "happy" }
    ]
  }
}

Video coming soon

  1. In the game, open Options, then Resource Packs, move My Moves Pack to the right-hand list and press Done. If the game was already running, press F3+T to reload.
  2. Switch to third person with F5.
  3. Press C to open the emote wheel and pick Bow.

Standing still, your player bows with a happy face. Moving stops an emote.

Video coming soon

Keep working in Blockbench by editing the animation and exporting it again over the same file. If you would rather keep the pack in Punchy! Studio, its Library copies a pack in from the game, so you can edit it there too (see the Punchy! Studio tab).

Look at more clips from the example pack

The example pack provided by Crafto animates the whole rig, including held items. Try climbing_up and mace_slam_right on the rig.

climbing_up and mace_slam_right from the example pack on the rig.

Two small things differ between Blockbench and the game. Moves bends the waist its own way, so a strong waist bend moves the arms a little differently in game. And the hand guides on the rig show the hand only, not your item. Blockbench’s Bedrock export also mirrors some axes, and Moves reads that export. So key on the rig and use Export Animations, and do not copy numbers by hand.

In Punchy! Studio

You will make a waving clip called wave, give it easing and a face, watch it on your own player, put it on the emote wheel and play it in game. Studio keeps everything for one pack together: its clips, its compat files and its faces.

Start a pack

  1. Join a world and press F6 to open Punchy! Studio. Pick Third Person with the switch between the menus and the workspace tabs.
  2. Choose File > Packs (Ctrl+O). In the Punchy Moves Packs menu, choose New Pack.
  3. Type the Pack name My Moves Pack and press Create.
Switching to Third Person and starting My Moves Pack.

The new pack has one compat file and one animation file, both named after it, and a first clip, new_clip. Studio keeps an editable copy in punchy-studio/moves/ until you export.

Make the clip and key it

  1. Choose File > New Clip (Ctrl+N). Type the Name wave, set the Length to 1.2, tick Loop and press Create.
  2. In the outliner, select Right Arm and press E for rotation.
  3. With the playhead at 0, press I to key the arm where it rests.
  4. Move the playhead to 0.3 s. Type it in the timeline’s time field, or press Right to step frame by frame. In the Transform panel, type 140 in the rotation’s Z field. Typing a value keys it at the playhead.
  5. At 0.6 s, type 110 in the same field. At 0.9 s, type 140 again.
  6. Go back to 0 with Shift+Left, choose Edit > Copy Pose (Ctrl+C), jump to the end with Shift+Right and choose Edit > Paste Pose (Ctrl+V). The loop now closes where it started.
  7. Select Head and key a small tilt at 0.3 s (Z about 8).
  8. Press Space to play, and again to stop.
Making the wave clip and keying the arm, with the loop closed.

K keys the whole pose at the playhead in one go, which is handy for blocking out a clip. The waist has a handle of its own: it turns the head, body and both arms about the neck. Alt+I deletes the key at the playhead. X does the same, unless the pointer is over a bone’s row in the names column of the timeline: there it takes the whole bone out of the clip, so use Alt+I to be safe. Undo brings anything back.

Shape the motion

  1. Select Right Arm in the outliner and put the playhead on its key at 0.3 s. Up and Down jump between keys.
  2. Press T. Under Interpolation, choose Smooth for a curve through the keys. Linear keeps an even pace.
  3. Press T again, and under Easing choose Out Back. The arm now swings past 140 and settles back.
  4. Press Ctrl+Tab to open the Graph Editor and see the curve.
Smooth interpolation and Out Back easing, drawn in the Graph Editor.

The Active Keyframe panel in the properties has the same two choices, and a Separate Pre Value for a sudden change at a key. The easing menu lists None and the ten curve families of easings.net, each as In, Out or In-out. Studio shows the curve as Punchy! Moves plays it.

Key a face

These steps key cheeky, a look of the pack’s own. Make it first in the Face tab, as Faces in packs and clips shows: File > New Look named cheeky, Extends set to happy, then Left lid 1, Blush 1 and Brow tilt -0.5.

  1. Put the playhead at 0.3 s in the Animation tab.
  2. Open the Face tab. In the Faces list, select the cheeky look and press Key in Clip (K).
  3. Back in the Animation tab, the Dope Sheet has keys at 0.3 s for Look: cheeky and for Face mix, which Studio keys with it. Select Lids under Face in the outliner and set its Value in the Face panel to 0 at 0.9 s, 1 at 1.0 s and 0 at 1.1 s, a blink.
Keying the cheeky look and the Lids channel in the wave clip, then View > Game View showing the face on your own player.

See Faces in packs and clips for every face part, and Faces for how the face fits your skin.

Watch it on your player

  1. Choose View > Game View. The game appears beside the stage, with Punchy! Moves playing your clip on your own player.
  2. Scrub the timeline or press Space. Use Front and Back to look from either side, and drag with the right mouse button to turn the player.
  3. Change a key. The Game view shows it at once, before you export anything.
  4. Choose View > Game View again to close it. Your player and camera go back as they were.
Game View playing the clip on your own player.

More about it is on Studio and the Game view.

Put it on the emote wheel

Clips play when a compat file names them. Make the wave an emote:

  1. Open the Bindings tab (Ctrl+B) and select the pack’s compat file in the outliner.

  2. Choose File > Raw JSON (or the Raw JSON button at the top) and replace the text with:

    {
      "format_version": 2,
      "defaults": { "animations": {} },
      "emotes": {
        "entries": [
          { "id": "wave", "display_name": "Wave", "animation": "wave", "face": "happy" }
        ]
      }
    }
  3. The line under the text says as you type whether the game reads the file (Punchy reads this.). Press Apply. The sheet’s Verdict panel says the same.

Typing the emote into the Bindings tab with Raw JSON.

Export and play it

  1. Press Ctrl+E (File > Export to Resource Pack). In Export Punchy Moves Pack, keep the Pack name, keep Turn the pack on and reload ticked and press Export. The status bar says when the pack is on and loaded.
  2. Close the editor with F6, press F5 twice to see your player from the front and press C to open the emote wheel. Pick Wave.
Exporting the pack, then picking Wave on the emote wheel in game.

Standing still, your player waves with the cheeky look, winking with pink cheeks. In the recording the look’s right eye is also the gem eye shape that Faces in packs and clips draws. Moving stops an emote. Ctrl+S saves the editable copy without exporting. It never changes a resource pack.

Study the example pack

To see how the clips of a real pack are keyed, copy the example pack provided by Crafto into Studio and open its clips. Studio lists the packs in your game’s resourcepacks folder, so put the example pack there first.

  1. Choose File > Packs. Under Copy a pack from the game, pick the example pack. Studio makes a copy named after it with Studio added. The pack itself stays as it is.
  2. Select a clip in the outliner (Search clips finds one by name), for example sword_attack_1, and play it with the Game view on.
File > Packs, then Copy a pack from the game. The example pack provided by Crafto heads the list; this recording copies My Moves Pack, exported above, and opens the copy, My Moves Pack Studio.

Studio only writes the clips you changed, so a pack of hundreds of clips keeps every other clip exactly as it was. A copy also works as a way to move a pack between Studio and Blockbench: File > Export Blockbench Rig writes the rig with your pack’s looks and eye shapes, you animate there, and Studio’s Library copies the exported pack back in.

Wire a clip to an action

A clip does nothing by itself. A compat file in assets/punchy_moves/compat/ names the clip for a moment: a held item, walking, climbing or an emote. Every compat file is a complete JSON file, starts with "format_version": 2, and its action names go under defaults.animations or an item group. The whole format is on Compat files.

The examples below use clips from the example pack provided by Crafto and are trimmed to the settings that matter, so the pack’s own compat file has more. They play those clips as they stand with that pack on, except the emote, which plays the bow_greeting clip you made above. Put each example in its own file, or merge their objects into one file.

An emote

The emote you made above, with the common keys. keybind gives the emote its own key. Without it, the emote is on the wheel only.

{
  "format_version": 2,
  "emotes": {
    "menu_key": "C",
    "entries": [
      {
        "id": "bow_greeting",
        "display_name": "Bow",
        "animation": "bow_greeting",
        "keybind": "H",
        "face": "happy"
      }
    ]
  }
}
Keys of an emote entry
KeyTypeDefaultWhat it doesExample
animationRequiredstringThe clip the emote plays, spelled exactly as in the animation file. name and clip work too. An entry without a clip, or whose clip no file defines, is left out of the wheel.
idstringthe clip nameNames the emote. Two entries with the same id share one key.bow_greeting
display_namestringthe idThe name on the wheel and in the Controls list. label and title work too.Bow
keybindstringno keyThe emote's own default key, such as H or J. A player's own choice in Controls always wins.H
facestringhappyThe look that plays with the emote. Use the lower-case name of a built-in look. A look that only your pack has plays Happy instead.
menu_keystringCOn the emotes object, not an entry: the key that opens the emote wheel.

Emotes start only while the player stands still on the ground, and only you see your own emotes.

A sword swing

Held items go in an item group. The example pack’s SWORD group plays two swings in turn. After more than 20 ticks without a swing, the combo starts again from the first clip.

{
  "format_version": 2,
  "item_groups": {
    "SWORD": {
      "animations": {
        "attack": {
          "variants": ["sword_attack_1", "sword_attack_2"],
          "retrigger_progress": 10
        }
      }
    }
  }
}

retrigger_progress is the percent of the clip that must play before the next click can start the next swing.

Video coming soon

Walking

Body actions go under defaults. This is trimmed from the example pack’s walking entry, which also layers extra clips on top and sets how walking blends. It plays the normal_forward loop when you walk forward, plays the same loop in reverse when you walk backward (reverse), and uses the two sidestep clips for left and right. All three clips loop in the example pack.

{
  "format_version": 2,
  "defaults": {
    "animations": {
      "walking": {
        "directions": {
          "forward": "normal_forward",
          "backward": { "clip": "normal_forward", "reverse": true },
          "left": "sidestep_left",
          "right": "sidestep_right"
        }
      }
    }
  }
}

For sprinting, more walking clips and how they blend, see Recipe: a walk cycle.

Climbing

One clip serves for climbing. With timer_effect set to vertical_delta, it follows your vertical speed and plays backward when you climb down. timer_scale calibrates that speed: your climbing speed is a small number, so without it the clip plays very slowly. The example pack uses 8.

{
  "format_version": 2,
  "defaults": {
    "animations": {
      "climbing": {
        "clip": "climbing_up",
        "timer_effect": "vertical_delta",
        "timer_scale": 8
      }
    }
  }
}

A mace sequence

A mace has phases. This is the example pack’s group, trimmed to the clips that matter. Its clip names, such as mace_slam, are written without a side: the pack holds mace_slam_right and mace_slam_left, and the mod picks the one for the arm that does the action.

{
  "format_version": 2,
  "item_groups": {
    "MACE": {
      "static_when_using": true,
      "sequence": {
        "behavior": "mace",
        "charge_height": 3,
        "smash_distance": 1.5,
        "defaults": { "over_idle": true }
      },
      "animations": {
        "equip": { "clip": "mace_idle" },
        "idle": { "clip": "mace_idle", "hold_last_frame": true },
        "charge": { "clip": "mace_charge" },
        "slam": { "clip": "mace_slam" },
        "attack": { "variants": ["mace_attack_1", "mace_attack_2"] }
      }
    }
  }
}

over_idle is for phases whose clips were animated as a change from the idle pose. The example pack sets it for every phase of its mace, so the swings, the charge and the slam add onto the raised mace of mace_idle. With "over_idle": true, such a phase plays on top of the last frame of the idle clip. Without it, the clip drops the idle pose while it plays. Put it on one phase, or in sequence.defaults for every phase, as here. It takes the JSON value true or false without quotes (text is ignored), and it does nothing on equip and idle.

More sequences (a bow, a bucket and more) are in Recipe: an item sequence. Every other action is in Compat files, and emotes in particular are in Recipe: an emote.

More actions you can wire

Body actions go under defaults.animations. Held-item actions go under animations in an item group, as in the sword example. Each row is the shortest form that works, with placeholder clip names for you to swap for your own.

ActionWhereExample
idle: the standing loopdefaults.animations"idle": "my_idle"
jump: a clip for each sidedefaults.animations"jump": { "left": "my_jump_left", "right": "my_jump_right" }
landing: a light and a heavy landingdefaults.animations"landing": { "light": "my_land", "heavy": "my_land_heavy" }
crouch: the sneaking pose, with a clip for getting in and outdefaults.animations"crouch": { "clip": "my_crouch", "enter": "my_crouch_in", "exit": "my_crouch_out" }
swimming: a clip for the surface, under water and swimming verticallydefaults.animations"swimming": { "surface": "my_swim_surface", "underwater": "my_swim_under", "vertical": "my_swim_up" }
mining: the loop while you break a blockitem group animations"mining": "my_mine"
hand_in: the clip when you pick the item upitem group animations"hand_in": { "clip": "my_equip" }
useitem: a one-shot when you use the itemitem group animations"useitem": "my_use"
interact: the gesture for interacting with the worlditem group animations"interact": "my_interact"

Every row goes inside a complete compat file with "format_version": 2, like the examples above. The keys of each action, and the many actions not listed here, are on Compat files.

How the pack folder fits together

WhatWhere in the packHow it is read
Clipsassets/punchy_moves/animations/**/*.jsonEvery .json file, at any depth, in the order of its path. A later file’s clip replaces an earlier clip with the same name.
Compat filesassets/punchy_moves/compat/**/*.jsonEvery .json file, in path order, before the animation files. A later file’s single values replace earlier ones, and lists such as emotes add up.
Facesassets/punchy_moves/faces/Looks, eye shapes and reaction changes. See Faces in packs and clips.

When two packs have a clip or compat file at the same path, the copy from the higher pack in the player’s resource pack list is the one read. Reaction changes in faces/triggers.json from every pack are combined, and the higher pack wins for each reaction it sets.

What a clip file holds

Punchy! Moves reads the Bedrock animation format, which is what Blockbench writes and Punchy! Studio writes too. Here is a small hand-written clip in the format the two tools export:

{
  "format_version": "1.8.0",
  "animations": {
    "wave_right": {
      "animation_length": 1.2,
      "loop": true,
      "bones": {
        "right_arm": {
          "rotation": {
            "0.0": [0, 0, 0],
            "0.3": { "post": [0, 0, 140], "lerp_mode": "catmullrom", "easing": "easeOutBack" },
            "0.9": { "post": [0, 0, 120], "lerp_mode": "catmullrom" },
            "1.2": [0, 0, 0]
          }
        },
        "head": { "rotation": [0, 0, 8] }
      }
    }
  }
}

Here is a real excerpt from the example pack provided by Crafto, the first two keys of the arm in sword_attack_1 (0.8333 seconds long, it does not loop):

{
  "animation_length": 0.8333,
  "bones": {
    "right_arm": {
      "rotation": {
        "0.0": { "post": [-154.7935, 41.0047, -36.8323], "lerp_mode": "catmullrom" },
        "0.0833": { "post": [-24.0428, -4.4934, -84.4029], "lerp_mode": "catmullrom" }
      }
    }
  }
}
Keys of a clip file
KeyTypeDefaultWhat it doesExample
animationsRequiredobjectEach member is one clip, named by its key. A file whose root is not an object is dropped.
animation_lengthnumberthe last keyHow long the clip lasts, in seconds. Left out or 0, the clip lasts until its last key on any bone.1.2
loopbooleanfalseOnly the JSON value true loops. false, "hold_on_last_frame" and a missing key all play the clip once.
bonesobjectKeys of each bone, by bone name. Bone names are read in any case.
positionchannel[0, 0, 0]In a bone: one value for the whole clip, such as [0, 0, 8], or an object of keys by time in seconds.
rotationchannel[0, 0, 0]In a bone: written the same way as position.
scalechannel[1, 1, 1]In a bone: written the same way as position.
postarray of 3 numbersIn a key object: the value the key holds. vector works the same way.
prearray of 3 numbersthe key's postIn a key object: the value the motion arrives with, for a sudden change at the key's time.
lerp_modestringlinearIn a key object: linear, or catmullrom for a smooth curve through the keys around it. Every other value plays as linear.
easingstringnoneIn a key object: a curve of easings.net that shapes the motion into this key, such as easeOutBack. Names ignore case, underscores, dashes and spaces.easeInOutSine
facestring or objectHolds a look for the whole clip: "face": "sleepy", or { "look": "sleepy", "mix": 1 }. face_ bones key the face the same way.sleepy

A key written as three bare numbers, like "0.0": [0, 0, 0], is linear and has no easing. To ease or smooth a key, write it as an object.

The bones

BoneWhat it moves
rootThe whole player, about the neck point.
waistThe upper body. It turns and moves the head, body and both arms about the neck. The legs and the root do not follow it.
head, bodyThe head and the body, about the neck point. The game adds where the player looks on top of the head’s keys.
right_arm, left_armThe arms, about the shoulders.
right_leg, left_legThe legs, about the hips.
right_item, left_itemThe held item, in the hand. They count only in actions that hold an item, such as attacks, uses and item sequences.

Positions are in pixels, rotations in degrees, and scale is a factor where 1 is the normal size. A positive X rotation swings a hanging arm backward and tips the head down. The skin’s second layer (hat, jacket, sleeves, pants) is not keyed on its own, so keys on those names do nothing. A clip reads only its length, loop, bones and face. There is no Molang, no sound and no particle in a clip.

The full format, with every easing curve, is on Animation files.

Left and right clips

Many actions play a clip for the arm that does them. Moves looks for <name>_right or <name>_left first, then the plain <name>. A clip whose name ends in _alt also looks for <base>_right_alt and <base>_left_alt. That is how mace_slam in the compat file finds mace_slam_right in the example pack.

Clips are not mirrored for you, so a _left clip has to be keyed for the left side. In Studio, Clip > Mirror to Twin (Ctrl+Shift+M) builds one from the other. In Blockbench, key both.

Things that stop a clip from playing

  • The name does not match. Clip names are case-sensitive. Bow_Greeting in the compat file will not find bow_greeting in the animation file. A clip name that no file defines plays nothing, and the log says nothing about it. Blockbench’s default name for a new animation starts with animation. and the model name, so rename it to the plain name before you export.
  • The clip does not loop. Only "loop": true loops. In Blockbench, set Loop Mode to Loop. Hold On Last Frame plays the clip once.
  • A whole compat file is dropped. Any error in a format 2 file drops the file: a format_version other than 2, a root key the format does not know, an action name with a capital letter, an unknown key inside sequence or turn_in_place. Nothing in that file applies. Look in logs/latest.log for a line that says Could not load animation compat and your file’s name. After the colon, the text starts with Compat and the field path in English, then a message that may be in Portuguese. Studio’s Verdict panel tells you before you export.
  • Broken JSON drops an animation file. A file that is not valid JSON, or whose root is not an object, adds no clips at all. If one clip cannot be read, the clips before it stay and the rest of that file is skipped. Animation files log nothing when they fail, so check the JSON in Blockbench or Studio, which write valid JSON for you.
  • A changed emote key does not move. The emote wheel key and each emote key are set up once, when the game first installs them, and the key the game saved earlier can win over a new default from the pack, even after a restart. After you change keybind for an emote the game already knows, or change menu_key, set the key under Options, Controls, Key Binds.
  • The pack is off, or not reloaded. Turn the pack on under Options, Resource Packs, then press F3+T. Studio’s export does this for you when Turn the pack on and reload is ticked.
  • A higher pack has the same file. Packs are read in the player’s pack order, and for the same clip or compat path the highest pack wins. Give your files their own names.
  • An emote does nothing. Emotes start only when you stand still on the ground, and they are not sent to other players. An emote whose clip no file defines is not on the wheel.
  • The face stays Happy. An emote’s face takes the lower-case name of a built-in look. A look only your pack has plays Happy.
  • Two clips with one name. The later file in path order wins. Rename one.

Last checked against the mod on 30 October 2026.