client.lua
Everything the player experiences client-side: locations, the device props, the train, the loot props on the carriages and the carry animation. Long coordinate lists are trimmed below to a few entries โ open the file to see the full lists. Never rename the Config.* keys; only change their values.
Debug
Lua
Config.Debug = true- Description: Enables client-side debug prints to help you track down issues. Set to
falseon a live server.
TriggerAlarm (client hook)
Lua
function TriggerAlarm(coords)
-- TODO implement your police call logic here (client side)
end- Description: Open-function hook called client-side (on the player who tipped off the cops) when a police alert fires. Plug your own client dispatch / alarm logic in here, or handle it server side in
configs/server.lua.coordsis where the player was when they alerted the police.
Hack Monitor Props
Lua
Config.MonitorProp = 'm24_1_prop_m41_orbital_screen_01a'
Config.MonitorRenderTarget = 'prop_m41_orbital_screen_01a'
Config.SecondMonitorProp = 'prop_monitor_01b'
Config.SecondMonitorRemove = 'prop_monitor_03b'
Config.SecondMonitorRenderTarget = 'tvscreen'
Config.CodeVerifyDuration = 5
Config.CameraPullback = 0.3- Description: The props and screens used for the two hacking stages (the antenna monitor and the access terminal).
- Fields:
- MonitorProp / MonitorRenderTarget: the prop model and its render-target name for the antenna monitor.
- SecondMonitorProp / SecondMonitorRenderTarget: the prop model and render-target for the terminal (second) monitor.
- SecondMonitorRemove: a nearby prop model removed so the second monitor can be placed cleanly.
- CodeVerifyDuration: seconds for the progress bar after the access code is entered on the second monitor.
- CameraPullback: extra meters to pull the monitor camera back from the screen (larger = farther away).
VehiclePickupLocations
Lua
Config.VehiclePickupLocations = {
vec4(-345.4493, -1567.4952, 25.2286, 38.1397),
vec4(-369.9995, -1545.5543, 26.1688, 359.9827),
-- ... more depots
}- Description: Depots where the heist vehicle is collected. When a heist starts one is picked at random: the player gets a waypoint, the vehicle spawns once they are close, and getting in begins the heist. Adjust these to real open spots on your map.
AntennaLocations
Lua
Config.AntennaLocations = {
{
coords = vector4(2042.2028, 2948.0161, 47.9760, 311.4505), -- Monitor base position
camera = vector4(2041.7725, 2947.6289, 47.9959, 311.4505), -- Exact camera position
lookAt = vector3(2042.2028, 2948.0161, 47.9760), -- Where camera looks
},
-- ... more antennas
}- Description: The antenna monitors used for the first hack. One is picked per heist; the player is sent there to breach the rail network.
- Fields:
- coords: monitor base position (
vector4, includes heading). - camera: exact camera position while hacking.
- lookAt: the point the camera looks at.
- coords: monitor base position (
SecondHackLocation
Lua
Config.SecondHackLocation = {
coords = vector4(2634.3513, 2931.1013, 44.6104, 165.6576), -- Monitor base position
camera = vector4(2634.4739, 2931.6267, 45.0104, 166.0450), -- Camera position
lookAt = vector3(2634.3513, 2931.1013, 44.8104), -- Where camera looks
}- Description: The access terminal where the player enters the code generated during the antenna hack. Same
coords/camera/lookAtshape as an antenna entry.
InterceptionLocations
Lua
Config.InterceptionLocations = {
vector4(2948.3250, 3659.9480, 54.8831, 340.5862),
vector4(2631.2708, 5449.2334, 62.0930, 21.4040),
-- ... more interception points
}- Description: The points the player travels to in order to plant the device on the tracks. One is chosen per heist; the train is forced to stop just before it.
TrainRoutes
Lua
Config.TrainRoutes = {
"Sandy Shores Express",
"Paleto Bay Freight",
"Los Santos Central",
-- ... more route names
}- Description: Flavour names for the train route, shown in the UI. One is picked at random per heist.
Scenarios
Lua
Config.Scenarios = {
{
name = "c4",
prop = "w_ex_pe",
hologramProp = "w_ex_pe",
timer = 15,
resultProp = "prop_pile_dirt_04",
animDict = "amb@world_human_gardener_plant@male@base",
animName = "base",
},
{
name = "jammer",
prop = "h4_prop_h4_jammer_01a",
hologramProp = "h4_prop_h4_jammer_01a",
timer = 15,
animDict = "amb@world_human_gardener_plant@male@base",
animName = "base",
},
{
name = "emp",
prop = "hei_prop_heist_emp",
hologramProp = "hei_prop_heist_emp",
timer = 15,
triggerDistance = 30.0,
animDict = "mini@repair",
animName = "fixing_a_player",
},
}- Description: The device the player plants on the tracks to stop the train. One scenario is chosen per heist (
c4,jammeroremp). - Fields:
- name: the scenario identifier (matches the planting prompt / translation).
- prop: the prop placed on the tracks.
- hologramProp: the placement-preview hologram prop.
- timer: seconds the planting action takes.
- resultProp: optional prop spawned as the result (e.g. the C4 explosion debris).
- triggerDistance: optional distance (m) at which the device triggers (used by the EMP).
- animDict / animName: the planting animation.
Train Distances
Lua
Config.TrainSpawnDistance = 1200.0
Config.TrainStopDistance = 20.0
Config.CarriageFloorZ = 0.0- TrainSpawnDistance: how far away (m) the train spawns before approaching.
- TrainStopDistance: how many meters before the interception point the train stops.
- CarriageFloorZ: base Z offset used to place props on the carriage floor (above the entity origin).
TrainPropSlots
Lua
Config.TrainPropSlots = {
{ slot = 1, type = "loot", model = "ch_prop_ch_crate_empty_01a", x = 0.0, y = -5.5 },
{ slot = 2, type = "loot", model = "sm_prop_smug_crate_s_bones", x = 0.0, y = -4.0 },
{ slot = 3, type = "search", x = 0.0, y = -2.1 },
-- Slots 8-17: positions fixed, models randomly shuffled from remaining LootProps
{ slot = 8, type = "loot", x = -0.7, y = 1.4 },
-- ... more slots
}- Description: The fixed layout of loot positions on a carriage.
- Fields:
- slot: the slot index.
- type:
"loot"= a pick-up-able prop,"search"= a searchable crate (random model fromConfig.SearchProps). - model: optional โ slots with a model are fixed; slots without one randomly pick from the remaining
Shared.LootPropspool. - x / y: the prop's offset on the carriage floor.
Loot Tuning
Lua
Config.MinItemsToDeliver = 5
Config.MaxLootProps = 60
Config.MaxSearchProps = 4
Config.PickupDuration = 1500
Config.SearchDuration = 5000- MinItemsToDeliver: minimum items that must be loaded into the vehicle before the drop-off can be completed.
- MaxLootProps: maximum pickup-able props spawned on the train.
- MaxSearchProps: maximum search-only crate props near the train.
- PickupDuration: time (ms) to pick up a loot prop.
- SearchDuration: time (ms) to search a crate.
Cleanup Timers
Lua
Config.TrainAutoDeleteTime = 900
Config.VehicleDeleteDelay = 120- TrainAutoDeleteTime: seconds after the train stops before the train and its props auto-delete.
- VehicleDeleteDelay: seconds the frozen vehicle stays at the drop-off before it is deleted.
SearchProps
Lua
Config.SearchProps = {
"ba_prop_battle_crate_art_02_bc",
"sm_prop_smug_crate_l_narc",
"ex_prop_crate_wlife_bc",
-- ... more crate models
}- Description: The crate models used for searchable crates (
type = "search"slots). A model is picked at random from this list. The items found inside come fromShared.SearchLoot.
DropOffLocations
Lua
Config.DropOffLocations = {
vec4(2594.1421, 494.2607, 108.4748, 88.7598),
vec4(2152.9807, -844.8054, 78.3766, 106.4809),
-- ... more drop-offs
}- Description: Where the loaded vehicle is delivered to complete the heist. One is chosen per heist and marked on the player's map.
Carry Settings
Lua
Config.CarryBone = 28422
Config.CarryOffset = vector3(0.0, -0.2, 0.15)
Config.CarryRotation = vector3(6.0, 24.0, -89.0)
Config.CarryOverrides = {
["hei_prop_heist_emp"] = { offset = vector3(0.0, -0.2, 0.15), rotation = vector3(6.0, 24.0, -89.0) },
["sm_prop_smug_crate_s_bones"] = { offset = vector3(0.0, -0.4, 0.04), rotation = vector3(30.0, 0.0, 0.0) },
-- ... one override per loot prop
}- Description: How a looted prop is attached to the player during the two-handed box-carry idle. Per-prop overrides fine-tune the fit so each model sits correctly against the chest.
- Fields:
- CarryBone: the ped bone the prop attaches to (
28422= the box-carry chest bone). - CarryOffset / CarryRotation: the default attach offset and rotation.
- CarryOverrides: per-model
{ offset, rotation }overrides keyed by prop model. Tune these in-game if a prop clips.
- CarryBone: the ped bone the prop attaches to (