DRS Radio List

v1.6.6 drs_radiolist
Ver na loja

Lista da rádio para o pma-voice: mostra no ecrã quem está na tua frequência e quem está a falar, em tempo real. Cada canal tem nome e cor, os canais podem ser só para certos empregos e cada jogador pode escolher o nome que aparece. Os dados vêm do servidor. Funciona com Qbox, QBCore, ESX ou sem framework.

#Requisitos

RecursoObrigatório
pma-voiceSim
Qbox, QBCore, ESX ou nenhumSim (deteção automática)
drs_radio ou outro rádio para o pma-voiceSim — para entrar nas frequências
ox_libNão — só para as notificações do ox

#Instalação

  1. Desliga outra lista da rádio, se tiveres.
  2. Coloca drs_radiolist 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. Configura os canais em Config.Channels.

#Comandos

ComandoO que faz
/radiolistaMostra ou esconde a lista
/radiolistamoverAtiva o modo de arrastar: move a lista para onde quiseres (a posição fica guardada)
/radionome [nome]Escolhe o nome que aparece na rádio
/radionome (sem nome)Volta ao nome da personagem

Os nomes dos comandos estão em Config.ToggleCommand, Config.MoveCommand e Config.CustomNameCommand.

#A lista

  • Quem está na tua frequência, com o ID do servidor e o indicativo (QBCore/Qbox: metadata.callsign).
  • Quem está a falar fica destacado e sobe para o topo.
  • O cabeçalho mostra o nome e a cor do canal.
  • Até Config.MaxVisible nomes; o resto aparece como "+N".
  • Posição inicial em Config.Position; cada jogador pode arrastá-la com /radiolistamover.

#Nomes

  • Config.NameSource: 'rp' (nome da personagem) ou 'fivem' (nome do FiveM).
  • Config.NameFormat: 'short' → C Silva · 'full' → Carlos Silva · 'first' → Carlos.
  • Com Config.CustomNames, cada jogador escolhe o nome com /radionome (filtrado, até CustomNameMaxLength caracteres). Com KeepCustomName, fica guardado entre sessões.

#Canais

config.lua
Config.Channels = {
    [1] = { label = 'Polícia',    color = '#3b82f6', jobs = { 'police', 'sheriff' }, lock = true },
    [3] = { label = 'INEM',       color = '#ef4444', jobs = { 'ambulance' },         lock = true },
    [5] = { label = 'Mecânicos',  color = '#a3e635', jobs = { 'mechanic' },          lock = false },
}
CampoO que faz
labelNome do canal na lista
colorCor do canal
jobsCanal privado: só quem tem um destes empregos vê a lista (vazio = todos veem)
lock = trueCanal bloqueado: só estes empregos conseguem entrar (usa o addChannelCheck do pma-voice)
duty = trueTem de estar de serviço (QBCore/Qbox)

Quem perde o emprego é tirado da frequência bloqueada. Os canais que não estão na lista aparecem como Config.UnlistedLabel (ex.: "Frequência 42") se Config.ShowUnlistedChannels = true.

Dica

Se usas o DRS Radio, as frequências reservadas já são protegidas por ele. Aqui basta dar nome e cor aos canais; o lock é útil sobretudo se usas outro rádio.

Com Config.StaffBypass = true, o staff (ACE drs.radiolist ou grupo de Config.StaffGroups) vê a lista de qualquer canal em que esteja.

#Opções principais

OpçãoPor defeitoDescrição
Config.Locale'pt'Idioma: pt ou en
Config.NameSource'rp'rp (personagem) ou fivem
Config.NameFormat'short'short, full ou first
Config.ShowServerIdtrueID do servidor ao lado do nome
Config.ShowCallsigntrueIndicativo antes do nome
Config.CustomNamestrue/radionome
Config.Position'right-center'Posição inicial da lista
Config.MaxVisible14Nomes visíveis
Config.ShowUnlistedChannelstrueMostra canais sem configuração
Config.StaffBypasstrueStaff vê qualquer canal

#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'

-- ------------------------------------------------------------------ nomes / names
-- Nome mostrado na lista: 'rp' (nome da personagem) ou 'fivem' (nome do FiveM)
-- Name shown on the list: 'rp' (character name) or 'fivem' (FiveM name)
Config.NameSource = 'rp'
-- Formato do nome da personagem / Character name format
--   'short' → C Silva   ·   'full' → Carlos Silva   ·   'first' → Carlos
Config.NameFormat = 'short'
-- Mostrar o ID do servidor ao lado do nome / Show the server ID next to the name
Config.ShowServerId = true
-- Mostrar o callsign (QBCore/Qbox: metadata.callsign) antes do nome / Show the callsign before the name
Config.ShowCallsign = true

-- Deixar os jogadores escolherem o nome que aparece na rádio / Let players pick the name shown on the radio
Config.CustomNames = true
Config.CustomNameCommand = 'radionome'
Config.CustomNameMaxLength = 24
-- Guardar o nome personalizado entre sessões (KVP no servidor) / Keep the custom name between sessions
Config.KeepCustomName = true

-- ------------------------------------------------------------------ comandos / commands
Config.ToggleCommand = 'radiolista'      -- mostrar/esconder a lista / show/hide the list
Config.MoveCommand = 'radiolistamover'   -- arrastar a lista para outro sítio / drag the list somewhere else

-- Posição inicial: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'right-center' | 'left-center' (centro: cresce para cima e para baixo)
-- Initial position (each player can drag it and the position is saved)
Config.Position = 'right-center'

-- Número máximo de nomes visíveis (o resto aparece como "+N") / Max names shown (the rest shows as "+N")
Config.MaxVisible = 14

-- ------------------------------------------------------------------ canais / channels
-- label: nome do canal; color: cor do canal na lista
-- jobs: só quem tem um destes empregos vê a lista deste canal (vazio = todos veem)
-- lock: se true, só quem tem um destes empregos consegue ENTRAR no canal (usa o addChannelCheck do pma-voice)
-- duty: se true, é preciso estar em serviço (QBCore/Qbox)
-- label: channel name; color: channel colour on the list
-- jobs: only players with one of these jobs see this channel's list (empty = everyone sees it)
-- lock: if true, only those jobs can JOIN the channel (uses pma-voice's addChannelCheck)
-- duty: if true, the player must be on duty (QBCore/Qbox)
Config.Channels = {
    [1] = { label = 'Polícia',       color = '#3b82f6', jobs = { 'police', 'sheriff' }, lock = true, duty = false },
    [2] = { label = 'Polícia 2',     color = '#60a5fa', jobs = { 'police', 'sheriff' }, lock = true, duty = false },
    [3] = { label = 'INEM',          color = '#ef4444', jobs = { 'ambulance' },         lock = true, duty = false },
    [4] = { label = 'Emergência',    color = '#f59e0b', jobs = { 'police', 'sheriff', 'ambulance' }, lock = true },
    [5] = { label = 'Mecânicos',     color = '#a3e635', jobs = { 'mechanic' },          lock = false },
}

-- Canais sem configuração: mostrar a lista a quem lá está? / Channels with no config: show the list to members?
Config.ShowUnlistedChannels = true
-- Nome dos canais sem configuração ('%s' = número) / Name of unlisted channels ('%s' = number)
Config.UnlistedLabel = 'Frequência %s'

-- Staff pode ver a lista de qualquer canal em que esteja (ACE drs.radiolist ou grupo admin)
-- Staff can see the list of any channel they are in (ACE drs.radiolist or admin group)
Config.StaffBypass = true
Config.StaffGroups = { 'god', 'admin', 'superadmin' }

-- 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_radiolist:GetChannelMembers(1)   -- { { id, name }, ... }
exports.drs_radiolist:GetPlayerChannel(src)  -- frequência atual (0 = nenhuma)
exports.drs_radiolist:GetRadioName(src)      -- nome que aparece na rádio

O chat do DRS Radio usa o GetRadioName, por isso os nomes são os mesmos na lista e no chat.

#Segurança

Os dados da lista vêm do servidor, a partir do estado que o próprio pma-voice escreve. Um cliente não consegue ver a lista de canais em que não está nem de canais privados de outros empregos.

#Resolução de problemas

A lista não aparece — só aparece quando estás numa frequência. Confirma que não a escondeste com /radiolista e que o canal não é privado de outro emprego.

Ninguém fica destacado a falar — o pma-voice tem de estar a correr e arrancar antes do drs_radiolist.

A lista ficou fora do ecrã — usa /radiolistamover e arrasta-a de volta.

Os nomes aparecem como o nome do FiveM — põe Config.NameSource = 'rp'. Sem framework ('none'), é sempre usado o nome do FiveM.