Skip to content

rc_extra_seats

A FiveM resource that attaches players to configurable positions on a vehicle (cargo beds, flatbeds, industrial bodies, etc.) and treats them as passengers. Seat positions are defined per vehicle model in config.lua or produced by the in-game gizmo editor.

Documentation map

SectionUse it for
RequirementsServer prerequisites, targeting system options
Installationserver.cfg setup, ACE permissions
First Seat SetupStep-by-step walkthrough of placing your first seat with the editor
General Settingsconfig.lua options: targeting, door lock, collision eject
Seat DefinitionsSchema and field reference for Config.pickupTruckModels
Seat EditorFull keybind and command reference for the in-game gizmo editor
Admin Commands/seatocclist, /seatfreeplayer, /seatfreeall
Sitting and StandingPlayer-facing interaction
Editable FilesWhat you can and cannot modify
Server Exports / Client ExportsProgrammatic API for other resources
TroubleshootingDiagnostics for common failure modes

How seat data is structured

Seat positions live in Config.pickupTruckModels keyed by uppercase model name. Each seat is one entry in a table:

lua
Config.pickupTruckModels = {
    ['SANDKING'] = {
        { offset = { 0.1, -0.8, 1.0 }, boneName = 'seat_dside_r', detectRadius = 1.0 },
        { offset = { 0.8, -0.8, 1.0 }, boneName = 'seat_dside_r' },
    },
}

Field reference: see Seat Definitions.

You can write entries by hand, but the practical workflow is to produce them with the in-game gizmo editor and paste the output into config.lua.

Editor workflow — placing a seat with the gizmo

The editor is a frozen-freecam, mouse-driven gizmo. Open it next to a vehicle, place seats visually, export the result, paste it into config.lua.

1. Open the editor

Stand near (or aim at) the vehicle. Press N or type /seateditor in chat.

  • You need the rc_extra_seats.editor ACE permission, or membership in a group that has the command ACE (most admin groups already do). See Installation.
  • A scripted camera takes over and translucent preview peds spawn at any existing seat positions for the model.

2. Position the camera (fly mode)

The camera starts unfrozen — fly it into a useful viewpoint.

InputAction
MouseLook
W / SForward / back
A / DStrafe
ShiftFaster
AltSlower

3. Switch to edit mode

Press F to freeze the camera. The mouse cursor activates and the gizmo is now interactive.

4. Add or select a seat

InputAction
InsertAdd a new seat at the currently selected seat's position
DeleteRemove the selected seat
TabCycle to next seat
Shift + TabPrevious seat

The gizmo (three arrows + a yellow ring) follows the selected seat.

5. Drag the gizmo to position the seat

HandleDrag effect
Red arrowMove along vehicle X (right)
Green arrowMove along vehicle Y (forward)
Blue arrowMove along vehicle Z (up)
Yellow ringRotate the seated ped's heading (yaw)

Click and hold a handle — it highlights — then drag. The preview ped follows the gizmo in real time.

6. Assign the bone

Press B to overlay all vehicle bones as magenta dots. Hover one to see its name. Click it to attach the selected seat to that bone.

For pickup beds the common choices are seat_dside_r or seat_pside_r. For vehicles without rear seat bones (skidsteers, semis), use chassis or chassis_dummy.

Press B again to hide the bone overlay.

7. Adjust the detect radius

The detect radius is the sphere around the seat where the "Press E to sit" prompt becomes available. The orange ring drawn around the seat is the current radius.

InputEffect
Scroll wheel±0.05 m
Shift + scroll wheel±0.25 m

8. Optional: precise numeric input

Chat commands work while the editor is open. Use them when the gizmo isn't precise enough.

/seatset x 0.42        — set selected seat's X offset
/seatset yaw 174.84    — set selected seat's heading in degrees
/seatset radius 0.4    — set selected seat's detect radius in meters
/seatbone seat_dside_f — assign a bone by name
/seatgoto 2            — switch to seat index 2

9. Undo

Press Z to undo the last change (up to 50 steps).

Applying the seat config

Two ways to push your changes back to players.

Path A — paste into config.lua (permanent)

This is what you want for a real, persistent change.

  1. While in the editor, press ] (right bracket). The NUI export panel opens with a ready-to-paste Lua snippet. A copy is also written to seat_exports/<MODEL>_<YYYYMMDD_HHMMSS>.lua on the server disk.
  2. Copy the snippet from the panel.
  3. Open config.lua. Inside Config.pickupTruckModels, find the entry for your model (or add a new one keyed by uppercase model name).
  4. Replace the model's table contents with the pasted snippet, or merge if you only want to add some of the seats.
  5. Save config.lua.
  6. Restart the resource: restart rc_extra_seats in the server console.

Every client gets the new layout on the next resource start.

lua
-- Example: pasted snippet inside Config.pickupTruckModels
['SANDKING'] = {
    { offset = { 0.10, -0.80, 1.00 }, boneName = 'seat_dside_r', detectRadius = 1.0 },
    { offset = { 0.80, -0.80, 1.00 }, boneName = 'seat_dside_r' },
    { offset = { 0.10, -2.40, 1.00 }, boneName = 'seat_dside_r' },
    { offset = { 0.80, -2.40, 1.00 }, boneName = 'seat_dside_r' },
},

Path B — live broadcast (temporary, for tuning)

While the editor is open, press [ (left bracket) to broadcast the in-memory seat config to every connected player immediately. No restart needed.

This is useful for tuning with other players watching, but the change does not survive a resource restart. For a permanent change you must still complete Path A and paste into config.lua.

Closing the editor

Press N again, or type /seatedclose. The freecam releases, preview peds despawn, and you return to your ped at its pre-editor location.

How occupancy is tracked

The server is the authoritative source of who is sitting where. Seat claims are arbitrated server-side and replicated via the trunkSeats entity statebag. A periodic self-heal audit clears stale records when a vehicle is removed, a player disconnects, or the resource restarts. See Server Exports — Occupancy class for the data model.

Robicore