Inicio › Documentación › Solicitudes de robo · origen_ilegalv2

Solicitudes de robo · origen_ilegalv2

El módulo de solicitudes de robo permite a los miembros de una banda enviar una solicitud formal de robo al departamento de policía directamente desde el panel de banda. La policía la aprueba o la rechaza, y la banda puede ver el estado en tiempo real.

Este módulo es completamente independiente de origen_robberies. No inicia ni gestiona el robo en sí: solo se encarga del handshake de solicitud y aprobación entre la banda y la policía.

La pestaña Robbery Requests solo aparece en el panel de banda si origen_police está en marcha. Si el recurso está detenido o no está instalado, la pestaña se oculta automáticamente.


Configuración (config/robbery_request.lua)

luaconfig/robbery_request.lua
Config.RobberyRequest.Enabled              = true   -- enable/disable the entire module
Config.RobberyRequest.Permission           = 'request_robbery'
Config.RobberyRequest.Anonymous            = true
Config.RobberyRequest.PendingExpireMinutes = 15
Config.RobberyRequest.ApprovedExpireMinutes = 30
Clave Tipo Por defecto Descripción
Enabled boolean true Activa o desactiva todo el módulo. Aunque sea true, la pestaña se oculta si origen_police no está arrancado.
Permission string 'request_robbery' Permiso de rango necesario para enviar y cancelar solicitudes. Los líderes siempre lo tienen. Consulta Configuración.
Anonymous boolean true Si es true, el panel de policía muestra "Anonymous" en lugar del nombre real de la banda y del solicitante. El ID de la banda se sigue enviando internamente para la validación.
PendingExpireMinutes number 15 Minutos tras los cuales una solicitud pending caduca si la policía no responde. 0 = sin caducidad.
ApprovedExpireMinutes number 30 Minutos tras los cuales una solicitud approved caduca si la banda no inicia el robo. 0 = sin caducidad.

Lista de robos (Config.RobberyRequest.Requests)

Cada entrada de la lista representa un tipo de robo que se puede solicitar.

luaconfig/robbery_request.lua
Config.RobberyRequest.Requests = {
 
    {
        id                             = "small_robbery",
        label                          = "Small Robbery",
        image                          = "https://r2.fivemanage.com/.../small_rob.png",
        active                         = true,
        requiredCops                   = 1,
        minParticipants                = 1,
        maxParticipants                = 3,
        cooldownSeconds                = 900,
        rejectedRequestCooldownSeconds = 300,
    },
 
    {
        id                             = "medium_robbery",
        label                          = "Medium Robbery",
        image                          = "https://r2.fivemanage.com/.../med_rob.png",
        active                         = true,
        requiredCops                   = 4,
        minParticipants                = 2,
        maxParticipants                = 6,
        cooldownSeconds                = 1800,
        rejectedRequestCooldownSeconds = 600,
    },
 
    {
        id                             = "large_robbery",
        label                          = "Large Robbery",
        image                          = "https://r2.fivemanage.com/.../big_rob.png",
        active                         = true,
        requiredCops                   = 6,
        minParticipants                = 4,
        maxParticipants                = 6,
        cooldownSeconds                = 3600,
        rejectedRequestCooldownSeconds = 900,
    },
 
    -- add as many entries as needed
}
Campo Tipo Descripción
id string Identificador único y estable del robo. Se usa en los exports y en las comprobaciones de estado.
label string Nombre mostrado en el panel de banda.
image string URL de la imagen de la tarjeta. Déjalo en "" para usar un marcador de posición.
active boolean Si es false, la entrada se oculta del panel y no se puede solicitar.
requiredCops number Mínimo de agentes de servicio necesarios para solicitar este robo.
minParticipants number Mínimo de participantes que debe declarar la banda (inclusive). Debe ser >= 1.
maxParticipants number Máximo de participantes (inclusive). Debe ser >= minParticipants.
cooldownSeconds number Tiempo de espera (segundos) tras completar el robo antes de poder solicitar de nuevo ese mismo robo (usa origen_robberies). 0 = sin cooldown.
rejectedRequestCooldownSeconds number Tiempo (segundos) que la banda debe esperar antes de volver a solicitar este robo después de que la policía lo rechace. Solo bloquea este robo; los demás no se ven afectados. 0 = sin cooldown por rechazo (la banda puede volver a solicitarlo de inmediato tras marcar el rechazo como leído).

Reglas de validación


Estados de la solicitud

Estado Descripción
pending Enviada, a la espera de respuesta de la policía.
approved Aprobada por la policía. La banda dispone de ApprovedExpireMinutes para empezar.
rejected Rechazada por la policía. La banda debe confirmar el rechazo antes de volver a solicitar.
cancelled Cancelada por un miembro de la banda con el permiso request_robbery.
expired Caducó sin respuesta (pending) o sin iniciarse (approved).
started El robo ha comenzado (terminal; lo establece origen_police).

Transiciones permitidas

text
pending  → approved | rejected | cancelled | expired
approved → cancelled | started | expired
started  → (terminal)
rejected → (terminal — gang must acknowledge)
cancelled→ (terminal)
expired  → (terminal)

rejected no es terminal de inmediato en la caché de la banda. Sigue visible hasta que el miembro de la banda lo confirma (botón del panel), lo que borra la entrada y permite volver a solicitar.


Flujo del lado de la banda

  1. Un miembro con request_robbery abre el panel de banda y navega a Robbery Requests.
  2. Selecciona un robo, elige el número de participantes y lo envía.
  3. El servidor valida: cooldown, policías conectados, rango de participantes y que la banda no tenga ya una solicitud pending.
  4. Si es válida, la solicitud se reenvía a origen_police y se guarda en la caché como pending.
  5. Las actualizaciones de estado llegan en tiempo real: la NUI refleja los cambios sin que el jugador tenga que refrescar.
  6. Si se rechaza, el panel muestra el motivo del rechazo (indicado por la policía). El miembro debe pulsar el botón de descartar para borrarlo. Tras confirmarlo, un cooldown por robo (rejectedRequestCooldownSeconds) puede seguir bloqueando durante un tiempo que se vuelva a solicitar ese robo concreto; los demás robos no se ven afectados.
  7. Si se aprueba, la banda dispone del tiempo configurado para iniciar el robo.
  8. Si la banda quiere abortar, puede cancelar (en cualquier estado salvo started).

Modo anónimo

Cuando Config.RobberyRequest.Anonymous = true:

Para revelar la identidad de la banda a la policía, establece Anonymous = false.


Comprobar el estado de una solicitud desde scripts externos

Usa los exports del lado servidor documentados en Exports para condicionar tus scripts de robo a una solicitud aprobada válida:

lua
-- Gate: only allow starting the robbery if approved
local res = exports['origen_ilegalv2']:GetRobberyRequestStatus(source, 'paleto_bank')
if not res.ok or res.status ~= 'approved' then
    return -- block
end

Resolución de problemas

Síntoma Causa Solución
La pestaña no es visible en el panel de banda origen_police no está arrancado Arranca origen_police antes de origen_ilegalv2
Error «Police unavailable» al enviar origen_police se detuvo a mitad de sesión Reinicia origen_police; la caché se borra automáticamente
La banda se queda con una solicitud pending atascada La policía no respondió antes de que pasaran PendingExpireMinutes La solicitud caducará automáticamente; baja PendingExpireMinutes si hace falta
No se puede volver a solicitar tras un rechazo El rechazo no se ha confirmado, o rejectedRequestCooldownSeconds sigue activo Descarta primero la notificación de rechazo; si hay un cooldown configurado, espera a que expire (solo bloquea el mismo robo)
El cooldown sigue activo tras reiniciar El cooldown solo existe en memoria y se restablece al reiniciar el recurso Comportamiento esperado: no hay cooldown persistente entre reinicios