Bones & regions
The two canonical reference tables every modeller and item author needs: the 20-bone EF biped
(the only skeleton meshes skin to) and the body regions (the values you put in an item’s
regions array). Both are verified against the mod’s code.
The 20-bone EF biped
Section titled “The 20-bone EF biped”The skeleton is the official Epic Fight biped — exactly 20 joints, case-sensitive names.
The renderer builds this skeleton in Java (TiedUpArmatures.buildBiped) and matches your GLB’s
bones to it by name. A mistyped joint name is silently ignored — the mesh deforms wrong, with
no error in the log.
Exact joint names
Section titled “Exact joint names”Root,Thigh_R, Leg_R, Knee_R,Thigh_L, Leg_L, Knee_L,Torso, Chest, Head,Shoulder_R, Arm_R, Elbow_R, Hand_R, Tool_R,Shoulder_L, Arm_L, Elbow_L, Hand_L, Tool_LHierarchy
Section titled “Hierarchy”Root├── Thigh_R│ ├── Leg_R│ └── Knee_R├── Thigh_L│ ├── Leg_L│ └── Knee_L└── Torso └── Chest ├── Head ├── Shoulder_R │ └── Arm_R │ ├── Elbow_R │ └── Hand_R │ └── Tool_R └── Shoulder_L └── Arm_L ├── Elbow_L └── Hand_L └── Tool_LPer-joint reference
Section titled “Per-joint reference”| Joint | Role |
|---|---|
Root | Global root — do not keyframe it for a worn-item animation |
Thigh_R / Thigh_L | Hip |
Leg_R / Leg_L | Upper leg |
Knee_R / Knee_L | Lower leg / foot (the “foot” is the same joint as Knee in EF) |
Torso | Lower spine |
Chest | Upper spine / ribcage |
Head | Head (vanilla head tracking applies unless an animation overrides it) |
Shoulder_R / Shoulder_L | Clavicle / shoulder pivot |
Arm_R / Arm_L | Upper arm — in EF naming, “Arm” already means upper arm |
Elbow_R / Elbow_L | Forearm — in EF naming, the forearm is called “Elbow” |
Hand_R / Hand_L | Hand |
Tool_R / Tool_L | Tool attachment point (usually left at identity) |
Naming differences vs other conventions
Section titled “Naming differences vs other conventions”Coming from a generic Blender rig, Mixamo, or another mod? Translate your names:
| Common Blender / external name | TiedUp EF name | Note |
|---|---|---|
root | Root | Uppercase |
Spine / Spine1 | Torso | No number |
Spine2 / Chest | Chest | |
Shoulder.R / Clavicle.R | Shoulder_R | Dot → underscore |
Upper_Arm.R / UpperArm.R | Arm_R | ”Arm” already means upper arm |
Forearm.R / LowerArm.R | Elbow_R | Forearm is called Elbow in EF |
Hand.R | Hand_R | Dot → underscore |
Thigh.R | Thigh_R | |
Leg.R (upper) | Leg_R | |
Foot.R / Knee.R | Knee_R | Foot is the same joint as Knee_R in EF |
| — | Tool_R / Tool_L | No common equivalent |
Weight limits
Section titled “Weight limits”You don’t need to skin to every joint. The GLB exporter only writes bones that actually have
skinned vertices, and the renderer matches by name against the full biped — so a blindfold GLB
listing only Head is perfectly fine. Partial bone lists are optimal, not a limitation.
Body regions
Section titled “Body regions”Every item declares one or more body regions in its regions array. The 14 values below are
the complete, exact set the parser accepts (matched against BodyRegion, case-insensitive —
the parser uppercases your input). An unknown region name is dropped with a WARN (often a “did
you mean…?” suggestion); if every region is invalid, the whole item is skipped.
Region table
Section titled “Region table”| Region | Global? | Typical items | Joints it tends to skin to |
|---|---|---|---|
HEAD | global | Hood, helmet, head harness | Head |
EYES | sub of HEAD | Blindfold | Head |
EARS | sub of HEAD | Earplugs | Head |
MOUTH | sub of HEAD | Gag, muzzle | Head |
NECK | — | Collar, choker | (cosmetic — Chest or Head) |
TORSO | — | Straitjacket, harness | Torso, Chest |
WAIST | — | Belt, chastity belt | Torso, Chest |
ARMS | global | Handcuffs, armbinder | Shoulder_R/L, Arm_R/L, Elbow_R/L, Hand_R/L, Tool_R/L |
HANDS | sub of ARMS | Mittens, fist mitts | Hand_R/L (+ arm chain as needed) |
FINGERS | sub of ARMS | Finger cuffs | (cosmetic — Hand_R/L) |
LEGS | global | Ankle cuffs, leg binder | Thigh_R/L, Leg_R/L, Knee_R/L |
FEET | sub of LEGS | Forced shoes, foot cuffs | Knee_R/L |
TAIL | — | Tail plug (pet play) | (cosmetic — adjacent joint) |
WINGS | — | Decorative wings | (cosmetic — Chest) |
Global vs sub-regions
Section titled “Global vs sub-regions”Three regions are global (isGlobal() == true on the enum) — they conceptually encompass
sub-regions:
| Global | Sub-regions |
|---|---|
HEAD | EYES, EARS, MOUTH |
ARMS | HANDS, FINGERS |
LEGS | FEET |
Cosmetic-only regions
Section titled “Cosmetic-only regions”NECK, FINGERS, TAIL, and WINGS have no biped joint of their own. Items in these regions
render by skinning to whichever adjacent joint makes sense (e.g. a collar skinned to Chest, a
choker to Head), but they do not change the player’s pose. They behave like any other region
for slot occupancy and blocked_regions.
How the two tables connect
Section titled “How the two tables connect”- Pick the region(s) for your item from the 14 above and put them in
regions. This drives slot occupancy, escape difficulty, and (if you declare it) blocking. - Skin your mesh to the relevant joint names from the biped — the names, not the region, determine deformation.
- (optional) If the item forces a pose, list the same joint names in an
OVERLAYbinding’sjointsarray so the animation drives only those joints.
For the full item schema see Item JSON; for the build-it-once tour see Your First Item.