Portal SAMP
[Tutorial] Guia Completo de Instalação e Uso do SAMPVOICE (v4.2) em Servidores SA-MP - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Guias e Tutoriais (https://portalsamp.com/forumdisplay.php?fid=7)
+--- Tópico: [Tutorial] Guia Completo de Instalação e Uso do SAMPVOICE (v4.2) em Servidores SA-MP (/showthread.php?tid=4753)



Guia Completo de Instalação e Uso do SAMPVOICE (v4.2) em Servidores SA-MP - BitSain - 06/05/2024

Guia sobre o Plugin SAMPVOICE

Guia elaborado por: BitSain
Última atualização: 13/10/2024, às 22:34
Créditos ao criador ao final do guia.

INÍCIO DO GUIA
Neste guia, explicarei o que é o SAMPVOICE e como instalá-lo corretamente em seu servidor de GTA SAMP, evitando quaisquer problemas. Cabe destacar que as informações que estou fornecendo são provenientes do documento oficial do SAMPVOICE (sampvoice.chm -> arquivo HTML compilado). Para acessar todas as informações relevantes, abra o documento .chm do SAMPVOICE (observação: o documento está em Russo, sendo necessária a tradução).

Observação: Este "guia" não está finalizado; irei complementá-lo gradualmente, pois as informações são extensas e muitas alterações, adições e remoções foram feitas no plugin.


O que é SAMPVOICE?
SAMPVOICE é um kit de desenvolvimento de software (SDK) para a implementação de sistemas de comunicação de voz em servidores SA-MP 0.3.7. Não se trata apenas de um chat de voz, mas sim de uma ferramenta para criá-lo.

Funcionalidades do SAMPVOICE
 
- Verifica a versão do plugin do jogador. 
- Verifica se um jogador possui microfone. 
- Ativa/desativa a capacidade do jogador de ouvir outros jogadores. 
- Ativa/desativa a capacidade do jogador de ser ouvido por outros jogadores. 
- Define chaves de ativação de canal para o jogador. 
- Inicia/parar a reprodução do canal com um comando do servidor. 
- Cria streams globais (som 2D). 
- Cria streams locais (áudio 3D). 
- Vincula threads locais a objetos do jogo. 
- Define vários parâmetros de fluxo (panorâmica, distância de audibilidade, posição, etc.). 
- Cria efeitos sonoros (walkie-talkie, eco, etc.).


Como funciona o SAMPVOICE?
O plugin consiste em três módulos: cliente, servidor de controle e servidor de voz.
Cliente - este é um jogador com o plugin, consumindo e produzindo tráfego de áudio.
Servidor de controle - este é um servidor que recebe comandos do mod do jogo e os transmite ao servidor de voz (via serviço de comando) e aos clientes relevantes.
Servidor de voz - este é um servidor que distribui o tráfego de áudio recebido de acordo com as instruções fornecidas pelo servidor de controle (enviando dados de um jogador para um stream específico, etc.).

[!] -> As informações a seguir podem ser consideradas como a funcionalidade "por trás das cortinas"; Configuração entre duas máquinas para aliviar o servidor SAMP. <- [!]

O servidor de voz foi implementado para aliviar a carga no servidor SAMP, que já possui bastante trabalho. Antes de considerar a configuração a seguir, vale ressaltar que, por padrão, as configurações do gerenciador e dos servidores de voz são configuradas para serem executadas na mesma máquina. Portanto, se o gerenciador e os servidores de voz estiverem rodando na mesma máquina, você não precisa criar uma configuração separada; basta pular essa explicação e se dirigir ao capítulo "Inserindo o SAMPVOICE no seu código".

Os endereços (uma combinação das opções '_host' e '_port') são divididos em dois tipos: interno e externo.

Endereço interno - é o endereço dentro da máquina; para o valor '_host', estão disponíveis as interfaces de rede da máquina (valores de exemplo: 0.0.0.0 (funciona em todas as interfaces disponíveis), 127.0.0.1 (também conhecido como localhost), 192.168.0.2 (pode ter um endereço diferente) (interface direcionada para sua rede local), 234.13.24.1 (você pode ter um endereço diferente) (interface direcionada para a Internet global)). O valor '_port' varia de 0 a 65535 (aqueles que não estão ocupados). Um valor 0 significa selecionar uma porta dinâmica aleatória (normalmente entre 49152 e 65535).

Endereço externo - é o endereço a partir do qual a máquina está acessível a um cliente que esteja prestes a contatá-la. Este endereço varia de acordo com o cliente. Se o cliente estiver dentro da rede local, você estará disponível em 192.168.0.2 (este é apenas um exemplo), e se estiver acessando a rede global, então você estará disponível no seu endereço IP global 241.34.24.1 (também condicional, seu endereço de Internet corresponde ao endereço do roteador final do seu provedor de Internet, que pode ser encontrado através de serviços como 2ip).

Agora que você conhece a teoria, vamos dar uma olhada nas opções de configuração do servidor de controle e do servidor de voz.
Citar:Servidor de controle
[Endereço interno] control_host - o host ao qual o serviço de controle está vinculado antes de se conectar ao serviço de comando.
[Endereço interno] control_port - porta à qual o serviço de controle está vinculado antes de se conectar ao serviço de comando.
[Endereço externo] command_host - o host do serviço de comando sob o qual está disponível para o serviço de controle.
[Endereço externo] command_port - porta do serviço de comando sob a qual é acessível ao serviço de controle.
[Endereço externo] voice_host - o host do serviço de voz sob o qual está disponível para os clientes (jogadores).
[Endereço externo] voice_port - porta do serviço de voz na qual está disponível para os clientes (jogadores).

Servidor de voz
[Endereço externo] control_host - host do serviço de controle sob o qual é acessível ao serviço de comando.
[Endereço externo] control_port - porta do serviço de controle sob a qual é acessível ao serviço de comando.
[Endereço interno] command_host - o host ao qual o serviço de comando está vinculado.
[Endereço interno] command_port - a porta à qual o serviço de comando está vinculado.
[Endereço interno] voice_host - o host ao qual o serviço de voz está vinculado.
[Endereço interno] voice_port - a porta à qual o serviço de voz está vinculado.

Vamos considerar o caso em que você possui várias máquinas. Digamos que você tenha 2 máquinas acessíveis pela Internet: A (234.13.24.1) e B (234.13.24.2). Você deseja executar um servidor SAMP na primeira máquina com o plugin SAMPVOICE (que atuará como um servidor de controle). Na segunda máquina, inicie o servidor de voz para aliviar o servidor SAMP. Então, as configurações do servidor devem ficar assim:
Citar:Servidor de controle
control_host = 0.0.0.0 (ligar a todas as interfaces de rede).
control_port = 2020.
command_host = 234.13.24.2 (especifique o endereço IP global do serviço de comando).
command_port = 2020.
voice_host = 234.13.24.2 (especifique o endereço IP global do serviço de voz para que os jogadores possam enviar pacotes para ele).
voice_port = 2020.

Servidor de voz
control_host = 234.13.24.1 (especifique o endereço IP global do serviço de controle).
control_port = 2020.
command_host = 0.0.0.0 (ligamos a todas as interfaces de rede, pois este é um serviço público).
command_port = 2020.
voice_host = 0.0.0.0 (ligamos a todas as interfaces de rede, pois este é um serviço público).
voice_port = 2020.

Agora vejamos outro caso em que você tem várias máquinas e uma rede local. Digamos que você tenha 2 máquinas acessíveis pela Internet: A (234.13.24.1) e B (234.13.24.2). Neste caso, A e B estão conectados por cabo a uma rede local, onde A (192.168.0.1) e B (192.168.0.2). Qual é a vantagem desta abordagem? A comunicação entre os servidores de controle e de voz é realizada através de um canal físico fechado, ou seja, ninguém poderá se conectar ao servidor de voz, exceto o único participante de uma rede local fechada - um servidor de controle. Mas isso é um exagero na maioria dos casos.

Você deseja executar um servidor SAMP com o plugin SAMPVOICE na primeira máquina (que atuará como servidor de gerenciamento). E na segunda máquina, inicie um servidor de voz para descarregar o servidor SAMP. Então, as configurações do servidor devem ficar assim:
Citar:Servidor de controle
control_host = 192.168.0.1 (ligamos à interface de rede de uma rede local fechada).
control_port = 2020.
command_host = 192.168.0.2 (especifique o endereço do serviço de comando dentro de uma rede local fechada).
command_port = 2020.
voice_host = 234.13.24.2 (especifique o endereço IP global do serviço de voz para que os jogadores possam enviar pacotes para ele).
voice_port = 2020.

Servidor de voz
control_host = 192.168.0.1 (especifique o endereço do serviço de controle dentro de uma rede local fechada).
control_port = 2020.
command_host = 192.168.0.2 (ligamos à interface de rede de uma rede local fechada).
command_port = 2020.
voice_host = 0.0.0.0 (ligamos a todas as interfaces de rede, pois este é um serviço público).
voice_port = 2020.


• Inserindo o SAMPVOICE no seu Código:

Referência Rápida: Para redirecionar o tráfego de áudio do jogador A para o jogador B, você precisa criar um stream de áudio (usando SvCreateStream), anexá-lo ao canal de alto-falante do jogador A (usando SvAttachStream) e, em seguida, anexar o jogador B ao stream de áudio (usando SvAttachListener). Pronto, agora, quando o microfone do jogador A estiver ativado (por exemplo, com a função SvPlay), seu tráfego de áudio será transmitido e, em seguida, ouvido pelo jogador B.

Agora vamos analisar alguns recursos do plugin através de um exemplo prático. Abaixo, criaremos um servidor que vinculará todos os jogadores conectados ao stream global e também estabeleceremos um stream local para cada jogador. Dessa forma, os jogadores poderão se comunicar por meio de chats globais (que podem ser ouvidos em qualquer ponto do mapa) e chats locais (que são ouvidos apenas quando próximos ao jogador).
Código:
#include <sampvoice>

#define GLOBAL_CHANNEL 0
#define LOCAL_CHANNEL 1

new SV_UINT:gstream = SV_NONE;
new SV_UINT:lstream[MAX_PLAYERS] = { SV_NONE, ... };

public OnPlayerConnect(playerid) {
    if (SvGetVersion(playerid) == 0) { // Verificando a disponibilidade do plugin
        SendClientMessage(playerid, -1, "Falha ao encontrar o plugin.");
    }
    else if (SvHasMicro(playerid) == SV_FALSE) { // Verificando a disponibilidade do microfone
        SendClientMessage(playerid, -1, "Falha ao encontrar o microfone.");
    }
    else {
        if(gstream != SV_NONE) {
            SvSetKey(playerid, 0x5A, GLOBAL_CHANNEL); // Z key
            SvAttachStream(playerid, gstream, GLOBAL_CHANNEL);
            SvAttachListener(gstream, playerid);
            SvSetIcon(gstream, "speaker");
            SendClientMessage(playerid, -1, "Pressione Z para falar no chat global.");
        }
        if((lstream[playerid] = SvCreateStream(40.0)) != SV_NONE) {
            SvSetKey(playerid, 0x42, LOCAL_CHANNEL); // B key
            SvAttachStream(playerid, lstream[playerid], LOCAL_CHANNEL);
            SvSetTarget(lstream[playerid], SvMakePlayer(playerid));
            SvSetIcon(lstream[playerid], "speaker");
            SendClientMessage(playerid, -1, "Pressione B para falar no chat local.");
        }
    }
}

public OnPlayerDisconnect(playerid, reason) {
    // Removendo o stream local do player após desconectar
    if(lstream[playerid] != SV_NONE) {
        SvDeleteStream(lstream[playerid]);
        lstream[playerid] = SV_NONE;
    }
}

public OnGameModeInit() {
    // Remova o comentário da linha para ativar o modo de depuração
    // SvEnableDebug();
    gstream = SvCreateStream();
}
public OnGameModeExit() {
    if(gstream != SV_NONE){
        SvDeleteStream(gstream);
        gstream = SV_NONE;
    }
}

Já foi observado que duas funções estão ausentes: 'OnPlayerActivationKeyPress' e 'OnPlayerActivationKeyRelease'. Sim, elas foram removidas.

Abaixo, estão todas as funções nativas do SAMPVOICE na versão 4.2:
Código PHP:
// [Functions] Debug
// ------------------------------------------------------------

native SV_VOID:SvEnableDebug();
native SV_VOID:SvDisableDebug();
native SV_BOOL:SvCheckDebug();

// [Functions] Player
// ------------------------------------------------------------

native SV_UINT:SvGetVersion(SV_UINT:player);
native SV_BOOL:SvHasMicro(SV_UINT:player);

native SV_BOOL:SvEnableListener(SV_UINT:player);
native SV_BOOL:SvDisableListener(SV_UINT:player);
native SV_BOOL:SvCheckListener(SV_UINT:player);

native SV_BOOL:SvEnableSpeaker(SV_UINT:playerSV_UINT:/*channels*/...);
native SV_BOOL:SvDisableSpeaker(SV_UINT:playerSV_UINT:/*channels*/...);
native SV_BOOL:SvCheckSpeaker(SV_UINT:playerSV_UINT:/*channels*/...);

native SV_BOOL:SvAttachStream(SV_UINT:playerSV_UINT:streamSV_UINT:/*channels*/...);
native SV_BOOL:SvDetachStream(SV_UINT:playerSV_UINT:streamSV_UINT:/*channels*/...);
native SV_BOOL:SvHasStream(SV_UINT:playerSV_UINT:streamSV_UINT:/*channels*/...);

native SV_BOOL:SvSetKey(SV_UINT:playerSV_UINT:keySV_UINT:/*channels*/...);
native SV_UINT:SvGetKey(SV_UINT:playerSV_UINT:channel);

native SV_BOOL:SvPlay(SV_UINT:playerSV_UINT:/*channels*/...);
native SV_BOOL:SvStop(SV_UINT:playerSV_UINT:/*channels*/...);

// [Functions] Stream
// ------------------------------------------------------------

native SV_UINT:SvCreateStream(SV_FLOAT:distance 0.0);

native SV_BOOL:SvEnableTransiter(SV_UINT:stream);
native SV_BOOL:SvDisableTransiter(SV_UINT:stream);
native SV_BOOL:SvCheckTransiter(SV_UINT:stream);

native SV_BOOL:SvAttachListener(SV_UINT:streamSV_UINT:player);
native SV_BOOL:SvDetachListener(SV_UINT:streamSV_UINT:player);
native SV_BOOL:SvHasListener(SV_UINT:streamSV_UINT:player);

native SV_VOID:SvSetVolume(SV_UINT:streamSV_FLOAT:volume);
native SV_VOID:SvSetPanning(SV_UINT:streamSV_FLOAT:panning);
native SV_VOID:SvSetDistance(SV_UINT:streamSV_FLOAT:distance);
native SV_VOID:SvSetPosition(SV_UINT:streamSV_FLOAT:xSV_FLOAT:ySV_FLOAT:z);
native SV_VOID:SvSetTarget(SV_UINT:streamSV_UINT:target);
native SV_VOID:SvSetEffect(SV_UINT:streamSV_UINT:effect);
native SV_VOID:SvSetIcon(SV_UINT:stream, const SV_STR:icon[]);

native SV_VOID:SvDeleteStream(SV_UINT:stream);

// [Functions] Effect
// ------------------------------------------------------------

native SV_UINT:SvCreateEffect();

native SV_BOOL:SvAppendFilter(SV_UINT:effectSV_FILTER:filterSV_INT:prioritySV_ANY:/*parameters*/...);
native SV_VOID:SvRemoveFilter(SV_UINT:effectSV_FILTER:filterSV_INT:priority);

native SV_VOID:SvDeleteEffect(SV_UINT:effect); 

// Fim do GUIA

• Créditos e Links do Projeto:
Link do Projeto: SAMPVOICE - GitHub
Criador: CyberMor

(Se você tiver um plugin Pawn.RakNet, certifique-se de colocar o SampVoice após ele.)


RE: O que é e como instalar o SAMPVOICE? (4.2) - pushline - 06/05/2024

Muito bom mano! Parabéns.