Skip to content

Routes & Fleet

Routes are lists of stops at real Los Santos Transit shelter props. Each stop is a vec4(x, y, z, heading) where the heading matches the shelter’s rotation:

local metroStops = {
vec4(303.927, -765.241, 28.315, 71.695),
vec4(115.483, -781.340, 30.419, -20.000),
-- ...
}

Key facts:

  • Pay is automatic — stop pay, tip ceiling, and completion bonus derive from total path length via Config.PayScale. Add a route and its pay is already balanced.
  • Difficulty is automatic — route length classifies the route as LOCAL, REGIONAL, or EXPRESS.
  • Each route starts at a distinct shelter, so shifts leave the depot toward different map regions.
  • Stops should be placed at prop_busstop_* shelter props so passenger queueing and curb-door alignment look right. Heading matters — it orients the queue along the curb.
  1. Collect shelter coordinates (vec4 with shelter heading) along your desired path
  2. Add a stops table
  3. Add a Config.BuildRoute entry to Config.Routes
  4. Restart lx-busjob — the terminal map bakes the new route trail on demand
local myRouteStops = {
vec4(303.927, -765.241, 28.315, 71.695),
vec4(115.483, -781.340, 30.419, -20.000),
}
Config.Routes = {
-- existing routes...
Config.BuildRoute(
'my_route', -- unique ID / route-art filename
'My Route', -- terminal label
'Short customer description.',
'Longer operations brief shown in the terminal.',
myRouteStops
),
}

Config.BuildRoute calculates map points, total length, stop pay, tip ceiling, completion bonus, stop count, and difficulty. The route ID should match ui/dist/route-art/<id>.jpg if you add custom route artwork.

The depot fleet is pack-owned — you never edit your framework’s vehicles.lua. Default fleet:

ID Model Label
bus bus Transit Bus
coach coach Coach
rentalbus rentalbus Tour Shuttle
airbus airbus Airport Coach
{
id = 'mybus',
model = 'mybus', -- any spawnable GTA/addon model
label = 'My Bus',
brand = 'Brute',
description = 'Shown in the Depot tab.',
minGrade = 0,
doors = {
board = { 1 }, -- door indices opened for boarding
exit = { 3, 1 }, -- alighting doors (first preferred)
firstSeat = 0, -- lowest passenger seat index peds may take
},
},

Door indices: 0 front-left (driver), 1 front-right, 2 rear-left, 3 rear-right. Passenger doors never include 0.

  • board — the curb entry door(s) passengers walk to
  • exit — doors used for alighting, in preference order
  • firstSeat — skip cab or co-driver seats so nobody sits next to the driver (e.g. firstSeat = 1 on the Tour Shuttle keeps the co-driver bench clear)

Vehicles without a doors table fall back to Config.Doors in config/shared.lua.