6. Arrival points
Config.Spawns. The server validates the id the client sends back against this
table, so a modified UI can only ever pick one of these — never arbitrary coords.
To add a location: stand there, face the way you want the character to face, and
run /ccspawn in F8. It prints a complete entry, preview block included.
| Option | Notes |
|---|---|
enabled |
Off, and characters spawn as they always did: last known position, or a random Config.DefaultSpawns entry |
allowLastPosition |
Offer “Last Known Location” as the first card. false forces a fresh start every session |
askOnCreate |
Also ask a brand new character, at the end of the creator |
default |
Fallback id, for new characters when askOnCreate is off and whenever a choice cannot be honoured |
livePreview |
Fly the game camera out to the highlighted location. Costs a moment of streaming — turn it off on servers with heavy map replacements |
previewDelay |
How long a highlight must settle before the camera commits, in ms. Stops a quick scrub dragging the world through half of Los Santos |
remember |
Remember the last place this character arrived at and pre-select it. Resource KVP; nothing stored server side |
lastImage |
Optional. Picture on the “Last Known Location” card, relative to html/. Only needed to move the file or use .png/.webp — the card finds images/spawns/last.jpg by name on its own. Absent, it borrows the picture of the nearest location below |
locations fields
Section titled “locations fields”| Field | Notes |
|---|---|
id |
Unique key. Never reuse an id for a different place |
label |
Display name on the card |
district |
Small tracked caps under the name |
blurb |
One or two lines of flavour, shown when the card is highlighted |
coords |
vector4(x, y, z, heading) the player is put down at |
art |
Which built-in vector scene to draw when there is no photo |
accent |
Hex the artwork and the card’s glow are tinted with |
tags |
Up to three short pills. Cosmetic |
image |
Optional. Path to a screenshot relative to html/, e.g. "images/spawns/legion.jpg". Lays over the artwork. 960×540 is plenty. Without it the card looks for images/spawns/<id>.jpg by name |
preview |
Optional. Framing for the live camera |
art presets
Section titled “art presets”downtown glass towers at dusk |
beach sand, sea and palms |
pier boardwalk and ferris wheel |
suburb houses, trees and a lake |
hills ridgelines and mansions |
desert mesas, scrub and heat haze |
mountain pines, peaks and cold sky |
airport runway, tower and a jet |
docks cranes and containers |
highway overpass at night |
preview framing
Section titled “preview framing”preview = { distance = 24, -- metres the lens sits back from the point height = 13, -- metres it sits above the point swing = 14, -- degrees it arcs either side fov = 45,}Or hand it an exact shot:
preview = { camera = vector3(...), aim = vector3(...), fov = 45.0 }Config.DefaultSpawns
Section titled “Config.DefaultSpawns”Where a character with no saved position and no arrival choice ends up. Only
reached when the framework has nothing better — ESX is asked for its own
Config.DefaultSpawns first, and QB/Qbox characters always carry a position. One
of these is picked at random.
Config.Housing
Section titled “Config.Housing”A character who owns somewhere to live gets an extra card at the front of the rail. Choosing it lands them at the door and asks the housing script to let them in, using that script’s own entry point.
Ownership is read from the housing script’s own table and checked again on the way in. Nothing here creates, buys, sells or deletes a property.
Supported with no configuration: qbx_properties, ps-housing, qb-apartments,
qb-houses, esx_property. Anything else goes in custom.
| Option | Notes |
|---|---|
enabled |
Off, and no housing table is ever read |
script |
"auto" for every one running, "none" for the same as off, or name one: "qbx_properties", "ps-housing", "qb-apartments", "qb-houses", "esx_property", or a custom id |
maxCards |
Most cards to show across every housing script |
enterDelay |
How long after the player is in the world before knocking, in ms. Every one of these teleports the player itself, and being moved while still spawning puts somebody under the map. Raise it on a heavy server |
propertyAccent |
Accent colour for property cards |
custom |
Any other housing or motel script |
What a property card says
Section titled “What a property card says”Nothing on one is authored:
| Line | Where it comes from |
|---|---|
| Name | The housing script’s label column, falling back to the property key |
| Area | The street and district the game reports at the front door. A script that stores its own region (ps-housing does) is believed ahead of that |
| Tag | HOME, APARTMENT, PENTHOUSE, MOTEL, TRAILER, ROOM, GARAGE, WAREHOUSE, OFFICE, CLUBHOUSE, BOAT or PROPERTY, read from the type column, interior name and label in that order. Plus RENTED and SHARED where recorded |
| Description | Whatever the housing script stores, otherwise one sentence per kind with the street or district in it |
| Artwork | The zone the door is in, then the kind, then the nearest authored arrival point |
Every word of it is in locales/*.lua under spawn_tag_*,
spawn_property_blurb_* and spawn_property_where_*. A card never shows a
coordinate, a zone code or a database id.
Config.Housing.custom
Section titled “Config.Housing.custom”Nearly all housing scripts store ownership the same way — one row per property with a column holding the owner’s character key — so naming the table and three columns is usually the whole integration.
| Field | Notes |
|---|---|
resource |
Required. The resource folder name |
table |
Required. The table its properties live in |
owner |
Required. The column holding the character key — a citizenid on QB/Qbox, the character identifier on ESX |
key |
Required. The column identifying one property. This is what is passed to the entry point |
label |
Column to name the card with. Falls back to key |
coords |
JSON column holding the door. Only the camera preview needs it |
apartment |
A column that is non-empty for apartments and motel rooms. Changes the wording only |
interior |
A column naming the shell or interior — an interior called DellPerroHeightsApt4 says “apartment” even with no type column |
rent |
A column non-empty when the property is rented. Adds a RENTED tag |
shared |
A column holding other people’s keys, JSON object or array. Adds a SHARED tag |
district |
A column naming the area. Preferred over the district read off the map |
description |
A column holding text about the property. Shown instead of the generic description |
defaultKind |
What a row is when nothing else identifies it: "house", "apartment", "motel", "trailer", "room", "penthouse", "garage", "warehouse", "office", "clubhouse", "boat" or "property" (default) |
enterServer |
The server event the client should trigger to go in |
enterClient |
The client event the server should trigger instead, for a script whose entry point does not read source |
enterArgs |
What that event wants: "plain" (just the key, default) or "qbx" ({ id = key, isSpawn = true }) |
custom = { resource = "my_housing", table = "my_properties", owner = "owner_cid", key = "id", label = "street", coords = "entrance", enterServer = "my_housing:server:enter",},Every field below key is optional, and a column named here that does not exist is
dropped rather than breaking the query. With neither enterServer nor
enterClient, the player is landed at the door coordinates.
A list of these tables handles several scripts. Leave it nil when unused.
