DRS Bodycam
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
| Recurso | Obrigatório |
|---|---|
| Qbox, QBCore ou ESX | Sim (deteção automática) |
| OneSync | Sim (vem ligado por defeito) |
Inventário com o item bodycam | Não — com Config.Item = false usa-se só o comando |
drs_policejob | Não — indicativo no overlay e bodycam grátis no armeiro |
#Instalação
- Coloca
drs_bodycamemresources. - Adiciona ao
server.cfg, depois da framework e do inventário:
ensure qb-core
ensure drs_bodycam- Cria o item
bodycam(ver abaixo) e copiainstall/images/bodycam.pngpara o teu inventário — ou põeConfig.Item = falsepara usar só o comando. - Ajusta os empregos, os monitores e o efeito de imagem no
config.lua.
#Item
QBCore — dentro de qb-core/shared/items.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):
-- 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:
-- 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
bodycamou escreve/bodycampara 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.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 },
}| Tecla | O que faz |
|---|---|
| E | Abre a lista de câmaras ligadas (bodycams e dashcams) |
| Ver | Abre a câmara escolhida |
| ← / → | Muda de câmara |
| Backspace | Sai |
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ção | Por defeito | Descrição |
|---|---|---|
Config.Locale | 'pt' | Idioma: pt ou en |
Config.Jobs | PSP, GNR, INEM | Empregos, nome do departamento e cor |
Config.RequireDuty | true | Só de serviço |
Config.Item | 'bodycam' | Item (false = só comando) |
Config.Command | 'bodycam' | Comando (false = só item) |
Config.AutoOnDuty | true | Liga sozinha ao entrar de serviço |
Config.Dashcam.enabled | true | Dashcams nas viaturas de emergência |
Config.MonitorDistance | 1.8 | Distâ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 = {}
-- 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
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 nilOs 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).