Configuration

This section includes all configurable files for the selected script. Most settings are configured automatically, but each config.lua file contains a header comment explaining the purpose and usage of every configuration type. Be sure to read the header of each file carefully to fully understand how to customize and adapt the system for QBCORE, ESX, or standalone environments, ensuring seamless integration with your server.


qs-vehicleshop/config/config.lua
--──────────────────────────────────────────────────────────────────────────────
--  Quasar Store · Configuration Guidelines
--──────────────────────────────────────────────────────────────────────────────
--  This configuration file defines all adjustable parameters for the script.
--  Comments are standardized to help you identify which sections you can safely edit.
--
--  • [EDIT] – Safe for users to modify. Adjust these values as needed.
--  • [INFO] – Informational note describing what the variable or block does.
--  • [ADV]  – Advanced settings. Change only if you understand the logic behind it.
--  • [CORE] – Core functionality. Do not modify unless you are a developer.
--  • [AUTO] – Automatically handled by the system. Never edit manually.
--
--  Always make a backup before editing configuration files.
--  Incorrect changes in [CORE] or [AUTO] sections can break the resource.
--──────────────────────────────────────────────────────────────────────────────

Config = {}                                -- [CORE] Main configuration table.

--──────────────────────────────────────────────────────────────────────────────
-- Language & Framework                                                        [EDIT]/[AUTO]
--──────────────────────────────────────────────────────────────────────────────
Config.Language  = "en"                    -- [EDIT] UI/Locales language code.

-- [AUTO] Detect framework; falls back to 'esx' if none is found.
-- [INFO] If your core is renamed or custom, replace this line with a fixed value: 'qb' or 'esx'.
Config.Framework = GetResourceState('qb-core') == 'started' and 'qb'
                or GetResourceState('es_extended') == 'started' and 'esx'
                or 'esx'                     -- [AUTO]

--──────────────────────────────────────────────────────────────────────────────
-- Feature Toggles                                                             [EDIT]
--──────────────────────────────────────────────────────────────────────────────
Config.EnableTestDrive   = true            -- [EDIT] Enable/disable test drive feature.
Config.RequireLicensed   = false           -- [EDIT] Require valid driver license to purchase/test.
Config.Debug             = false           -- [EDIT] Verbose console logs for troubleshooting.

--──────────────────────────────────────────────────────────────────────────────
-- Test Drive & Showroom                                                       [EDIT]
--──────────────────────────────────────────────────────────────────────────────
Config.TestDriveTime = 1.5 * 60 * 1000     -- [EDIT] Test drive duration in ms (1.5 minutes).

-- [INFO] World positions for vehicle previews in showroom contexts.
Config.ShowRoomCoords                 = vector4(1610.1960, -386.0465, -17.1471, 93.0454)         -- [EDIT] Cars.
Config.LargueVehicleShowRoom          = vector4(-1840.6783, 2982.3730, 32.3859, 85.0314)         -- [EDIT] Large vehicles (keep key name as-is if used elsewhere).
Config.BoatShowRoom                   = vector4(-2100.0771, -1160.4104, 1.8164, 146.4032)        -- [EDIT] Boats.
Config.ShowRoomSpotLihtForBigVehiclesAndBoats = true                                            -- [EDIT] Spotlight on big vehicles/boats (may impact performance).

--──────────────────────────────────────────────────────────────────────────────
-- Accounting / Commissions                                                    [EDIT]
--──────────────────────────────────────────────────────────────────────────────
Config.AccountsScript = 'qb-core'          -- [EDIT] Money backend: 'esx_addonaccount' | 'qb-management' | 'qb-banking' | 'qb-core'
Config.SellerGivenPercentage = 15           -- [EDIT] % of sale paid to the seller (integer).
Config.UseSpaceInCenterEvery = true         -- [EDIT] Plates use centered space pattern.

--──────────────────────────────────────────────────────────────────────────────
-- Map Blip Settings                                                           [EDIT]
--──────────────────────────────────────────────────────────────────────────────
Config.BlipPrefix = "Vehicle Shop: "        -- [EDIT] Blip label prefix.
Config.BlipSprite = 595                     -- [EDIT] Blip sprite id.
Config.BlipColour = 38                      -- [EDIT] Blip color id.
Config.BlipScale  = 0.9                     -- [EDIT] Blip scale.

--──────────────────────────────────────────────────────────────────────────────
-- Plate Formatting                                                            [EDIT]
--──────────────────────────────────────────────────────────────────────────────
Config.plateFormats = {                     -- [EDIT] Plate patterns. L=letter, N=number.
    "LLLNNL", -- e.g. 'TZU69G'
    "LLLNNL", -- e.g. 'COL30H'
    "LNNNNL", -- e.g. 'T2030H'
    "NNLLNN", -- e.g. '12BC34'
}
Config.DefMaxLength = 6                     -- [EDIT] Max plate characters for client UI.

--──────────────────────────────────────────────────────────────────────────────
-- Accepted Accounts & Crypto                                                  [EDIT]
--──────────────────────────────────────────────────────────────────────────────
Config.AccountsToPay = { 'cash', 'bank' }   -- [EDIT] Add account names only. Do NOT map as key=value.
-- [INFO] To add icons: place PNGs in /web/build/customizable/<account>.png (e.g. bank.png, cash.png)
Config.CryptoAccount = 'crypto'             -- [EDIT] Crypto account label (must have PNG icon).

--──────────────────────────────────────────────────────────────────────────────
-- Commands & Permissions                                                       [EDIT]
--──────────────────────────────────────────────────────────────────────────────
Config.AdminCommand        = "vehicleshop"  -- [EDIT] Admin menu command.
Config.EmployeeMenuCommand = "opendealership"-- [EDIT] Employee menu command.
Config.AccessAcePermission = 'vehicleshopcreator' -- [EDIT] ACE permission flag (server.cfg).

--──────────────────────────────────────────────────────────────────────────────
-- Keys Integration (Vehicle Keys)                                             [ADV]
-- [INFO] Hooks for popular key systems. Replace events/exports for your setup.
--──────────────────────────────────────────────────────────────────────────────
---@param vehicle number  -- entity id
---@param plate string    -- vehicle plate text
---@param model any       -- model hash or name (on missions)
---@param mission boolean -- true when invoked from mission context
Config.AssignCarKeys = function(vehicle, plate, model, mission)
    DebugPrint("Giving keys to the vehicle: ", plate, mission)

    if not mission then
        if GetResourceState('qs-vehiclekeys') == 'started' then
            exports['qs-vehiclekeys']:GiveKeysAuto()
            exports['qs-vehiclekeys']:GiveKeys(plate, model, true)
        elseif GetResourceState('qbx_vehiclekeys') == 'started' then
            exports.qbx_vehiclekeys:GiveKeys(source, vehicle, false)
        elseif GetResourceState("qb-vehiclekeys") == 'started' then
            TriggerServerEvent('qb-vehiclekeys:server:AcquireVehicleKeys', plate)
        elseif GetResourceState("wasabi_carlock") == 'started' then
            exports.wasabi_carlock:GiveKey(plate)
        end
    else
        local nvmodel = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle))
        local nvplate = GetVehicleNumberPlateText(vehicle)

        if GetResourceState('qs-vehiclekeys') == 'started' then
            exports['qs-vehiclekeys']:GiveKeys(plate, model, true)
        elseif GetResourceState("qb-vehiclekeys") == 'started' then
            TriggerServerEvent('qb-vehiclekeys:server:AcquireVehicleKeys', plate)
        elseif GetResourceState("wasabi_carlock") == 'started' then
            exports.wasabi_carlock:GiveKey(plate)
        end
    end

    SetVehicleEngineOn(vehicle, true, true, false) -- [INFO] Start engine after key assignment.
end

--──────────────────────────────────────────────────────────────────────────────
-- Fuel System Integration                                                     [ADV]
-- [INFO] Uses qs-fuelstations or LegacyFuel if available, else native fallback.
--──────────────────────────────────────────────────────────────────────────────
Config.MissionFuel = true                   -- [EDIT] Mission vehicles drain fuel quickly (tow usage incentive).
Config.TimeToEmpty = .40                    -- [EDIT] Minutes to empty (0.4 ≈ 24s in ticked drain logic; comment notes 40s).

---@param vehicle number
---@param fuelLevel number
Config.SetVehicleFuel = function(vehicle, fuelLevel)
    if GetResourceState('qs-fuelstations') == 'started' then
        exports['qs-fuelstations']:SetFuel(vehicle, fuelLevel)
    elseif GetResourceState('LegacyFuel') == 'started' then
        exports["LegacyFuel"]:SetFuel(vehicle, fuelLevel)
    else
        ErrorPrint("Fuel System not found, please add qs-fuelstations or LegacyFuel, or adapt Config.SetVehicleFuel/Config.GetVehicleFuel.")
        SetVehicleFuelLevel(vehicle, fuelLevel)
    end
end

---@param vehicle number
---@return number fuelLevel
Config.GetVehicleFuel = function(vehicle)
    local fuelLevel = 100
    if GetResourceState('qs-fuelstations') == 'started' then
        fuelLevel = exports['qs-fuelstations']:GetFuel(vehicle)
    elseif GetResourceState('LegacyFuel') == 'started' then
        fuelLevel = exports["LegacyFuel"]:GetFuel(vehicle)
    else
        fuelLevel = GetVehicleFuelLevel(vehicle)
    end
    return fuelLevel
end

---@param vehicle number
Config.SetVehiclePersistant = function(vehicle) -- [ADV] Persists entity with compatible garages.
    local vehicleNetId = NetworkGetNetworkIdFromEntity(vehicle)
    if GetResourceState('qs-advancedgarages') == 'started' then
        exports['qs-advancedgarages']:setVehicleToPersistent(vehicleNetId)
    end
    print("Vehicle with netId " .. vehicleNetId .. " is now persistent.")
end

--──────────────────────────────────────────────────────────────────────────────
-- Missions: Spawn Locations                                                    [EDIT]
--──────────────────────────────────────────────────────────────────────────────
Config.MissionTakeVehicleCoords = {
    -- city port
    vector4(1233.5984, -3231.7458, 5.6025, 1.4223),
    vector4(1218.4076, -3230.7104, 5.6774, 5.8339),

    -- north town
    vector4(35.3286, 6443.1895, 31.4053, 228.4462),
    vector4(42.3564, 6449.6548, 31.4155, 229.5308),
    vector4(59.1482, 6468.3901, 31.4253, 227.4545),

    -- arena war
    vector4(-365.1500, -1866.4991, 20.5279, 9.9986),

    -- TEST (keep commented)
    -- vector4(1260.9913, 2678.4492, 37.5816, 259.8691),
    -- vector4(1250.967041, 2681.459229, 37.603638, 280.629913),
}

---@return vector4
function GetRandomMissionSpawnLocation()     -- [CORE] Helper for random mission start.
    return Config.MissionTakeVehicleCoords[math.random(1, #Config.MissionTakeVehicleCoords)]
end

--──────────────────────────────────────────────────────────────────────────────
-- Editor Action Controls                                                      [EDIT]
-- [INFO] Labels and key codes for creator/editor flows.
--──────────────────────────────────────────────────────────────────────────────
Config.ActionControls = {
    forward                  = { label = 'Forward +/-',                 codes = { 33, 32 } },
    right                    = { label = 'Right +/-',                   codes = { 35, 34 } },
    up                       = { label = 'Up +/-',                      codes = { 52, 51 } },
    add_point                = { label = 'Add Point',                   codes = { 24 } },
    undo_point               = { label = 'Undo Last',                   codes = { 25 } },
    set_position             = { label = 'Set Position',                codes = { 24 } },
    add_garage               = { label = 'Add Garage',                  codes = { 24 } },
    rotate_z                 = { label = 'RotateZ +/-',                 codes = { 20, 73 } },
    rotate_z_scroll          = { label = 'RotateZ +/-',                 codes = { 17, 16 } },
    increase_z               = { label = 'Z Boundary +/-',              codes = { 180, 181 } },
    decrease_z               = { label = 'Z Boundary +/-',              codes = { 21, 180, 181 } },
    change_shell             = { label = 'Next Shell Model',            codes = { 217 } },
    done                     = { label = 'Done',                        codes = { 191 } },
    change_player            = { label = 'Player +/-',                  codes = { 82, 81 } },
    select_player            = { label = 'Select Player',               codes = { 191 } },
    cancel                   = { label = 'Cancel',                      codes = { 194 } },
    select_vehicle           = { label = 'Vehicle +/-',                 codes = { 82, 81 } },
    spawn_vehicle            = { label = 'Spawn Vehicle',               codes = { 191 } },
    leftApt                  = { label = 'Previous Interior',           codes = { 174 } },
    rightApt                 = { label = 'Next Interior',               codes = { 175 } },
    select_menuCoords        = { label = 'Set Menu Location',           codes = { 47 } },
    select_spawnCoords       = { label = 'Set Vehicle Spawn Location',  codes = { 74 } },
    add_vehicle_show_point   = { label = 'Add Vehicle Show Point',      codes = { 217 } },
}

Config.Precision = 100.0                    -- [ADV] Editor float precision. Do not change unless required by tooling.

--──────────────────────────────────────────────────────────────────────────────
-- Vehicle Data Fields (UI/Stats)                                              [EDIT]/[ADV]
-- [INFO] Field list for basic/advanced stats rendering in UI panels.
--──────────────────────────────────────────────────────────────────────────────
Config.Fields = {
    -- Basic Info
    { name = "modelName",     label = "Model Name",    getter = function(model) return Config.Getters.GetDisplayName(model) end },
    { name = "vehicleClass",  label = "Vehicle Class", getter = function(model) return Config.Getters.GetVehicleClass(model) end },
    { name = "doorCount",     label = "Door Count",    getter = function(model) return Config.Getters.GetDoorCount(model) end },
    { name = "seatCapacity",  label = "Seat Capacity", getter = function(model) return Config.Getters.GetSeatCount(model) end },
    -- Transmission example (commented; requires reliable source)
    -- { name = "transmission", label = "Transmission", getter = function(model) return Config.Getters.GetTransmissionType(model) end },

    -- Advanced Handling Stats
    {
        name = "fMass", type = "float", label = "Weight", unit = "kg",
        getter = function(vehicle) return GetVehicleHandlingFloat(vehicle, "CHandlingData", "fMass") end
    },
    {
        name = "fInitialDragCoeff", type = "float", label = "Drag Coefficient", unit = "",
        getter = function(vehicle) return GetVehicleHandlingFloat(vehicle, "CHandlingData", "fInitialDragCoeff") end
    },
    {
        name = "fInitialDriveMaxFlatVel", type = "float", label = "Top Speed", unit = "km/h",
        modifier = function(value) return value * 1.32 end,  -- [INFO] Convert game units → km/h (approx).
        getter   = function(vehicle) return GetVehicleHandlingFloat(vehicle, "CHandlingData", "fInitialDriveMaxFlatVel") end
    },
    {
        name = "fBrakeForce", type = "float", label = "Brake Force", unit = "",
        getter = function(vehicle) return GetVehicleHandlingFloat(vehicle, "CHandlingData", "fBrakeForce") end
    },
}

--──────────────────────────────────────────────────────────────────────────────
-- Vehicle Classes (Labels)                                                    [EDIT]
--──────────────────────────────────────────────────────────────────────────────
Config.VehicleClasses = {
    [0] = "Compact", [1] = "Sedan", [2] = "SUV", [3] = "Coupe", [4] = "Muscle",
    [5] = "Classic Sports", [6] = "Sports", [7] = "Super", [8] = "Motorcycle",
    [9] = "Off-Road", [10] = "Industrial", [11] = "Utility", [12] = "Van",
    [13] = "Bicycle", [14] = "Boat", [15] = "Helicopter", [16] = "Plane",
    [17] = "Service", [18] = "Emergency", [19] = "Military", [20] = "Commercial", [21] = "Train"
}

--──────────────────────────────────────────────────────────────────────────────
-- Getters (Centralized Accessors)                                             [CORE]
-- [INFO] Do not change unless adapting to a custom data source.
--──────────────────────────────────────────────────────────────────────────────
Config.Getters = {
    ---@param vehicle number
    ---@return string
    GetDisplayName = function(vehicle)
        -- [INFO] Robust display name retrieval with graceful fallback.
        local displayName = GetLabelText(GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)))
        if displayName == "NULL" then
            displayName = tostring(GetEntityModel(vehicle))
        end
        return displayName
    end,

    ---@param vehicle number
    ---@return string
    GetVehicleClass = function(vehicle)
        local vehicleClass = GetVehicleClassFromName(GetEntityModel(vehicle))
        return Config.VehicleClasses[vehicleClass] or "Unknown"
    end,

    ---@param vehicle number
    ---@return number
    GetDoorCount = function(vehicle)
        return GetNumberOfVehicleDoors(vehicle)
    end,

    ---@param vehicle number
    ---@return number
    GetSeatCount = function(vehicle)
        return GetVehicleModelNumberOfSeats(GetEntityModel(vehicle))
    end,

    ---@param vehicle number
    ---@return "Manual"|"Automatic"
    GetTransmissionType = function(vehicle)
        local isManual = GetVehicleHandlingInt(vehicle, "CHandlingData", "nInitialDriveGears") == 1
        return isManual and "Manual" or "Automatic"
    end,
}
qs-vehicleshop/config/data.lua
if not Config then Config = {} end -- [CORE]

--──────────────────────────────────────────────────────────────────────────────
-- Vehicle List (Screenshots Only)                                             [EDIT]
-- [INFO] This list is used to generate vehicle screenshots/previews.
-- [INFO] It is NOT the shop inventory. Add/remove models as needed.
--──────────────────────────────────────────────────────────────────────────────
Config.VehicleList = {
    -- Boats
    "dinghy", "dinghy2", "dinghy3", "dinghy4", "jetmax", "marquis", "seashark", "seashark2",
    "seashark3", "speeder", "speeder2", "squalo", "submersible", "submersible2", "suntrap", "toro",
    "toro2", "tropic", "tropic2", "tug", "avisa", "dinghy5", "kosatka", "longfin", "patrolboat",

    -- Commercial
    "benson", "biff", "hauler", "hauler2", "mule", "mule2", "mule3", "mule4", "packer", "phantom", 
    "phantom2", "phantom3", "pounder", "pounder2", "stockade", "stockade3", "terbyte", "barrage",

    -- Compacts
    "asbo", "blista", "brioso", "brioso2", "issi2", "issi3", "issi4", "issi5", "issi6", "panto",
    "prairie", "rhapsody",

    -- Coupes
    "cogcabrio", "exemplar", "f620", "felon", "felon2", "jackal", "oracle", "oracle2", "sentinel",
    "sentinel2", "windsor", "windsor2", "zion", "zion2",

    -- Cycles
    "bmx", "cruiser", "fixter", "scorcher", "tribike", "tribike2", "tribike3",

    -- Emergency
    "ambulance", "fbi", "fbi2", "firetruk", "lguard", "pbus", "police", "police2", "police3", 
    "police4", "policeb", "policeold1", "policeold2", "policet", "pranger", "predator", "riot", 
    "riot2", "sheriff", "sheriff2",

    -- Helicopters
    "akula", "annihilator", "annihilator2", "buzzard", "buzzard2", "cargobob", "cargobob2", 
    "cargobob3", "cargobob4", "frogger", "frogger2", "havok", "hunter", "maverick", "savage", 
    "seasparrow", "skylift", "supervolito", "supervolito2", "swift", "swift2", "valkyrie", 
    "valkyrie2", "volatus",

    -- Industrial
    "bulldozer", "cutter", "dump", "flatbed", "guardian", "handler", "mixer", "mixer2", 
    "rubble", "tiptruck", "tiptruck2",

    -- Military
    "apc", "barrage", "chernobog", "crusader", "halftrack", "khanjali", "minitank", "rhino", 
    "scarab", "scarab2", "scarab3", "thruster", "trailersmall2", "vigilante", "zr380", "zr3802", 
    "zr3803",

    -- Motorcycles
    "akuma", "avarus", "bagger", "bati", "bati2", "bf400", "carbonrs", "chimera", "cliffhanger", 
    "daemon", "daemon2", "defiler", "deathbike", "deathbike2", "deathbike3", "diablous", 
    "diablous2", "double", "enduro", "esskey", "faggio", "faggio2", "faggio3", "fcr", "fcr2", 
    "gargoyle", "hakuchou", "hakuchou2", "hexer", "innovation", "lectro", "manchez", "nemesis", 
    "nightblade", "oppressor", "oppressor2", "pcj", "ratbike", "ruffian", "sanchez", "sanchez2", 
    "sanctus", "shotaro", "sovereign", "stryder", "thrust", "vader", "vindicator", "vortex", 
    "wolfsbane", "zombiea", "zombieb",

    -- Muscle
    "blade", "buccaneer", "buccaneer2", "chino", "chino2", "clique", "coquette3", "deviant", 
    "dominator", "dominator2", "dominator3", "dominator4", "dominator5", "dominator6", 
    "dukes", "dukes2", "dukes3", "ellie", "faction", "faction2", "faction3", "gauntlet", 
    "gauntlet2", "gauntlet3", "gauntlet4", "gauntlet5", "hermes", "hotknife", "hustler", 
    "impaler", "impaler2", "impaler3", "impaler4", "imperator", "imperator2", "imperator3", 
    "lurcher", "moonbeam", "moonbeam2", "nightshade", "phoenix", "picador", "ratloader", 
    "ratloader2", "ruiner", "ruiner2", "ruiner3", "sabregt", "sabregt2", "slamvan", "slamvan2", 
    "slamvan3", "slamvan4", "slamvan5", "slamvan6", "stalion", "stalion2", "tampa", "tampa3", 
    "tulip", "vamos", "vigero", "virgo", "virgo2", "virgo3", "voodoo", "voodoo2", "yosemite", 
    "yosemite2", "yosemite3",

    -- Off-Road
    "bfinjection", "bifta", "blazer", "blazer2", "blazer3", "blazer4", "blazer5", "brawler", 
    "bruiser", "bruiser2", "bruiser3", "brutus", "brutus2", "brutus3", "caracara", "caracara2", 
    "dloader", "dubsta3", "dune", "dune2", "dune3", "dune4", "dune5", "freecrawler", "hellion", 
    "insurgent", "insurgent2", "insurgent3", "kalahari", "kamacho", "marshall", "menacer", 
    "mesa3", "monster", "monster3", "monster4", "monster5", "nightshark", "rancherxl", 
    "rancherxl2", "rebel", "rebel2", "rcbandito", "riata", "sandking", "sandking2", "technical", 
    "technical2", "technical3", "trophytruck", "trophytruck2", "vagrant", "verus", "winky", 
    "zhaba",

    -- Planes
    "alkonost", "alphaz1", "avenger", "avenger2", "besra", "blimp", "blimp2", "blimp3", 
    "bombushka", "cargoplane", "cuban800", "dodo", "duster", "howard", "hydra", "jet", 
    "lazer", "luxor", "luxor2", "mammatus", "microlight", "miljet", "mogul", "molotok", 
    "nimbus", "nokota", "pyro", "rogue", "seabreeze", "shamal", "starling", "strikeforce", 
    "stunt", "titan", "tula", "velum", "velum2", "vestra", "volatol",

    -- Sedans
    "asea", "asea2", "asterope", "cog55", "cog552", "cognoscenti", "cognoscenti2", 
    "emperor", "emperor2", "emperor3", "fugitive", "glendale", "glendale2", "ingot", 
    "intruder", "limo2", "premier", "primo", "primo2", "regina", "romero", "stafford", 
    "stanier", "stratum", "stretch", "superd", "surge", "tailgater", "warrener", "washington",

    -- Service
    "airbus", "brickade", "bus", "coach", "rallytruck", "rentalbus", "taxi", "tourbus", 
    "trash", "trash2", "wastelander",

    -- Sports
    "alpha", "banshee", "bestiagts", "blista2", "blista3", "buffalo", "buffalo2", "buffalo3", 
    "carbonizzare", "comet2", "comet3", "comet4", "comet5", "coquette", "coquette4", "drafter", 
    "deveste", "elegy", "elegy2", "feltzer2", "flashgt", "furoregt", "futo", "futo2", "gb200", 
    "hotring", "imorgon", "issi7", "italigto", "italirsx", "jugular", "jester", "jester2", 
    "jester3", "khamelion", "kuruma", "kuruma2", "locust", "lynx", "massacro", "massacro2", 
    "neo", "neon", "ninef", "ninef2", "omnis", "paragon", "paragon2", "pariah", "penumbra", 
    "penumbra2", "rapidgt", "rapidgt2", "raptor", "remus", "revolter", "ruston", "schafter2", 
    "schafter3", "schafter4", "schafter5", "schafter6", "schlagen", "schwarzer", "sentinel3", 
    "seven70", "specter", "specter2", "streiter", "sugoi", "sultan", "sultan2", "sultan3", 
    "sultanrs", "surano", "tampa2", "tropos", "verlierer2", "veto", "veto2", "vstr", "zr350", 
    "zion3", "calico", "cypher", "dominator7", "dominator8", "euros", "futo2", "growler", 
    "jester4", "previon", "remus", "rt3000", "tailgater2", "warrener2", "zr350",

    -- Sports Classics
    "ardent", "btype", "btype2", "btype3", "casco", "cheburek", "cheetah2", "coquette2", 
    "dynasty", "fagaloa", "feltzer3", "gt500", "infernus2", "jb700", "jb7002", "mamba", 
    "manana", "manana2", "michelli", "monroe", "nebula", "peyote", "peyote3", "pigalle", 
    "rapidgt3", "retinue", "retinue2", "savestra", "stinger", "stingergt", "stromberg", 
    "swinger", "torero", "tornado", "tornado2", "tornado3", "tornado4", "tornado5", 
    "tornado6", "turismo2", "viseris", "z190", "zion3", "ztype",

    -- Super
    "adder", "autarch", "banshee2", "bullet", "cheetah", "cyclone", "deveste", 
    "entity2", "entityxf", "emerus", "fmj", "furia", "gp1", "infernus", "italigtb", "italigtb2", 
    "krieger", "le7b", "nero", "nero2", "osiris", "penetrator", "pfister811", "prototipo", 
    "reaper", "s80", "sc1", "scramjet", "sheava", "sultanrs", "t20", "taipan", "tempesta", 
    "tezeract", "thrax", "tigon", "turismor", "tyrant", "tyrus", "vacca", "vagner", "vigilante", 
    "visione", "voltic", "voltic2", "xa21", "zentorno",

    -- SUVs
    "baller", "baller2", "baller3", "baller4", "baller5", "baller6", "bjxl", "cavalcade", 
    "cavalcade2", "contender", "dubsta", "dubsta2", "fq2", "granger", "gresley", "habanero", 
    "huntley", "landstalker", "landstalker2", "mesa", "mesa2", "novak", "patriot", "patriot2", 
    "radi", "rebla", "rocoto", "seminole", "seminole2", "serrano", "toros", "xls", "xls2",

    -- Trailers
    "armytanker", "armytrailer", "armytrailer2", "baletrailer", "boattrailer", "cablecar", 
    "docktrailer", "graintrailer", "proptrailer", "raketrailer", "tr2", "tr3", "tr4", "trflat", 
    "tvtrailer", "tanker", "tanker2", "trailerlarge", "trailerlogs", "trailersmall", "trailers", 
    "trailers2", "trailers3", "trailers4", "freighttrailer",

    -- Trains
    "freight", "freightcar", "freightcont1", "freightcont2", "freightgrain", "metrotrain", 
    "tankercar",

    -- Utility
    "airtug", "caddy", "caddy2", "caddy3", "docktug", "forklift", "mower", "ripley", "sadler", 
    "sadler2", "scrap", "towtruck", "towtruck2", "tractor", "tractor2", "tractor3", "utillitruck", 
    "utillitruck2", "utillitruck3",

    -- Vans
    "bison", "bison2", "bison3", "bobcatxl", "burrito", "burrito2", "burrito3", "burrito4", 
    "burrito5", "camper", "gburrito", "gburrito2", "journey", "minivan", "minivan2", "paradise", 
    "pony", "pony2", "rumpo", "rumpo2", "rumpo3", "speedo", "speedo2", "speedo4", "surfer", 
    "surfer2", "taco", "youga", "youga2", "youga3", "youga4"
}