Before You Begin#
Before installing Dispatch and MDT, make sure your server meets the requirements. Three things are mandatory; everything else is optional and only needed for the feature that uses it.
Requirement | Status | Notes |
|---|---|---|
| Required | Database access for calls, callsigns, the MDT, cameras and jail. |
| Required | Keybinds, zones, callbacks and notifications. |
Framework | Required |
|
Voice | Recommended | pma-voice or SaltyChat, to move units between radio channels from the dispatch panel. |
Inventory | Optional | qs-inventory, ox_inventory, qb-inventory or the ESX default — for the MDT item and for confiscating illegal items on jailing. |
Billing | Optional | For speed-camera fines and the bills tab of the MDT. See Integrations. |
Housing | Optional | qs-housing or qb-houses, to list a citizen's properties in the MDT. |
OneSync | Recommended | OneSync Infinity, so units far away still show on the map and bodycams can follow them. |
The framework, the garage bridge and the housing bridge are detected from the resources already running. The inventory, billing and voice systems are chosen in config/config.lua.
Downloading Dispatch and MDT#
After purchasing Dispatch and MDT, the resource is automatically linked to your CFX Portal account. Sign in to the CFX Portal with the same account used at checkout, open Granted Assets, and download it. The optional Outlaw Alert DLC is downloaded the same way.
After extracting the download you should have this folder:
qs-dispatch/
├── config/
│ ├── config.lua -- every option of the script
│ ├── jobsdata.lua -- the penal code and EMS services lists
│ └── datas.lua -- zone names and vehicle colour names
├── client/custom/ -- editable bridges: framework, billing, commands, alert exports
├── server/custom/ -- editable bridges: framework, inventory, billing, housing, voice, garages, call hook
├── locales/ -- en · es · fr · de · pt
├── sql/all.sql -- the database tables
└── fxmanifest.luaThe folder must be named exactly
qs-dispatch. Other scripts call it by that name, and a renamed copy prints an error and shuts the server console down a few seconds after starting.
Installing the Resource#
Move the qs-dispatch folder into your server's resources directory. It can live inside a category folder:
resources/
└── [qs]/
├── qs-dispatch/
└── qs-outlawalert-dlc/ -- optionalThen open your server.cfg and start every dependency before Dispatch and MDT:
ensure oxmysql
ensure ox_lib
# Framework
ensure es_extended
# ensure qb-core
# Voice, inventory, billing, housing
ensure pma-voice
ensure qs-inventory
ensure qs-billing
ensure qs-housing
ensure qs-dispatch
ensure qs-outlawalert-dlc # optional, always after qs-dispatchThe loading order matters. The framework, garage and housing bridges are picked by looking at what is already started, so a framework that starts after Dispatch and MDT is not found.
The Database#
Import sql/all.sql into your server's database with HeidiSQL, phpMyAdmin or any MySQL client. Every statement uses CREATE TABLE IF NOT EXISTS, so importing it again on an existing server is safe.
Table | Holds |
|---|---|
| Each officer's callsign. |
| The CCTV cameras placed with the camera creator. |
| Active sentences: reason, length, start and end time. |
| Citizen profiles per department: photo, tags and notes. |
| Incident reports and BOLOs. |
| Charges and warrants per citizen. |
| The history entries written on a citizen's profile. |
| The history of each plate, including speed-camera infractions. |
Your framework's own tables are only read —
usersandowned_vehicleson ESX,playersandplayer_vehicleson QBCore. On every start the script matches the collation ofdispatch_mdt_datato your users table and prints an[AUTOCFG]line; that is expected.
Adding the MDT Item#
The MDT opens with /openmdt by default. If you prefer officers to carry a tablet, set Config.NeedItemForMDT = true and register the item named in Config.MDTItemName (mdt by default) in your inventory:
Add it to qs-inventory/shared/items.lua:
['mdt'] = {
['name'] = 'mdt',
['label'] = 'MDT',
['weight'] = 500,
['type'] = 'item',
['image'] = 'mdt.png',
['unique'] = true,
['useable'] = true,
['shouldClose'] = true,
['description'] = 'Police mobile data terminal',
},Add it to ox_inventory/data/items.lua:
['mdt'] = {
label = 'MDT',
weight = 500,
stack = false,
close = true,
description = 'Police mobile data terminal',
},Add it to qb-core/shared/items.lua:
mdt = { name = 'mdt', label = 'MDT', weight = 500, type = 'item', image = 'mdt.png', unique = true, useable = true, shouldClose = true, description = 'Police mobile data terminal' },Insert it into the items table:
INSERT INTO `items` (`name`, `label`, `weight`) VALUES ('mdt', 'MDT', 1);Using the item always opens the MDT, so give it only to the jobs that should have one.
Camera Creator Permissions#
CCTV cameras are placed in game with /createcameras, which is protected by two aces: the command itself and the permission to create cameras. Add both to server.cfg:
Every member of your admin group can place cameras:
add_ace group.admin command.createcameras allow
add_ace group.admin dispatch.createCameras allowOnly one identifier can place cameras:
add_ace identifier.license:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx command.createcameras allow
add_ace identifier.license:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx dispatch.createCameras allowA player without permission who runs the command sees a "not allowed" screen, and the server console prints a suggested add_ace line with their identifier. Restart the server after adding aces.
Configuring the Resource#
Everything is set in a few editable files:
File | Contents |
|---|---|
| Language, integrations, jobs, keys, commands, blips, MDT permissions, radio groups, jail, radar, speed cameras, bodycams and CCTV. |
| The penal code — each charge's fine and jail time — and the EMS services list. |
| Zone names and vehicle colour names used in the alerts. |
| The Discord webhooks for police and EMS calls. |
The values worth reviewing first:
Config.Language = 'en' -- en · es · fr · de · pt
Config.InventorySystem = 'qs-inventory' -- qs-inventory · ox-inventory · qb-inventory · esx-default · none
Config.Billing = 'qs-billing' -- see Integrations
Config.voice = 'pma-voice' -- pma-voice · saltychat
Config.JobsAllowed = { -- jobs that receive calls and use the dispatch
'police',
'mechanic',
'ambulance'
}
Config.AllowImages = true -- attach a screenshot to calls
Config.DiscordWebHook = '' -- a Discord webhook used to store those screenshotsScreenshots need a webhook. Photos in calls are uploaded to a Discord channel and the link is shown in the call. Create a webhook in a private channel and paste it in
Config.DiscordWebHook; without it, calls simply arrive without a picture.
Verifying the Installation#
Restart your server and read the console. A healthy start prints:
[AUTOCFG] Dispatch MDT Data table was successfully updated to the correct collate `utf8mb4_general_ci`.
Loaded 0 Camera objects
ESX Version of QS-Dispatch LoadedOn QBCore the last line reads QBCore Version of QS-Dispatch Loaded. If any of these lines is missing or an error appears instead, see Common Errors. Then join with a police character and work through the first loop:
Go on duty
Type
/onduty. Your blip appears on the map and the dispatch is ready.Send a test call
Type
/police Testing the dispatch. The call pops up with a sound, a blip appears, and the call is listed in the panel.Respond to it
Press G on the pop-up, or open the panel with L and choose Respond. A waypoint is set to the call.
Open the MDT
Type
/openmdtand search for your own character under Profiles. Usage covers everything else.



