config.lua

Preview File Updated: v1.3.0 - 30.04.2025

Config = {}

-- ███████╗██████╗  █████╗ ███╗   ███╗███████╗██╗    ██╗ ██████╗ ██████╗ ██╗  ██╗
-- ██╔════╝██╔══██╗██╔══██╗████╗ ████║██╔════╝██║    ██║██╔═══██╗██╔══██╗██║ ██╔╝
-- █████╗  ██████╔╝███████║██╔████╔██║█████╗  ██║ █╗ ██║██║   ██║██████╔╝█████╔╝ 
-- ██╔══╝  ██╔══██╗██╔══██║██║╚██╔╝██║██╔══╝  ██║███╗██║██║   ██║██╔══██╗██╔═██╗ 
-- ██║     ██║  ██║██║  ██║██║ ╚═╝ ██║███████╗╚███╔███╔╝╚██████╔╝██║  ██║██║  ██╗
-- ╚═╝     ╚═╝  ╚═╝╚═╝  ╚═╝╚═╝     ╚═╝╚══════╝ ╚══╝╚══╝  ╚═════╝ ╚═╝  ╚═╝╚═╝  ╚═╝
local frameworkAutoFind = function()
    if GetResourceState('es_extended') ~= 'missing' then
        return "ESX"
    elseif GetResourceState('qb-core') ~= 'missing' then
        return "QB-Core"
    end
end

Config.Core = frameworkAutoFind()
Config.CoreExport = function()
    if Config.Core == "ESX" then
        return exports['es_extended']:getSharedObject()
    elseif Config.Core == "QB-Core" then
        return exports['qb-core']:GetCoreObject()
    end
end

---@field PlayerLoaded string: ESX: "esx:playerLoaded" / QB-Core: "QBCore:Client:OnPlayerLoaded"
Config.PlayerLoaded = Config.Core == "ESX" and "esx:playerLoaded" or "QBCore:Client:OnPlayerLoaded"  

---@field PlayerLogoutServer string: ESX: "esx:playerDropped" / QB-Core: "QBCore:Server:OnPlayerUnload"
Config.PlayerLogoutServer = Config.Core == "ESX" and "esx:playerDropped" or "QBCore:Server:OnPlayerUnload"

---@field PlayerSetJob string: ESX: "esx:setJob" / QB-Core: "QBCore:Client:OnJobUpdate"
Config.PlayerSetJob = Config.Core == "ESX" and "esx:setJob" or "QBCore:Client:OnJobUpdate"

---@field PlayerSetGang string: ESX: "esx:setJob2" / QB-Core: "QBCore:Client:OnGangUpdate"
Config.PlayerSetGang = Config.Core == "ESX" and "esx:setJob2" or "QBCore:Client:OnGangUpdate"



-- ███╗   ███╗ █████╗ ██╗███╗   ██╗    ███████╗███████╗████████╗████████╗██╗███╗   ██╗ ██████╗ ███████╗
-- ████╗ ████║██╔══██╗██║████╗  ██║    ██╔════╝██╔════╝╚══██╔══╝╚══██╔══╝██║████╗  ██║██╔════╝ ██╔════╝
-- ██╔████╔██║███████║██║██╔██╗ ██║    ███████╗█████╗     ██║      ██║   ██║██╔██╗ ██║██║  ███╗███████╗
-- ██║╚██╔╝██║██╔══██║██║██║╚██╗██║    ╚════██║██╔══╝     ██║      ██║   ██║██║╚██╗██║██║   ██║╚════██║
-- ██║ ╚═╝ ██║██║  ██║██║██║ ╚████║    ███████║███████╗   ██║      ██║   ██║██║ ╚████║╚██████╔╝███████║
-- ╚═╝     ╚═╝╚═╝  ╚═╝╚═╝╚═╝  ╚═══╝    ╚══════╝╚══════╝   ╚═╝      ╚═╝   ╚═╝╚═╝  ╚═══╝ ╚═════╝ ╚══════╝
---@field AutoExecuteQuery boolean: Automatic creation of tables required for vms_garagesv2
Config.AutoExecuteQuery = true

---@field Debug boolean
Config.Debug = true

---@field DebugPolyZone boolean
-- **[Developer Option]** Enables debug mode for PolyZone registration.
-- If set to true, developers will see visual outlines of parking zones, making it easier to create and adjust new parking areas.
-- If set to false, no debug visuals will be displayed.
Config.DebugPolyZone = true -- Enable debug mode for PolyZone (only for development)


---@field DefaultRoutingBucket number
-- Defines the default **routing bucket** for all players.
-- The routing bucket system isolates players into different "instances" (virtual worlds) within the server.
-- By default, all players share the same bucket (`0`), meaning they can see each other normally.
-- If modified, only players in the same bucket can interact with each other.
Config.DefaultRoutingBucket = 0 -- Default routing bucket (0 = shared world)


---@field VehiclePropertiesStateBag string
-- The **state bag** name used to update and synchronize vehicle properties.
-- This option should **not** be modified unless you're an advanced developer and know exactly what you're doing.
-- If you use a different vehicle state system, you might need to change this.
Config.VehiclePropertiesStateBag = "VehicleProperties" -- Recommended default


---@field RegisterStateBag boolean
-- In **ESX**, this is already built into the framework, so **no registration is required** (and should not be enabled to avoid conflicts).
-- In **QB-Core**, this does not exist by default, so it **must** be registered to ensure vehicle properties are correctly stored and synced.
-- **vms_garagesV2 automatically handles this for QB-Core**, so users should **not** modify this unless they fully understand the consequences.
-- **Warning:** Incorrect modifications can break vehicle property synchronization.
Config.RegisterStateBag = Config.Core == "QB-Core" -- Required for QB-Core, unnecessary for ESX

Config.UseMarkers = true -- Using a marker to display points
Config.UseText3D = false -- Using a 3D Text to display points
Config.UseHelpNotify = true -- Using a ESX.ShowHelpNotification (only for esx)

---@class Marker Below you can configure the markers for each point
Config.Marker = {
    ['management_business'] = {
        distanceSee = 10.0,
        distanceAccess = 1.8,
        type = 36,
        color = {50, 168, 82, 175},
        rotation = vec(0.0, 0.0, 0.0),
        scale = vec(0.5, 0.5, 0.5),
        bobUpAndDown = true,
        rotate = true,
        textureDict = nil,
        textureName = nil,
        drawOnEnts = false,
    },
    ['enter_garage_veh'] = {
        distanceSee = 10.0,
        distanceAccess = 1.8,
        type = 36,
        color = {50, 168, 82, 175},
        rotation = vec(0.0, 0.0, 0.0),
        scale = vec(0.5, 0.5, 0.5),
        bobUpAndDown = true,
        rotate = true,
        textureDict = nil,
        textureName = nil,
        drawOnEnts = false,
    },
    ['enter_garage'] = {
        distanceSee = 12.0,
        distanceAccess = 1.8,
        type = 20,
        color = {50, 168, 82, 175},
        rotation = vec(0.0, 0.0, 0.0),
        scale = vec(0.2, 0.2, 0.2),
        bobUpAndDown = true,
        rotate = true,
        textureDict = nil,
        textureName = nil,
        drawOnEnts = false,
    },
    ['exit_garage_veh'] = {
        distanceSee = 10.0,
        distanceAccess = 1.8,
        type = 36,
        color = {255, 168, 82, 175},
        rotation = vec(0.0, 0.0, 0.0),
        scale = vec(0.5, 0.5, 0.5),
        bobUpAndDown = true,
        rotate = true,
        textureDict = nil,
        textureName = nil,
        drawOnEnts = false,
    },
    ['exit_garage'] = {
        distanceSee = 12.0,
        distanceAccess = 1.8,
        type = 20,
        color = {255, 168, 82, 175},
        rotation = vec(0.0, 0.0, 0.0),
        scale = vec(0.2, 0.2, 0.2),
        bobUpAndDown = true,
        rotate = true,
        textureDict = nil,
        textureName = nil,
        drawOnEnts = false,
    },
    ['garage_menu'] = {
        distanceSee = 10.0,
        distanceAccess = 1.8,
        type = 20,
        color = {50, 168, 82, 175},
        rotation = vec(0.0, 180.0, 0.0),
        scale = vec(0.2, 0.2, 0.2),
        bobUpAndDown = true,
        rotate = true,
        textureDict = nil,
        textureName = nil,
        drawOnEnts = false,
    },
    ['return_vehicle'] = {
        distanceSee = 25.0,
        distanceAccess = 3.5,
        type = 21,
        color = {50, 168, 82, 175},
        rotation = vec(0.0, 180.0, 0.0),
        scale = vec(0.8, 0.8, 0.8),
        bobUpAndDown = false,
        rotate = true,
        textureDict = nil,
        textureName = nil,
        drawOnEnts = false,
    },
    ['impound'] = {
        distanceSee = 10.0,
        distanceAccess = 1.8,
        type = 29,
        color = {50, 168, 82, 175},
        rotation = vec(0.0, 0.0, 0.0),
        scale = vec(0.2, 0.2, 0.2),
        bobUpAndDown = true,
        rotate = true,
        textureDict = nil,
        textureName = nil,
        drawOnEnts = false,
    },
    ['parking_space'] = {
        distanceSee = 5.0,
        distanceAccess = 1.8,
        type = 21,
        color = {20, 240, 10, 175},
        rotation = vec(180.0, 0.0, 0.0),
        scale = vec(0.2, 0.2, 0.2),
        bobUpAndDown = false,
        rotate = true,
        textureDict = nil,
        textureName = nil,
        drawOnEnts = false,
    },
    ['pay_station'] = {
        distanceSee = 10.0,
        distanceAccess = 1.8,
        type = 29,
        color = {50, 168, 82, 175},
        rotation = vec(0.0, 0.0, 0.0),
        scale = vec(0.2, 0.2, 0.2),
        bobUpAndDown = false,
        rotate = true,
        textureDict = nil,
        textureName = nil,
        drawOnEnts = false,
    },
}

---@class Blips Below you can configure blips for each garage and impound
Config.Blips = {
    ['impound:vehicle'] = {
        sprite = 317,
        display = 4,
        scale = 0.9,
        color = 41,
        name = "Impound"
    },
    
    ['free_garage:vehicle'] = {
        sprite = 357,
        display = 4,
        scale = 0.9,
        color = 3,
        name = "Garage"
    },
    ['free_garage:boat'] = {
        sprite = 356,
        display = 4,
        scale = 0.9,
        color = 3,
        name = "Garage"
    },
    ['free_garage:plane'] = {
        sprite = 359,
        display = 4,
        scale = 0.9,
        color = 3,
        name = "Hangar"
    },
    ['free_garage:helicopter'] = {
        sprite = 360,
        display = 4,
        scale = 0.9,
        color = 3,
        name = "Garage"
    },

    ['paid_garage:vehicle'] = {
        sprite = 369,
        display = 4,
        scale = 0.9,
        color = 11,
        name = "Paid Garage"
    },
    ['paid_garage:boat'] = {
        sprite = 371,
        display = 4,
        scale = 0.9,
        color = 11,
        name = "Paid Garage"
    },
    ['paid_garage:plane'] = {
        sprite = 372,
        display = 4,
        scale = 0.9,
        color = 11,
        name = "Paid Garage"
    },
    ['paid_garage:helicopter'] = {
        sprite = 370,
        display = 4,
        scale = 0.9,
        color = 11,
        name = "Paid Garage"
    },

    ['rent_garage:vehicle'] = {
        sprite = 369,
        display = 4,
        scale = 0.9,
        color = 12,
        name = "Rent Garage"
    },
    ['rent_garage:boat'] = {
        sprite = 371,
        display = 4,
        scale = 0.9,
        color = 12,
        name = "Rent Garage"
    },
    ['rent_garage:plane'] = {
        sprite = 372,
        display = 4,
        scale = 0.9,
        color = 12,
        name = "Rent Garage"
    },
    ['rent_garage:helicopter'] = {
        sprite = 370,
        display = 4,
        scale = 0.9,
        color = 12,
        name = "Rent Garage"
    },

    ['job_garage'] = {
        sprite = 357,
        display = 4,
        scale = 0.9,
        color = 38,
        name = "Job Garage"
    },
}



--  ██████╗ ██████╗ ███╗   ██╗███████╗██╗ ██████╗ ██╗   ██╗██████╗  █████╗ ████████╗██╗ ██████╗ ███╗   ██╗
-- ██╔════╝██╔═══██╗████╗  ██║██╔════╝██║██╔════╝ ██║   ██║██╔══██╗██╔══██╗╚══██╔══╝██║██╔═══██╗████╗  ██║
-- ██║     ██║   ██║██╔██╗ ██║█████╗  ██║██║  ███╗██║   ██║██████╔╝███████║   ██║   ██║██║   ██║██╔██╗ ██║
-- ██║     ██║   ██║██║╚██╗██║██╔══╝  ██║██║   ██║██║   ██║██╔══██╗██╔══██║   ██║   ██║██║   ██║██║╚██╗██║
-- ╚██████╗╚██████╔╝██║ ╚████║██║     ██║╚██████╔╝╚██████╔╝██║  ██║██║  ██║   ██║   ██║╚██████╔╝██║ ╚████║
--  ╚═════╝ ╚═════╝ ╚═╝  ╚═══╝╚═╝     ╚═╝ ╚═════╝  ╚═════╝ ╚═╝  ╚═╝╚═╝  ╚═╝   ╚═╝   ╚═╝ ╚═════╝ ╚═╝  ╚═══╝
---@field AllowAllToParking boolean
-- Determines whether **any** player can park a vehicle in public parking lots, regardless of ownership.
-- If set to `true`, players can park any vehicle they enter, even if they do not own it.
-- If set to `false`, only the vehicle owner (or authorized job members) can park the vehicle.
Config.AllowAllToParking = false -- Restrict parking to vehicle owners only


---@field AllowAllToPullOut boolean  
-- Determines whether **any** player can pull out a vehicle from a parking lot.
Config.AllowAllToPullOut = false -- Only the vehicle owner can take out their parked vehicle


---@field AllowParkingCompanyVehiclesEverywhere boolean
-- Allows company/gang vehicles (e.g., ambulances, police cars) to be parked **anywhere**, not just in designated company parking areas.
-- If set to `true`, job vehicles can be parked in any parking lot.
-- If set to `false`, job vehicles can only be parked in their designated **company/gang garages**.
Config.AllowParkingCompanyVehiclesEverywhere = true -- Enable parking of company vehicles anywhere


---@field PreventExplosionOfParkedVehicles boolean
-- Prevents **explosions** from affecting parked vehicles.
-- If set to `true`, parked vehicles will not be destroyed by explosions.
-- If set to `false`, parked vehicles may be destroyed when affected by explosions.
Config.PreventExplosionOfParkedVehicles = true -- Protect parked vehicles from explosions


---@field AllowRecoveryBurnedVehicles boolean
-- Allows players to **recover burned vehicles** from impound.
-- If set to `true`, even destroyed vehicles can be retrieved.
-- If set to `false`, burned vehicles cannot be recovered.
Config.AllowRecoveryBurnedVehicles = true -- Allow recovering burned vehicles

---@field AllowRecoveryVehiclesFromWater boolean
-- Allows recovery of **submerged** vehicles from impound.
-- ⚠ **Note:** This is in **beta mode** and only works with **oceans** (not lakes or rivers).
Config.AllowRecoveryVehiclesFromWater = true -- Allow recovering sunken vehicles (oceans only)


---@field AllowTransferBetweenGarages boolean
-- Enables the ability to transfer a vehicle **between garages** using an in-game menu.
-- If set to `true`, players can move vehicles from one garage to another for a fee.
Config.AllowTransferBetweenGarages = true -- Enable garage transfers
Config.TransferBetweenGaragesPrice = 500 -- Cost of transferring a vehicle to another garage


---@field AllowLockpickParkedVehicle boolean
-- Determines whether players can **lockpick** parked vehicles and drive them away.
-- **This does not disable lockpicking entirely**—it only affects whether a **lockpicked** vehicle can be driven away.
-- If `false`, players will be unable to drive a stolen parked vehicle, even if they successfully lockpick it.
-- If you want to **completely disable lockpicking**, you must modify your lockpick script.
Config.AllowLockpickParkedVehicle = true -- Allow stolen parked vehicles to be driven


---@field VehiclesLoadDistance number
-- The **render distance** for parked vehicles (in meters).
-- - **Recommended:** `25m` (Best performance vs. visibility balance)
-- - Lower values improve performance but make vehicles disappear sooner.
-- - Higher values keep vehicles visible from further away but may impact performance.
Config.VehiclesLoadDistance = 25 -- Distance at which parked vehicles become visible


---@field ClearCacheOfVehicleModels boolean
-- Clears the **vehicle model cache** after spawning vehicles.
-- **Recommended for large servers** with add-on vehicles to prevent texture loss over time.
Config.ClearCacheOfVehicleModels = true -- Prevent texture loss from vehicle caching


---@field InstantVehicleLoading boolean
-- Instantly loads **all parked vehicles** when entering a parking PolyZone, instead of loading them progressively.
-- - **Beta Feature:** Performance impact is unknown for servers with a very large number of parked add-on vehicles.
-- - **Use with caution:** May cause spikes in resource usage or minor freezes if too many vehicles are spawned at once.
Config.InstantVehicleLoading = false


---@field WaitForProperties boolean
-- **(QB-Core/QBX-Core Only)** Ensures that vehicle properties (e.g., damage, mods, paint) are correctly applied.
-- If vehicles are missing modifications when spawned, **enable this**.
Config.WaitForProperties = true -- Ensures vehicle properties are properly applied


---@field WaitForPropertiesTime number
-- The **delay (in milliseconds)** before vehicle properties are applied.
-- If properties are **not loading correctly**, increase this value.
-- **Recommended value:** 500 (half a second).
Config.WaitForPropertiesTime = 500 -- Delay before applying vehicle properties


---@field DisplayParkingTimer boolean
-- Displays a **timer** indicating how long a vehicle has been parked.
-- This can be useful for tracking parking durations, especially for roleplay.
Config.DisplayParkingTimer = true -- Enable parking duration display
Config.ParkingTimerScale = 0.95 -- Scaling factor for the parking timer UI


---@field MaxSpeedToPark number
-- The **maximum speed** (in GTA's `GetEntitySpeed` units) at which a player can park a vehicle.
-- This prevents players from parking while driving at high speeds.
-- - 3.0 is approximately **11 km/h (7 mph)**, simulating a slow parking maneuver.
Config.MaxSpeedToPark = 3.0 -- Maximum speed at which players can park


---@class VehicleTypes
-- Defines different vehicle categories and their default impound locations.
Config.VehicleTypes = {
    ['vehicle'] = {
        name = "vehicle", -- Internal name (from database column `type`)
        label = "vehicle", -- Display label
        defaultImpound = "Impound1", -- The impound lot where unparked vehicles are moved
        autoAddToImpoundAfterRestart = true -- Automatically move unparked vehicles to impound after a restart
    },
    ['boat'] = {
        name = "boat",
        label = "boat",
        defaultImpound = "ImpoundBoat",
        autoAddToImpoundAfterRestart = true
    },
    ['plane'] = {
        name = "plane",
        label = "plane",
        defaultImpound = "ImpoundPlane",
        autoAddToImpoundAfterRestart = true
    },
    ['helicopter'] = {
        name = "helicopter",
        label = "helicopter",
        defaultImpound = "ImpoundHeli",
        autoAddToImpoundAfterRestart = true
    }
}


---@class CustomVehicleLabels
-- Defines custom display names for specific vehicles using their model hashes.
-- Useful for replacing default in-game vehicle names with real-world branding.
Config.CustomVehicleLabels = {
    [joaat('c63w205')] = 'Mercedes-Benz C63S', -- Example custom vehicle label
}


---@class AddVehicleKeysOn
-- Specifies when players should receive vehicle keys.
-- Controlled via config.client.lua - CL.GiveVehicleKeys.
Config.AddVehicleKeysOn = {
    -- Receiving keys when pulling out vehicles from an **impound lot**
    companyVehFromImpound = true, -- Company vehicle
    gangVehFromImpound = true, -- Gang vehicle
    privateVehFromImpound = true, -- Privately owned vehicle
    
    -- Receiving keys when pulling out vehicles from **public parking lots**
    companyVehFromParking = true, 
    gangVehFromParking = true, 
    privateVehFromParking = true, 

    -- Receiving keys when taking a vehicle from **a garage**
    companyOwnedVehFromGarage = true, -- A company-owned vehicle
    companyVehFromGarage = true, -- A generic company vehicle
    gangOwnedVehFromGarage = true, -- A gang-owned vehicle
    gangVehFromGarage = true, -- A generic gang vehicle
    privateVehFromGarage = true -- A privately owned vehicle
}


---@class RemoveVehicleKeysOn
-- Specifies when players' vehicle keys should be **removed**.
-- Controlled via config.client.lua - CL.RemoveVehicleKeys
Config.RemoveVehicleKeysOn = {
    -- Removing keys when parking a vehicle in **public parking lots**
    companyVehToParking = false, 
    gangVehToParking = false, 
    privateVehToParking = false, 

    -- Removing keys when parking a vehicle in **a garage**
    companyOwnedVehToGarage = true, -- A company-owned vehicle
    companyVehToGarage = true, -- A generic company vehicle
    gangOwnedVehToGarage = true, -- A gang-owned vehicle
    gangVehToGarage = true, -- A generic gang vehicle
    privateVehToGarage = false -- A privately owned vehicle
}


---@class CompanyGrades Here you need to enter information about the works that will have the ability to transcribe a private vehicle to a company vehicle and a registered job garage in Config.Garages
Config.CompanyGrades = {
    ['police'] = {
        ['0'] = { -- Recruit
            label = "Recruit",
        },
        ['1'] = { -- Officer
            label = "Officer",
        },
        ['2'] = { -- Sergeant
            label = "Sergeant",
        },
        ['3'] = { -- lieutenant
            label = "Lieutenant",
        },
        ['4'] = { -- Boss
            label = "Boss",
            isBoss = true, -- This will enable this rank to order and transfer vehicles for employees
        },
    },
    ['ambulance'] = {
        ['0'] = {
            label = "Recruit",
        },
        ['1'] = {
            label = "Doctor",
        },
        ['2'] = {
            label = "Chief Doctor",
        },
        ['3'] = {
            label = "Boss",
            isBoss = true, -- This will enable this rank to order and transfer vehicles for employees
        },
    }
}

---@class GangGrades Here you need to enter information about the works that will have the ability to transcribe a private vehicle to a company vehicle and a registered job garage in Config.Garages
Config.GangGrades = {
    ['ballas'] = {
        ['0'] = { -- Member
            label = "Member",
        },
        ['1'] = { -- Boss
            label = "Boss",
            isBoss = true, -- This will enable this rank to order and transfer vehicles for employees
        },
    },
}


---@class RandomGarageAnims
-- Defines **random animations** that play when a player enters a **garage or impound lot**.
-- This helps make interactions **more immersive** instead of having players stand still.
Config.RandomGarageAnims = {
    {"rcmnigel1a", "base"},
    {"rcmjosh1", "idle"},
    {"anim@heists@humane_labs@finale@strip_club", "ped_b_celebrate_loop"},
    {"random@street_race", "_car_b_lookout"},
    {"anim@amb@casino@hangout@ped_male@stand@02b@idles", "idle_a"}
}


---@class GiveVehicleCommand 
Config.GiveVehicleCommand = {
    enabled = true,
    oldESX = false,
    name = "givecar",
    groups = 'admin',
    help = "Add a vehicle to the garage",
    suggestions = {
        {label = "Player ID or Job Name for company"},
        {label = "Vehicle Type (vehicle/boat/helicopter/plane)"},
        {label = "Vehicle Model"},
        {label = "License Plate Number (_ = space) (* Max 8 characters, special characters cannot be used!)"},
    }
}



-- ██╗███╗   ███╗██████╗  ██████╗ ██╗   ██╗███╗   ██╗██████╗ 
-- ██║████╗ ████║██╔══██╗██╔═══██╗██║   ██║████╗  ██║██╔══██╗
-- ██║██╔████╔██║██████╔╝██║   ██║██║   ██║██╔██╗ ██║██║  ██║
-- ██║██║╚██╔╝██║██╔═══╝ ██║   ██║██║   ██║██║╚██╗██║██║  ██║
-- ██║██║ ╚═╝ ██║██║     ╚██████╔╝╚██████╔╝██║ ╚████║██████╔╝
-- ╚═╝╚═╝     ╚═╝╚═╝      ╚═════╝  ╚═════╝ ╚═╝  ╚═══╝╚═════╝ 
---@field TowMenuCommand string
-- The command that allows players to open the **tow menu**.
-- Example: If set to `'tow'`, players can type `/tow` in chat to access the menu.
Config.TowMenuCommand = 'tow' -- Default command to open the tow menu


---@field MaxTowFineAmount number
-- The **maximum** fine amount that can be set when impounding a vehicle.
-- Ensures that players cannot impose excessive fines.
Config.MaxTowFineAmount = 12000 -- Maximum fine allowed when towing a vehicle


---@field MinTowFineAmount number
-- The **minimum** fine amount that can be set when impounding a vehicle.
-- Prevents fines from being set to negative values or zero if a minimum fine is required.
Config.MinTowFineAmount = 0 -- Minimum fine allowed (set to `0` to allow free impounds)


---@field MaxTowFineCharacters number
-- The **maximum** number of characters allowed in the fine **description/title**.
-- Prevents excessively long fine descriptions.
Config.MaxTowFineCharacters = 250 -- Maximum length of fine description


---@field MinTowFineCharacters number
-- The **minimum** number of characters allowed in the fine **description/title**.
-- Ensures players provide a proper reason for the fine.
Config.MinTowFineCharacters = 0 -- Minimum length of fine description


---@class AllowJobImpoundsTakeVehWithoutPaying
-- Defines which **jobs** can use the tow menu and access impound lots.
-- Each job has access to specific impound locations.
Config.TowMenuJobsAccess = {
    ['mechanic'] = {
        label = "Mechanic",
        impoundsAvailable = {
            ['vehicle'] = 'Impound1', -- Default vehicle impound lot
            ['boat'] = 'ImpoundBoat', -- Boat impound lot
            ['plane'] = 'ImpoundPlane', -- Plane impound lot
            ['helicopter'] = 'ImpoundHeli' -- Helicopter impound lot
        },
    },
    ['police'] = {
        label = "Police",
        impoundsAvailable = {
            ['vehicle'] = { 
                'ImpoundPolice', -- Police-specific impound
                'Impound1' -- General public impound
            },
            ['boat'] = 'ImpoundBoat',
            ['plane'] = 'ImpoundPlane',
            ['helicopter'] = 'ImpoundHeli',
        },
    },
}

---@field AllowJobImpoundsTakeVehWithoutPaying boolean: This will enable the vehicle to be removed from the impound without the customer having to pay.
Config.AllowJobImpoundsTakeVehWithoutPaying = true

---@class AutomaticImpound 
Config.AutomaticImpound = {
    ['vehicle'] = {
        impounded_by = "City Services",
        fine_title = "Leaving a vehicle in a place not intended for it.",
        fine_amount = 200,
    },
    ['boat'] = {
        impounded_by = "City Services",
        fine_title = "Leaving a vehicle in a place not intended for it.",
        fine_amount = 400,
    },
    ['plane'] = {
        impounded_by = "City Services",
        fine_title = "Leaving a vehicle in a place not intended for it.",
        fine_amount = 2600,
    },
    ['helicopter'] = {
        impounded_by = "City Services",
        fine_title = "Leaving a vehicle in a place not intended for it..",
        fine_amount = 2000,
    },
}



-- ██████╗  █████╗ ██╗██████╗     ██████╗  █████╗ ██████╗ ██╗  ██╗██╗███╗   ██╗ ██████╗ ███████╗
-- ██╔══██╗██╔══██╗██║██╔══██╗    ██╔══██╗██╔══██╗██╔══██╗██║ ██╔╝██║████╗  ██║██╔════╝ ██╔════╝
-- ██████╔╝███████║██║██║  ██║    ██████╔╝███████║██████╔╝█████╔╝ ██║██╔██╗ ██║██║  ███╗███████╗
-- ██╔═══╝ ██╔══██║██║██║  ██║    ██╔═══╝ ██╔══██║██╔══██╗██╔═██╗ ██║██║╚██╗██║██║   ██║╚════██║
-- ██║     ██║  ██║██║██████╔╝    ██║     ██║  ██║██║  ██║██║  ██╗██║██║ ╚████║╚██████╔╝███████║
-- ╚═╝     ╚═╝  ╚═╝╚═╝╚═════╝     ╚═╝     ╚═╝  ╚═╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝╚═╝  ╚═══╝ ╚═════╝ ╚══════╝
---@field NeedPayForParking boolean: Does the player have to pay at the parking meter for parking (In future updates there will be additional options for this)
Config.NeedPayForParking = true



-- ██╗  ██╗ ██████╗ ██╗   ██╗███████╗███████╗     ██████╗  █████╗ ██████╗  █████╗  ██████╗ ███████╗███████╗
-- ██║  ██║██╔═══██╗██║   ██║██╔════╝██╔════╝    ██╔════╝ ██╔══██╗██╔══██╗██╔══██╗██╔════╝ ██╔════╝██╔════╝
-- ███████║██║   ██║██║   ██║███████╗█████╗      ██║  ███╗███████║██████╔╝███████║██║  ███╗█████╗  ███████╗
-- ██╔══██║██║   ██║██║   ██║╚════██║██╔══╝      ██║   ██║██╔══██║██╔══██╗██╔══██║██║   ██║██╔══╝  ╚════██║
-- ██║  ██║╚██████╔╝╚██████╔╝███████║███████╗    ╚██████╔╝██║  ██║██║  ██║██║  ██║╚██████╔╝███████╗███████║
-- ╚═╝  ╚═╝ ╚═════╝  ╚═════╝ ╚══════╝╚══════╝     ╚═════╝ ╚═╝  ╚═╝╚═╝  ╚═╝╚═╝  ╚═╝ ╚═════╝ ╚══════╝╚══════╝
local housingAutoFind = function()
    local housingList = {
        'nolag_properties',
        'qs-housing',
        -- 'add_your_custom',
    }
    
    for _, housing in ipairs(housingList) do
        if GetResourceState(housing) == 'started' then
            return housing
        end
    end

    return nil
end

---@field Housing string:
--[[
    - nolag_properties
    - qs-housing

    * If your housing is not in the above list, it can be customized in ./server/[housing]/
]]
Config.Housing = housingAutoFind()

---@field DebugHouseGaragesZones boolean: You can debug areas to which garages belong to houses
Config.DebugHouseGaragesZones = false

---@field VehiclesHouseGaragesAlwaysOpen boolean: Whether all vehicles in the garage belonging to the house should always be open (If true, then when a player steals a vehicle from another player, he will be able to use it)
Config.VehiclesHouseGaragesAlwaysOpen = true

---@field RegisterHouseGaragesAutomatically boolean
--[[
    Automatically registers **housing garages** when a new house is created using a supported housing system.
    - It listens to the events of creating a house and immediately creates a usable garage for the new property.
    - **No need for manual registration** via the VMS Garages menu.
    - Add support for other housing systems manually by adding a listener in vms_garagesv2/server/[housing]/.
    - **Recommended:** Enable (`true`) if you're using or planning to integrate a supported housing system.
    - Disable (`false`) if you prefer manual control or have no automatic housing integration.
]]
Config.RegisterHouseGaragesAutomatically = true -- Auto-register garages on house creation



-- ███████╗ █████╗ ██╗     ███████╗     █████╗  ██████╗ ██████╗ ███████╗███████╗███╗   ███╗███████╗███╗   ██╗████████╗
-- ██╔════╝██╔══██╗██║     ██╔════╝    ██╔══██╗██╔════╝ ██╔══██╗██╔════╝██╔════╝████╗ ████║██╔════╝████╗  ██║╚══██╔══╝
-- ███████╗███████║██║     █████╗      ███████║██║  ███╗██████╔╝█████╗  █████╗  ██╔████╔██║█████╗  ██╔██╗ ██║   ██║   
-- ╚════██║██╔══██║██║     ██╔══╝      ██╔══██║██║   ██║██╔══██╗██╔══╝  ██╔══╝  ██║╚██╔╝██║██╔══╝  ██║╚██╗██║   ██║   
-- ███████║██║  ██║███████╗███████╗    ██║  ██║╚██████╔╝██║  ██║███████╗███████╗██║ ╚═╝ ██║███████╗██║ ╚████║   ██║   
-- ╚══════╝╚═╝  ╚═╝╚══════╝╚══════╝    ╚═╝  ╚═╝ ╚═════╝ ╚═╝  ╚═╝╚══════╝╚══════╝╚═╝     ╚═╝╚══════╝╚═╝  ╚═══╝   ╚═╝   
---@field UseSaleAgreement boolean: Do you want to use the script built-in option to sell your vehicle
Config.UseSaleAgreement = true

Config.AgreementPaymentMethods = {'cash', 'bank'}

---@field UseSaleAgreementItem boolean: The ability to open a vehicle sales agreement with item.
Config.UseSaleAgreementItem = false
Config.SaleAgreementItem = 'sale_agreement_vehicle'
Config.RemoveSaleAgreementItem = true -- after the sale is completed, the item will be removed from the seller

---@field UseSaleAgreementCommand boolean: The ability to open a vehicle sales agreement with command.
Config.UseSaleAgreementCommand = true
Config.SaleAgreementCommand = 'sellvehicle'

---@class SaleBlacklistVehicles You can prevent players from selling individual vehicles
Config.SaleBlacklistVehicles = {
    [GetHashKey('rhino')] = true,
    [GetHashKey('police')] = true,
    [GetHashKey('police2')] = true,
    [GetHashKey('police3')] = true,
}



-- ██╗      ██████╗  ██████╗ █████╗ ████████╗ ██████╗ ██████╗ 
-- ██║     ██╔═══██╗██╔════╝██╔══██╗╚══██╔══╝██╔═══██╗██╔══██╗
-- ██║     ██║   ██║██║     ███████║   ██║   ██║   ██║██████╔╝
-- ██║     ██║   ██║██║     ██╔══██║   ██║   ██║   ██║██╔══██╗
-- ███████╗╚██████╔╝╚██████╗██║  ██║   ██║   ╚██████╔╝██║  ██║
-- ╚══════╝ ╚═════╝  ╚═════╝╚═╝  ╚═╝   ╚═╝    ╚═════╝ ╚═╝  ╚═╝
---@field AllowImpoundLocator boolean: This will allow players to locate a vehicle when it is currently spawned on the server.
Config.AllowImpoundLocator = true
Config.PriceOfLocationCheck = 250

---@field UseVMSTuningLocator boolean: If you are using vms_tuning min. v2.0.4, you can use the required locator installation.
Config.UseVMSTuningLocator = false

Config.LocatorBlip = {
    usePreciseLocation = true,

    radiusNotPrecise = 200.0,

    showTime = 20000,

    sprite = 465,
    display = 4,
    scale = 0.9,
    color = 15,

    name = "Located Vehicle"
}


-- ██╗   ██╗███╗   ███╗███████╗     ██████╗██╗████████╗██╗   ██╗██╗  ██╗ █████╗ ██╗     ██╗     
-- ██║   ██║████╗ ████║██╔════╝    ██╔════╝██║╚══██╔══╝╚██╗ ██╔╝██║  ██║██╔══██╗██║     ██║     
-- ██║   ██║██╔████╔██║███████╗    ██║     ██║   ██║    ╚████╔╝ ███████║███████║██║     ██║     
-- ╚██╗ ██╔╝██║╚██╔╝██║╚════██║    ██║     ██║   ██║     ╚██╔╝  ██╔══██║██╔══██║██║     ██║     
--  ╚████╔╝ ██║ ╚═╝ ██║███████║    ╚██████╗██║   ██║      ██║   ██║  ██║██║  ██║███████╗███████╗
--   ╚═══╝  ╚═╝     ╚═╝╚══════╝     ╚═════╝╚═╝   ╚═╝      ╚═╝   ╚═╝  ╚═╝╚═╝  ╚═╝╚══════╝╚══════╝
Config.VMSCityHallResource = 'vms_cityhall'
Config.UseVMSCityHall = GetResourceState(Config.VMSCityHallResource) == 'started'

---@field UseCityHallVIN boolean: If a player orders a vehicle using the management menu in the garage, the VIN will be automatically generated
Config.UseCityHallVIN = true

Last updated

Was this helpful?