SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Português/Portuguese > Lançamentos/Releases

Reply
 
Thread Tools Display Modes
Old 11/02/2018, 09:59 AM   #1
Jelly23
Guest
 
Posts: n/a
Default Sincronização no SA-MP.

• Sincronização no SA-MP.
Conteúdo:
- Sincronização de dados;
- Funções Get*;
- Mundos virtuais e processo de "streaming";
- Pool interna de processamento de RPCs.
- Dessincronização.
• Sincronização de dados.
Todos os dados como posição, arma atual e velocidade vem em pacotes. Ou mais precisamente no caso de UDP, datagramas. Cada datagrama contém uma ou mais mensagens, podendo ser vida, posição atual, entre outros.

Cada pacote é identificado pelos seus primeiros 8 bits (1 byte), que nesse caso é o seu identificador numérico. Existem diferentes tipos de pacotes contendo diferentes mensagens/dados em si, sendo:

ID_PLAYER_SYNC (ID: 207) - Um pacote com este identificador numérico é responsável por atualizações a pé, dos jogadores. Este pacote sempre será enviado APENAS se o jogador estiver a pé, e é enviado a cada um segundo se o jogador não estiver se movendo. A sua estrutura de dados é a seguinte:
  • lrKey - Seta para esquerda/direita (←→) - Se a tecla atual for seta para esquerda, então lrKey se iguala a KEY_LEFT, caso contrário KEY_RIGHT. 0 se nenhum dos casos.
  • udKey - Seta para cima/baixo (↑↓) - Se a tecla atual for seta para cima, então lrKey se iguala a KEY_UP, caso contrário KEY_DOWN. 0 se nenhum dos casos.
  • keys - Um mapa (bitmask) com as teclas pressionadas.
  • position[3] - Posição atual (X, Y, Z).
  • quaternion[4] - Quaterniões de rotação (W, X, Y, Z).
  • health - Vida atual do jogador.
  • armour - Colete atual do jogador.
  • weaponId - Arma atual do jogador.
  • additionalKey - Tecla adicional.
  • specialAction - Ação especial.
  • velocity[3] - Velocidade nos eixos X, Y e Z.
  • surfingOffsets[3] - Offsets de surfing em um veículo - 0.0 em todas as offsets se o jogador não estiver surfando um veículo.
  • surfingVehicleId - O ID do veículo que o jogador está surfando (0 se nenhum).
  • animationId - ID da animação atual.
  • animationFlags - Flags da animação atual.
ID_VEHICLE_SYNC (ID: 200) - Um pacote com este identificador numérico é responsável por atualizações do jogador dentro de um veículo (como motorista). A sua estrutura de dados é a seguinte:
  • vehicleId - ID de veículo atual.
  • lrKey - Seta para esquerda/direita (←→) - Se a tecla atual for seta para esquerda, então lrKey se iguala a KEY_LEFT, caso contrário KEY_RIGHT. 0 se nenhum dos casos.
  • udKey - Seta para cima/baixo (↑↓) - Se a tecla atual for seta para cima, então lrKey se iguala a KEY_UP, caso contrário KEY_DOWN. 0 se nenhum dos casos.
  • keys - Um mapa (bitmask) com as teclas pressionadas.
  • quaternion[4] - Quaterniões de rotação do veículo (W, X, Y, Z).
  • position[3] - Posição atual (X, Y, Z)
  • velocity[3] - Velocidade nos eixos X, Y e Z.
  • vehicleHealth - Vida atual do veículo.
  • playerHealth - Vida do jogador.
  • armour - Colete do jogador.
  • weaponId - Arma atual do jogador.
  • additionalKey - Tecla adicional.
  • sirenState - Estado da sirene do veículo.
  • landingGearState - Estado do trem de pouso (dado também utilizado por veículos como empilhadeira para representar o estado do garfo/forquilha).
  • trailerId - ID de trailer anexado ao veículo (0 se nenhum).
  • trainSpeed - Velocidade do trem (dado utilizado por trens).
ID_PASSENGER_SYNC (ID: 211) - Um pacote com este identificador numérico é responsável por atualizações do jogador dentro de um veículo (como passageiro). A sua estrutura de dados é a seguinte:
  • vehicleId - ID de veículo atual.
    seatId - Número do assento atual.
    driveBy - 0 se o jogador não estiver em modo de drive-by, caso contrário 1.
    weaponId - ID de arma atual.
    additionalKey - Tecla adicional.
    playerHealth - Vida do jogador.
    playerArmour - Colete do jogador.
  • lrKey - Seta para esquerda/direita (←→) - Se a tecla atual for seta para esquerda, então lrKey se iguala a KEY_LEFT, caso contrário KEY_RIGHT. 0 se nenhum dos casos.
  • udKey - Seta para cima/baixo (↑↓) - Se a tecla atual for seta para cima, então lrKey se iguala a KEY_UP, caso contrário KEY_DOWN. 0 se nenhum dos casos.
  • keys - Um mapa (bitmask) com as teclas pressionadas.
    position[3] - Posição atual do jogador (X, Y, Z).
ID_AIM_SYNC (ID: 203) - Um pacote com este identificador numérico é responsável por atualizações relacionadas com a câmera/mira do jogador. A sua estrutura de dados é a seguinte:
ID_BULLET_SYNC (ID: 206) - Um pacote com este identificador numérico é responsável por atualizações de tiros/balas disparados por um jogador. A sua estrutura de dados é a seguinte:
  • hitType - Tipo de acerto: http://wiki.sa-mp.com/wiki/BulletHitTypes
  • hitId - ID do veículo, objeto ou jogador que levou o tiro.
  • origin[3] - Origem da bala.
  • hitPos[3] - Posição de acerto.
  • offsets[3] - offsets da bala.
  • weaponId - ID da arma que a bala pertence.
ID_TRAILER_SYNC (ID: 210) - Um pacote com este identificador numérico é responsável por atualizações de trailers anexados a veículos sendo utilizados por jogadores. A sua estrutura de dados é a seguinte:
  • trailerId - ID do trailer anexado.
  • position[3] - Posição atual (X, Y, Z).
  • quaternion[4] - Quaterniões de rotação do trailer (W, X, Y, Z).
  • velocity[3] - Velocidade nos eixos X, Y e Z.
  • angularVelocity[3] - Velocidade angular.
ID_WEAPONS_UPDATE (ID: 204) - Um pacote com este identificador numérico é responsável por atualizações de balas e armas em todas as slots. A sua estrutura de dados é a seguinte:
  • slot[12] - Slot.
  • arma0[12] - ID da arma.
  • balas0[12] - Quantidade de balas.
ID_RCON_COMMAND (ID: 201) - Um pacote com este identificador numérico é responsável por mandar tentativas de comandos rcon para o servidor. Todos os comandos rcons são mandados por esse pacote, até mesmo tentativas de login. A sua estrutura de dados é a seguinte:
  • text_length - UINT32 com a quantidade de células do texto do comando.
  • cmdtext - Texto do comando.
• Funções Get*.
Funções Get* (como GetPlayerWeapon) retornam valores que o servidor já tem, sem nenhuma operação I/O. Esses valores são contidos nos dados dos pacotes de sincronização que jogadores enviam para o servidor. Assim que recebidos os dados, os valores são escritos em variáveis nas estruturas internas do servidor em CPlayerPool, assim, a função retornará o valor já presente em uma das variáveis nas estruturas internas.

Após um pacote de sincronização chegar no servidor e ter seus dados escritos nas estruturas internas, a callback OnPlayerUpdate é chamada. O valor retornado na callback OnPlayerUpdate determina se os dados recebidos pelo servidor vão ser transmitidos com outros jogadores ou não, nesse caso retornando 1 permite que os dados sejam transmitidos com outros jogadores após terem sidos salvos nas estruturas internas do servidor, e retornando 0 impedirá a transmissão desses dados.
• Mundos virtuais e processo de "streaming".
O servidor controla aquilo que será transmitido com o cliente. Outros jogadorés só vão ser criados se você estiver a uma certa distância de suas posições atuais e se o mundo virtual for o mesmo, resultando no processo de stream-in com outros clientes.

No processo de stream-in com jogadores, o servidor manda a chamada de procedimento remóto (RPC - Remote Procedure Call) WorldPlayerAdd para seu cliente, criando os outros jogadores em seu cliente e então permitindo que você receba dados de sincronização desses outros clientes. O mesmo serve para veículos e objetos, o processo de stream-in ocorre quando você chega na distância necessária (geralmente uma distância menor que 200.0 no plano X, Y - O valor pode variar, depende de como você definiu stream_distance em server.cfg, mas por padrão é 200.0) e se estiver no mesmo mundo virtual.

Chegando a uma distância superior à stream_distance, os jogadores/veículos/objetos sofrem stream-out, em que são removidos do seu cliente, logo esses jogadores não teram dados de sincronização mandados para você.

O cliente não controla aquilo que será transmitido consigo mesmo, o servidor é responsável por isso baseado em fatores como posição e mundo virtual. O cliente pode chegar ao ponto de modificar a posição resultando no servidor em fazer o processo de stream-in/out, mas, o cliente nunca poderá alterar o mundo virtual, que é totalmente controlado pelo servidor.

No momento que o mundo virtual muda, todo jogador/objeto/carro que está próximo de você e dentro da distância de streaming e não pertencer ao seu mundo virtual, sofrerá o processo de stream-out, e aquilo que ainda não foi transmitido não será. Você estará limitado a outros jogadores/veículos/objetos que estejam no seu mesmo mundo virtual.
• Pool interna de processamento de RPCs.
Chamadas de procedimento remoto (RPCs - Remote Procedure Calls) tem o objetivo de executar funções internas no cliente. Quando você muda a ação especial de um jogador com a função SetPlayerSpecialAction, o RPC 88 é mandado para o cliente, tendo o ID da ação especial como parâmetro, e logo uma função interna é chamada no cliente e a ação especial muda de acordo com a providenciada na chamada de procedimento remóto.

Antes de uma chamada de procedimento remóto ser enviada, o servidor verifica se o cliente está mandando atualizações para se certificar que não esteja AFK. Se o cliente estiver AFK, os RPCs são colocados em uma pool de processamento interna, e assim que o cliente voltar, os RPCs são removidos da pool e processados, chegando no cliente.

Vamos considerar o seguinte exemplo:

- O servidor manda uma chamada de procedimento remóto para mudar a ação especial do cliente.
- O cliente está pausado, resultando no colocamento do RPC, na pool interna de processamento.
- O cliente volta, então o RPC é processado e removido da pool de processamento, chegando no cliente.
- O cliente manda a nova ação especial no pacote de sincronização a pé.
- Os dados do pacote são escritos nas variáveis das estruturas internas do servidor.
- OnPlayerUpdate é chamada, e se ela retornar 1, a atualização será transmitida para jogadores dentro da área de streaming.
- GetPlayerSpecialAction retornará o novo ID de ação especial mantido em uma variável em CPlayerPool->CPlayer[id_do_jogador].
• Dessincronização.
A dessincronização, também conhecida como "relógio travado" por algumas pessoas, é uma grande causa de falsos-positivos em relação a verificações de anti-cheat.

Um jogador sofrendo dessincronização, ainda manda pacotes de atualização para o servidor e recebe eles, mas não vai reagir a alguns RPCs mandados pelo servidor, como 145 (SetPlayerAmmo) com o intuito de atualizar/mudar alguma informação do cliente.

Como o cliente acaba não reagindo a certos RPCs, o mesmo não passará pelo processo de stream in/out que é feito com RPCs, resultando jogadores/veículos/objetos em não serem removidos, mas vão parar de mandar dados de sincronização, resultando em que o jogador dessincronizado veja todos como se estivessem pausados/AFK.

Fazer a detecção de um jogador dessincronizado não é complicado, leve em consideração que ele ainda manda atualizações para o servidor, logo a callback OnPlayerUpdate continua sendo chamada. Você pode fazer a detecção tentando mudar a munição na slot 0 utilizando SetPlayerAmmo, já que os jogadores não vão perceber a mudança de munição em punhos (id 0) ou soco inglês (id 1), e verificar se há alguma diferença de valores com a última atualização.

Last edited by Jelly23; 11/02/2018 at 05:50 PM.
  Reply With Quote
Old 11/02/2018, 01:50 PM   #2
NelsonC
Huge Clucker
 
NelsonC's Avatar
 
Join Date: Oct 2017
Location: Germany
Posts: 206
Reputation: 12
Default Re: Sincronização no SA-MP.

Muito bom, +Rep
NelsonC is offline   Reply With Quote
Old 11/02/2018, 02:17 PM   #3
Ermanhaut
Gangsta
 
Ermanhaut's Avatar
 
Join Date: Apr 2016
Location: 2369.5547, -1681.9297, 15.0078
Posts: 629
Reputation: 43
Default Re: Sincronização no SA-MP.

Continue trazendo conteúdos sobre Pawn.RakNet pra board porque é muito interessante.
Parabéns pela iniciativa e pelo tutorial.
__________________
  • Estou desenvolvendo por dinheiro, contate-me com sua proposta.
Ermanhaut is offline   Reply With Quote
Old 11/02/2018, 05:34 PM   #4
Jelly23
Guest
 
Posts: n/a
Default Re: Sincronização no SA-MP.

Informação sobre dessincronização, adicionada.
  Reply With Quote
Old 12/02/2018, 03:01 AM   #5
IlanZ
High-roller
 
Join Date: Jul 2016
Location: Brasil
Posts: 1,357
Reputation: 75
Default Re: Sincronização no SA-MP.

Parabéns pelo tutorial, ta muito show.
IlanZ is offline   Reply With Quote
Old 13/02/2018, 02:51 AM   #6
Bruno13
High-roller
 
Bruno13's Avatar
 
Join Date: May 2013
Location: Caxias do Sul/RS
Posts: 1,422
Reputation: 240
Default Re: Sincronização no SA-MP.

Tutorial de qualidade excelente.

Prevejo novas eras na board BR.
__________________
Desenvolvendo Hogwarts RP/G
Code:
> Não trabalho mais com venda de sistemas.
> Site: www.bruno13.tk
Bruno13 is offline   Reply With Quote
Old 16/02/2018, 03:44 PM   #7
KoloradO
Huge Clucker
 
KoloradO's Avatar
 
Join Date: Mar 2016
Posts: 212
Reputation: 16
Default Re: Sincronização no SA-MP.

Pode me dizer outra maneira de detectar sem usar SetPlayerAmmo ?
__________________
Scavenge And Survive - Apocalypse

IP: 167.114.201.72:7777

My discord: Nicolas#3489
KoloradO is offline   Reply With Quote
Old 16/02/2018, 03:46 PM   #8
Jelly23
Guest
 
Posts: n/a
Default Re: Sincronização no SA-MP.

Quote:
Originally Posted by KoloradO View Post
Da pra detectar sem usar SetPlayerAmmo ?
Você poderia utilizar drunk level (SetPlayerDrunkLevel), por exemplo, pois ao utilizar GetPlayerDrunkLevel, ele vai continuar o mesmo.

Faça a verificação na callback OnPlayerUpdate, assim o jogador não será acusado de estar desincronizado se estiver AFK, já que, se a callback parar de ser executada, logo a verificação também para, e o jogador não pode ser acusado de estar desincronizado.
  Reply With Quote
Old 16/02/2018, 04:03 PM   #9
KoloradO
Huge Clucker
 
KoloradO's Avatar
 
Join Date: Mar 2016
Posts: 212
Reputation: 16
Default Re: Sincronização no SA-MP.

Funciona com SetPlayerColor também ?
__________________
Scavenge And Survive - Apocalypse

IP: 167.114.201.72:7777

My discord: Nicolas#3489
KoloradO is offline   Reply With Quote
Old 16/02/2018, 04:13 PM   #10
Jelly23
Guest
 
Posts: n/a
Default Re: Sincronização no SA-MP.

Quote:
Originally Posted by KoloradO View Post
Funciona com SetPlayerTeam também ?
Não.
  Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
[Ajuda] Sincronização BartWhite Português/Portuguese 4 08/09/2015 01:06 AM
[Ajuda] Sincronização com a Hora do Servidor maikonk Português/Portuguese 1 12/07/2012 08:50 AM


All times are GMT. The time now is 08:06 AM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.