Cualquier script de tu servidor puede enviar una alerta al dispatch: un robo a una tienda, una venta de drogas, una alarma de banco, una solicitud de grúa. Hay dos formas de hacerlo — llamar a una de las 35 alertas listas para usar con un solo export, o crear tu propia llamada con el evento qs-dispatch:server:CreateDispatchCall.
Alertas listas para usar#
Cada alerta es un export de cliente sin argumentos. Envía una llamada a la policía en la posición actual del jugador, con el código, el mensaje, el blip y el icono correctos. Llámala desde el cliente del jugador que comete el delito:
-- client side, in your robbery script
exports['qs-dispatch']:StoreRobbery()Export | Código | Alerta |
|---|---|---|
| 10-13 | Hunting |
| 10-15 | Vending Drugs |
| 10-16 | Vehicle Shooting |
| 10-17 | Shooting |
| 10-18 | Officer Down |
| 10-20 | Speeding Vehicle |
| 10-21 | Fight |
| 10-22 | Injured Person |
| 10-23 | Deceased Person |
| 10-24 | Store Robbery |
| 10-25 | Fleeca Bank Robbery |
| 10-26 | Paleto Bank Robbery |
| 10-27 | Pacific Bank Robbery |
| 10-28 | Prison Break |
| 10-29 | Vangelico Robbery |
| 10-30 | House Robbery |
| 10-31 | Drug Sale |
| 10-32 | Art Gallery Robbery |
| 10-33 | Humane Labs Robbery |
| 10-34 | Train Robbery |
| 10-35 | Van Robbery |
| 10-36 | Underground Robbery |
| 10-37 | Drug Boat Robbery |
| 10-38 | Union Depository Robbery |
| 10-39 | Yacht Heist |
| 10-40 | Car Boosting |
| 10-41 | Car Jacking |
| 10-42 | Vehicle Theft |
| 10-43 | Suspicious Activity |
| 10-44 | Illegal Racing |
| 10-45 | Kidnapping |
| 10-46 | Cyber Attack |
| 10-47 | Illegal Fishing |
| 10-48 | Arms Deal |
| 10-49 | Sign Robbery |
Todas están escritas en client/custom/exports/exports_1.lua, que puedes editar: cambia un mensaje, envíala también al sheriff o copia una para crear un export propio.
Enviar tu propia llamada#
Para todo lo que no esté en la lista, dispara el evento de servidor qs-dispatch:server:CreateDispatchCall con una tabla que describa la llamada. Lo habitual es hacerlo en el cliente: lee la posición y el vehículo del jugador con GetPlayerInfo, opcionalmente toma una foto con getSSURL y luego envía la llamada.
local playerData = exports['qs-dispatch']:GetPlayerInfo()
exports['qs-dispatch']:getSSURL(function(image)
TriggerServerEvent('qs-dispatch:server:CreateDispatchCall', {
job = { 'police', 'sheriff' },
callLocation = playerData.coords,
callCode = { code = '10-90', snippet = 'ATM Robbery' },
message = 'A ' .. playerData.sex .. ' is breaking into an ATM on ' .. playerData.street_1,
flashes = true,
image = image,
blip = {
sprite = 108,
scale = 1.2,
colour = 1,
flashes = true,
text = 'ATM Robbery',
time = (5 * 60 * 1000), -- 5 minutes
},
otherData = {
{ text = 'Armed suspect', icon = 'fas fa-gun' },
}
})
end)local playerData = exports['qs-dispatch']:GetPlayerInfo()
TriggerServerEvent('qs-dispatch:server:CreateDispatchCall', {
job = 'mechanic',
callLocation = playerData.coords,
callCode = { code = 'Tow', snippet = 'Breakdown' },
message = 'A ' .. playerData.vehicle_label .. ' (' .. playerData.vehicle_plate .. ') has broken down',
flashes = false,
blip = {
sprite = 68,
scale = 1.0,
colour = 5,
flashes = false,
text = 'Tow request',
time = (3 * 60 * 1000),
}
})Desde un script de servidor, usa TriggerEvent. Los exports de servidor leen los datos del jugador desde su cliente, así que llámalos dentro de un thread:
CreateThread(function()
exports['qs-dispatch']:GetPlayerInfo(source, function(playerData)
TriggerEvent('qs-dispatch:server:CreateDispatchCall', {
job = { 'police' },
callLocation = playerData.coords,
callCode = { code = '10-31', snippet = 'Alarm' },
message = 'Silent alarm triggered at the warehouse',
flashes = true,
blip = {
sprite = 161, scale = 1.5, colour = 1, flashes = true,
text = 'Silent alarm', time = (2 * 60 * 1000),
}
})
end)
end)Los campos de la llamada#
Campo | Tipo | Descripción |
|---|---|---|
| string o tabla | Obligatorio. Quién la recibe: |
| vector3 | Obligatorio. Dónde ocurrió. Debe ser un |
| tabla |
|
| string | La descripción que leen los agentes. |
| boolean | Resalta la tarjeta de la llamada como urgente. |
| string o nil | Una URL de imagen que se muestra en la llamada — normalmente el resultado de |
| tabla | El blip del mapa — ver abajo. Omítelo para una llamada sin blip. |
| tabla | Líneas extra en la tarjeta, cada una |
El blip#
Campo | Descripción |
|---|---|
| El id del icono del blip de la lista de blips de FiveM. |
| Su tamaño — 1.0 es el normal. |
| El id del color del blip (1 es rojo). |
| Hace que el blip parpadee. |
| El nombre que se muestra en la leyenda del mapa. |
| Cuánto tiempo permanece, en milisegundos. Se desvanece gradualmente durante ese tiempo. |
Qué devuelve GetPlayerInfo#
exports['qs-dispatch']:GetPlayerInfo() describe al jugador que lo llama, listo para incluir en un mensaje:
Campo | Contiene |
|---|---|
| La posición del jugador, como vector3. |
| El nombre de la calle y el nombre de la zona de |
| "Male" o "Female" según el idioma activo, o "person" cuando no se puede saber. |
| La entidad del vehículo, o nil si va a pie. |
| El nombre del modelo, el color y la matrícula — o |
| La velocidad del vehículo en km/h. |
| El número de puertas. |
| El ped del jugador y el network id del vehículo (0 a pie). |
Las fotos necesitan un webhook.
getSSURLdevuelvenilcuandoConfig.AllowImagesestá desactivado oConfig.DiscordWebHookestá vacío — la llamada se envía igualmente, solo que sin imagen.
Reaccionar a cada llamada#
Cada llamada creada — por un comando, un export, el DLC o tu propio script — pasa por OnCallEvent en server/custom/events/onCallEvent.lua. Ya publica las llamadas de policía y EMS en Discord; añade ahí cualquier otra cosa — una notificación del teléfono, un log, un contador.
function OnCallEvent(job, callLocation, callCode, message, flashes, image, callId)
if Contains(job, 'police') then
-- your code: SMS to every officer, a log, ...
end
end


