DRS Radio

v2.4.1 drs_radio
Ver na loja

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

RecursoObrigatório
pma-voiceSim
Qbox, QBCore, ESX ou nenhumSim (deteção automática; 'none' funciona sem framework)
Inventário com o item radioNão — com Config.Item = nil não é preciso item
ox_libNão — só para as notificações do ox
drs_radiolistNão — mostra quem está no canal e quem está a falar

#Instalação

  1. Desliga o rádio antigo (ex.: qb-radio): os dois registam o mesmo item.
  2. Coloca drs_radio em resources.
  3. Adiciona ao server.cfg, depois do pma-voice e da framework:
server.cfg
ensure pma-voice
ensure qb-core
ensure drs_radio
ensure drs_radiolist
  1. O item radio já vem com o QBCore. Nos outros inventários, adiciona-o (ver abaixo).
  2. 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:

items_qb-core.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:

items_ox_inventory.lua
-- 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:

items_esx.sql
-- 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

  1. Usa o item radio ou escreve /radio (ou a tecla de Config.OpenKey).
  2. Escreve a frequência no teclado (ex.: 1.5) e carrega em Enter ou em Ligar.
  3. ↑ e ↓ mudam de canal; + e − mudam o volume.
  4. Guardar e depois uma memória (M1–M4) guarda a frequência; um clique numa memória liga-te a ela.
  5. 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

SeparadorO que tem
ChatMensagens de texto para quem está na frequência. As últimas 50 ficam enquanto o canal tiver gente
CanaisFrequê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.lua
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.MaxFrequency com 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 = true sai da rádio ao morrer e, com RejoinOnRevive, 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çãoPor defeitoDescriçã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.MaxFrequency999Frequência mais alta
Config.Decimals1Casas decimais (1 ou 2)
Config.PaneltruePainel com chat e canais
Config.PrivateChannelstrueCanais privados com palavra-passe
Config.StaffBypasstrueStaff entra em qualquer frequência
Config.LeaveOnDeathfalseSai da rádio ao morrer
Config.DefaultVolume60Volume inicial (0–100)
Config.Presets4Número de memórias

#Configuração completa

config.lua
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

server
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.