DRS Radio
Rádio portátil para o pma-voice: visor LCD, teclado numérico, canal +/−, volume, cliques do microfone e memórias. Ao lado do rádio há um painel com o chat do canal, a lista de canais ativos e canais privados com palavra-passe. As frequências reservadas por emprego ou gang são protegidas no servidor e dentro do próprio pma-voice. Combina com o DRS Radio List. Funciona com Qbox, QBCore, ESX ou sem framework.
#Requisitos
| Recurso | Obrigatório |
|---|---|
pma-voice | Sim |
| Qbox, QBCore, ESX ou nenhum | Sim (deteção automática; 'none' funciona sem framework) |
Inventário com o item radio | Não — com Config.Item = nil não é preciso item |
ox_lib | Não — só para as notificações do ox |
drs_radiolist | Não — mostra quem está no canal e quem está a falar |
#Instalação
- Desliga o rádio antigo (ex.:
qb-radio): os dois registam o mesmo item. - Coloca
drs_radioemresources. - Adiciona ao
server.cfg, depois dopma-voicee da framework:
ensure pma-voice
ensure qb-core
ensure drs_radio
ensure drs_radiolist- O item
radiojá vem com o QBCore. Nos outros inventários, adiciona-o (ver abaixo). - Ajusta as frequências reservadas em
Config.Restricted.
#Item
QBCore — o item já existe; se não tiveres, junta a qb-core/shared/items.lua:
-- drs_radio: 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/
radio = { name = 'radio', label = 'Rádio', weight = 2000, type = 'item', image = 'radio.png', unique = false, useable = true, shouldClose = true, combinable = nil, description = 'Rádio portátil' },ox_inventory / Qbox — dentro de ox_inventory/data/items.lua. O server.export é obrigatório para o item abrir o rádio:
-- drs_radio: cola dentro de ox_inventory/data/items.lua
-- Imagens: copia install/images/*.png para ox_inventory/web/images/
['radio'] = { label = 'Rádio', weight = 2000, stack = true, close = true, description = 'Rádio portátil', client = { image = 'radio.png' }, server = { export = 'drs_radio.useRadio' } },ESX — importa na base de dados:
-- drs_radio: executa na base de dados (ESX com a tabela items)
INSERT IGNORE INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`) VALUES ('radio', 'Rádio', 2, 0, 1);#Como usar
- Usa o item
radioou escreve/radio(ou a tecla deConfig.OpenKey). - Escreve a frequência no teclado (ex.:
1.5) e carrega em Enter ou em Ligar. - ↑ e ↓ mudam de canal; + e − mudam o volume.
- Guardar e depois uma memória (M1–M4) guarda a frequência; um clique numa memória liga-te a ela.
- O botão redondo liga e desliga o rádio (volta à última frequência quando o voltas a ligar).
Para falar usa a tecla de rádio do pma-voice (por defeito Left Alt; cada jogador pode mudá-la em Definições → Atalhos → FiveM).
#Painel ao lado do rádio
| Separador | O que tem |
|---|---|
| Chat | Mensagens de texto para quem está na frequência. As últimas 50 ficam enquanto o canal tiver gente |
| Canais | Frequências ativas com o número de pessoas; um clique liga-te |
Canais privados: no separador Canais, escolhe uma frequência livre e uma palavra-passe. Quem quiser entrar tem de a saber, e o canal acaba quando fica vazio. A proteção é feita no servidor e no pma-voice.
Lanterna: o botão LANTERNA acende uma luz a partir do rádio na mão enquanto o menu está aberto (Config.Flashlight).
#Frequências reservadas
Cada número reserva a frequência e as decimais dela (1 = 1.0 a 1.9):
Config.Restricted = {
[1] = { label = 'Polícia', jobs = { 'police', 'sheriff' } },
[3] = { label = 'INEM', jobs = { 'ambulance' } },
[4] = { label = 'Emergência', jobs = { 'police', 'sheriff', 'ambulance' } },
[6] = { label = 'Ballas', gangs = { 'ballas' } }, -- gangs: QBCore/Qbox
[7] = { label = 'PSP serviço', jobs = { 'police' }, duty = true }, -- só de serviço
}jobs— empregos que podem entrar.gangs— gangs que podem entrar (QBCore/Qbox).duty = true— tem de estar de serviço.label— nome mostrado no visor.
Com Config.StaffBypass = true, o staff (ACE drs.radio ou grupo de Config.StaffGroups) entra em qualquer frequência. Com Config.ShowLockedChannels = false, os canais reservados a que não tens acesso não aparecem na lista.
#Outros comportamentos
- Frequências de 1 a
Config.MaxFrequencycom uma ou duas casas decimais (Config.Decimals, até 999.99). O DRS Radio List e alguns HUDs mostram só uma casa decimal. - Morte: com
Config.LeaveOnDeath = truesai da rádio ao morrer e, comRejoinOnRevive, volta sozinho ao canal depois de ser reanimado. - Sem item: com
Config.LeaveWithoutItem = true, quem fica sem o item sai da rádio. - Guardado entre sessões: volume, cliques do microfone e memórias (por jogador).
- Animação: rádio na mão enquanto o menu está aberto (
Config.Animation).
#Opções principais
| Opção | Por defeito | Descrição |
|---|---|---|
Config.Locale | 'pt' | Idioma: pt ou en |
Config.Item | 'radio' | Item necessário (nil = nenhum) |
Config.Command | 'radio' | Comando para abrir |
Config.OpenKey | '' | Tecla para abrir (vazio = nenhuma) |
Config.MaxFrequency | 999 | Frequência mais alta |
Config.Decimals | 1 | Casas decimais (1 ou 2) |
Config.Panel | true | Painel com chat e canais |
Config.PrivateChannels | true | Canais privados com palavra-passe |
Config.StaffBypass | true | Staff entra em qualquer frequência |
Config.LeaveOnDeath | false | Sai da rádio ao morrer |
Config.DefaultVolume | 60 | Volume inicial (0–100) |
Config.Presets | 4 | Número de memórias |
#Configuração completa
Config = {}
-- Idioma / Language: 'pt' ou 'en'
Config.Locale = 'pt'
-- Framework: 'auto' deteta Qbox/QBCore/ESX (ou 'qbx' | 'qb' | 'esx' | 'none')
Config.Framework = 'auto'
-- ------------------------------------------------------------------ abrir / opening
-- Item necessário (nil = não precisa de item). O item abre o rádio ao ser usado.
-- Required item (nil = no item needed). Using the item opens the radio.
Config.Item = 'radio'
Config.Command = 'radio' -- também abre o rádio / also opens the radio
Config.OpenKey = '' -- tecla (vazio = nenhuma) / key (empty = none)
-- ------------------------------------------------------------------ frequências / frequencies
Config.MaxFrequency = 999 -- 1 a 999 / 1 to 999
-- Casas decimais: 1 (ex.: 1.5) ou 2 (ex.: 1.55, até 999.99) / Decimals: 1 (e.g. 1.5) or 2 (e.g. 1.55, up to 999.99)
-- Nota: o DRS Radio List e alguns HUDs mostram só uma casa decimal / Note: DRS Radio List and some HUDs show one decimal
Config.Decimals = 1
-- Frequências reservadas. Vale para a frequência e para as decimais dela (1 = 1.0 a 1.9).
-- Reserved frequencies. Covers the frequency and its decimals (1 = 1.0 to 1.9).
-- jobs: empregos que podem entrar · gangs: gangs que podem entrar (QBCore/Qbox)
-- duty: tem de estar em serviço (QBCore/Qbox) · label: nome no visor
-- jobs: jobs allowed · gangs: gangs allowed (QBCore/Qbox) · duty: must be on duty · label: name on the screen
Config.Restricted = {
[1] = { label = 'Polícia', jobs = { 'police', 'sheriff' } },
[2] = { label = 'Polícia 2', jobs = { 'police', 'sheriff' } },
[3] = { label = 'INEM', jobs = { 'ambulance' } },
[4] = { label = 'Emergência', jobs = { 'police', 'sheriff', 'ambulance' } },
[5] = { label = 'Mecânicos', jobs = { 'mechanic' } },
-- [6] = { label = 'Ballas', gangs = { 'ballas' } },
}
-- ------------------------------------------------------------------ painel / panel
-- Painel ao lado do rádio com o chat do canal e a lista de canais ativos (quem está no canal: DRS Radio List)
-- Panel next to the radio with the channel chat and the active channel list (who is on it: DRS Radio List)
Config.Panel = true
Config.Chat = true -- chat de texto do canal / channel text chat
Config.PrivateChannels = true -- criar canais privados com palavra-passe / private password-protected channels
Config.ShowLockedChannels = false -- mostrar na lista os canais reservados a que não tens acesso / list reserved channels you can't join
Config.Flashlight = true -- botão de lanterna no rádio / flashlight button on the radio
-- O staff (ACE drs.radio ou grupo admin) entra em qualquer frequência / Staff can join any frequency
Config.StaffBypass = true
Config.StaffGroups = { 'god', 'admin', 'superadmin' }
-- ------------------------------------------------------------------ comportamento / behaviour
Config.LeaveOnDeath = false -- sair da rádio ao morrer / leave the radio on death
Config.RejoinOnRevive = true -- com LeaveOnDeath: voltar ao canal ao ser reanimado / rejoin after being revived
Config.LeaveWithoutItem = true -- sair da rádio se ficar sem o item / leave when the item is gone
Config.DefaultVolume = 60 -- 0-100
Config.Animation = true -- rádio na mão enquanto o menu está aberto / radio in hand while the menu is open
Config.Presets = 4 -- memórias rápidas (guardadas no jogador) / quick memories (saved per player)
-- Notificações com ox_lib quando estiver a correr / Use ox_lib notifications when it is running
Config.UseOxNotify = false#Para programadores
exports.drs_radio:GetFrequency(src) -- frequência atual (ou nil)
exports.drs_radio:SetFrequency(src, 1.5) -- muda a frequência (o vigia continua a aplicar as reservas)
exports.drs_radio:IsPrivate(1.5) -- é um canal privado?#Segurança
- Entrar numa frequência é sempre validado no servidor (item, frequência e emprego).
- As frequências reservadas também ficam trancadas dentro do pma-voice (
addChannelCheck). - Um vigia no servidor tira de lá quem entrar numa frequência reservada por outra via qualquer.
- Quem fica sem o item sai da rádio, e os pedidos têm limite de frequência.
#Resolução de problemas
Usar o item não abre o rádio (ox_inventory) — falta server = { export = 'drs_radio.useRadio' } no item.
Abre o rádio antigo — o qb-radio (ou outro) ainda está ligado. Desliga-o.
"Não tens acesso à frequência…" — é uma frequência reservada: confirma o emprego/gang e, se tiver duty = true, o serviço.
Ligo-me mas não ouço ninguém — confirma que o pma-voice está a correr e arranca antes do drs_radio, e que o volume não está a 0.