# Add alerts

In this page you will learn how you can include new alerts, from simple command-based alerts like `/911` to complex custom alerts with advanced functionalities.

## Default Alert Commands

Go to `configs/cl_config.lua` and include your new command inside this table.

```lua
-- Priority 'low', 'medium' or 'high'
-- Car robbery, shop robbery and bank robbery can be found inside client/api/alert_handlers.lua
CL_CONFIG.AlertCommands = {
    {
        command = '911',
        job = { 'police' },
        code = '10-13',
        default_priority = 'medium',
        enabled = true,
        anonymous = false,
        --timeout = 10, --Optional timeout you can set in seconds
    },
    {
        command = 'anon911',
        job = { 'police' },
        code = '10-13',
        default_priority = 'medium',
        enabled = true,
        anonymous = true,
    },
    {
        command = 'sos',
        code = 'P2',
        job = { 'police', 'ambulance' },
        prepared_args = 'A officer is in need of assistance, please come as fast as possible.',
        default_priority = 'high',
        enabled = true,
        anonymous = true,
        blip_time = 5,
        -- job_restricted = 'police',  or { 'police', 'ambulance' } (optional)
        sos = true,
        blip = { -- Optional parameter to override the default blip
            sprite = 84,
            colour = 3,
            scale = 0.7,
            flashes = true,
            text = '10-13 - Officer in distress',
        }
    },
    {
        command = 'emergency',
        code = 'P2',
        job = { 'police', 'ambulance' },
        default_priority = 'high',
        enabled = true,
        anonymous = false,
    }
}
```

### Alert Command Parameters

* **command**: The command that will be used (e.g., '911', 'sos')
* **job**: The job(s) that will receive the alert (string or table)
* **code**: The alert code displayed in dispatch
* **default\_priority**: Alert priority ('low', 'medium', or 'high')
* **enabled**: Whether the command is enabled
* **anonymous**: If the character name should appear or not
* **timeout**: Optional timeout in seconds before alert expires
* **prepared\_args**: Pre-filled message for the alert
* **job\_restricted**: Optional restriction on who can use the command
* **sos**: Mark as an SOS alert for special handling
* **blip\_time**: Time in seconds until the blip fades
* **blip**: Optional blip configuration override

## Custom Alerts

For more advanced alerts that require player data, vehicle information, or custom logic, you can create custom alerts using the dispatch API.

## Client-Side API

### Getting Player Data

To create custom alerts with dynamic information, use the `GetPlayerData` export to retrieve comprehensive player information:

```lua
local data = exports['rcore_dispatch']:GetPlayerData()
```

This export returns different data depending on whether the player is in a vehicle or not.

#### Player Data (On Foot)

```lua
local data = exports['rcore_dispatch']:GetPlayerData()
-- Returns:
data.street_1    -- "Marina Drive" (Raw street name)
data.zone        -- "Sandy Shores" (Zone name)
data.street      -- "Marina Drive, Sandy Shores" (Combined street and zone)
data.coords      -- vector3(0,0,0) (Player coordinates)
data.sex         -- "male" or "female" (Player ped gender)
data.ped         -- 4354 (Ped ID)
```

#### Player Data (In Vehicle)

When the player is in a vehicle, additional vehicle data is included:

```lua
local data = exports['rcore_dispatch']:GetPlayerData()
-- All the above player data, plus:

-- Vehicle-specific data
data.vehicle_data.speed           -- "54 km/h" (Speed with unit)
data.vehicle_data.dispatch_color  -- "/#ff0000" (Color formatted for dispatch)
data.vehicle_data.color          -- "#ff0000" (HEX color value)
data.vehicle_data.model_form     -- "Zentorno" (Formatted vehicle name)
data.vehicle_data.vehicle_entity -- 4866 (Vehicle entity ID)
data.vehicle_data.model          -- -1403128555 (Vehicle model hash)
data.vehicle_data.model_string   -- "ZENTORNO" (Raw model string)
data.vehicle_data.heading        -- "West" (Cardinal direction)
data.vehicle_data.plate          -- "ABC123" (License plate)

-- Legacy compatibility fields
data.vehicle        -- 4866 (Vehicle entity)
data.vehicle_label  -- "Zentorno" (Formatted vehicle name)
data.vehicle_colour -- "/#ff0000" (Dispatch-formatted color)
data.speed          -- "54.00 km/h" (Formatted speed)
data.heading        -- "West" (Cardinal direction)
data.vehicle_plate  -- "ABC123" (License plate)
```

### Sending Custom Alerts (Client)

Use the `rcore_dispatch:server:sendAlert` event to send custom alerts from the client:

```lua
local playerData = exports['rcore_dispatch']:GetPlayerData()

local alertData = {
    code = '10-64',                    -- Alert code
    default_priority = 'medium',       -- 'low', 'medium', or 'high'
    coords = playerData.coords,        -- Alert location
    job = 'police',                    -- Job(s) to receive alert (string or table)
    text = 'Custom alert message',     -- Alert description
    type = 'alerts',                   -- Alert type for statistics
    blip_time = 5,                     -- Optional: Blip fade time (seconds)
    image = 'url_to_image.jpg',        -- Optional: Image URL
    custom_sound = 'url_to_sound.mp3', -- Optional: Custom sound URL
    blip = {                           -- Optional: Custom blip settings
        sprite = 54,
        colour = 3,
        scale = 0.7,
        text = 'Custom Alert',
        flashes = false,
        radius = 0,
    }
}

TriggerServerEvent('rcore_dispatch:server:sendAlert', alertData)
```

## Server-Side API

### Sending Alerts from Server

You can trigger alerts directly from server-side scripts using `TriggerEvent`:

```lua
function sendCustomAlert(source)
    local alertData = {
        code = '10-64',
        default_priority = 'high',
        coords = vector3(0, 0, 0),
        job = {'police', 'ambulance'},
        text = 'Server-generated alert',
        type = 'alerts',
        blip_time = 10,
        blip = {
            sprite = 54,
            colour = 1,
            scale = 0.8,
            text = 'Server Alert'
        }
    }

    TriggerEvent('rcore_dispatch:server:sendAlert', alertData)
end
```

### Getting Player Data from Server

For server-side scripts that need player data, you can use a callback system:

```lua

-- Usage example
exports['rcore_dispatch']:GetPlayerData(source, function(playerData)
    local alertData = {
        code = '10-64',
        default_priority = 'medium',
        coords = playerData.coords,
        job = 'police',
        text = string.format('Alert at %s involving %s', playerData.street, playerData.sex),
        type = 'alerts'
    }

    TriggerEvent('rcore_dispatch:server:sendAlert', alertData)
end)
```

### Alert Types for Statistics

The dispatch system tracks different alert types for statistics:

* `alerts` - General alerts
* `bank_robbery` - Bank robbery incidents
* `shop_robbery` - Store robbery incidents
* `car_robbery` - Vehicle theft incidents

## Complete Example: Car Theft Alert with Screenshot

Here's a comprehensive example that creates a car theft alert with a screenshot using the [screenshot-basic](https://github.com/citizenfx/screenshot-basic) resource. This example is configured to work with a Discord webhook for image hosting:

```lua
-- Client-side car theft alert with screenshot
function createCarTheftAlert()
    -- Get player data
    local playerData = exports['rcore_dispatch']:GetPlayerData()

    -- Check if player is in a vehicle
    if not playerData.vehicle_data then
        return
    end

    -- Build dynamic alert message
    local alertText = string.format(
        'Vehicle theft in progress! Suspect is stealing a %s painted %s. ' ..
        'Offender gender: %s, License plate: %s. Last seen at %s.',
        playerData.vehicle_data.model_form,
        playerData.vehicle_data.dispatch_color,
        playerData.sex,
        playerData.vehicle_data.plate,
        playerData.street
    )

    -- Take screenshot and send alert (using Discord webhook)
    exports['screenshot-basic']:requestScreenshotUpload(
        CL_CONFIG.CarRobberyPictureWebhook, -- Discord webhook URL configured in your config
        "files[]",
        function(response)
            local imageData = json.decode(response)

            local alertData = {
                code = '10-64 - Vehicle Theft',
                default_priority = 'high',
                coords = playerData.coords,
                job = 'police',
                text = alertText,
                type = 'car_robbery',
                blip_time = 8,
                image = imageData.attachments[1].proxy_url, -- Discord CDN URL from webhook response
                blip = {
                    sprite = 56,  -- Car icon
                    colour = 1,   -- Red
                    scale = 0.8,
                    text = 'Vehicle Theft',
                    flashes = true,
                    radius = 0
                }
            }

            TriggerServerEvent('rcore_dispatch:server:sendAlert', alertData)
        end
    )
end

RegisterCommand('reportcartheft', function()
    createCarTheftAlert()
end, false)
```

## API Reference

### Alert Data Structure

| Parameter          | Type         | Required | Description                             |
| ------------------ | ------------ | -------- | --------------------------------------- |
| `code`             | string       | Yes      | Alert code (e.g., "10-64", "10-13")     |
| `default_priority` | string       | Yes      | Priority level: "low", "medium", "high" |
| `coords`           | vector3      | Yes      | Alert coordinates                       |
| `job`              | string/table | Yes      | Job(s) to receive alert                 |
| `text`             | string       | Yes      | Alert message text                      |
| `type`             | string       | Yes      | Alert type for statistics               |
| `blip_time`        | number       | No       | Blip fade time in seconds               |
| `image`            | string       | No       | Image URL                               |
| `custom_sound`     | string       | No       | Custom sound URL                        |
| `blip`             | table        | No       | Custom blip configuration               |

### Blip Configuration

| Parameter | Type    | Description                                                                     |
| --------- | ------- | ------------------------------------------------------------------------------- |
| `sprite`  | number  | [Blip sprite ID](https://docs.fivem.net/docs/game-references/blips/#blips)      |
| `colour`  | number  | [Blip color ID](https://docs.fivem.net/docs/game-references/blips/#blip-colors) |
| `scale`   | number  | Blip size scale                                                                 |
| `text`    | string  | Blip label text                                                                 |
| `flashes` | boolean | Whether blip should flash                                                       |
| `radius`  | number  | Radius blip size (0 or nil = normal blip)                                       |

Examples of alert types and their implementations can be found in `client/api/alert_handlers.lua`.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://documentation.rcore.cz/paid-resources/rcore_dispatch/add-alerts.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
