Commands#
Sit Everywhere registers three commands players and admins type, plus a diagnostics command for debugging. The first three can be renamed from /sitconfig → Commands; the 1.x aliases stay registered whatever you rename them to.
Command | Where | Description |
|---|---|---|
| In game | Opens the animation picker to sit wherever the player stands. Next to a preset seat, takes that seat instead. Also answers to |
| In game | The same, opened on the Bed category to lie down. Also answers to |
| In game | Opens the settings panel. Needs the |
| In game, output in F8 | Diagnostics for the seat solver. Only answers while Debug mode is on. |
Renaming a command needs a restart; the chat suggestions follow the new name. Renaming
/sitconfigdoes not rename its ace — see Installation.
Key Bindings#
Three actions are FiveM key bindings, so every player can rebind them in the pause menu under Settings → Key Bindings → FiveM:
Binding | Default | Does | Internal name |
|---|---|---|---|
Stand up |
| Stands the player up and releases the seat. On the way to a preset seat, cancels the walk. |
|
Sit down (preset seats) |
| Takes the seat under the floating prompt. |
|
Lie down (preset seats) |
| Lies down on the seat under the floating prompt. |
|
The two preset bindings only exist when the floating prompt is in use (Preset seats → Interaction set to automatic with no third eye, floating text or both). The internal names are what a keybind preset or a bind line refers to.
The change animation key (E while seated) is a game control picked in the panel, not a binding, so it is the same for every player.
A binding's default only applies to players who have never bound it. Changing Stand up key in the panel moves it for new players; anyone who already has
Xsaved keepsXuntil they rebind it themselves.
The Debug Command#
/sitdev exists to explain what the seat solver is doing. Turn on General → Debug mode first — the change applies straight away — then open the F8 console to read the output.
Sub-command | Prints |
|---|---|
| Solves the prop you are aiming at, or the nearest one within 4 m: its model, its kind, where the height came from ( |
| Every animation's offset from the seat point. |
| While seated: whether the pose is playing, whether the ped is frozen, and how far it is from the point it was put on. |
| The same as |
Exports#
Sit Everywhere has no exports. Other resources drive it through the events and callbacks below — a radial menu, a phone app, a job script or your own furniture can open the picker, seat a player on a prop and check whether a seat is taken.
Client Events#
Open the picker on a prop
Opens the animation picker on a chair, bench, sofa or bed, exactly as the third-eye option does. Pass the entity, or 0 to use the nearest seat (or bed) within Interaction distance.
-- From a client script
TriggerEvent('qs-siteverywhere:sit', entity) -- sitting poses
TriggerEvent('qs-siteverywhere:lay', entity) -- lying poses
-- From the server, on the nearest seat to that player
TriggerClientEvent('qs-siteverywhere:sit', source, 0)The entity can be a plain handle or the data table ox_target hands to its options. With nothing to sit on in range, the player is told "There is nothing to sit on around here."; too far from the prop, "You are too far away."
Sit or lie down anywhere
The same as typing the command. Use the 1.x aliases: they never change, so your integration keeps working if an admin renames /sit or /lay.
ExecuteCommand('sitanywhere') -- /sit
ExecuteCommand('laydown') -- /lay
ExecuteCommand('StandUp') -- the stand up keyFor example, a sit entry in an ox_lib radial menu:
lib.addRadialItem({
id = 'sit_anywhere',
icon = 'chair',
label = 'Sit',
onSelect = function()
ExecuteCommand('sitanywhere')
end,
})React to a settings change
Fired on every client each time the settings arrive from the server — on join, and after every save in /sitconfig.
AddEventHandler('qs-siteverywhere:settingsApplied', function()
-- the panel was saved, or this player just received the settings
end)1.x event names
The 1.x events are still registered and do exactly the same as the ones above, so scripts written for version 1 keep working untouched.
TriggerEvent('qs-sit:sit', entity) -- = qs-siteverywhere:sit
TriggerEvent('qs-sit:laydown', entity) -- = qs-siteverywhere:laySeat Claiming#
Every seat a player takes is reserved on the server under its coordinates, rounded to the centimetre, so two clients that solve the same bench seat land on the same reservation. Another resource can use the same registry — a furniture or job script that seats players on its own points keeps them from overlapping with Sit Everywhere's.
Check, take and release a seat
From a client script, with a vector3 or an { x, y, z } table:
-- true when another player holds that point
local taken = lib.callback.await('qs-siteverywhere:seat:occupied', false, coords)
-- reserves it for this player; false when somebody else holds it
local ok = lib.callback.await('qs-siteverywhere:seat:take', false, coords)
-- releases it again
TriggerServerEvent('qs-siteverywhere:seat:free', coords)A reservation lasts until the player releases it, stands up or disconnects. One held by a player who is no longer on the server is cleared the next time anyone asks for that point. With Sitting → Seat claiming off, take always succeeds and occupied always answers false.
1.x names
TriggerServerEvent('qs-sit:takePlace', coords)
TriggerServerEvent('qs-sit:leavePlace', coords)
local taken = lib.callback.await('qs-sit:getPlace', false, coords)In 1.x these never reported a seat as taken. In version 2 they share the registry above, so a script that relied on them starts getting real answers.
About the Messages#
Every message a player sees comes from the notify section of locales/<code>.json, in the language chosen in the panel, and every console warning starts with [qs-siteverywhere]. Common Errors lists what each one means.



