This page answers one question: “how do I make a restraint look right when the player moves?”
It’s the decision-first starting point — read it before the deep
Animations reference (the mechanics: export, the constructor block,
the properties unlocks). Here we cover what to author and the handful of rules that keep it
from silently doing nothing.
Every clip you bind is one of these two. Picking the right one is the single most consequential
choice when animating a restraint.
OVERLAY — a pose on some joints
A pose masked to a joints list. It owns exactly those joints; the base animation shows
through on every joint not listed. It reuses the base for the rest of the body. Use it for
arm / hand / head / mouth / eye poses. Several overlays on different limbs compose
freely.
FULL_BODY — a whole-body animation
A whole-body clip that replaces the base for that state. Use it when the restraint changes
the gait itself — a restricted “walk a little”, a hop, a hobble. It becomes the base for that
state, so it drives the whole body including movement. A FULL_BODY gait and an OVERLAY arm
pose still compose.
Each rule below prevents a real, silent failure — the kind that produces no error, just a wrong
look. Internalise these and most “why is my restraint not animating?” questions answer themselves.
POSE = OVERLAY, GAIT = FULL_BODY. A pose on a limb → OVERLAY masked to that limb. A change in
how you walk / hop → FULL_BODY.
Always write "mode": "OVERLAY" for poses. If you omit mode, it defaults to FULL_BODY,
and your arm clip will freeze the whole body (legs included) — with no error.
Keyframe exactly the joints you list, and copy joint names exactly — they’re case-sensitive
(Arm_R, not Arm_r). A clip that doesn’t actually animate a listed joint renders nothing
there (the base shows through); you only get a one-time log warning.
Never put Root in an overlay’s joints. Overlays don’t reconcile the root/hips — keep
overlays to limb chains. Anything that moves the root must be FULL_BODY.
Own whole limb chains (Shoulder → Arm → Elbow → Hand together), so the seam between your
overlay and the base lands at a near-static parent joint.
Bind your overlay to EVERY state the wearer can reach — IDLE, WALK, RUN, SNEAK, SWIM, FALL,
JUMP (and STRUGGLE). Re-list the same clip per state. An armbound player with only IDLE/WALK
bound will flash free arms when sprinting or swimming. (Some states are player-only — see the
animation list before binding one on an NPC-only item.)
Keep co-equipped restraints’ joint lists disjoint (arms vs head vs legs). Two clips that keep
the same joint do not blend — the higher pose_priority wins it outright.
Max 4 overlays per state. A 5th overlay on the same state is dropped (lowest
pose_priority first), with only a log warning.
Gait clips speed-sync to movement automatically. When a WALK/RUN/SNEAK/SWIM gait is bound (the
pack editor does this for you), its cadence follows the player’s actual speed (no foot-sliding).
This is a property of the gait clip class, not just an editor feature — a hand-written JSON clip
gets the same behaviour by targeting it (see Animations).
Author the base WALK at vanilla walk pace and RUN at sprint pace; pair a slowed bound gait with the
item’s movement-speed restriction so the steps match the distance travelled.
Iterate with F3+T (it reloads animation content), not/reload.