[Standalone] [Paid] Sit Anywhere

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

pic_2

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. :smile:

Code is accessible Yes
Subscription-based No
Lines (approximately) 1930
Optional dependencies mythic notify, qTarget or qb-target or ox_target
Support Yes
31 Likes

Great job :dizzy:

1 Like

Thanks!

2 Likes

Hi, Great job for this script. Would you help me set up the seating for gabz’s cat cafe? is that it is not in the script configuration :S

1 Like

Hey, yeah it’s not set up for gabz’s cat cafe, but I’ll see if I can add it at some point tomorrow. (or later today) :smiley:

1 Like

Perfect thank you very much

does this support qb-target?

2 Likes

Yes, it does support qb-target, it’s even configured to use qb-target by default.

1 Like


This works perfectly right out of the box. Thanks! :heart:

1 Like

A small update!
I’ve gone ahead and added/fixed some stuff (See the list below). The most notable addition is the gabz team UwU Cat Cafe (thanks to @Neiltary for mentioning it). I’ll add some more preset locations over the next couple of days/weeks. I hope you all enjoy this!

Changelog:

  • Small improvements for preset chairs at gabz pillbox
  • Fixed sitting checks not working when using an animation that did not have a specified offset
  • Added options to use circle zones instead of box zones when adding preset locations
  • Refactored dev/debugging code
  • Added Gabz UwU Cafe
2 Likes

thx for update :heart_eyes_cat:

Looks nice!

2 Likes

All good! Thanks for the suggestion! :grin:

1 Like

Can you make a quide for people to add more chairs

1 Like

Sure!

So adding chairs is pretty easy once you get the hang of it, I would advise you to take a chair that is similar to what you’re trying to add from the list.lua file, and just modify that until it fits. However, here is a “guide” for those who want to know the specifics.

The first thing to figure out is if the chair (or whatever) you are trying to add is dynamic or not. You can figure this out by using an object spooner or some other sort of dev tool (such as this one made by Koil: koil-public/fivem-koil-debug at master · itsKoil/koil-public · GitHub). If they are dynamic, then follow the Models guide, otherwise, just follow the Poly guide.

Models

[hash] = { 
    sit = { 
        type = 'chair', 
        seats = { 
            [1] = vector4(xOffset, yOffset, zOffset, headingOffset)
        } 
    } 
}, -- prop_name
  • hash : The hash is what identifies the model, you could in theory replace it with GetHashKey(prop_name) to get the same effect. However, there is no need to get the hash key every time the recourse starts up, so the faster thing is to have it pre-‘calculated’.

  • sit = {} : Inside of this table is where the sit code would be, for laying down we use lay = {}

  • type : This is the type of chair, it decides what scenarios/animations that we use, whether or not we teleport the player in or out etc. Most of the options set through the type can be overwritten on a model-to-model basis.
    You can find the full list of types in the config file.

  • option : Inside of the sit = {} table we can set model-specific options, some of them include:

    • teleportIn = boolean
    • teleportOut = boolean
    • skipSeeCheck = boolean
  • seats = {} : Inside this table, we list the possible seats, these are indexed and need to be a vector4. (You can have an unlimited amount of ‘slots’)

  • prop_name This is just a comment, has no functionality other than showing the name of the prop since we use the hash.

Example:

[-826852533] = { sit = { type = 'chair2', teleportIn = true, seats = {[1] = vector4(0.0, 0.1, 0.85, 180.0)} } }, -- prop_umpire_01

For more examples just look in the list.lua file, you’ll see plenty of examples. The best way is just to try it out in-game and adjust the numbers and restart the resource until you have something that works.

Polys
So polys are a little different but largely the same. Polys are always a part of a group, this is to reduce the number of calculations, if you are creating a new group just copy an existing one and take it from there, it should be self-explanatory what to do.

['name_of_chair'] = { 
    sit = { 
        type = 'chair2', 
        seats = {
            [1] = vector4(xCoords, yCoords, zCoords, heading)
        } 
    }, 
    poly = { 
        center = vector3(xCoords, yCoords, zCoords), 
        length = 1.25, 
        width = 0.75, 
        height = 1.0 
    } 
},
  • `‘name_of_chair’``: This is the name of the polys, it needs to be unique to its group.

  • sit = {} : The same as models.

  • option : This is the same as models, see above for info.

  • seats = {} : This is mostly the same as the model, however instead of offset we use the coords and heading.

  • poly = {} : This is what’s really different from the models. Now, even if you don’t use a 3rd eye solution and just the command you still need this to make it work.

  • center : The center of the poly, this is the most important one, it is usually the same as the seat for most 1 seat polys.

  • length : the length of the poly.

  • width : The width of the poly.

  • height : The height of the poly, this can be replaced by maxZ and minZ, but those will be absolute coords.

Example:

['pillbox_ward_c_34'] = { 
    sit = { type = 'chair3', seats = {[1] = vector4(360.72, -583.13, 42.8, 340.0)} }, 
    poly = { length = 1.0, width = 1.0, height = 1.0 } 
},

When adding polys I would advise you to set Config.Debugmode to true, and Config.DebugPoly to true IF you have your PolyZone script set to only render polys nearby.

Lay
Adding places to lay down on follows the same pattern as sitting, just remember to use lay = {} instead of sit = {}.

I hope this helps you out, if you have any questions feel free to post them!

2 Likes

Maybe a Video, do you have a support chanel or di s c o r d that i can speak to you about this futher ?

1 Like

Creating a video takes a significant amount of time, something I don’t have as of right now.

And due to my time constraints, I sadly don’t have time to help you over a voice call. You’re more than welcome to post a comment here on what you specifically need help with, and I’ll answer as soon as I got time to. I don’t say this to be mean, I just honestly don’t have more time than I need right now.

Thanks for your understanding! :slightly_smiling_face:

Im getting klapperende eierstokken from this one.

If anyone is using the big ol’ Zonah map…
You’re welcome!


    -- Zonah
    ['mtzonah'] = {
		enabled = true,
		center = vector3(-437.22, -334.04, 54.91),
		radius = 100.0,
		polys = {
            -- Waiting Room Chairs, each row is a different row of 5 seats
            ['benchzonah1'] = { 
                sit = { type = 'chair2', seats = {
                [1] = vector4(-438.50, -331.35, 34.41, 0.0), [2] = vector4(-437.87, -331.61, 34.41, 0.0), [3] = vector4(-437.06, -331.67, 34.41, 0.0), [4] = vector4(-436.42, -331.70, 34.41, 0.0), [5] = vector4(-435.64, -331.87, 34.41, 0.0), 
                [6] = vector4(-438.69, -332.23, 34.41, 180.0), [7] = vector4(-438.07, -332.26, 34.41, 180.0), [8] = vector4(-437.31, -332.40, 34.41, 180.0), [9] = vector4(-436.57, -332.52, 34.41, 180.0), [10] = vector4(-435.81, -332.62, 34.41, 180.0), 
                [11] = vector4(-438.96, -334.52, 34.41, 0.0), [12] = vector4(-438.29, -334.60, 34.41, 0.0), [13] = vector4(-437.52, -334.68, 34.41, 0.0), [14] = vector4(-436.76, -334.84, 34.41, 0.0), [15] = vector4(-436.09, -334.92, 34.41, 0.0), 
                [16] = vector4(-439.06, -335.23, 34.41, 180.0), [17] = vector4(-438.42, -335.30, 34.41, 180.0), [18] = vector4(-437.63, -335.41, 34.41, 180.0), [19] = vector4(-437.02, -335.50, 34.41, 180.0), [20] = vector4(-436.25, -335.75, 34.41, 180.0), 
                [21] = vector4(-436.45, -337.89, 34.41, 0.0), [22] = vector4(-437.21, -337.78, 34.41, 0.0), [23] = vector4(-438.01, -337.55, 34.41, 0.0), [24] = vector4(-438.63, -337.53, 34.41, 0.0), [25] = vector4(-439.26, -337.32, 34.41, 0.0), 
                [26] = vector4(-439.46, -338.12, 34.41, 180.0), [27] = vector4(-438.73, -338.20, 34.41, 180.0), [28] = vector4(-438.07, -338.43, 34.41, 180.0), [29] = vector4(-437.40, -338.55, 34.41, 180.0), [30] = vector4(-436.62, -338.55, 34.41, 180.0)} }, 
                poly = { center = vector3(-437.54, -334.75, 34.42), length = 8, width = 4, height = 0.75, heading = -7.0 } 
            },
            ['ZonahConsult1'] = { -- consult room 1
            sit = { type = 'chair2', seats = {[1] = vector4(-450.81, -322.74, 34.71, 350.62)} }, 
            lay = { type = 'lay', seats = {[1] = vector4(-450.34, -323.11, 34.71, 175.62)} },
            poly = { center = vector3(-450.48, -323.08, 34.41), length = 1, width = 2, height = 0.75, heading = -7.0  } 
            },
            ['ZonahConsult2'] = { -- consult room 2
            sit = { type = 'chair2', seats = {[1] = vector4(-456.34, -315.52, 34.71, 24.62)} }, 
            lay = { type = 'lay', seats = {[1] = vector4(-455.83, -315.61, 34.71, 200.62)} },
            poly = { center = vector3(-456.16, -315.52, 34.41), length = 1, width = 2, height = 0.75, heading = 200.0  } 
            },
            ['ZonahConsult3'] = { -- consult room 3
            sit = { type = 'chair2', seats = {[1] = vector4(-462.24, -301.49, 34.71, 24.62)} }, 
            lay = { type = 'lay', seats = {[1] = vector4(-462.24, -301.49, 34.71, 200.62)} },
            poly = { center = vector3(-462.24, -301.49, 34.41), length = 1, width = 2, height = 0.75, heading = 200.0  } 
            },
            ['ZonahConsult4'] = { -- consult room 4
            sit = { type = 'chair2', seats = {[1] = vector4(-464.77, -295.33, 34.71, 24.62)} }, 
            lay = { type = 'lay', seats = {[1] = vector4(-464.77, -295.33, 34.71, 200.62)} },
            poly = { center = vector3(-464.77, -295.33, 34.41), length = 1, width = 2, height = 0.75, heading = 200.0  } 
            },
            ['ZonahMRI'] = { -- MRI
            lay = { type = 'lay', seats = {[1] = vector4(-446.96, -290.90, 34.71, 200.62)} },
            poly = { center = vector3(-446.96, -290.90, 34.41), length = 1, width = 2, height = 0.75, heading = 200.0  } 
            },
            ['ZonahXRay'] = { -- Xray
            lay = { type = 'lay', seats = {[1] = vector4(-441.15, -303.30, 34.71, 200.62)} },
            poly = { center = vector3(-441.15, -303.30, 34.41), length = 1, width = 2, height = 0.75, heading = 200.0  } 
            },
            ['ZonahStaffCouch1'] = { -- Staff Couch 1
            lay = { type = 'lay', seats = {[1] = vector4(-430.93, -312.62, 34.41, 284.62)} },
            poly = { center = vector3(-430.93, -312.62, 34.41), length = 3, width = 2, height = 0.75, heading = 20.0  } 
            },
            ['ZonahSurgery1'] = { -- Surgery1
            lay = { type = 'lay', seats = {[1] = vector4(-456.74, -309.85, -130.93, 200.62)} },
            poly = { center = vector3(-456.74, -309.85, -130.93), length = 1, width = 2, height = 0.75, heading = 200.0  } 
            },
            ['ZonahSurgery2'] = { -- Surgery2
            lay = { type = 'lay', seats = {[1] = vector4(-443.0, -304.31, -130.93, 200.62)} },
            poly = { center = vector3(-443.0, -304.31, -130.93), length = 1, width = 2, height = 0.75, heading = 200.0  } 
            },
            ['ZonahSurgery3'] = { -- Surgery3
            lay = { type = 'lay', seats = {[1] = vector4(-446.05, -291.67, -130.93, 200.62)} },
            poly = { center = vector3(-446.05, -291.67, -130.93), length = 1, width = 2, height = 0.75, heading = 200.0  } 
            }
        }
    }

Doesn’t include absolutely every chair but includes every central waiting room chair, all the consultation tables, surgical beds, MRI and XRay beds.

Isn’t this just the free SIT ANYWHERE script from github modified?