Início › Documentação › Pedidos de assalto · origen_ilegalv2

Pedidos de assalto · origen_ilegalv2

O módulo de pedidos de assalto permite que os membros de uma gangue enviem um pedido formal de assalto ao departamento de polícia diretamente a partir do painel da gangue. A polícia aprova-o ou rejeita-o, e a gangue pode ver o estado em tempo real.

Este módulo é completamente independente do origen_robberies. Não inicia nem gere o assalto em si: apenas trata do handshake de pedido e aprovação entre a gangue e a polícia.

O separador Robbery Requests só aparece no painel da gangue se o origen_police estiver a correr. Se o recurso estiver parado ou não estiver instalado, o separador é escondido automaticamente.


Configuração (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
Chave Tipo Por omissão Descrição
Enabled boolean true Ativa ou desativa todo o módulo. Mesmo com true, o separador esconde-se se o origen_police não estiver arrancado.
Permission string 'request_robbery' Permissão de cargo necessária para enviar e cancelar pedidos. Os líderes têm-na sempre. Consulta Configuração.
Anonymous boolean true Se for true, o painel da polícia mostra "Anonymous" em vez do nome real da gangue e do requerente. O ID da gangue continua a ser enviado internamente para validação.
PendingExpireMinutes number 15 Minutos após os quais um pedido pending expira se a polícia não responder. 0 = sem expiração.
ApprovedExpireMinutes number 30 Minutos após os quais um pedido approved expira se a gangue não iniciar o assalto. 0 = sem expiração.

Lista de assaltos (Config.RobberyRequest.Requests)

Cada entrada da lista representa um tipo de assalto que pode ser pedido.

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 Descrição
id string Identificador único e estável do assalto. Usado nos exports e nas verificações de estado.
label string Nome mostrado no painel da gangue.
image string URL da imagem do cartão. Deixa em "" para usar um marcador de posição.
active boolean Se for false, a entrada é escondida do painel e não pode ser pedida.
requiredCops number Mínimo de agentes em serviço necessários para pedir este assalto.
minParticipants number Mínimo de participantes que a gangue tem de declarar (inclusive). Tem de ser >= 1.
maxParticipants number Máximo de participantes (inclusive). Tem de ser >= minParticipants.
cooldownSeconds number Tempo de espera (segundos) após concluir o assalto até se poder pedir de novo esse mesmo assalto (usa origen_robberies). 0 = sem cooldown.
rejectedRequestCooldownSeconds number Tempo (segundos) que a gangue tem de esperar antes de voltar a pedir este assalto depois de a polícia o rejeitar. Bloqueia apenas este assalto; os restantes não são afetados. 0 = sem cooldown por rejeição (a gangue pode voltar a pedir de imediato depois de marcar a rejeição como lida).

Regras de validação


Estados do pedido

Estado Descrição
pending Enviado, à espera de resposta da polícia.
approved Aprovado pela polícia. A gangue tem ApprovedExpireMinutes para começar.
rejected Rejeitado pela polícia. A gangue tem de confirmar a rejeição antes de voltar a pedir.
cancelled Cancelado por um membro da gangue com a permissão request_robbery.
expired Expirou sem resposta (pending) ou sem ser iniciado (approved).
started O assalto começou (terminal; definido pelo origen_police).

Transições permitidas

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

rejected não é terminal de imediato na cache da gangue. Continua visível até o membro da gangue o confirmar (botão no painel), o que limpa a entrada e permite voltar a pedir.


Fluxo do lado da gangue

  1. Um membro com request_robbery abre o painel da gangue e navega até Robbery Requests.
  2. Seleciona um assalto, escolhe o número de participantes e envia.
  3. O servidor valida: cooldown, polícias online, intervalo de participantes e que a gangue ainda não tem um pedido pending.
  4. Se for válido, o pedido é reencaminhado para o origen_police e guardado em cache como pending.
  5. As atualizações de estado chegam em tempo real: a NUI reflete as alterações sem o jogador ter de atualizar.
  6. Se for rejeitado, o painel mostra o motivo da rejeição (indicado pela polícia). O membro tem de carregar no botão de dispensar para o limpar. Depois de confirmar, um cooldown por assalto (rejectedRequestCooldownSeconds) pode continuar a impedir durante algum tempo que se volte a pedir esse assalto em concreto; os outros assaltos não são afetados.
  7. Se for aprovado, a gangue tem o tempo configurado para iniciar o assalto.
  8. Se a gangue quiser desistir, pode cancelar (em qualquer estado exceto started).

Modo anónimo

Quando Config.RobberyRequest.Anonymous = true:

Para revelar a identidade da gangue à polícia, define Anonymous = false.


Verificar o estado de um pedido a partir de scripts externos

Usa os exports do lado do servidor documentados em Exports para condicionar os teus scripts de assalto a um pedido aprovado válido:

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

Resolução de problemas

Sintoma Causa Solução
O separador não está visível no painel da gangue O origen_police não está arrancado Arranca o origen_police antes do origen_ilegalv2
Erro «Police unavailable» ao enviar O origen_police parou a meio da sessão Reinicia o origen_police; a cache é limpa automaticamente
A gangue fica com um pedido pending preso A polícia não respondeu antes de passarem PendingExpireMinutes O pedido expirará automaticamente; baixa PendingExpireMinutes se for necessário
Não é possível voltar a pedir após uma rejeição A rejeição não foi confirmada, ou rejectedRequestCooldownSeconds ainda está ativo Dispensa primeiro a notificação de rejeição; se houver um cooldown configurado, espera que expire (só bloqueia o mesmo assalto)
O cooldown continua ativo após reiniciar O cooldown só existe em memória e repõe-se ao reiniciar o recurso Comportamento esperado: não há cooldown persistente entre reinícios