DRS Speed Camera
Radares de velocidade fixos e móveis: quem passa acima do limite leva uma multa automática, com flash no ecrã. O dinheiro vai para a conta da polícia, a multa fica no perfil do cidadão no MDT e, nos excessos mais graves, a polícia recebe um alerta com a matrícula. Funciona com Qbox, QBCore e ESX.
#Requisitos
| Recurso | Obrigatório |
|---|---|
oxmysql | Sim |
| Qbox, QBCore ou ESX | Sim (deteção automática) |
drs_dispatch | Não — alertas de excesso grave |
drs_mdt | Não — multas no perfil do cidadão |
#Instalação
- Coloca
drs_speedcamemresources. - Adiciona ao
server.cfg, depois dooxmysqle da framework:
ensure oxmysql
ensure qb-core
ensure drs_speedcam- As tabelas são criadas sozinhas no arranque. As multas vão para
drs_pd_fines(a mesma dodrs_policejobe dodrs_mdt) e o registo completo fica emdrs_speedcam_log. - Ajusta os radares em
Config.Camerase os escalões emConfig.Brackets.
#Como funciona
- O carro passa dentro do raio de um radar acima do limite +
Config.Tolerance. - O servidor confirma o condutor, a distância ao radar e as isenções.
- O condutor vê um flash branco, ouve o som da câmara e recebe a multa do escalão certo.
- O dinheiro sai da conta
Config.Accounte vai para a conta da polícia (Config.Society, na proporçãoSocietyShare). - Se o excesso passar um escalão com
alert = true, a polícia recebe um alerta nodrs_dispatchcom a matrícula.
Cada radar só multa o mesmo condutor uma vez por minuto.
#Radares fixos
Vêm 8 radares nas autoestradas do mapa base. Cada um tem posição, raio de deteção e limite:
Config.Cameras = {
{ label = 'Autoestrada — Davis', coords = vector3(-524.26, -1776.36, 21.34), radius = 25.0, limit = 90 },
{ label = 'Vinewood', coords = vector3(980.99, 407.42, 92.24), radius = 20.0, limit = 80 },
}Dica
Para acrescentar um radar, vai ao sítio no jogo, copia as coordenadas (ex.: com um script de coords) e junta uma linha. Um raio de 20–25 metros apanha bem uma estrada de duas faixas.
Os radares fixos aparecem no mapa (Config.Blips.Enabled).
#Escalões de multa
over = quanto acima do limite, fine = valor, alert = true = avisa a polícia. A tolerância só decide se há multa: até limite + Config.Tolerance não acontece nada.
Config.Brackets = {
{ over = 0, fine = 150 },
{ over = 20, fine = 400 },
{ over = 40, fine = 900 },
{ over = 60, fine = 2000, alert = true },
}Exemplo: num radar de 120 com tolerância 5, quem passa a 124 não é multado; quem passa a 150 vai 30 acima do limite → escalão over = 20 → multa de 400; quem passa a 185 vai 65 acima → multa de 2000 e alerta à polícia.
#Radar móvel
A polícia de serviço monta um tripé que funciona como um radar fixo durante Config.Mobile.Minutes minutos:
| Comando | O que faz |
|---|---|
/radarmovel 80 | Monta um radar à frente do agente, com limite 80 |
/radarmovel junto ao tripé | Recolhe o radar |
- Só para os empregos e cargos de
Config.Mobile.Jobs. - Opcionalmente precisa de um item (
Config.Mobile.Item). - Cada agente pode ter até
MaxPerOfficerradares montados. - Os radares móveis não aparecem no mapa.
#Isenções
- Empregos de
Config.ExemptJobs(polícia, INEM…), só quando estão de serviço. - Classes de veículo de
Config.ExemptClasses(18 = emergência).
#Opções principais
| Opção | Por defeito | Descrição |
|---|---|---|
Config.Locale | 'pt' | Idioma: pt ou en |
Config.Unit | 'kmh' | kmh ou mph |
Config.Tolerance | 5 | Margem antes de multar |
Config.Account | 'bank' | De onde sai o dinheiro |
Config.AllowDebt | true | Pode ficar com saldo negativo |
Config.Society | 'police' | Conta que recebe as multas (false = nenhuma) |
Config.Blips.Enabled | true | Radares fixos no mapa |
Config.Flash | true | Flash branco no ecrã |
Config.Mobile.Enabled | true | Radar móvel |
Config.Mobile.Minutes | 30 | Tempo até o radar móvel desmontar |
Config.Webhook | '' | Webhook do Discord |
#Configuração completa
Config = {}
-- Idioma / Language: 'pt' ou 'en'
Config.Locale = 'pt'
Config.Framework = 'auto'
Config.UseOxNotify = false
Config.StaffGroups = { 'god', 'admin', 'superadmin' }
Config.Debug = false
Config.Currency = '€'
Config.Unit = 'kmh' -- 'kmh' | 'mph'
Config.Tolerance = 5 -- margem antes de multar / margin before fining
-- ------------------------------------------------------------------ multas / fines
-- over = quanto acima do limite | fine = valor | alert = avisa a polícia (drs_dispatch)
-- over = how far above the limit | fine = amount | alert = warn the police (drs_dispatch)
Config.Brackets = {
{ over = 0, fine = 150 },
{ over = 20, fine = 400 },
{ over = 40, fine = 900 },
{ over = 60, fine = 2000, alert = true },
}
Config.Account = 'bank'
Config.AllowDebt = true -- fica negativo se não tiver saldo / may go negative
Config.Society = 'police' -- conta que recebe as multas (false = nenhuma) / society that gets the money
Config.SocietyShare = 1.0
-- Isentos / Exempt
Config.ExemptJobs = { police = true, sheriff = true, ambulance = true } -- só de serviço / only on duty
Config.ExemptClasses = { [18] = true } -- 18 = emergência / emergency
-- Mostrar os radares no mapa / Show cameras on the map
Config.Blips = { Enabled = true, sprite = 184, color = 1, scale = 0.6 }
-- Flash branco no ecrã / White screen flash
Config.Flash = true
-- ------------------------------------------------------------------ radares fixos / fixed cameras
-- radius = distância a que o radar apanha o carro / detection radius
Config.Cameras = {
{ label = 'Autoestrada — Davis', coords = vector3(-524.26, -1776.36, 21.34), radius = 25.0, limit = 90 },
{ label = 'Autoestrada — Mirror Park', coords = vector3(1584.93, -993.46, 59.39), radius = 25.0, limit = 120 },
{ label = 'Autoestrada — Tataviam', coords = vector3(2442.20, -134.60, 88.78), radius = 25.0, limit = 120 },
{ label = 'Senora Fwy — Sandy Shores', coords = vector3(2871.80, 3540.58, 53.09), radius = 25.0, limit = 120 },
{ label = 'Senora Fwy — Grapeseed', coords = vector3(2506.07, 4145.24, 38.11), radius = 25.0, limit = 120 },
{ label = 'Vinewood Hills', coords = vector3(1258.20, 789.42, 103.22), radius = 20.0, limit = 80 },
{ label = 'Vinewood', coords = vector3(980.99, 407.42, 92.24), radius = 20.0, limit = 80 },
{ label = 'Great Ocean Hwy — Chumash', coords = vector3(-2627.62, 2855.14, 16.69), radius = 25.0, limit = 100 },
}
-- ------------------------------------------------------------------ radar móvel / mobile camera
-- A polícia monta um radar portátil (tripé) que funciona como os fixos durante X minutos
-- Police set up a portable camera (tripod) that works like the fixed ones for X minutes
Config.Mobile = {
Enabled = true,
Command = 'radarmovel', -- /radarmovel [limite] — de novo perto dele para o recolher / again next to it to pick it up
Jobs = { police = 0, sheriff = 0 }, -- emprego = cargo mínimo / job = minimum grade
Item = false, -- ex.: 'speedcamera' (false = não precisa) / item needed (false = none)
Minutes = 30,
MaxPerOfficer = 1,
Radius = 30.0,
Model = 'prop_tripod_01', -- tripé / tripod
}
-- Webhook do Discord / Discord webhook
Config.Webhook = ''#Integrações (ficheiro aberto)
O server/editable.lua não é encriptado:
| Função | Para que serve |
|---|---|
Hooks.OnDuty | Saber se o condutor está de serviço (isenção) |
Hooks.Charge | Cobrar a multa ao jogador |
Hooks.SocietyAdd | Pôr o dinheiro na conta da polícia |
Hooks.RecordFine | Guardar a multa (por defeito em drs_pd_fines, para o MDT) |
Hooks.Alert | Alerta à polícia (por defeito no drs_dispatch) |
#Resolução de problemas
Não sou multado — confirma que és tu o condutor, que não estás num emprego isento de serviço nem num veículo de emergência, e que passaste acima de limite + tolerância. Cada radar só multa uma vez por minuto.
Multas a mais numa estrada paralela — reduz o radius desse radar.
O dinheiro não chega à polícia — confirma o nome da conta em Config.Society. Se usas outro sistema de contas, adapta o Hooks.SocietyAdd.
O /radarmovel não funciona — tens de ter o emprego e cargo de Config.Mobile.Jobs, estar de serviço e (se definido) ter o item de Config.Mobile.Item.