Comandos#
Los comandos de agente solo funcionan para los trabajos listados en Admin → Dispatch → Jobs, y la mayoría solo de servicio. Los nombres de comando marcados como configurables se cambian en el archivo indicado.
Comando | Quién | Descripción |
|---|---|---|
| Trabajos de policía | Abre o cierra la tablet del MDT (también el ítem |
| Admins | Abre el panel de administración. Cualquier otro ve sus identificadores con líneas |
| Admins | Teletransporta por cada punto de comisaría configurado. |
| De servicio | El menú rápido (por defecto |
| De servicio | Te asigna a ti mismo — o, como operador de dispatch, a otra unidad — a una llamada. |
| Unidades en la llamada | Añade una nota a la llamada. |
| Cualquiera | Crea una llamada de prioridad 1 para la policía y el sheriff en tu posición, con una captura. |
| Cualquiera | Llamadas de ciudadanos a los servicios de emergencia. Configurable en |
| Agentes | Unirse a un indicativo o salir de él. |
| Agentes | Elige tu blip en el mapa u ocúltalo. |
| De servicio | Un mensaje de radio del departamento, también publicado en el chat del juego. |
| Agentes | Permite o impide que otros agentes vean tu bodycam. |
| Agentes K9, de servicio | Despliega o guarda a tu perro. Se renombra en Admin → K9 Unit. |
| Los trabajos del objeto | Coloca un cono, una barrera, un radar de velocidad, una banda de clavos o una luz — p. ej. |
| Quien tenga un | Repara la cámara rota a menos de 5 m. Configurable en |
| Admins | Repara la cámara rota más cercana, o todas. |
| Permiso de esposas | Mete al sospechoso esposado en el vehículo más cercano, o lo saca de él. |
| Jugadores abatidos | Llamada de socorro Officer Down / Citizen Down (qs-police-alerts, tecla |
| Trabajos de pruebas, de servicio | Muestras de ADN y limpieza de escenas (qs-police-evidence). Consulta Recursos complementarios. |
| Consola del servidor | Qué adaptador de banca y qué cuenta usa un trabajo, su saldo y — con una cantidad — un depósito de prueba real. |
Teclas#
Cada jugador puede reasignar cualquier tecla en Settings → Key Bindings → FiveM. Los valores predeterminados del servidor están en config/shared/keys_commands.lua (las teclas del radar en config/shared/rpol.lua).
Tecla | Acción |
|---|---|
| Pulsar para hablar por radio. En un vehículo con barra de luces, la misma tecla también hace sonar la bocina de aire — reasigna una de las dos si tus agentes lo prefieren. |
| Menú rápido. |
| Llamada anterior / siguiente en el widget. |
| Responder a la llamada seleccionada. |
| Widget pequeño / completo. |
| Esposar · escoltar. |
| K9 seguir · K9 dentro/fuera del vehículo (solo con el perro desplegado). |
| Mostrar el radar de velocidad · reiniciar su bloqueo rápido. |
| Grupos de luces · sirena · tono de sirena (qs-police-veh-creator). |
Los agentes también pueden crear sus propias teclas de radio desde la página de radio — cada una aparece en las asignaciones de teclas de FiveM como "Radio Keybind: <name>".
Enviar una llamada de dispatch#
El export que necesita cualquier script de robos, atracos o alarmas. Funciona desde el cliente — la forma fácil, cuando hay un jugador allí mismo — o desde el servidor.
-- CLIENT: a player is robbing a store
local info = exports['qs-police-creator']:GetPlayerInfo() -- coords, sex, street, vehicle, plate…
local result = exports['qs-police-creator']:CreateDispatchCall({
title = 'Store Robbery', -- required
description = ('A %s is robbing the store on %s'):format(info.sex, info.street_1), -- required
location = { coords = { x = info.coords.x, y = info.coords.y, z = info.coords.z } }, -- required
jobNames = { 'police', 'sheriff' }, -- required
caller = { name = true, phone = true }, -- optional: filled in from the player; leave out for anonymous
priority = 1, -- optional: 1 = most urgent
blip = { sprite = 60, color = 1, scale = 1.0, label = 'Store Robbery' }, -- optional
image = exports['qs-police-creator']:GetScreenshotUrl(), -- optional: needs an image host
})
if result and result.success then
-- the call is on every officer's MDT
end-- SERVER: a silent alarm
local result = exports['qs-police-creator']:CreateDispatchCall({
title = 'Silent Alarm',
description = 'A bank alarm was triggered',
location = { coords = { x = 150.0, y = -1040.0, z = 29.4 } },
jobNames = { 'police' },
priority = 1,
blip = { sprite = 60, color = 5, scale = 1.0, label = 'Silent Alarm' },
}, source) -- optional: the player the call is aboutDevuelve { success = true, data = call }, o { success = false, message = … } cuando falta un campo obligatorio. GetScreenshotUrl devuelve nil cuando no hay ningún host de imágenes configurado — en ese caso, omite image.
Exports de cliente#
Se llaman desde un script de cliente como exports['qs-police-creator']:Name(...).
Tablet y servicio
exports['qs-police-creator']:IsTabletOpen() -- true / false
exports['qs-police-creator']:SetDutyStatus(true) -- put the local officer on (true) or off (false) duty
-- React when the tablet opens or closes
AddEventHandler('qs-police-creator:client:tabletToggled', function(isOpen)
print('MDT ' .. (isOpen and 'opened' or 'closed'))
end)Información del jugador, del vehículo y de capturas
local info = exports['qs-police-creator']:GetPlayerInfo()
-- info.coords, info.street_1, info.street_2, info.sex,
-- info.vehicle, info.vehicle_label, info.vehicle_colour, info.vehicle_plate,
-- info.speed, info.doorCount
exports['qs-police-creator']:GetVehicleLabel(vehicle) -- display name
exports['qs-police-creator']:GetVehicleColour(vehicle) -- primary colour name
exports['qs-police-creator']:GetScreenshotUrl() -- uploads a screenshot, returns its URL or nil
exports['qs-police-creator']:GetRadarTargetInfo() -- { plate, speed, units, dir, antenna, model } or nilEsposas
Bloquea tus propias acciones — un teléfono, un inventario, un emote — mientras el jugador está esposado:
exports['qs-police-creator']:IsHandcuffed() -- true / false
exports['qs-police-creator']:IsEscorted() -- being escorted
exports['qs-police-creator']:IsEscorting() -- escorting someone
exports['qs-police-creator']:GetHandcuffState() -- { isHandcuffed, isEscorted, isEscorting, escorter, escortTarget, escapeAttempts }
exports['qs-police-creator']:RemoveHandcuffs() -- uncuff the local player
if exports['qs-police-creator']:IsHandcuffed() then return endComisarías y la interfaz
exports['qs-police-creator']:GetShops() -- configured equipment shops
exports['qs-police-creator']:GetStashes() -- configured item storage
exports['qs-police-creator']:GetBillingLocations() -- fine payment points
exports['qs-police-creator']:GetCurrentTheme() -- the officer's MDT theme name
exports['qs-police-creator']:SetRadioAnimationIndex(2) -- pick the radio talking animationExports de servidor#
Se llaman desde un script de servidor. playerId es el id de servidor del jugador.
Trabajo del jugador
Se lee directamente de tu framework (QBCore, Qbox o ESX):
exports['qs-police-creator']:GetJobName(playerId) -- 'police'
exports['qs-police-creator']:GetJobGrade(playerId) -- 3
exports['qs-police-creator']:GetPlayerIdentifier(playerId) -- citizenid (QB/Qbox) or identifier (ESX)Dinero de sociedad
La cuenta bancaria del departamento, a través del script de banca que se detecte:
exports['qs-police-creator']:DepositToSociety('police', 500, 'Towing fee') -- true if it landed
exports['qs-police-creator']:WithdrawFromSociety('police', 500, 'New radios') -- false if the account cannot cover it
exports['qs-police-creator']:GetSocietyBalance('police') -- a number, or nilEsposas
exports['qs-police-creator']:IsPlayerHandcuffed(playerId) -- true / false
exports['qs-police-creator']:IsPlayerEscorted(playerId) -- true / false
exports['qs-police-creator']:GetPlayerHandcuffState(playerId) -- { isHandcuffed, isEscorted, escortedBy }Logs
Escribe en los Action Logs — y en el webhook de Discord de la categoría si hay uno configurado:
exports['qs-police-creator']:CreateLog('system', 'evidence_sold', { item = 'filled_evidence_bag', price = 200 }, source)Tiendas, almacenes y puntos de multas
exports['qs-police-creator']:GetShops()
exports['qs-police-creator']:GetStashes()
exports['qs-police-creator']:GetBillingLocations()
-- Add / Set / Delete variants exist for each: AddShop(shop), SetShop(shop), DeleteShop(id), …Capturas
-- Screenshot a player and upload it to the configured host
exports['qs-police-creator']:GetScreenshotUrl(playerId, function(url)
print(url) -- nil when no image host is set
end)Eventos#
Cada multa puesta desde el MDT, por cualquier departamento, lanza un evento de servidor una vez guardada — úsalo para enviar un mensaje al teléfono, un correo o una factura propia:
AddEventHandler('qs-police-creator:server:penaltyCreated', function(penalty)
-- penalty.id row id
-- penalty.identifier the fined citizen
-- penalty.target their server id if online, otherwise nil
-- penalty.job / jobLabel the department that wrote it
-- penalty.totalFine amount
-- penalty.totalMonths sentence months
-- penalty.charges { type, id, title | description, fine_amount, sentence_months }
-- penalty.appliedBy officer name, penalty.appliedBySource their server id
-- penalty.appliedAt unix time
-- penalty.paid true when the total is 0
end)¿Envías tu propio aviso? Desactiva el integrado con Config.Penalties.NotifyOnCreate = false en config/server/penalties.lua.
Evento | Lado | Cuándo |
|---|---|---|
| Cliente | El MDT se abre o se cierra ( |
| Cliente | El agente entra o sale de servicio ( |
| Cliente | Cambia el trabajo o el rango del jugador ( |
| Servidor | Se guarda una multa (arriba). |
| Servidor | Se incauta un vehículo ( |
State bags: Player(id).state.bodycamEnabled indica si se puede ver la bodycam de un agente, y los vehículos de la flota llevan Entity(vehicle).state.qsFleet (matrícula y garaje) — compruébalo en tu propio script de garaje o de desguace para no tocar las unidades policiales.
Eventos de pruebas#
Desde el cliente del jugador que deja el rastro, en tus propios scripts de robos o heridas:
TriggerServerEvent('qs-police-evidence:server:CreateFingerPrintDrop') -- a fingerprint where the player stands
TriggerServerEvent('qs-police-evidence:server:CreateBloodDrop') -- a blood drop with the player's DNA


