The Citizen character
The Citizen is the default player model provided by Facepunch. It comes with a complete skeleton, animgraph, blend shapes, and LOD meshes — everything you need to have a working player character out of the box.All Citizen source files — VMDLs, FBXs, animgraphs, and more — ship with the game. Find them under
addons/citizen/models/citizen in your s&box installation. These files are kept in sync with Facepunch’s source folder, so new files appear automatically when Facepunch adds them.Source files and scale
All Citizen source files are in centimeters. The VMDL applies aScaleAndMirror modifier with a value of 0.3937 to convert to the engine’s inch-based units. When you create clothing or other bonemerged content, work in centimeters and apply the same modifier in your VMDL.
Procedural helper bones
The Citizen uses constraint-driven procedural bones for better limb deformation. You do not need to export animation data for these bones — the engine drives them at runtime.arm_upper_[R/L]_twist[0/1]— shoulder to bicepsarm_elbow_helper_[R/L]— extreme elbow anglesarm_lower_[R/L]_twist[0/1]— forearm to wristleg_upper_[R/L]_twist[0/1]— pelvis to thighleg_knee_helper_[R/L]— extreme knee anglesleg_lower_[R/L]_twist[0/1]— calf to footneck_clothing— reduces neck twist for clothing items
LOD reference
| LOD | Triangles (body) | Switch distance |
|---|---|---|
| LOD0 | 6.6k (+ 7.2k head) | — |
| LOD1 | 4.2k (+ 7.2k head) | 5 |
| LOD2 | 1.7k (+ 1.0k head) | 20 |
| LOD3 | 1.0k (+ 0.4k head) | 40 |
| LOD4 | 1.0k (+ 0.2k head) | 70 |
Adding animations
To add a small number of new animations without forking the full Citizen VMDL, use the Base Model field in ModelDoc and referencecitizen.vmdl. You can only add animations this way — you cannot add new meshes, materials, or bones through this feature.
For a community-made Citizen control rig, see: https://github.com/Ali3nSystems/Ecodelia-Tools-for-Facepunch-Assets
Stretching limbs
The Citizen supports non-uniform limb lengths. Because animations store position offsets in parent-local space, you can author animations where bone offsets differ from the default — effectively stretching or squashing arms and legs without per-bone scale data.First-person weapons
Facepunch provides a ready-to-use first-person weapon pack at: https://sbox.game/facepunch/sboxweapons The pack is open-source. When downloaded through the editor it includes source files: VMDLs, FBXs, animgraphs, and subgraphs.How to attach arms to a weapon
The setup is the reverse of what Source 1 developers may expect:Animgraph parameters
Once arms are bonemerged onto a weapon, send animgraph parameters to drive animations. Below are the most commonly used parameters.Movement parameters
Movement parameters
| Parameter | Type | Description |
|---|---|---|
b_grounded | bool | Whether the player is on the ground. |
b_jump | bool (self-resets) | Trigger a jump. |
b_sprint | bool | Sprinting stance. Set true only when the sprint key is held and the player is moving. |
move_bob | float 0–1 | Intensity of sway and bob. |
move_bob_cycle_control | float 0–1 | Manual scrub of movement animation phase. |
Weapon actions
Weapon actions
| Parameter | Type | Description |
|---|---|---|
b_attack | bool (self-resets) | Fire or punch. |
b_attack_dry | bool | Use when the weapon is empty. |
b_reload | bool (self-resets) | Trigger reload animation. |
b_empty | bool | Set when the magazine is empty. |
ironsights | enum (1 = ADS) | Aim-down-sights stance. |
b_holster | bool | Holster the weapon. |
Speed scaling
Speed scaling
| Parameter | What it controls |
|---|---|
speed_reload | Reload animations |
speed_deploy | Deploy and holster animations |
speed_ironsights | Iron sights transitions |
speed_grab | Grab stance and gestures |
Animation event tags
The animgraph fires event tags as strings to your game code viaOnAnimTagEvent. Use these instead of hard-coding timings.
| Tag | Meaning |
|---|---|
attack_discouraged | The weapon is not ready to fire cleanly yet. |
holster_finished | Safe to destroy the weapon GameObject. |
reload_bodygroup | The magazine is off-screen — swap bodygroup now. |
reload_increment | A mag/clip has been inserted — increment ammo counter. |
melee_swing | Active across the full melee swing. |
melee_hit | The moment of melee impact. |
Replacing weapon meshes
To use your own art while keeping the weapon’s animgraph, hide the default weapon mesh and bonemerge (or parent) your mesh on top. Adjust hand grip using theFingerAdjustment_* float parameters:
FingerAdjustment_L3_Bend bends the left hand’s middle finger.