
Wiki
Vehicle MC Wiki
Vehicle configuration, rig backends, service systems, terrain handling, and combat-ready admin workflows.
Getting Started
Start here for the real first-boot checks, module setup, and the runtime surfaces that affect every server.
Vehicle Authoring
Learn the top-down YAML flow so you know what belongs in config.yml, vehicles.yml, service files, and player-side UI files.
YML File Guides
Jump straight into the exact YAML file guide you need when you already know the filename and want the public explanation fast.
Vehicle Content
Build readable vehicle families, terrain behavior, browse layers, and driver feedback.
Service and World
Handle vehicle servicing, repair tools, fuel tanks, spawnpoints, and station behavior.
Combat and Ecosystem
Connect Vehicle MC to Duck Shot and the combat stack without losing control of performance or readability.
Vehicle MC separates vehicle physics from vehicle rendering.
That split is one of the plugin's biggest strengths:
- Vehicle MC stays in charge of movement, collision, seats, and interaction
- the rig backend decides how the vehicle is visually drawn
If the vehicle drives correctly but looks wrong, this is the layer to fix.
The three rig layers
Vehicle MC rigs are easiest to understand as three separate layers:
- the physics authority root
- the visual rig backend
- the hitbox and interaction layer
The visual rig is not the same thing as the movement authority. That is why you can retune rendering without rewriting the entire vehicle controller.
Backend choices
Vehicle MC supports three visual backends:
DISPLAYARMOR_STANDMODELENGINE
Global default:
entities:
rig:
backend: DISPLAYPer-vehicle override:
rig:
backend: MODELENGINEPublic rule:
- use
DISPLAYfor the main modern path - keep
ARMOR_STANDfor legacy parity or special fallback cases - use
MODELENGINEwhen you want external model and animation playback, while Vehicle MC still owns physics
Display backend basics
The Display backend is where most modern Vehicle MC setups should start.
Important global knobs:
entities:
rig:
display:
baseScale: 0.625
viewRange: 128.0
teleportDurationTicks: 3
interpolationDurationTicks: 3
interpolationDelayTicks: 0
teleportEveryTick: true
offsetsFollowTilt: trueWhat these do:
baseScaleis the first thing to check if all rigs look too big or too smallviewRangecontrols how far away rigs stay visible- teleport and interpolation values affect smoothness
offsetsFollowTiltdecides whether parts move with pitch and roll or mainly stay yaw-driven
rig.root
rig.root defines the main carrier entity and visual root item.
Common fields:
rig:
root:
entity: ARMOR_STAND
equipment:
helmet: minecraft:diamond_hoe{Damage:10}
options:
marker: false
invisible: true
gravity: false
small: falseThis is where you decide:
- what the base rig model is
- whether the carrier is visible
- whether the carrier uses small or full-size options
offset on the root is especially useful for fixing a model that sits too low or too high visually without moving the true vehicle authority.
Seat entities
rig.seatEntities controls the supporting entities used for seats.
That is different from seats[item] in the vehicle data:
seats[item]describes who can sit whererig.seatEntitiesdescribes how those seat carriers are represented
Keep the seat-entity layer consistent unless you have a strong reason to change it.
Anchors
Anchors are named attachment points for other systems.
rig:
anchors:
exhaust_left:
offset: [0.0, 0.2, -1.2]
rotation: [0.0, 0.0, 0.0]Good uses for anchors:
- exhaust points
- muzzle points
- rotor centers
- hose origins
- custom FX attachment points
Anchors let you keep those positions reusable instead of scattering hard-coded offsets everywhere.
Parts
rig.parts[item] is where most visible sub-objects live.
Each part can define:
id- model item
- local offset
- local rotation
- per-part options
- scale
That means you can build a readable visual hierarchy instead of one giant fused model description.
Part animation
Parts can also carry animation instructions.
Example:
animation:
type: ROTATE_Y
when: DRIVER
idleDegPerTick: 0.0
activeDegPerTick: 0.0
steerMaxDeg: 35.0
smoothing: 0.35
pivot: SELFThis is useful for:
- steering visuals
- spinning details
- driver-only animated behavior
- lightweight visual feedback without external animation middleware
Two important real-world uses already appear in the current source examples:
- a dirt bike handlebar part that follows steering input
- a helicopter rotor part that spins faster when a driver is actively flying
Example steering part:
- id: handlebars
steeringYaw:
enabled: true
maxDeg: 19.0
smoothing: 0.35
invert: true
pivot: SELFExample rotor part:
- id: rotor_center
tiltPosFactor: 0.9
animation:
type: ROTATE_Y
when: DRIVER
idleDegPerTick: 8.0
activeDegPerTick: 20.0
activeSpeedThreshold: 0.05Interpretation:
steeringYawis for a normal rig part that should visibly follow inputtiltPosFactoris useful when a large part such as a rotor should not fully translate with pitch and rollanimation.when: DRIVERis a clean way to tie a visual state to occupancy without inventing a full ModelEngine state machine
Wheels
rig.wheels[item] is the dedicated wheel system, not just another part list.
Example:
rig:
wheels:
- partId: front_left
radius: 0.38
spinEnabled: true
spinAxis: X
steer:
enabled: true
maxDeg: 19.0
smoothing: 0.35Wheel config handles:
- rolling spin
- steering yaw
- suspension probes
- axle behavior
- speed-based blur or swap behavior
If your wheels look wrong, do not try to fix that only through generic part offsets.
If you want a practical wheel-first walkthrough for pivots, suspension, axle roll, and hybrid ModelEngine bodies, continue into native Wheels, Suspension, Axles, and Hybrid ModelEngine Rigs.
If you want the concrete source-backed examples for:
- dirt bike steering assemblies
- four-wheel native jeeps
- hybrid ModelEngine bodies
- tank-style ModelEngine rigs
- helicopters and rotor parts
continue into advanced Rig Examples: Dirt Bikes, Jeeps, Tanks, Helicopters, and Input-Driven Parts.
pivotOffset
pivotOffset is the important fix when a wheel or axle appears to orbit the wrong center.
Use it when:
- the wheel model was exported off-center
- steering looks correct but rotation looks wrong
- the whole wheel seems to circle an invisible point
This is one of the most important wheel-specific knobs in the plugin.
Suspension and axle behavior
Vehicle MC also supports visual suspension and axle roll behavior.
These are useful when:
- the vehicle should react visibly to uneven terrain
- a solid axle should tilt between left and right wheel probes
- ground contact needs to read better without rewriting physics
For basic setups, keep these modest. Overdoing them can make a clean rig look unstable.
ModelEngine backend
ModelEngine is optional, but the backend is already clearly defined.
Example:
rig:
backend: MODELENGINE
modelEngine:
enabled: true
modelId: "tank7"
hideBaseEntity: true
overrideHitbox: false
applyPitchToRoot: true
states:
idle:
animation: "idle"
lerpInTicks: 5
lerpOutTicks: 5
drive:
animation: "walk"
lerpInTicks: 3
lerpOutTicks: 3
turn_left:
animation: "sprint"
overlay: trueImportant public point:
- Vehicle MC still owns the authoritative physics pose
- ModelEngine is the body-render and animation layer
- hybrid setups are often the best answer when you need premium body art plus native wheel behavior
If a ModelEngine rig is selecting the wrong state or following the wrong pose, continue into rig Debug Commands, Pivot Tools, and Live Diagnostics after this page.
That makes it a visual backend, not a replacement for the Vehicle MC runtime.
Canonical ModelEngine state keys
Vehicle MC already has a clear state vocabulary:
- base states:
idle,drive,reverse,airborne - overlay states:
turn_left,turn_right
Use those state names consistently so your models and your config stay readable together.
Suggested order
- Get the vehicle driving correctly first.
- Choose one visual backend per vehicle family.
- Fix root scale and offset before tuning individual parts.
- Add anchors before hard-coding lots of repeated FX offsets.
- Tune wheels as wheels, not as generic decorative parts.
- Use ModelEngine when you need a richer external animation path, not just because the option exists.

