--[[ ╔══════════════════════════════════════════════════════════════════╗ ║ AGENCY GARAGE ║ ║ Premium Vehicle Garage System ║ ║ (c) Agency Scripts ║ ╠══════════════════════════════════════════════════════════════════╣ ║ Plug & Play · QBCore / ESX / Standalone · Multi-Phone ready ║ ╚══════════════════════════════════════════════════════════════════╝ This file is the ONLY thing you need to touch as a server owner. Everything is commented. No coding knowledge required. Framework options (Config.Framework): 'auto' -> Auto-detect QBCore or ESX (recommended) 'qb' -> Force QBCore 'esx' -> Force ESX 'standalone' -> No framework. Vehicles are managed by this script. ]] Config = {} -- ===================================================================== -- FRAMEWORK & AUTO-DETECTION -- ===================================================================== -- Leave this on 'auto'. The script finds your framework, your database, -- your fuel system, your notify and your text-ui resource by itself. Config.Framework = 'auto' -- 'auto' | 'qb' | 'esx' | 'standalone' -- If your qb-core / es_extended is named differently, set it here. Config.QBCoreResource = 'qb-core' Config.ESXResource = 'es_extended' Config.Debug = false -- true = verbose console logs for testing -- Creates/adds the required database columns on start automatically -- (standalone table, missing ESX columns ...). Never deletes any data. Config.AutoSetupDatabase = true -- ===================================================================== -- LANGUAGE -- ===================================================================== Config.Locale = 'en' -- See locales/ folder for all 24 supported languages -- ===================================================================== -- BRIDGES (auto-detected — only force if needed) -- ===================================================================== -- NOTIFICATIONS: Agency-Notify is the default. Falls back automatically to -- ox_lib -> framework -> GTA native if Agency-Notify is not installed. Config.Notify = 'agency' -- 'agency' (default) | 'auto' | 'ox' | 'qb' | 'esx' | 'native' -- TEXT-UI (the "[E] Open Garage" hint at the marker) Config.TextUI = 'auto' -- 'auto' | 'ox' | 'jg' | 'qb' | 'native' -- FUEL: 'auto' detects ox_fuel -> LegacyFuel -> ps-fuel -> cdn-fuel -> native Config.Fuel = 'auto' -- 'auto' | 'ox_fuel' | 'LegacyFuel' | 'ps-fuel' | 'cdn-fuel' | 'native' | 'none' -- VEHICLE KEYS: gives the player the keys automatically when taking a vehicle out Config.VehicleKeys = 'auto' -- 'auto' | 'agency' | 'qb' | 'qs' | 'wasabi' | 'mk' | 'none' -- ===================================================================== -- MULTI-PHONE INTEGRATION ⭐ -- ===================================================================== -- Agency-Garage writes the vehicle status into the standard 'state' field -- (0 = out, 1 = stored, 2 = impounded) and 'garage' of player_vehicles / -- owned_vehicles. Every common phone garage app reads this automatically: -- qb-phone, lb-phone, gksphone, qs-smartphone, roadphone, yseries and more. -- Nothing else to do. Set to false to disable. Config.PhoneSync = true Config.PhoneSyncEvent = 'garage:vehicleStateChanged' -- extra live event some phones can catch -- ===================================================================== -- DATABASE COMPATIBILITY (works with any standard vehicleshop) -- ===================================================================== -- The script reads the standard tables (player_vehicles for QB, -- owned_vehicles for ESX). Any vehicleshop that writes there is supported. -- Show ALL of the player's vehicles in every garage (with live status), -- not only the ones stored in this exact garage. Config.ShowAllVehicles = true -- ===================================================================== -- CAYO PERICO GARAGES -- ===================================================================== -- The garage positions on the Cayo Perico island (imported from the old -- script) are turned OFF by default. Flip this to true to enable them. Config.EnableCayoGarages = false -- ===================================================================== -- VEHICLE PREVIEW -- ===================================================================== -- Show a real 3D preview of the selected vehicle with an orbit camera -- before taking it out — not just a small list entry. Config.Preview = { enabled = true, autoRotate = false, -- false = drag with the mouse to rotate (recommended) · true = spins by itself mouseSensitivity = 0.35, -- how fast the mouse rotates the camera rotateSpeed = 18.0, -- spin speed when autoRotate is on (degrees per second) heightOffset = 25.0, -- fallback only, used if a garage has no spawn point hotspots = true, -- show interactive dots on the vehicle (doors, hood, trunk, windows, interior) } -- ===================================================================== -- GENERAL BEHAVIOUR -- ===================================================================== Config.InteractKey = 38 -- [E] key to open the garage Config.UseTarget = false -- true = ox_target / qb-target instead of marker+key Config.DrawDistance = 25.0 -- distance at which markers & text are drawn Config.InteractDistance = 2.5 -- how close you must be to interact -- MARKER (the animated icon on the ground where you open the garage) Config.Marker = { type = 36, -- marker type (36 = car-ish disc). See fivem marker docs. size = 0.55, color = { 0, 212, 255, 180 }, -- cyan {r,g,b,a} bob = false, -- float up and down rotate = true, -- spin around pulse = true, -- subtle size pulse (breathing) zOffset = 0.25, } -- OPEN HINT ("Press E to open the garage") -- 'notify' = shown via your notify system (Agency-Notify by default) when you walk up -- 'textui' = persistent text-ui while you stand on the marker -- 'both' = both Config.OpenHint = { mode = 'notify', -- 'notify' | 'textui' | 'both' } -- ===================================================================== -- PARK / STORE POINT (separate point to park a vehicle, like the old garage) -- ===================================================================== -- Each garage has its own 'store' point (imported from the old script). -- Drive your car onto it and press [E] to park it. Config.StorePoint = { enabled = true, -- false = park only via the "Store" button in the list exitFirst = true, -- true = you step out of the car first, THEN it disappears marker = { type = 36, size = 0.6, color = { 255, 70, 70, 190 }, -- red {r,g,b,a} bob = false, rotate = true, pulse = true, zOffset = 0.25, }, } Config.SpawnInVehicle = true -- player is placed in the driver seat on take-out Config.WarpDelay = 250 -- ms before warping in (clean sync) Config.StoreAnywhere = true -- true = store a vehicle at any garage, no matter where taken Config.StoreOwnedOnly = true -- true = only own vehicles can be stored Config.AllowSharedKeys = true -- passengers with a key may store the car Config.FadeOutOnStore = true -- vehicle fades out smoothly when stored -- Blacklisted models: these can NEVER be stored (service/job vehicles etc.) Config.BlacklistedModels = { 'police', 'ambulance', 'firetruk', 'pbus', 'trash', } -- ===================================================================== -- IMPOUND / DEPOT -- ===================================================================== Config.Impound = { enabled = true, fee = 500, -- default release fee feeAccount = 'bank', -- 'bank' | 'cash' payHigher = true, -- if a higher 'depotprice' is stored, that one applies } -- AUTO-IMPOUND ON LOGOUT -- When a player disconnects, their vehicles that are currently OUT get -- despawned and moved to the impound. They have to pay to get them back. Config.ImpoundOnLogout = { enabled = true, -- master switch (set false to turn the whole thing off) depot = 'depotlsimpound', -- which depot id the vehicle goes to (see Config.Garages) fee = 250, -- release fee added on logout-impound (0 = use Config.Impound.fee) deleteEntity = true, -- also remove the car from the world on logout } -- ===================================================================== -- ANTI-CHEAT / SECURITY -- ===================================================================== Config.SaveCondition = true -- fuel, engine & body damage are saved Config.SaveMods = true -- tuning/mods are saved and restored Config.AntiSpamMs = 800 -- minimum delay between two actions per player (ms) -- ===================================================================== -- CAMERA / SHOWROOM (when taking a vehicle out) -- ===================================================================== Config.Camera = { enabled = false, -- optional showroom camera that orbits the garage while the list is open (the vehicle preview is the main feature) height = 1.2, distance = 5.5, rotateSpeed = 12.0, -- degrees per second } -- ===================================================================== -- VEHICLE IMAGES FOR THE UI -- ===================================================================== -- 'spawn' -> uses html/img/vehicles/.png (e.g. adder.png) -- 'class' -> one image per category (car.png, air.png, sea.png) -- 'single' -> always html/img/vehicles/default.png -- If an image is missing, a clean placeholder icon is shown automatically. Config.VehicleImages = 'class' -- ===================================================================== -- BLIPS -- ===================================================================== Config.Blips = { enabled = true, showByCommand = true, -- /garages briefly highlights all garage blips command = 'garages', uniformNames = true, -- true = all garages are just called "Garage" on the map, false = uses the label (e.g. "LSPD") defaultName = 'Garage', -- the default name if uniformNames is true } -- ===================================================================== -- CATEGORIES -- ===================================================================== -- Every garage has a 'category'. Vehicles are matched by their GTA class, -- so e.g. a heli can only be taken out at an air garage. Config.Categories = { car = { label = 'Vehicles', classes = { 0,1,2,3,4,5,6,7,9,10,11,12,17,18,19,20,22 } }, air = { label = 'Aircraft', classes = { 15,16 } }, sea = { label = 'Boats', classes = { 14 } }, } -- ===================================================================== -- BRANDING (subtle — paid script, no ad spam) -- ===================================================================== Config.Branding = { showFooter = true, -- small "Agency Garage" tag at the bottom of the UI label = 'Agency Garage', } -- ===================================================================== -- COMMANDS -- ===================================================================== Config.Commands = { addVehicle = 'addvehicle', -- /addvehicle [id] [model] [plate] (mainly standalone) addVehicleAce = 'command.addvehicle', -- required ACE permission } -- ===================================================================== -- TEXT / TRANSLATIONS -- ===================================================================== -- Translations are now in separate files under locales/. -- Set your language above with Config.Locale. -- Supported: en, de, fr, es, esm, pt, it, nl, pl, cs, ro, ru, tr, sv, -- da, no, fi, hu, sk, hr, bg, uk, el, ja -- To add your own language, copy locales/en.lua to locales/xx.lua and translate. -- ===================================================================== -- GARAGE DEFINITIONS (positions imported from the old garage script) -- ===================================================================== -- type: 'public' (everyone) | 'job' | 'gang' | 'depot' (impound) -- category: 'car' | 'air' | 'sea' -- job/gang: only needed for type 'job'/'gang' (string or { 'police', 'ambulance' }) -- access: vector3 — marker position to open the garage -- spawns: list of vector4 — the script picks the first free spawn point -- blip: sprite/color/scale — remove to hide the blip Config.Garages = { ['legion'] = { label = 'Legion Square', type = 'public', category = 'car', access = vector3(213.6, -809.31, 31.01), store = vector3(214.32, -793.27, 30.8), spawns = { vector4(222.16, -804.25, 30.58, 250.0), vector4(223.46, -799.04, 30.58, 250.0), vector4(226.3, -791.58, 30.58, 250.0), vector4(215.43, -775.99, 30.43, 248.98), vector4(232.69, -773.72, 30.32, 249.76) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['alta'] = { label = 'Alta', type = 'public', category = 'car', access = vector3(278.19, -345.95, 44.92), store = vector3(294.05, -340.45, 44.92), spawns = { vector4(266.84, -328.77, 44.5, 249.42), vector4(269.29, -322.26, 44.5, 249.45), vector4(287.66, -329.12, 44.5, 249.52), vector4(283.91, -338.77, 44.5, 249.58), vector4(294.68, -346.56, 44.5, 69.93) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['textilecity'] = { label = 'Textile City', type = 'public', category = 'car', access = vector3(412.74, -634.35, 28.5), store = vector3(402.15, -643.13, 28.5), spawns = { vector4(408.8, -638.68, 28.08, 270.0), vector4(393.08, -638.73, 28.08, 270.81), vector4(393.21, -649.69, 28.08, 270.43), vector4(392.48, -657.72, 28.08, 270.83), vector4(415.9, -649.35, 28.08, 270.51) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['pillboxhill'] = { label = 'Pillbox Hill', type = 'public', category = 'car', access = vector3(-332.01, -781.39, 33.96), store = vector3(-331.93, -768.52, 33.97), spawns = { vector4(-320.15, -752.3, 33.54, 159.86), vector4(-331.77, -750.56, 33.54, 181.7), vector4(-341.29, -756.81, 33.54, 91.4), vector4(-357.49, -764.41, 33.54, 269.31), vector4(-307.79, -756.62, 33.54, 161.04) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['westvinewood'] = { label = 'West Vinewood', type = 'public', category = 'car', access = vector3(-515.93, 53.0, 52.58), store = vector3(-529.11, 48.59, 52.58), spawns = { vector4(-537.01, 40.77, 52.16, 265.99), vector4(-509.52, 65.48, 52.16, 85.36), vector4(-510.96, 55.17, 52.16, 84.34), vector4(-519.69, 66.28, 52.16, 84.99), vector4(-504.47, 54.48, 56.07, 265.69) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['westvinewood2'] = { label = 'West Vinewood 2', type = 'public', category = 'car', access = vector3(-570.24, 311.83, 84.49), store = vector3(-561.5, 328.39, 84.41), spawns = { vector4(-580.68, 314.45, 84.37, 354.67), vector4(-588.58, 335.45, 84.67, 175.84), vector4(-601.55, 345.46, 84.69, 175.98) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['vinewoodhills'] = { label = 'Vinewood Hills', type = 'public', category = 'car', access = vector3(886.2, -1.13, 78.76), store = vector3(878.34, -10.78, 78.76), spawns = { vector4(858.37, -28.97, 78.34, 237.92), vector4(865.02, -45.35, 78.34, 57.82), vector4(890.62, -45.15, 78.34, 57.29) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['vinewoodhills2'] = { label = 'Vinewood Hills 2', type = 'public', category = 'car', access = vector3(664.45, 630.94, 128.91), store = vector3(655.81, 631.84, 128.91), spawns = { vector4(638.47, 606.27, 128.49, 250.49), vector4(654.98, 606.79, 128.49, 71.33), vector4(636.39, 625.62, 128.49, 70.06) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['vinewoodhills3'] = { label = 'Vinewood Hills 3', type = 'public', category = 'car', access = vector3(-77.07, 907.36, 235.81), store = vector3(-75.47, 895.6, 235.5), spawns = { vector4(-66.23, 892.11, 235.13, 115.63), vector4(-71.02, 903.26, 235.19, 114.49) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['harmony'] = { label = 'Harmony', type = 'public', category = 'car', access = vector3(599.73, 2726.74, 41.91), store = vector3(593.19, 2730.84, 42.02), spawns = { vector4(624.26, 2724.0, 41.4, 5.26), vector4(583.25, 2736.76, 41.58, 184.15), vector4(581.21, 2720.36, 41.64, 4.71) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['banhamcanyon'] = { label = 'Banham Canyon', type = 'public', category = 'car', access = vector3(-3048.89, 611.0, 7.18), store = vector3(-3041.26, 607.11, 7.5), spawns = { vector4(-3056.03, 608.34, 6.79, 291.97), vector4(-3053.88, 602.67, 6.87, 289.86), vector4(-3051.78, 596.95, 7.02, 289.15) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['downtownvinewood'] = { label = 'Downtown Vinewood', type = 'public', category = 'car', access = vector3(364.39, 297.84, 103.49), store = vector3(372.99, 289.74, 103.27), spawns = { vector4(386.95, 291.72, 102.63, 165.04), vector4(392.69, 280.48, 102.56, 71.03), vector4(371.48, 266.74, 102.6, 340.53) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['grandsenora'] = { label = 'Grand Senora', type = 'public', category = 'car', access = vector3(1984.54, 3065.77, 47.01), store = vector3(1990.1, 3070.05, 47.0), spawns = { vector4(2012.04, 3055.3, 46.62, 58.94), vector4(2016.86, 3062.81, 46.62, 60.09), vector4(1999.63, 3081.81, 46.65, 148.07) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['sandyshoresmc'] = { label = 'Sandy Shores MC', type = 'public', category = 'car', access = vector3(1836.58, 3668.21, 33.68), store = vector3(1844.66, 3663.68, 34.15), spawns = { vector4(1853.67, 3676.2, 33.33, 210.23), vector4(1831.35, 3663.51, 33.44, 210.09), vector4(1825.11, 3659.53, 33.58, 209.13) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['sanchianski'] = { label = 'San Chianski', type = 'public', category = 'car', access = vector3(2761.43, 3452.49, 55.84), store = vector3(2750.55, 3445.04, 56.1), spawns = { vector4(2775.86, 3436.56, 55.39, 67.43), vector4(2791.24, 3474.5, 54.85, 68.56), vector4(2769.44, 3473.51, 55.08, 67.23) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['mirrorpark'] = { label = 'Mirror Park', type = 'public', category = 'car', access = vector3(1034.69, -766.03, 58.0), store = vector3(1025.51, -759.96, 57.99), spawns = { vector4(1017.16, -760.3, 57.55, 222.93), vector4(1027.52, -785.35, 57.45, 310.28), vector4(1047.0, -785.62, 57.57, 91.26) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['lapuerta'] = { label = 'La Puerta', type = 'public', category = 'car', access = vector3(-1082.51, -1261.67, 5.61), store = vector3(-1065.57, -1261.42, 6.01), spawns = { vector4(-1075.61, -1267.34, 5.48, 299.93), vector4(-1080.98, -1258.0, 5.13, 300.38), vector4(-1074.83, -1240.87, 4.85, 120.24) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['paletobay'] = { label = 'Paleto Bay', type = 'public', category = 'car', access = vector3(137.66, 6612.97, 31.83), store = vector3(147.58, 6622.93, 31.77), spawns = { vector4(151.05, 6607.28, 31.45, 358.41), vector4(145.84, 6613.57, 31.39, 359.11), vector4(155.75, 6592.76, 31.42, 179.37) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['paletobay2'] = { label = 'Paleto Bay 2', type = 'public', category = 'car', access = vector3(-274.94, 6126.03, 31.48), store = vector3(-280.27, 6120.74, 31.51), spawns = { vector4(-282.03, 6142.62, 31.08, 135.25), vector4(-276.61, 6137.28, 31.08, 135.7), vector4(-303.97, 6129.09, 31.08, 225.36) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['rancho'] = { label = 'Rancho', type = 'public', category = 'car', access = vector3(384.21, -1612.76, 29.29), store = vector3(397.2, -1613.16, 29.29), spawns = { vector4(395.51, -1626.53, 28.87, 49.3), vector4(388.55, -1612.64, 28.87, 230.57) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['rancho2'] = { label = 'Rancho 2', type = 'public', category = 'car', access = vector3(443.0, -1969.08, 24.4), store = vector3(457.17, -1977.47, 22.96), spawns = { vector4(453.99, -1965.92, 22.55, 180.38), vector4(449.5, -1960.62, 22.55, 182.45) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['delperro'] = { label = 'Del Perro', type = 'public', category = 'car', access = vector3(-1523.96, -451.46, 35.6), store = vector3(-1519.72, -445.65, 35.44), spawns = { vector4(-1522.3, -418.57, 35.02, 230.52), vector4(-1526.95, -423.81, 35.02, 230.73) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['davis'] = { label = 'Davis', type = 'public', category = 'car', access = vector3(-71.77, -1821.7, 26.94), store = vector3(-50.89, -1831.68, 26.57), spawns = { vector4(-60.26, -1843.13, 26.16, 319.89), vector4(-52.36, -1849.82, 25.85, 320.93) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['grapeseed'] = { label = 'Grapeseed', type = 'public', category = 'car', access = vector3(1698.05, 4792.72, 41.92), store = vector3(1691.35, 4794.65, 41.92), spawns = { vector4(1691.42, 4788.03, 41.5, 89.22), vector4(1691.61, 4774.13, 41.5, 91.71) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['mountchiliad'] = { label = 'Mount Chiliad', type = 'public', category = 'car', access = vector3(1721.4, 6410.46, 34.01), store = vector3(1722.91, 6394.3, 34.24), spawns = { vector4(1729.74, 6405.79, 34.04, 152.75), vector4(1717.45, 6416.34, 33.02, 243.98) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['zancudoriver'] = { label = 'Zancudo River', type = 'public', category = 'car', access = vector3(-1130.62, 2675.25, 18.18), store = vector3(-1136.76, 2669.33, 18.1), spawns = { vector4(-1159.62, 2673.95, 17.67, 222.74), vector4(-1154.93, 2678.09, 17.67, 220.94) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['tataviammountains'] = { label = 'Tataviam Mountains', type = 'public', category = 'car', access = vector3(2588.15, 426.63, 108.55), store = vector3(2570.9, 416.1, 108.46), spawns = { vector4(2576.07, 428.77, 108.03, 180.28), vector4(2583.07, 428.63, 108.03, 179.74) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['lsairport'] = { label = 'LS Airport', type = 'public', category = 'car', access = vector3(-949.49, -2582.63, 13.83), store = vector3(-948.02, -2589.07, 13.83), spawns = { vector4(-957.98, -2604.35, 13.42, 60.79), vector4(-957.04, -2583.48, 13.41, 240.27) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['cayobeginn'] = { label = 'Cayo Beginning', type = 'public', category = 'car', cayo = true, access = vector3(4503.198, -4531.859, 4.168), store = vector3(4513.65, -4509.417, 4.128), spawns = { vector4(4501.372, -4548.034, 4.028, 20.806), vector4(4521.961, -4528.845, 4.132, 47.578) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['cayomid'] = { label = 'Cayo Mid', type = 'public', category = 'car', cayo = true, access = vector3(5178.179, -5128.128, 3.073), store = vector3(5157.778, -5129.067, 2.34), spawns = { vector4(5186.646, -5133.239, 3.34, 80.143), vector4(5164.675, -5129.388, 2.493, 177.75) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['boat'] = { label = 'Boat', type = 'public', category = 'sea', access = vector3(-726.15, -1333.12, 1.6), store = vector3(-747.33, -1356.48, 1.1), spawns = { vector4(-704.71, -1341.66, -0.09, 134.81), vector4(-711.88, -1329.8, 0.43, 142.34) }, blip = { sprite = 410, color = 3, scale = 0.8 } }, ['boatcayo'] = { label = 'Boat Cayo', type = 'public', category = 'sea', cayo = true, access = vector3(5107.975, -5205.645, 2.063), store = vector3(5098.216, -5193.487, 1.367), spawns = { vector4(5099.662, -5166.661, 1.699, 357.534), vector4(5100.634, -5140.325, 1.716, 358.361) }, blip = { sprite = 410, color = 3, scale = 0.8 } }, ['air'] = { label = 'Air', type = 'public', category = 'air', access = vector3(-943.03, -2962.05, 13.95), store = vector3(-1007.54, -2979.84, 13.95), spawns = { vector4(-1007.13, -3015.86, 13.95, 55.89), vector4(-979.32, -2997.89, 13.95, 59.19), vector4(-960.99, -2964.56, 13.95, 57.96) }, blip = { sprite = 360, color = 3, scale = 0.8 } }, ['aircayo'] = { label = 'Air cayo', type = 'public', category = 'air', cayo = true, access = vector3(4430.855, -4460.986, 4.328), store = vector3(4451.652, -4493.408, 4.204), spawns = { vector4(4440.407, -4514.454, 4.184, 108.825), vector4(4410.822, -4524.619, 4.184, 108.57), vector4(4376.036, -4537.133, 4.185, 109.878) }, blip = { sprite = 360, color = 3, scale = 0.8 } }, ['police1'] = { label = 'LSPD', type = 'job', job = 'police', category = 'car', access = vector3(456.05, -1020.52, 28.28), store = vector3(455.75, -1014.55, 28.43), spawns = { vector4(446.43, -1025.51, 28.64, 360.0), vector4(442.97, -1026.19, 28.71, 360.0), vector4(438.99, -1026.51, 28.78, 360.0), vector4(435.43, -1027.24, 28.84, 360.0), vector4(431.69, -1027.66, 28.91, 360.0), vector4(427.49, -1028.11, 28.99, 360.0) }, blip = { sprite = 357, color = 2, scale = 0.8 }, jobPlate = 'LSPD', -- Prefix for spawned job vehicle plates (e.g., LSPD123) markerColor = { 0, 255, 0, 180 }, vehicles = { { model = 'police', label = 'Police Cruiser' }, { model = 'police2', label = 'Police Interceptor' }, { model = 'police3', label = 'Police SUV' }, { model = 'police4', label = 'Unmarked Cruiser' }, { model = 'policeb', label = 'Police Bike' }, { model = 'policet', label = 'Police Transporter' } } }, ['ambulance'] = { label = 'MD', type = 'job', job = 'ambulance', category = 'car', access = vector3(-1850.35, -319.12, 49.14), store = vector3(-1858.83, -306.88, 49.14), spawns = { vector4(-1865.56, -299.85, 49.14, 45.32) }, blip = { sprite = 357, color = 2, scale = 0.8 }, jobPlate = 'MD', markerColor = { 0, 255, 0, 180 }, vehicles = { { model = 'ambulance', label = 'Ambulance' }, { model = 'lguard', label = 'Lifeguard SUV' } } }, ['adac'] = { label = 'ADAC', type = 'public', category = 'car', access = vector3(855.267, -2095.442, 30.541), store = vector3(860.126, -2097.099, 30.543), spawns = { vector4(850.267, -2098.295, 30.541, 82.285), vector4(849.888, -2101.755, 30.537, 89.063), vector4(849.482, -2105.554, 30.541, 83.984) }, blip = { sprite = 357, color = 3, scale = 0.8 } }, ['depotlsimpound'] = { label = 'LS Impound', type = 'depot', category = 'car', access = vector3(409.57, -1623.24, 29.29), coords = vector4(408.83, -1623.00, 29.29, 230.13), spawns = { vector4(404.91, -1630.93, 29.29, 230.13), vector4(400.91, -1635.93, 29.29, 230.13), vector4(396.0, -1644.6, 29.29, 140.0), vector4(398.4, -1646.6, 29.29, 140.0), vector4(400.8, -1648.6, 29.29, 140.0), vector4(403.2, -1650.6, 29.29, 140.0), vector4(405.6, -1652.6, 29.29, 140.0), vector4(408.0, -1654.6, 29.29, 140.0), vector4(410.4, -1656.6, 29.29, 140.0), vector4(417.1, -1627.8, 29.29, 320.0) }, blip = { sprite = 68, color = 1, scale = 0.8 } }, ['depotbootimpound'] = { label = 'Boot Impound', type = 'depot', category = 'sea', access = vector3(-731.368, -1340.667, 1.595), spawns = { vector4(-730.662, -1359.294, -0.475, 143.039) }, blip = { sprite = 68, color = 1, scale = 0.8 } }, ['depotcayoimpound'] = { label = 'Cayo Impound', type = 'depot', category = 'car', cayo = true, access = vector3(4517.639, -4460.173, 4.194), spawns = { vector4(4527.138, -4470.861, 4.204, 108.897), vector4(4525.721, -4466.391, 4.192, 108.208), vector4(4499.328, -4468.401, 4.208, 28.546), vector4(4495.887, -4469.777, 4.212, 13.178), vector4(4486.038, -4474.158, 4.219, 28.42), vector4(4482.586, -4475.351, 4.221, 20.635), vector4(4478.775, -4476.793, 4.22, 32.55) }, blip = { sprite = 68, color = 1, scale = 0.8 } }, ['depotairimpound'] = { label = 'Air Impound', type = 'depot', category = 'air', access = vector3(-1004.5, -2960.3, 13.95), spawns = { vector4(-1043.783, -2952.541, 13.951, 62.894) }, blip = { sprite = 68, color = 1, scale = 0.8 } }, ['depotpbimpound'] = { label = 'PB Impound', type = 'depot', category = 'car', access = vector3(-270.15, 6130.77, 31.51), spawns = { vector4(-282.03, 6142.62, 31.08, 135.25), vector4(-276.61, 6137.28, 31.08, 135.7), vector4(-303.97, 6129.09, 31.08, 225.36) }, blip = { sprite = 68, color = 1, scale = 0.8 } }, }