DRS Bodycam

v1.9.5 drs_bodycam
Ver na loja

Bodycams e dashcams para a polícia e o INEM. Quem tem a bodycam ligada vê um overlay com REC, nome, indicativo, departamento, número da unidade, data e hora. As viaturas de emergência com um agente ao volante passam a ser dashcams. No monitor da esquadra vê-se ao vivo qualquer câmara ligada. O servidor confirma tudo e acaba a transmissão sozinho quando a câmara desliga. Funciona com Qbox, QBCore e ESX.

#Requisitos

RecursoObrigatório
Qbox, QBCore ou ESXSim (deteção automática)
OneSyncSim (vem ligado por defeito)
Inventário com o item bodycamNão — com Config.Item = false usa-se só o comando
drs_policejobNão — indicativo no overlay e bodycam grátis no armeiro

#Instalação

  1. Coloca drs_bodycam em resources.
  2. Adiciona ao server.cfg, depois da framework e do inventário:
server.cfg
ensure qb-core
ensure drs_bodycam
  1. Cria o item bodycam (ver abaixo) e copia install/images/bodycam.png para o teu inventário — ou põe Config.Item = false para usar só o comando.
  2. Ajusta os empregos, os monitores e o efeito de imagem no config.lua.

#Item

QBCore — dentro de qb-core/shared/items.lua:

items_qb-core.lua
-- drs_bodycam: cola dentro de qb-core/shared/items.lua (Qbox: ox_inventory/data/items.lua, ver o outro ficheiro)
-- Imagens: copia install/images/*.png para qb-inventory/html/images/

    bodycam = { name = 'bodycam', label = 'Bodycam', weight = 300, type = 'item', image = 'bodycam.png', unique = false, useable = true, shouldClose = true, combinable = nil, description = 'Câmara corporal da polícia' },

ox_inventory / Qbox — dentro de ox_inventory/data/items.lua (o server.export liga e desliga a bodycam ao usar o item):

items_ox_inventory.lua
-- drs_bodycam: cola dentro de ox_inventory/data/items.lua
-- Imagens: copia install/images/*.png para ox_inventory/web/images/

    ['bodycam'] = { label = 'Bodycam', weight = 300, stack = true, close = true, description = 'Câmara corporal da polícia', client = { image = 'bodycam.png' }, server = { export = 'drs_bodycam.use' } },

ESX — importa na base de dados:

items_esx.sql
-- drs_bodycam: executa na base de dados (ESX com a tabela items)
INSERT IGNORE INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`) VALUES ('bodycam', 'Bodycam', 1, 0, 1);

#Bodycam

  • Usa o item bodycam ou escreve /bodycam para ligar e desligar.
  • Com Config.AutoOnDuty = true, liga-se sozinha ao entrar de serviço, se tiveres o item.
  • Enquanto está ligada, vês o overlay com REC, o teu nome, o indicativo, o departamento (Config.Jobs), o número da unidade, a data e a hora. Há um som ao ligar e desligar (Config.Sounds).
  • Se perderes o item ou saíres de serviço, a bodycam desliga-se.

#Dashcam

Com Config.Dashcam.enabled, qualquer viatura de emergência (classe 18, ou os modelos de Config.Dashcam.models) com um agente ao volante aparece no monitor como dashcam, com a matrícula. Não é preciso item.

#Monitor da esquadra

Os monitores estão em Config.Monitors. Cada um tem posição, os empregos que o podem usar e o cargo mínimo:

config.lua
Config.Monitors = {
    { coords = vector3(441.84, -978.72, 30.69), jobs = { 'police', 'sheriff' }, grade = 2 },
    { coords = vector3(311.25, -593.35, 43.28), jobs = { 'ambulance' }, grade = 2 },
}
TeclaO que faz
EAbre a lista de câmaras ligadas (bodycams e dashcams)
VerAbre a câmara escolhida
← / →Muda de câmara
BackspaceSai

Enquanto vês uma câmara, o teu boneco fica parado ao pé do monitor, com um efeito de imagem de câmara (Config.ViewEffect). Se te afastares mais de Config.MonitorDistance ou a câmara desligar, a transmissão acaba sozinha. Com Config.ShowOwnFeed = true vês a tua própria câmara — útil para testar sozinho.

#Opções principais

OpçãoPor defeitoDescrição
Config.Locale'pt'Idioma: pt ou en
Config.JobsPSP, GNR, INEMEmpregos, nome do departamento e cor
Config.RequireDutytrueSó de serviço
Config.Item'bodycam'Item (false = só comando)
Config.Command'bodycam'Comando (false = só item)
Config.AutoOnDutytrueLiga sozinha ao entrar de serviço
Config.Dashcam.enabledtrueDashcams nas viaturas de emergência
Config.MonitorDistance1.8Distância máxima ao monitor
Config.ViewEffect'scanline_cam_cheap'Efeito de imagem (timecycle)
Config.Webhook''Webhook do Discord (quem vê que câmara)

#Configuração completa

config.lua
Config = {}

-- Idioma / Language: 'pt' ou 'en'
Config.Locale = 'pt'

-- Framework: 'auto' deteta Qbox/QBCore/ESX (ou 'qbx' | 'qb' | 'esx')
Config.Framework = 'auto'
Config.UseOxNotify = false

-- Empregos que podem usar bodycam e ver o monitor / Jobs that can wear a bodycam and use the monitor
Config.Jobs = {
    police = { label = 'PSP', color = '#3b82f6' },
    sheriff = { label = 'GNR', color = '#16a34a' },
    ambulance = { label = 'INEM', color = '#ef4444' },
}
-- É preciso estar de serviço / Must be on duty
Config.RequireDuty = true

-- Item da bodycam (false = só com o comando) / Bodycam item (false = command only)
Config.Item = 'bodycam'
-- Comando para ligar/desligar (false = só com o item) / Command to toggle (false = item only)
Config.Command = 'bodycam'
-- Mostrar a própria câmara no monitor (útil para testar sozinho) / Show your own camera on the monitor (handy for solo testing)
Config.ShowOwnFeed = false
-- Liga sozinha ao entrar de serviço (se tiver o item) / Turns on by itself when going on duty (if the item is there)
Config.AutoOnDuty = true

-- Dashcam: viaturas de emergência com um agente lá dentro aparecem no monitor
-- Dashcam: emergency vehicles with an officer inside show up on the monitor
Config.Dashcam = {
    enabled = true,
    classes = { [18] = true },     -- 18 = emergência / emergency
    models = {},                   -- ou modelos / or models: { 'police', 'police2' }
}

-- Monitores (onde se vê as câmaras) / Monitors (where feeds are watched)
-- grade = cargo mínimo / minimum grade
Config.Monitors = {
    { coords = vector3(441.84, -978.72, 30.69), jobs = { 'police', 'sheriff' }, grade = 2 },
    { coords = vector3(311.25, -593.35, 43.28), jobs = { 'ambulance' }, grade = 2 },
}
Config.MonitorDistance = 1.8

-- Efeito de imagem ao ver uma câmara (timecycle) / Image effect while watching (timecycle)
Config.ViewEffect = 'scanline_cam_cheap'
Config.ViewEffectStrength = 1.0

-- Som de ligar/desligar / On/off beep
Config.Sounds = true

-- Webhook do Discord (quem vê que câmara) / Discord webhook (who watches which camera)
Config.Webhook = ''

#Para programadores

server
exports.drs_bodycam:IsBodycamOn(src)       -- true / false
exports.drs_bodycam:SetBodycam(src, true)  -- liga ou desliga (false se o jogador não tem um emprego válido)

Player(src).state.bodycam   -- { name, cs, dept, unit, job } ou nil
Player(src).state.dashcam   -- { net, plate, job } ou nil

Os state bags permitem a outros scripts saber quem está a gravar (ex.: mostrar um ícone no HUD).

#Segurança

O servidor confirma o emprego, o serviço, o item, o cargo e a distância ao monitor antes de mostrar qualquer câmara, e acaba a transmissão sozinho se a câmara desligar. Um cliente não consegue ver câmaras a que não tem acesso. Com um webhook, fica registado quem viu que câmara.

#Resolução de problemas

O /bodycam não liga — o teu emprego tem de estar em Config.Jobs, tens de estar de serviço e (se Config.Item estiver definido) ter o item.

O monitor não mostra nada — só aparecem câmaras ligadas de outros jogadores. Para testar sozinho, põe Config.ShowOwnFeed = true.

Não consigo usar o monitor — precisas de um emprego da lista jobs desse monitor e do cargo mínimo grade.

A imagem fica estranha — muda ou desliga o efeito em Config.ViewEffect (ou baixa ViewEffectStrength).