[FREE] Emergency Vehicle Modification System for QBCore/QBX/ESX/Standalone

I spent several days looking for a simple/straightforward Extras and Livery menu for emergency vehicles. Mostly, what I found was either

  • too complex
  • UI was too conspicuous
  • cost too much $$
  • Didn’t have all the features to modify modern vehicles

I decided to build a simple, lightweight, EmergencyVehicleMenu that anyone could use and edit easily. I like the simplicity of using OX_lib. It always looks clean and you can make server-wide menu and notification changes easily.

Overview

:rocket: Zero-Configuration Emergency Vehicle Modification System

A next-generation FiveM script that automatically configures everything for emergency vehicle modifications across all
major frameworks. No manual setup required - just install and it works!

Requirements

  • Standalone Mode - No framework dependencies required
  • ox_lib - For UI components
  • OxMysql - For database operations
  • Framework (Optional) - Auto-detects QBCore, QBox, ESX

Key Features

Core Functionality

  • Multi-Framework Auto-Detection: Works with QBCore, QBox (qbx_core), ESX, or Standalone
  • Job-Based Access Control: Restrict by job AND grade (configurable per zone)
  • Location-Based Zones: Modify vehicles at designated PD, Fire, and EMS locations
  • Custom Vehicle Detection: Manual vehicle list for add-on cars that bypass Class 18
  • Vehicle Liveries: Apply standard and custom YFT liveries to vehicles
  • Custom Livery Management: Add, remove, and organize custom liveries directly in-game
  • Performance Upgrades: Engine, brakes, transmission, suspension, armor, and turbo
  • Appearance Customization: Colors, wheels, window tints, neon lights, and more
  • Vehicle Extras: Toggle up to 20 vehicle extras (lightbars, pushbars, etc.)
  • Door Controls: Individual control for doors, hood, and trunk
  • Field Repair System: Emergency repairs outside stations (requires item)

:new: What’s New in v2.2.0

Accessibility Improvements

  • :white_check_mark: Lowered Grade Requirements - All zones now use minGrade = 0 (Cadets/Officers can access)
  • :white_check_mark: Better Custom Vehicle Support - Manual vehicle list with easy-to-add examples
  • :white_check_mark: Gabz MLO Templates - Commented zone examples for custom buildings
  • :white_check_mark: Expanded Job Mappings - Includes statepolice, trooper, saspr, and more

Economy & Balance

  • :white_check_mark: Balanced Repair Costs - $350 field / $500 full repair
  • :white_check_mark: Job Discounts - 25% off for police, ambulance, fire
  • :white_check_mark: Free for Mechanics - Configurable job exemptions

New Features

  • :white_check_mark: Undercover Neon Support - Whitelist specific vehicles for neon access
  • :white_check_mark: Input Validation - Security for preset/livery names
  • :white_check_mark: Named Constants - Easy maintenance for damage thresholds, cooldowns

Technical Improvements

  • :white_check_mark: Config Reorganization - 9 clearly labeled sections
  • :white_check_mark: Job Caching - Prevents SQL spam (5-minute cache)
  • :white_check_mark: QBox Detection Fix - Verified qbx_core checked before qb-core
  • :white_check_mark: Removed Duplicate Code - Cleaned up config sections

User Experience

  • Intuitive UI: Clean menu system with status indicators
  • Visual Zone Indicators: Map blips and ground markers show available modification locations
  • Interactive Access: Press E to open the menu when in a garage with an emergency vehicle
  • Search Functionality: Find specific liveries quickly with built-in search
  • Configuration Saving: Save your favorite vehicle setups
  • Auto-apply: Automatically apply saved configurations when entering vehicles
  • Preset System: Save and share configurations across your department

Administration

  • Easy Configuration: Organized config with clear section headers
  • Zone Types: Different visual indicators for police, fire, and medical
  • Customizable Features: Enable or disable specific modification types
  • Database Integration: Save and load configurations across server restarts
  • Debug Mode: Verbose logging for troubleshooting

Vehicle Menu   Overview

Livery Selection

Color Options

Commands and Controls

  • Press E when in a modification zone to open the menu

Access Control

Access to the vehicle modification menu is restricted to:

  1. Job-Based: Must have the correct job (police, fire, ambulance, etc.)
  2. Grade-Based: Configurable minimum grade per zone (default: 0 = all ranks)
  3. Location-Based: Must be within designated modification zones
  4. Vehicle-Based: Only emergency vehicles can be modified (configurable)

This approach provides layered security while remaining accessible to all department members.

Configuration

The config.lua file is organized into 9 clear sections:

– [[ 1. CORE SETTINGS ]]
Config.Debug = true – Set FALSE for production
Config.AutoConfigure = true – Auto-detect framework and zones

– [[ 2. FRAMEWORK & PERFORMANCE ]]
Config.AutoDetectFramework = true – Auto-detects QBCore/QBox/ESX
Config.CacheJobInfo = true – Prevents SQL spam (5 min cache)

– [[ 3. JOB ACCESS CONTROL ]]
Config.EnableJobRestrictions = true – Enable job-based restrictions
Config.EnableGradeRestrictions = true – Enable grade requirements
Config.DisableZoneRestrictions = false – Set TRUE for admin testing

– Job name mappings (add your custom job names)
Config.JobMappings = {
police = {‘police’, ‘lspd’, ‘bcso’, ‘sheriff’, ‘sahp’, ‘statepolice’, ‘trooper’},
fire = {‘fire’, ‘lsfd’, ‘firefighter’},
ambulance = {‘ambulance’, ‘ems’, ‘medical’},
}

– [[ 4. ZONE CONFIGURATION ]]
Config.ManualZones = true
Config.ManualModificationZones = {
{
name = “Mission Row PD - Garage”,
coords = vector3(454.6, -1017.4, 28.4),
radius = 30.0,
type = “police”,
requiredJob = “police”,
minGrade = 0, – Grade 0 = ALL ranks can access
jobLabel = “Police Officer”
},
– 11+ pre-configured locations included (PD, Fire, EMS)
– Gabz MLO templates included as comments
}

– [[ 5. VEHICLE DETECTION ]]
Config.ManualVehicleDetection = true – Use manual list for custom cars
Config.ManualEmergencyVehicles = {
– GTA V Defaults included
“police”, “police2”, “police3”, “police4”, “sheriff”, “sheriff2”,
“fbi”, “fbi2”, “firetruk”, “ambulance”, “riot”,
– Add your custom vehicles:
– “nypd_explorer”,
– “bcso_charger”,
– “2020tahoe”,
}

– [[ 6. FEATURE TOGGLES ]]
Config.EnabledModifications = {
Liveries = true,
Extras = true,
Performance = true,
Appearance = true,
Doors = true,
Neon = false, – Enable for unmarked units
Repair = true
}

– Selective neon for undercover vehicles
Config.UndercoverNeon = {
enabled = false,
allowedVehicles = {
– “unmarked_charger”,
– “slicktop_explorer”,
}
}

– [[ 7. ECONOMY ]]
Config.RepairCosts = {
enabled = true,
fullRepairCost = 500,
fieldRepairCost = 350,
freeForJobs = {‘mechanic’},
discountJobs = {
{job = ‘police’, discount = 0.25}, – 25% off
{job = ‘ambulance’, discount = 0.25},
{job = ‘fire’, discount = 0.25}
}
}

Handling Custom Liveries

This script applies custom liveries by referencing .yft files that you have streamed using a separate resource.

  1. Stream Your Liveries: Ensure your custom vehicle .yft files (and their corresponding .ytd texture dictionaries) are
    correctly added to a streaming resource in your server.
  2. Configure Paths: Add entries to Config.CustomLiveries in config.lua or use the in-game ‘Add New Livery’ menu.
  3. Folder Structure:

[vehiclename]
├── fxmanifest.lua
└── stream
├── vehicle_livery1.yft
├── vehicle_livery2.yft
├── vehicle.yft
└── vehicle_lightbar_standard.yft

Database Tables

CREATE TABLE IF NOT EXISTS vehicle_mods (
id INT NOT NULL AUTO_INCREMENT,
vehicle_model VARCHAR(255) NOT NULL,
extras TEXT DEFAULT NULL,
player_id VARCHAR(255) DEFAULT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY vehicle_model_unique (vehicle_model)
);

The extras column holds a JSON object containing all saved modifications.

Coming Soon

  • Vehicle-specific configuration profiles
  • Image preview for liveries
  • Comprehensive livery management panel
  • Phone integration for remote vehicle prep

Migration from v2.1.x

  1. Backup your current config.lua
  2. Install new version
  3. Add custom zones to Config.ManualModificationZones if needed
  4. Add custom vehicles to Config.ManualEmergencyVehicles
  5. Test with Config.Debug = true

Latest Release: Release v2.2.0-DSRP - Accessibility & Configuration Overhaul · DeamonScripts/dps-EmergencyVehicleMenu · GitHub

Support provided only via GitHub issues
| Code is accessible | Yes | Lines (approximately) | 1,200+ | |—|—|—|—|
| Requirements | ox_lib, oxmysql | Support | GitHub Issues | | Assets accessible | Yes | Framework | Optional (auto-detect) |

Or single column style:

Code is accessible Yes
Lines (approximately) 1,200+
Requirements ox_lib, oxmysql
Support GitHub Issues
Assets accessible Yes

Or just a simple list if tables are rendering weird:

Code is accessible: Yes | Lines: 1,200+ | Requirements: ox_lib, oxmysql | Support: GitHub Issues |
Assets: Yes

3 Likes

So can this be changed to work with standalone as this would be great to have for standalone servers as well

It’s actually on my agenda to make it standalone or with any popular framework. I’ll update it tonight And let you know when it’s done

Awesome thanks

It’s been updated on Git Hub. It should now work with QB, QBX, ESX, or Standalone Fivem.

Future Updates:

  • Additional SQL logic to save preferences for each vehicle the player uses, with updates on each change
    *Compatibility with other menus
    *Complete Mod menu for useable only at PD, EMS, or other locations specified in the config

I’ll try to get to that next week.

Nice I will give it a try

Hey boss the script still looks for qb core even though its set to standalone

image

I’ll fix it and test it later tonight. I can just give you one that set up for standalone.

I just quickly re-coded it the other day, but I wasn’t able to fully test it so you’re kind of my guinea pig. I’ll get you squared away.

Ok all good

Any updates on this?

I just updated it :grinning: It took me a bit, I was missing some stuff and had to rework the entire script.

Make sure you follow the updated readme. There are changes needed in the config and FXmanifest depending on the framework…

Ok I will test it out and let you know if it works

Github does not seem to be updated as there is no SQLs for QB ESX STANDALONE unless people have to make them

this is also still not working here is the new error

image

I thoroughly tested it last night. It worked fine for me and all of those instances when I get home tonight from work I’ll take a look again but if you have additional information, just send me a private message and we’ll sort through it.

Ok whats your thing to pm?

Ensure the fxmanifest.lua is correctly set up for standalone use.

Ensure the config.lua file is correctly setup, and you have ox_lib & oxmsql database setup

Made changes.

The SQL is in this post and in the readme on github.

is there also that you have for example an unmarked police car and you can put a stop sign on it with Stop Police? and put sirens on it? that would really be better