Browse docs
Emergency Dispatch
Dispatch Enhanced v2
Emergency Dispatch is the server-authoritative operations system built into the Jobs Base tablet. It gives responders a focused field-unit view and authorized dispatchers a separate control-center workspace for calls, incidents, resources, radio traffic, warnings, and coordination.
| Workspace | Designed for | Main tasks |
|---|---|---|
| Field-unit Dispatch | On-duty responders | Staff a unit, join radio, accept assignments, update FMS, and set waypoints |
| Dispatch center | Authorized dispatchers | Take calls, create incidents, alarm units, coordinate radio, and close incidents |
Config.Dispatch system. The optional
Config.EmergencyDispatch integration connects the separate
emergencydispatch resource and is not required for Dispatch Enhanced v2.Field-unit workspace
Every on-duty member of a Dispatch-enabled job uses the normal Dispatch page. The page keeps the crew's most important information in one vertical flow:
- current unit, crew capacity, FMS status, channel, and frequency;
- active assignment, priority, location, waypoint, and incident state;
- available units and their staffing state;
- unit-wide channel selection and personal radio settings;
- self-dispatch controls when the configured center is not staffed.

The Open Dispatcher action is shown only when the player is on duty in a configured
dispatcherJobs job, has the DISPATCH permission, and matches the center's
optional grade restrictions.
Dispatcher workspace
Authorized staff start a shift for one control center and choose their available roles. The main workspace places the call queue, open incidents, and selected incident in one operational view. Quick actions, collapsible panels, resizable columns, direct priority changes, and a short undo window reduce navigation during busy situations.

Capabilities are checked again by the server. Showing a button in the frontend never grants the permission to use its action.
Tactical map
The Incidents view combines live units, active incidents, stations, facilities, and configured POIs. Dispatchers can filter layers and priorities, inspect grouped markers, follow movement, and trigger permitted incident actions directly from the map.

Clustering, live routes, radio-traffic highlighting, auto-centering, context actions, and movement
trails are controlled through Config.Dispatch.enhanced.map. Tactical drawing tools are
optional and disabled by default. The timeline key is currently reserved; the map does
not provide historical replay or a time slider.
Resources
The Resources view shows staffed and available units across covered departments. Filter by department, station, unit type, or FMS state, then use response-plan suggestions or select units manually. Crew size, distance, ETA, radio channel, and current assignment remain visible while dispatching.

Communication
The Communication view brings the active voice channel, secondary receive channel, dispatcher presence, on-duty personnel, connected centers, written center chat, SDS messages, and public warnings into one place. The effective radio behavior still comes from the configured PMA Voice, SaltyChat, or YACA adapter.

Archive and personal settings
Closed incidents remain in the Archive and can be exported when the current user is authorized. The same area includes the known-reporter directory used during call intake.

Each dispatcher can choose display density, interface scale, map behavior, notification categories, draft recovery, and automatic reconnect. Personal settings never expand server-side permissions.

Quick setup
1. Start the required resources
Start the database, phone, and voice providers before the Sky resources:
ensure oxmysql
ensure <your_phone_resource>
ensure <your_voice_resource>
ensure sky_base
ensure sky_jobs_base
ensure sky_policejob
ensure sky_ambulancejob
ensure sky_firejob
The phone resource is optional when citizens do not need to submit calls through a phone app. Use the real resource folder names in place of the placeholders.
2. Enable Dispatch Enhanced
The global switches are in sky_jobs_base/config/config.lua:
Config.Dispatch = {
enabled = true,
enhanced = {
enabled = true
}
}
This is only the minimum excerpt. Keep the supplied radio, map, permission, center, warning, SDS, phone, resilience, and rate-limit settings in the existing table.
3. Configure at least one center
A center defines who may dispatch, which jobs it covers, and which channels and roles it offers:
centers = {
{
id = "central_dispatch",
enabled = true,
dispatcherJobs = { "police", "sheriff", "ambulance", "fire" },
coveredJobs = { "police", "sheriff", "ambulance", "fire" },
channels = {
{ id = "POLICE_MAIN", shortLabel = "POL" },
{ id = "EMS_MAIN", shortLabel = "EMS" },
{ id = "FIRE_MAIN", shortLabel = "FIR" },
{ id = "DISPATCH_MAIN", shortLabel = "CMD" }
},
defaultChannel = "DISPATCH_MAIN",
noDispatcherFallback = true,
roles = {
{ id = "call_taker", default = true },
{ id = "dispatcher", default = true },
{ id = "situation" }
},
alarmMethods = { "tablet", "radio_tone", "station_announcement" }
}
}
Use unique IDs. The defaultChannel must exist in the center's channel list. Add
hybrid, stations, and connectedCenters settings from the
supplied configuration when those workflows are required.
4. Complete each job in /jobconfig
Open /jobconfig, choose the job, and configure these Dispatch sections:
- Enable Dispatch and, if required, Show in Emergency App.
- Create at least one radio channel and select the job's default channel.
- Create FMS status codes and mark at least one status as available for dispatch.
- Create response unit types and enough virtual fleet entries for the expected crews.
- Add incident keywords and response plans using matching
TYPE:COUNTrequirements. - Add useful POIs and known reporters.
- Grant Dispatch center only to grades that should work as dispatchers.
- Save the job and restart
sky_jobs_baseafter global configuration changes.
Jobs in the crime group are intentionally excluded from the public Emergency phone app.
5. Select the voice provider
Choose automatic detection or a specific adapter in sky_base/config/config.lua:
Config = {
phone = "auto",
voice = "auto"
}
Supported voice values are "pma", "saltychat",
"yaca", and "none". With SaltyChat, enable
RequestRadioTrafficStates so transmitting and receiving states are reported reliably.
Quick operating guide
Field unit
- Go on duty and open Dispatch in the Jobs Base tablet.
- Staff a free virtual unit and verify the crew list.
- Select an available FMS status and join the required radio channel.
- Accept the assigned incident, set its waypoint, and update FMS while responding.
- Leave the unit when the crew ends its shift.
Dispatcher
- Open Dispatch, choose Open Dispatcher, select a center and roles, then start the shift.
- Accept an incoming call or create an incident directly.
- Classify the incident, confirm location and priority, then link the call when applicable.
- Open Resources, use Suggest units, or select matching units manually.
- Alarm the units and coordinate radio, SDS, warnings, and connected centers as needed.
- Add situation updates, verify the incident log, and close the incident when operations finish.
- Open Archive to review the record or use Export PDF.
PDF export
Use Export PDF on an active incident or an archive entry. There is no printer overlay and no server report folder. Jobs Base creates a real PDF in memory, requests a short-lived authorized URL, and asks FiveM to open that URL in the operating system's default browser. The browser's PDF viewer can then display or download the file.
FiveM may show its normal external-URL confirmation first. The generated link expires after two
minutes, and a new export by the same player replaces the previous one. If a fresh link returns
404 or never opens, verify that the server's published TCP endpoint is reachable from
the player's computer.
Test checklist
Use a caller, a dispatcher, and a field unit when possible:
- The responder can staff a unit, set an available FMS state, and join radio.
- The dispatcher can start the correct center shift with the intended roles.
- A phone call reaches the call queue and can be linked to an incident.
- The incident appears on the tactical map with the expected priority and location.
- Suggested or selected resources receive the alarm and can accept it.
- Waypoint, radio, SDS, situation log, and FMS updates reach the intended users.
- Closing the incident moves it to the archive.
- Export PDF opens a real PDF in the external browser after confirmation.
- Ending the dispatcher shift activates the configured hybrid fallback.
Create an incident from another resource
Trusted server resources should use the resource-owned API. Its sourceId is idempotent within the
invoking resource, so reconnects or provider retries do not create duplicate incidents:
local result = exports["sky_jobs_base"]:CreateDispatchIncident({
sourceId = "vehicle-theft:report-2841",
jobs = { "police" },
coords = { x = 215.4, y = -810.2, z = 30.7 },
message = "A witness reported a vehicle theft in progress.",
keywordCode = "VEHICLE_THEFT"
})
if not result.success then
print(("Unable to create dispatch incident: %s"):format(result.error))
end
The job must be covered by a configured dispatch center. keywordCode must exactly match a
configured response plan when automatic plan selection is expected. The simpler client export is
restricted to the caller's own on-duty job, uses the server-side player position, and accepts only a
category from client metadata.
Troubleshooting
Confirm that the player is on duty, the job is listed in the center's
dispatcherJobs, the grade has the Dispatch center permission, and at least one
center role allows that grade. Field-unit access alone is not dispatcher access.
Confirm that the unit is staffed, has an available FMS status, has no conflicting assignment, and uses a response type matching the selected plan. Response type codes are case-sensitive.
Staffing a unit and joining radio are separate actions. Select a channel on the field-unit page,
then verify Config.voice, the provider resource name, and resource start order.
Accept FiveM's external-link confirmation and retry the export to create a fresh two-minute URL. If it still fails, verify the public TCP endpoint and remember that PDF export is not yet fully reliable in every environment.