Sit Anywhere
Showcase
Click here if the video above doesn’t work. (Youtube)
About
Have you ever just wanted to be able to sit down, without having to line up your character perfectly, use a bunch of time to find a suiting animation or use noclip to reach the seat? Well, then you have found just the right resource!
Sit Anywhere is a standalone script that allows people to sit on over 250 different models and over 520 different preset locations. You can also (for example) have multiple people sit on the same bench, as there are multiple “slots” to sit on for most models. The script is also highly optimized (0.00 ms when idle, 0.03 ms while sitting) and allows for custom keybind through fivem’s key mapping. I’ve also made it highly configurable (see Configuration) and it supports the usage of both qTarget and qb-target as targeting solutions. On top of all of this, you can freely edit the source code to your heart’s content (no encryption or obfuscation etc.).
I have been using the script for quite some time, so there shouldn’t be many bugs or problems. However, if you find any bugs/issues, report them and I’ll fix them ASAP!
Key Features
- 480+ vanilla models to sit or lay down on!
- 980+ preset locations to sit or lay down on, including most Gabz, G&N and Nopxiel interiors
- Multiple sitting positions (“slots”) on most models
- Highly optimized (0.00 ms when idle, 0.03 ms while sitting) (0.01-0.05 ms if using prompts)
- Key mapping (custom keybinds) for both keyboard and controllers
- Highly configurable (See Configuration)
- All of the code is accessible
- Supports ox_target, qb-target and qTarget
- A prompts system for those who want to use that!
- Customisable localization; You can easily translate or change the text in the config file!
Configuration
The script is highly configurable, click below to see the full config file.
Config.lua
Config = {}
-- Debugmodes
Config.Debugmode = false -- General debugging, shows what seats/beds you can sit/lay on and the direction you will be facing, also enables debugging commands. (Only shows seats nearby)
Config.DebugPoly = false -- This is not advised unless you have set your PolyZone script set to only render polys nearby, the prefeered way is to go into list.lua and set the debug on the polyzone group instead! (see gabz_atom)
-- What framework you use. Supported frameworks are: "QBCore", "TMC" or false (false = standalone)
Config.Framework = false
-- Just like Config.Framework; What framework/libary you use for the notifications. Supported values: "QBCore", "TMC", "OX" or false (false = standalone)
-- IMPORTANT NOTE: If you use OX you NEED to add '@ox_lib/init.lua', under client_scripts in fxmanifest.lua!
Config.Notifications = false
-- The targeting solution (3rd eye) to use.
-- false = don't use any targeting solution. ('false'/"false" will NOT work, false NEEDS to be a boolean.)
-- 'qb-target' = qb-target by BerkieBb and its many other contributors. (https://github.com/BerkieBb/qb-target)
-- 'qtarget' = qTarget by Linden (thelindat), Noms (OfficialNoms) and its many other contributors. (https://github.com/overextended/qtarget)
-- 'ox_target' = ox_target by Linden (thelindat) and its many other contributors. (https://github.com/overextended/ox_target)
Config.Target = 'ox_target'
-- Teleport to the last position before getting seated when we found no way to get to the seat
Config.TeleportToLastPosWhenNoRoute = false
-- Always teleport in/out of the seat
Config.AlwaysTeleportToSeat = false
Config.AlwaysTeleportOutOfSeat = false
-- Tthe interaction and prompts distance, used for max distance the 3rd eye can see, how far the /sit command will look for entites and how close you have to be for a prompt to be showed if you use those.
Config.MaxInteractionDist = 2.0
Config.MaxPromptDist = 1.8
-- The maximum amount of tilt a object can have before it is rendered unsuitable to sit on
Config.MaxTilt = 20.0
-- These will be the default keys/buttons
Config.DefaultKeybinds = {
GetUp = {
Keyboard = 'X',
PadAnalog = 'RRIGHT_INDEX'
},
-- Only used in the prompts system
SitDown = {
SitKeyboard = 'E',
LayKeyboard = 'G',
SitPadAnalog = 'LLEFT_INDEX',
LayPadAnalog = 'LRIGHT_INDEX'
}
}
-- Whether or not to add chat suggestion.
Config.AddChatSuggestions = true
-- Whether or not to use the prompt system. NOTE: this uses extra resources.
Config.UsePrompts = false
-- If true, instructions on how to get up form the seat/bed will be displayed in the top left corner of your screen
Config.ShowHelpText = true
-- The script will ATTEMPT (no guarantee) to prevent showing help text when other scripts are allready showing help texts, this will stop some of the annoying pling sounds.
Config.PreventHelpTextOverwrites = true
-- Whether or not trigger an reduce stress event/export when sitting/laying down. You wil have to add a event/export yourself for this to work.
Config.ReduceStress = false
-- Invalidates the idle cam while you are seated/laying down.
Config.InvalidateIdleCam = true
-- Use the coords of where the 3rd eye intersects with the object to find the closest seat. If set to false the coords of the player ped will be used instead.
Config.UseTargetingCoords = true
-- Sets if the targeting scripts should draw sprites in the center of the sit poly zones (This option is only supported by ox_target)
Config.TargetDrawSprite = true
-- These are the icons/labels if we use a targeting solution.
Config.Targeting = {
SitIcon = "fas fa-chair",
LayIcon = "fas fa-bed",
SitLabel = "Sit Down",
LayLabel = "Lay Down"
}
-- The localization for the notifications, chat suggestions and keymapping.
Config.Lang = {
-- Notifications
Notification = {
OccupiedSit = "This seat is already occupied!",
OccupiedLay = "You can't lay down here!",
NoAvailable = "No seat is avalible!",
NoFound = "No seats were found!",
NoBedFound = "Nothing to lay down on was found!",
TooTilted = "This seat is too tilted!",
CannotReachSeat = "You can't reach this seat!",
CannotSitInSeat = "You can't sit in this seat!",
CannotReachBed = "You can't reach this bed/bench!",
AlreadyAttemptingToSit = "You are already attempting to sit down!",
AlreadyAttemptingToLay = "You are already attempting to lay down!",
InVehicleSit = "You cannot sit down while you are in a vehicle!",
InVehicleLay = "You cannot lay down while you are in a vehicle!"
},
-- Chat Suggestions
ChatSuggestions = {
Sit = "Sit down on the closest seat",
Lay = "Lay down on the closest bed/bench"
},
-- Key Mapping
KeyMapping = {
-- %s is automatically replaced with the key they need to press.
SitDown = "Press %s to sit down",
LayDown = "Press %s to lay down",
GetUp = "Press %s to get up"
},
-- Description in Settings>Key Bindings>Fivem
KeyBindingDesc = {
Keyboard = {
SitDown = "Sit - Sit Down (Seat)",
LayDown = "Sit - Lay Down (Bed/Bench)",
GetUp = "Sit - Get Up"
},
PadAnalog = {
SitDown = "Sit - Sit Down (Seat) - Controller",
LayDown = "Sit - Lay Down (Bed/Bench) - Controller",
GetUp = "Sit - Get Up - Controller"
}
}
}
-- The diffrent sitting settings, don't touch unless you know what you are doing.
Config.SitTypes = {
['default'] = { -- Default settings, if non has been spesified, don't touch! (unless you really know what you are doing)
skipGoStraightTask = false,
teleportIn = false,
teleportOut = false,
timeout = 8,
scenarios = {
[1] = { name = "PROP_HUMAN_SEAT_CHAIR_MP_PLAYER", offset = vector4(0.0, 0.0, 0.0, 0.0) }
}
-- animation = { dict = "timetable@jimmy@mics3_ig_15@", name = "idle_a_jimmy", offset = vector4(0.0, 0.0, 0.0, 0.0), flag = 1 }
},
['chair'] = {
scenarios = {
[1] = { name = "PROP_HUMAN_SEAT_CHAIR_MP_PLAYER" }
}
},
['chair2'] = {
scenarios = {
[1] = { name = "PROP_HUMAN_SEAT_CHAIR_MP_PLAYER" },
[2] = { name = "PROP_HUMAN_SEAT_ARMCHAIR", offset = vector4(0.0, 0.05, 0.0, 0.0) }
}
},
['chair3'] = {
scenarios = {
[1] = { name = "PROP_HUMAN_SEAT_CHAIR_MP_PLAYER" },
[2] = { name = "PROP_HUMAN_SEAT_ARMCHAIR", offset = vector4(0.0, 0.05, 0.0, 0.0) },
[3] = { name = "PROP_HUMAN_SEAT_DECKCHAIR" }
}
},
['barstool'] = {
teleportIn = true,
scenarios = {
[1] = { name = "PROP_HUMAN_SEAT_BAR" }
}
},
['stool'] = {
teleportIn = true,
scenarios = {
[1] = { name = "PROP_HUMAN_SEAT_CHAIR_MP_PLAYER" }
},
},
['deck'] = {
scenarios = {
[1] = { name = "PROP_HUMAN_SEAT_DECKCHAIR" }
}
},
['sunlounger'] = {
skipGoStraightTask = true,
timeout = 12,
scenarios = {
[1] = { name = "PROP_HUMAN_SEAT_SUNLOUNGER" }
}
},
['tattoo'] = {
animation = { dict = "misstattoo_parlour@shop_ig_4", name = "customer_loop", offset = vector4(0.0, 0.0, -0.75, 0.0) }
},
['strip_watch'] = {
scenarios = {
[1] = { name = "PROP_HUMAN_SEAT_STRIP_WATCH" }
}
},
['diner_booth'] = {
teleportIn = true,
teleportOut = true,
scenarios = {
[1] = { name = "PROP_HUMAN_SEAT_CHAIR_MP_PLAYER" }
}
},
['laysit'] = {
animation = { dict = "timetable@jimmy@mics3_ig_15@", name = "idle_a_jimmy", offset = vector4(0.0, 0.0, 0.0, 0.0) }
},
['wall'] = {
scenarios = {
[1] = { name = "WORLD_HUMAN_SEAT_WALL" }
}
},
['steps'] = {
scenarios = {
[1] = { name = "WORLD_HUMAN_SEAT_STEPS" }
}
},
['ledge'] = {
scenarios = {
[1] = { name = "WORLD_HUMAN_SEAT_LEDGE" }
}
},
['director'] = {
animation = { dict = "misscarsteal4@director_grip", name = "beginning_loop_director", offset = vector4(0.0, 0.0, -1.16, 0.0) },
teleportOut = true
},
['barber'] = {
animation = { dict = "anim@amb@luxury_suite@spa@barbers", name = "player_idle_a", offset = vector4(0.0, 0.0, 0.0, 0.0) }
},
['sitground'] = {
animation = { dict = "anim@amb@business@bgen@bgen_no_work@", name = "sit_phone_phoneputdown_idle_nowork", offset = vector4(0.0, 0.0, 0.0, 0.0) }
}
}
-- The diffrent laying settings, don't touch unless you know what you are doing.
Config.LayTypes = {
['default'] = { -- Default settings, if non has been spesified
animation = { dict = "misslamar1dead_body", name = "dead_idle" },
exitAnimType = 0, -- 0 = relative to camera | 1 = to the right | 2 = to the left
exitAnim = true
},
['bed'] = {
animation = { dict = "misslamar1dead_body", name = "dead_idle" }
},
['lay'] = {
animation = { dict = "savecouch@", name = "t_sleep_loop_couch", offset = vector4(-0.1, 0.1, -0.5, 270.0) }
},
['layside'] = {
animation = { dict = "savecouch@", name = "t_sleep_loop_couch", offset = vector4(-0.1, 0.1, -0.5, 270.0) },
exitAnimType = 2
},
['layside_reverse'] = {
animation = { dict = "savecouch@", name = "t_sleep_loop_couch", offset = vector4(0.1, 0.1, -0.5, 90.0) },
exitAnimType = 1
},
['busstop'] = {
animation = { dict = "savecouch@", name = "t_sleep_loop_couch", offset = vector4(0.0, 0.0, -0.5, 270.0) }
},
['medical'] = {
animation = { dict = "anim@gangops@morgue@table@", name = "body_search" }
},
['tattoo'] = {
animation = { dict = "amb@world_human_sunbathe@male@front@base", name = "base", offset = vector4(0.0, 0.0, 0.0, 180.0) },
exitAnim = false
}
}
-- Which preset (poly) locations that should be loaded. (disable/enable those you use!)
Config.PresetLocations = {
-- Vanilla Interiors
coroner = true,
lscustoms = false,
mrpd = false,
pacific_standard = false,
paleto_bank = false,
paleto_so = false,
pdm = false,
sandy_so = false,
submarine = false,
tattoo_shops = true,
tequilala = true,
trevors_trailer = true,
vanilla_unicorn = false,
-- Other Interiors (not affiliated/sponsored)
uniqx_burgershot = false, -- https://www.gta5-mods.com/maps/mlo-burgershot-2023-add-on-sp-fivem
rtx_club77 = false, -- https://forum.cfx.re/t/paid-map-club-77/5090016
-- Gabz Team Interiors
gabz_altruists = false,
gabz_atom = false,
gabz_aztecas = false,
gabz_bahama = false, -- Bahama Mamas
gabz_ballas = false,
gabz_bennys = false,
gabz_burgershot = false,
gabz_catcafe = false,
gabz_bobcat = false,
gabz_diner = false, -- Pop's Dinner
gabz_families = false,
gabz_firedept = false, -- El Burro & Davis
gabz_harmony = false,
gabz_haters = false,
gabz_hayes = false,
gabz_hornys = false,
gabz_import = false,
gabz_koi = false,
gabz_lamesa_pd = false,
gabz_lostsc = false,
gabz_lscustoms = false, -- This is NOT mutually exclusive with the regular lscustoms, just an add-on if you have gabz-lscustoms
gabz_marabunta = false,
gabz_mba = false, -- Maze Bank Arena
gabz_mrpd = false, -- Mission Row Police Deparment
gabz_paletocamp = false,
gabz_ottos = false,
gabz_pacific_standard = false, -- This is the new pacific standard from the gabz team.
gabz_pacific_standard_old = false, -- This is the old gabz pacific standard, it's a retexure of (+ some changes to) the base game version.
gabz_paleto_bank = false,
gabz_paleto_so = false,
gabz_park_ranger = false,
gabz_pdm = false,
gabz_pillbox = false,
gabz_pizzeria = false,
gabz_prison = false,
gabz_records = false, -- Records A Studios
gabz_sandy_so = false,
gabz_townhall = false,
gabz_triads = false,
gabz_tuners = false,
gabz_vagos = false,
gabz_vanilla_unicorn = false,
gabz_weedcamp = false,
-- These are just proofs of concept.
ledge = true,
steps = true,
wall = true
}
Purchase on Tebex
You can purchase it here through Tebex. (10.00 USD + tax)
Pictures
Some of my other scripts
[Standalone] [PAID] Slash Tires
[Standalone] [Paid] CS Styled Killfeed
[Release] Telescopes
[Standalone] Crutches
If you have any questions or suggestions feel free to post them below, and I’ll answer them as soon as I can.
Code is accessible | Yes |
Subscription-based | No |
Lines (approximately) | 1930 |
Optional dependencies | mythic notify, qTarget or qb-target or ox_target |
Support | Yes |