Declarado como /onesync em dependencies. O recurso não inicia sem ele
Não depende de framework: funciona em QBox, QBCore, ESX ou servidor sem framework. Não usa banco de dados nem ox_lib.
Não pode rodar junto com outro sistema de voz. O manifest declara provides para mumble-voip, tokovoip, toko-voip e tokovoip_script — rodar qualquer um deles em paralelo quebra o áudio. Se usar vMenu, desligue o chat de voz dele.
Também não sobrescreva estas natives em outros recursos, ou o pma-voice perde o controle da proximidade:
Usa o áudio nativo do jogo, com oclusão e posicionamento 3D. Muda as distâncias dos modos de proximidade (whisper/normal/shout passam de 3/7/15 para 1.5/3/6 unidades)
voice_useSendingRangeOnly
bool
false
Impede que quem entra direto no servidor Mumble transmita para todo mundo. Recomendado ligar — o recurso avisa no console se estiver desligado
voice_use2dAudio
bool
—
Usado apenas na detecção de "nenhum modo de áudio configurado", que dispara os padrões automáticos
voice_use3dAudio
bool
—
Idem voice_use2dAudio
voice_enableSubmix
int
1
Aplica o efeito de submix (som de rádio/telefone) na voz de quem fala no rádio ou em chamada
O jogador pode ligar/desligar os próprios cliques; a preferência fica em KVP local (pma-voice_enableMicClicks), alterada via export setVoiceProperty('micClicks', ...).
Três modos, definidos em shared.lua, com distâncias que dependem de voice_useNativeAudio:
Modo
Distância (padrão)
Distância (voice_useNativeAudio = true)
Whisper
3.0
1.5
Normal
7.0
3.0
Shouting
15.0
6.0
O jogador cicla entre eles com a tecla de voice_defaultCycle (F11). Outros recursos podem adicionar e remover modos (addVoiceMode / removeVoiceMode), forçar um alcance fixo (overrideProximityRange) ou substituir inteiramente a lógica de quem entra no alcance (overrideProximityCheck).
Quando o jogador está em modo espectador ou com uma câmera renderizada, o recurso liga automaticamente o modo "ouvinte", em que ele escuta todos os jogadores independentemente da distância.
Um jogador entra em um canal numérico (setRadioChannel) e fala segurando a tecla de voice_defaultRadio (ALT). Enquanto fala, os outros do canal ouvem sua voz com o submix de rádio e o clique de microfone.
O rádio é bloqueado quando:
voice_enableRadios está em 0;
o jogador está morto (IsPlayerDead ou state bag isDead);
radioEnabled foi desligado via setVoiceProperty('radioEnabled', false);
Outros recursos ligam e desligam bits para bloquear o rádio por motivos diferentes, sem pisar uns nos outros. Use os exports addRadioDisableBit / removeRadioDisableBit. O rádio só volta a funcionar quando o valor chega a 0.
-- exemplo: bloquear rádio enquanto algemadoexports['pma-voice']:addRadioDisableBit(2)exports['pma-voice']:removeRadioDisableBit(2)
Os bits não são impostos pelo recurso — a convenção fica a cargo dos recursos que os usam (ex.: 1 = morto, 2 = algemado, 8 = submerso, 16 = sem item de rádio).
O servidor pode registrar uma checagem por canal com addChannelCheck. Se a função retornar false, o jogador é removido do canal e o client recebe pma-voice:radioChangeRejected. As checagens são apagadas automaticamente quando o recurso que as registrou para.
Canais de chamada funcionam como salas: todos no mesmo callChannel se ouvem, com o submix de telefone, independentemente da distância. Não há tecla — a voz de proximidade normal é o que entra na chamada.
setCallChannel(0) (ou o export removePlayerFromCall) tira o jogador da chamada. É o mecanismo usado por recursos de telefone.
Alterna o mute de um jogador no Mumble. A duração é em segundos e o padrão é 900 (15 min); passado o tempo, o mute cai sozinho. Rodar o comando de novo antes disso desfaz o mute
/setvoiceintent <speech|music>
Qualquer jogador
Define o perfil de captura do microfone. speech (padrão) liga supressão de ruído e filtro passa-alta; music desliga os dois. Só funciona com voice_allowSetIntent = 1
/vol <1-100>
Qualquer jogador
Ajusta o volume do rádio e das chamadas de uma vez
/cycleproximity
Qualquer jogador
Alterna entre os modos de proximidade. Mapeado em F11 por padrão
+radiotalk / -radiotalk
Qualquer jogador
Comandos de keybind (segurar/soltar) para falar no rádio. Mapeados em ALT esquerdo por padrão
O servidor pode barrar canais por job, gangue ou item registrando uma checagem:
exports['pma-voice']:addChannelCheck(1, function(source) local player = exports.qbx_core:GetPlayer(source) return player and player.PlayerData.job.name == 'police'end)
O manifest declara provides para mumble-voip, tokovoip, toko-voip e tokovoip_script, e o recurso expõe os aliases SetRadioChannel, SetCallChannel, SetMumbleProperty e SetTokoProperty. Recursos escritos para esses sistemas funcionam sem alteração — mas os recursos originais não podem estar rodando.
-- disparado ao começar/parar de falar no rádioAddEventHandler('pma-voice:radioActive', function(ativo) end)-- disparado ao trocar de modo de proximidadeAddEventHandler('pma-voice:setTalkingMode', function(modo) end)-- disparado quando a animação de rádio é ligada/desligadaAddEventHandler('pma-voice:toggleRadioAnim', function(desativada) end)-- momento certo para registrar submixes customizadosAddEventHandler('pma-voice:registerCustomSubmixes', function() end)-- retorna a Cfg do recurso (voiceModes)TriggerEvent('pma-voice:settingsCallback', function(cfg) end)
pma-voice/├── client/│ ├── commands.lua — /setvoiceintent, /vol, /cycleproximity e overrides de proximidade│ ├── events.lua — conexão/desconexão do Mumble e estado inicial dos alvos de voz│ ├── init/│ │ ├── init.lua — inicialização do KVP de mic clicks e reentrada em rádio/chamada│ │ ├── main.lua — volumes, submixes de rádio e chamada, mute local, setVoiceProperty│ │ ├── proximity.lua — loop de alvos de voz, modo espectador/ouvinte, modos de voz│ │ └── submix.lua — aplica a state bag `submix` na voz dos outros jogadores│ ├── module/│ │ ├── phone.lua — canais de chamada│ │ └── radio.lua — canais de rádio, +radiotalk/-radiotalk, animação, bits de disableRadio│ └── utils/│ └── Nui.lua — fila de mensagens para a UI (só envia depois do uiReady)├── server/│ ├── main.lua — state bags, canais Mumble por jogador, defaults de convar, getters│ ├── mute.js — comando /muteply (em JS por causa do clearTimeout)│ └── module/│ ├── phone.lua — setPlayerCall e sincronização das chamadas│ └── radio.lua — setPlayerRadio, addChannelCheck, overrideRadioNameGetter├── ui/ — UI compilada (indicador de voz) e os sons de clique de microfone├── voice-ui/ — código-fonte Vue da UI├── docs/ — documentação por export, do upstream├── shared.lua — Cfg.voiceModes, logger e type_check└── fxmanifest.lua