Pular para o conteúdo principal

Mecanismo de Consulta SA:MP

Introdução

O Mecanismo de Consulta SA:MP nada mais é do que o mecanismo para transmissão de estatísticas e informações do servidor, como nome, ping, idioma, jogadores online, etc...

Neste artigo, vou documentar como esse mecanismo funciona, além de ensinar como usá-lo sem precisar do cliente original.

Consultas

Consultas são pacotes UDP puros enviados ao endereço do servidor contendo dados serializados.

Você pode se perguntar: "Mas como o servidor interpreta pacotes de consulta de forma diferente daqueles do protocolo RakNet?", e a resposta é simples: na camada de socket de baixo nível do RakNet, pacotes que contêm 53 41 4D 50 ou traduzido para caracteres "SAMP" no início, são tratados de forma diferente. Ver Código

Dados Serializados

Os dados transmitidos no pacote são: "SAMP" + octetos do IP + primeiro byte da porta* + segundo byte da porta + OPCODE

Se você tem dúvidas sobre por que extrair e o que são octetos de IP e bytes de porta, veja: Link.

Tamanho em bytesNome
4"SAMP"
4Octetos do IP
1Porta & 0xFF
1Porta >> 8 & 0xFF
1OPCODE

Exemplo em C

OPCODE

OPCODE's são identificadores de pacotes, e cada um representa uma requisição diferente.

  • OPCODE "i" ou 0x69: Significa informação. Obtém a quantidade de jogadores no servidor, o nome do mapa e todas as informações desse tipo. É realmente útil para descrever seu servidor sem alterar nada.

  • OPCODE "r" ou 0x72: Significa regras. 'Regras' quando se trata do SA:MP inclui o instagib, a gravidade, clima, a URL do site, e assim por diante.

  • OPCODE "c" ou 0x63: Significa lista de clientes, isso envia de volta ao servidor os nomes dos jogadores e então as pontuações dos jogadores. Imagine apenas como uma visão geral básica de todos os jogadores.

  • OPCODE "d" ou 0x64: Significa informação detalhada do jogador. Com isso, você pode obter tudo, desde o ping do jogador, o ID do jogador (útil para scripts de admin), a pontuação novamente, e também o nome de usuário.

  • OPCODE "x" ou 0x78: Este é um comando RCON, e é completamente diferente de todos os outros pacotes.

  • OPCODE "p" ou 0x70: Quatro caracteres pseudo-aleatórios são enviados ao servidor, e os mesmos caracteres são retornados. Você pode usar o tempo entre enviar e receber para calcular o ping/latência do servidor.

Resposta

Como dito acima, cada OPCODE retorna informações.

A resposta consiste nos mesmos primeiros 11 bytes enviados, o que chamamos de Cabeçalho, depois a resposta definitiva.

Tabelas de Resposta para i, r, c, d, p

Tipo de Resposta i

ByteChaveLargura em BytesDescrição
11Password10 ou 1, dependendo se a senha está definida
12-13Players2Número atual de jogadores online
14-15MaxPlayers2Número máximo de jogadores permitidos no servidor
16-19(strlen)4Comprimento do hostname do servidor
20 + strlenHostname(strlen)Hostname do servidor
21-24(strlen)4Comprimento do gamemode do servidor
25 + strlenGamemode(strlen)Gamemode do servidor
26-29(strlen)4Comprimento do idioma do servidor
30 + strlenLanguage(strlen)Idioma do servidor

Tipo de Resposta r

ByteChaveLargura em BytesDescrição
11-12RuleCount2Número de regras fornecidas pelo servidor
13(strlen)1Comprimento do nome da regra
14 + strlenRulename(strlen)Nome da regra
15(strlen)1Comprimento do valor da regra
16 + strlenRuleValue(strlen)Valor da regra

(Repita a partir do Byte 13 para cada regra, quantas vezes for RuleCount)

Tipo de Resposta c

ByteChaveLargura em BytesDescrição
11-12PlayerCount2Número de jogadores fornecidos pelo servidor
13(strlen)1Comprimento do apelido do jogador
14 + strlenPlayerNick(strlen)Apelido do jogador
15-18Score4Pontuação do jogador

(Repita a partir do Byte 13 para cada jogador, quantas vezes for PlayerCount)

Tipo de Resposta d

ByteChaveLargura em BytesDescrição
11-12PlayerCount2Número de jogadores fornecidos pelo servidor
13PlayerID1ID do jogador (valores 0-255)
14(strlen)1Comprimento do apelido do jogador
15 + strlenPlayerNick(strlen)Apelido do jogador
16-19Score4Pontuação do jogador
20-23Ping4Ping do jogador ao servidor

(Repita a partir do Byte 13 para cada jogador, quantas vezes for PlayerCount)

Tipo de Resposta p

ByteChaveLargura em BytesDescrição
11número 11Primeiro número da sequência pseudo-aleatória enviada pelo cliente
12número 21Segundo número da sequência pseudo-aleatória
13número 31Terceiro número da sequência pseudo-aleatória
14número 41Quarto número da sequência pseudo-aleatória

Código de Exemplo em C

Há algum tempo fiz uma pequena lib em C, que permite realizar consultas, você pode usá-la como exemplo. Ver Repositório