Configuração de police job em FiveM: graus, duty, armory e contagem de polícia
Como configurar um police job em um servidor FiveM: job e graus, toggle de duty, armory com shop e stash, algema e escolta, verificações de contagem de polícia, MDT e dispatch.
O sintoma: você adicionou um police job, mas ninguém consegue entrar em duty, a armory está aberta para todos, ou roubos dizem "sem polícia suficiente" enquanto três oficiais estão online.
Um police job que funciona é um punhado de pequenas peças que devem concordar com uma coisa: o nome do job e quem está em duty. Este artigo caminha por cada peça e onde geralmente quebra.
O job e seus graus
O job é uma linha de dados: um nome, um rótulo e uma lista de graus (cadet, officer, sergeant, chief). O número de grau é o que você verifica depois, então decida a ordem primeiro e mantenha-a. Como criar o job em cada framework é coberto em adding a job on ESX e adding a job on QBCore. Em QBox o job vive nos dados compartilhados qbx_core em vez de um arquivo qb-core.
Duas regras que salvam dor:
- Use um nome interno em todos os lugares, por exemplo
police. Cada script que diz "apenas polícia" compara contra essa string. - Dê ao grau do chefe a flag que seu framework usa para chefes, então menus de sociedade e gerenciamento funcionam.
O toggle de duty
Ser um policial e estar em duty não é a mesma coisa. Roubos, dispatch e vencimentos devem contar apenas oficiais em duty.
- QBCore e QBox mantêm um campo
ondutyno job, e um toggle o muda. Um job pode ser definido para começar em duty ou fora de duty por padrão. - ESX não tem campo de duty no job base. Muitas configurações usam um job de off-duty segundo, ou uma flag que seu recurso de polícia mantém, então verifique como o seu faz antes de escrever qualquer contagem.
Seja qual for o framework, o toggle deve rodar no servidor, e o servidor decide o valor. Um evento do cliente que diz "Estou em duty" sem verificação é um exploit.
A armory: shop ou stash
Não distribua armas de um evento do cliente. Use as próprias ferramentas de seu inventário. Com ox_inventory você pode restringir uma loja ou stash a um job e um grau mínimo, que é a armory mais limpa:
-- shop entry (in the ox_inventory shops data)
PoliceArmory = {
name = 'Police Armory',
groups = { police = 0 }, -- job name and minimum grade
inventory = {
{ name = 'radio', price = 0 },
{ name = 'handcuffs', price = 0 },
},
locations = { vec3(452.6, -980.0, 30.7) },
}Um stash funciona da mesma forma para evidence lockers e armazenamento compartilhado. Veja ox_inventory shops e ox_inventory stashes. Mantenha os nomes groups e a verificação de grau iguais ao nome do seu job, ou a armory permanecerá trancada para todos.
Algema e escolta
Algema é um conjunto de pequenas peças, não um recurso:
- O oficial toca uma animação e o servidor verifica se o alvo está próximo e o oficial tem o job.
- O alvo recebe um estado de algema, uma animação de algema e controles desabilitados (sem disparar, sem correr, sem entrar em veículos sozinhos).
- Escolta prende o alvo ao oficial, ou segue-o, até ser liberado.
Mantenha a flag de algema como um state bag para que cada cliente veja, e para que jogadores que apareçam depois vejam também. Verifique distância e job no servidor, da forma que securing your server events descreve. Lembre-se de limpar a flag quando o jogador for liberado, morrer ou partir.
Contagem de polícia para roubos
Roubos, heists e alguns drug jobs perguntam "quantos oficiais estão em duty". A resposta deve vir do servidor:
-- ESX (server)
local function policeOnline()
local count = 0
for _, xPlayer in pairs(ESX.GetExtendedPlayers('job', 'police')) do
count += 1
end
return count
end-- QBCore (server)
local function policeOnline()
local count = 0
for _, player in pairs(QBCore.Functions.GetQBPlayers()) do
local job = player.PlayerData.job
if job.name == 'police' and job.onduty then
count += 1
end
end
return count
endEm QBox, versões recentes qbx_core também enviam exports de contagem de duty, então verifique sua documentação antes de escrever seu próprio loop. Se você usar um par de job off-duty em ESX, conte apenas o nome em duty.
Sempre conte no servidor, e conte novamente quando o roubo começar, não apenas quando o jogador se aproximar. Veja robbery scripts para o fluxo completo.
MDT e dispatch são separados
O police job te dá um job e uma contagem. Estes geralmente são outros recursos:
- MDT: registros, mandados, cidadãos e busca de veículos.
- Dispatch: chamadas 911, blips de alerta, status do oficial.
- Evidência e depósito: frequentemente seus próprios scripts novamente.
Verifique a configuração de cada um para o nome do job. Um dispatch que nunca mostra alertas é quase sempre configurado para um nome de job diferente do que você criou.
Lista de verificação
| Sintoma | Solução |
|---|---|
| Armory aberta para todos | Adicione o nome do job e um grau mínimo aos groups da loja ou stash |
| Armory trancada para oficiais | O nome do job na armory não corresponde ao nome do job que você criou |
| Roubo diz sem polícia, oficiais online | Conte apenas oficiais em duty, com o nome exato do job, no servidor |
| Dispatch mostra sem alertas | Defina o nome do police job na configuração do dispatch |
| Jogador permanece algemiado após libertação | Limpe o estado de algema ao liberar, morte e desconexão |
| Qualquer um pode entrar em duty | Faça o toggle no servidor e verifique o job primeiro |
Respostas rápidas
Como conto os policiais online?
No servidor, percorra os jogadores conectados e conte os que possuem seu police job e que estão em duty. Faça no servidor, nunca no cliente, porque roubos e heists confiam nesse número.
Um police job inclui um MDT e dispatch?
Geralmente não. O job em si é apenas o job, graus, duty e uma armory. O MDT (registros, mandados) e o dispatch (chamadas, blips) são recursos separados que leem o job do jogador.
Onde dou armas para a polícia?
Coloque-as em uma armory: uma loja de inventário ou um stash restrito ao police job e a um grau mínimo. Não dê armas de um evento do cliente.

