🎤 pma-voice - Manual de Funcionalidades

Sistema de voz de alta performance para FiveM/RedM usando servidor mumble interno com áudio nativo, rádio e chamadas.

Versão: Latest | Framework: Todos | Licença: MIT


🎯 O que o pma-voice faz

O pma-voice é uma solução completa de VOIP para servidores FiveM/RedM. Ele gerencia chat de voz por proximidade, comunicação via rádio, chamadas telefônicas e aplica efeitos de áudio 3D com suporte a submix (eco, reverberação). O sistema é altamente otimizado com 0.00ms de uso idle.


⚙️ Como funciona

O pma-voice utiliza o servidor mumble interno do FiveM/RedM para transmissão de áudio. O sistema gerencia canais de voz, aplica efeitos de áudio baseados em distância e sincroniza o estado de voz entre todos os jogadores conectados.

Sistema de Proximidade

  • Voz transmitida baseada na distância entre jogadores
  • Múltiplos modos de proximidade (sussurro, normal, grito)
  • Ciclo entre modos via tecla configurável (padrão: F11)

Rádio

  • Canais de rádio com restrição de acesso
  • Efeito de submix aplicado (som de rádio)
  • Suporte a múltiplos canais simultâneos

Chamadas

  • Chamadas ponto-a-ponto entre jogadores
  • Integração com sistemas de telefone (como NPWD)
  • Volume independente

🔧 Configuração

Configure tudo via convars no server.cfg:

# Configurações de Áudio
setr voice_useNativeAudio false      # Áudio nativo do jogo (efeitos 3D)
setr voice_use2dAudio false          # Áudio 2D (volume constante)
setr voice_use3dAudio false          # Áudio posicional 3D
setr voice_useSendingRangeOnly false # Apenas alcance de envio

# Interface e Controles
setr voice_enableUi 1                # Habilitar UI de voz (0/1)
setr voice_enableProximityCycle 1    # Ciclo de proximidade (0/1)
setr voice_defaultCycle "F11"        # Tecla para ciclar modos
setr voice_defaultRadio "LMENU"      # Tecla para usar rádio (ALT)

# Rádio e Chamadas
setr voice_enableRadios 1            # Sistema de rádio (0/1)
setr voice_enableCalls 1             # Sistema de chamadas (0/1)
setr voice_enableSubmix 1            # Efeitos de submix (0/1)
setr voice_defaultRadioVolume 30     # Volume padrão rádio (1-100)
setr voice_defaultCallVolume 60      # Volume padrão chamadas (1-100)

# Servidor Externo (Opcional)
setr voice_externalAddress ""        # IP do servidor mumble externo
setr voice_externalPort 0            # Porta do servidor externo

Referência de ConVars

ConVarPadrãoDescriçãoTipo
voice_useNativeAudiofalseUsar áudio nativo com efeitos 3Dboolean
voice_enableUi1Mostrar UI de vozint (0/1)
voice_enableProximityCycle1Habilitar tecla F11int (0/1)
voice_defaultRadio”LMENU”Tecla para rádio (LMENU=ALT)string
voice_defaultRadioVolume30Volume do rádioint (1-100)
voice_enableRadios1Sistema de rádioint (0/1)
voice_enableCalls1Sistema de chamadasint (0/1)
voice_enableSubmix1Efeitos de submixint (0/1)
voice_allowSetIntent1Permitir definir intent (speech/music)int (0/1)
voice_debugMode0Log de debug (1=básico, 4=verboso)int

📤 Exports

Exports do Cliente

ExportDescriçãoParâmetros
setVoicePropertyDefine configuração de vozproperty (string), value (any)
setRadioChannelDefine canal de rádiochannel (int)
setCallChannelDefine canal de chamadachannel (int)
setRadioVolumeDefine volume do rádiovolume (int, 1-100)
setCallVolumeDefine volume de chamadavolume (int, 1-100)
addPlayerToRadioEntra no canal de rádiochannel (int)
addPlayerToCallEntra no canal de chamadachannel (int)
removePlayerFromRadioSai do rádioNone
removePlayerFromCallSai da chamadaNone
toggleMutePlayerAlterna mudo de jogadorserverId (int)

Exports do Servidor

ExportDescriçãoParâmetros
setPlayerRadioDefine rádio do jogadorsource (int), channel (int)
setPlayerCallDefine chamada do jogadorsource (int), channel (int)
addChannelCheckAdiciona verificação de acessochannel (int), callback (function)
getPlayersInRadioChannelLista jogadores no rádiochannel (int)

📡 Eventos

Eventos do Cliente

EventoDescriçãoParâmetros
pma-voice:settingsCallbackRetorna configurações atuaiscb(voiceSettings)
pma-voice:radioActiveRádio ativado/desativadoboolean
pma-voice:setTalkingModeMudança de modo de proximidademodeId (int)

💻 State Bags

Acesse o estado do jogador via Player(source).state:

State BagDescriçãoTipo
proximityTabela com modo, distância e nometable
radioChannelCanal de rádio atual (0 = nenhum)int
callChannelCanal de chamada atual (0 = nenhum)int
voiceIntentIntent (‘speech’ ou ‘music’)string
disableRadioEstado de rádio desabilitado (bitwise)int

Estados de Rádio Desabilitado (Bitwise)

enum DisabledRadioStates {
    Enabled = 0,
    IsDead = 1,
    IsCuffed = 2,
    IsPdCuffed = 4,
    IsUnderWater = 8,
    DoesntHaveItem = 16,
    PlayerDisabledRadio = 32,
}

🎮 Comandos

ComandoDescriçãoPermissão
/muteply [target] [duration]Mutar jogadorACE: command.muteply

Configuração ACE para Comando

add_ace group.superadmin command.muteply allow
add_ace group.admin command.muteply allow

🔗 Integrações

Compatibilidade

O pma-voice fornece compatibilidade com APIs:

  • mumble-voip - Compatibilidade de exports
  • toko-voip - Compatibilidade parcial

Integração com NPWD (Telefone)

-- NPWD usa pma-voice para chamadas telefônicas
exports['pma-voice']:setCallChannel(phoneCallChannel)

Verificação de Canal de Rádio (Servidor)

exports['pma-voice']:addChannelCheck(1, function(source)
    local Player = QBCore.Functions.GetPlayer(source)
    return Player.PlayerData.job.name == 'police'
end)

💡 Casos de Uso

Entrar no Rádio da Polícia (Cliente)

exports['pma-voice']:setRadioChannel(1)
print("Entrou no canal de rádio 1")

Verificar Canal de Rádio do Jogador (Servidor)

local radioChannel = Player(source).state.radioChannel
if radioChannel and radioChannel > 0 then
    print(("Jogador %s está no canal de rádio %s"):format(GetPlayerName(source), radioChannel))
end

Sistema de Rádio com Restrição de Job

RegisterCommand('radio', function(source, args)
    local channel = tonumber(args[1])
    if not channel then return end
    
    local Player = QBCore.Functions.GetPlayer(source)
    local restrictedChannels = {
        [1] = 'police',
        [2] = 'ambulance',
        [3] = 'mechanic'
    }
    
    if restrictedChannels[channel] then
        if Player.PlayerData.job.name == restrictedChannels[channel] then
            exports['pma-voice']:setPlayerRadio(source, channel)
        else
            TriggerClientEvent('ox_lib:notify', source, {
                title = 'Erro',
                description = 'Sem permissão para este canal',
                type = 'error'
            })
        end
    else
        exports['pma-voice']:setPlayerRadio(source, channel)
    end
end)

Desabilitar Rádio quando Morto

-- Cliente
AddEventHandler('esx:onPlayerDeath', function()
    local state = LocalPlayer.state
    state:set('disableRadio', 1, true)  -- IsDead = 1
end)
 
AddEventHandler('esx:onPlayerSpawn', function()
    local state = LocalPlayer.state
    state:set('disableRadio', 0, true)  -- Enabled = 0
end)

⚠️ Solução de Problemas

Voz não funciona

  • Verifique se o OneSync está habilitado no servidor
  • Confirme que ensure pma-voice está no server.cfg
  • Verifique se não há conflito com outros sistemas de voz

Não compatível com outros sistemas de voz

IMPORTANTE: pma-voice NÃO é compatível com:

  • vMenu voice
  • toko-voip (simultâneo)
  • mumble-voip (simultâneo)

Se usar vMenu, desative o chat de voz.

Não sobrescreva estas natives:

  • NetworkSetTalkerProximity
  • MumbleSetTalkerProximity
  • MumbleSetAudioInputDistance
  • MumbleSetAudioOutputDistance
  • NetworkSetVoiceActive

Rádio não funciona

  • Verifique se voice_enableRadios está definido como 1
  • Confirme que o jogador tem a tecla de rádio configurada (padrão: ALT)
  • Verifique as restrições de canal com addChannelCheck

Chamadas não conectam

  • Verifique se voice_enableCalls está habilitado
  • Confirme que o NPWD ou sistema de telefone está integrado
  • Verifique o volume das chamadas

Áudio 3D não funciona (RedM)

O áudio nativo não é suportado no RedM. Use configurações padrão.


⚠️ Aviso de Compatibilidade

Este script NÃO é compatível com outros sistemas de voz simultâneos. Use apenas um sistema de voz por servidor.