Browse docs

Emergency Dispatch

Set up Dispatch Enhanced v2, operate field units and control centers, and export incident reports.

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.

WorkspaceDesigned forMain tasks
Field-unit DispatchOn-duty respondersStaff a unit, join radio, accept assignments, update FMS, and set waypoints
Dispatch centerAuthorized dispatchersTake calls, create incidents, alarm units, coordinate radio, and close incidents
This page covers the built-in 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:

server.cfg
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:

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:

sky_jobs_base/config/config.lua
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:

  1. Enable Dispatch and, if required, Show in Emergency App.
  2. Create at least one radio channel and select the job's default channel.
  3. Create FMS status codes and mark at least one status as available for dispatch.
  4. Create response unit types and enough virtual fleet entries for the expected crews.
  5. Add incident keywords and response plans using matching TYPE:COUNT requirements.
  6. Add useful POIs and known reporters.
  7. Grant Dispatch center only to grades that should work as dispatchers.
  8. Save the job and restart sky_jobs_base after 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:

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

  1. Go on duty and open Dispatch in the Jobs Base tablet.
  2. Staff a free virtual unit and verify the crew list.
  3. Select an available FMS status and join the required radio channel.
  4. Accept the assigned incident, set its waypoint, and update FMS while responding.
  5. Leave the unit when the crew ends its shift.

Dispatcher

  1. Open Dispatch, choose Open Dispatcher, select a center and roles, then start the shift.
  2. Accept an incoming call or create an incident directly.
  3. Classify the incident, confirm location and priority, then link the call when applicable.
  4. Open Resources, use Suggest units, or select matching units manually.
  5. Alarm the units and coordinate radio, SDS, warnings, and connected centers as needed.
  6. Add situation updates, verify the incident log, and close the incident when operations finish.
  7. 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.

PDF export is still being expanded and is currently not 100% reliable in every FiveM client, server, or network setup. Keep the incident open until the browser has successfully displayed the file. Future updates will improve reliability and add further export capabilities.

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:

server.lua
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