Skip to content

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
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
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 = {
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 }

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.

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

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.

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.