[Tutorial] Pacotes - Pawn.RakNet
#1

• Pacotes - Pawn.RakNet
Obs: Tambйm recomendo ler meu tуpico sobre RPCs: https://sampforum.blast.hk/showthread.php?tid=642644

Os sistemas que usam a biblioteca RakNet, se comunicam atravйs do que й conhecido como pacotes. Ou mais precisamente no caso de UDP, datagramas. Cada datagrama й criado pela biblioteca RakNet e contйm uma ou mais mensagens. Essas mensagens podem ser vida, posiзгo do jogador, veнculo atual, entre outros.

O primeiro byte do pacote (8 bits) й o seu identificador numйrico.

Existem vбrios identificadores de pacote, sendo os mais comuns:
  • ID_VEHICLE_SYNC (200) = Responsбvel pelas mensagens (dados) de sincronizaзгo de veнculo. Ex: quando o jogador estб dentro de um carro. Sua posiзгo, vida do carro, velocidade, etc, sгo as mensangens do pacote.
  • ID_AIM_SYNC (203) = Responsбvel pelas mensagens (dados) de mira/cвmera do jogador. Ex: Vetores de cвmera, zoom de cвmera, estado da arma, objeto/carro/jogador/ator em que o jogador estб mirando, etc sгo as mensangens do pacote.
  • ID_BULLET_SYNC (206) = Responsбvel pelas mensagens (dados) de tiros de armas. Ex: tipo de disparo, origem do disparo, destino do disparo, alvo, centro do disparo, arma usada para o disparo, etc, sгo as mensagens do pacote.
  • ID_PLAYER_SYNC (207) = Responsбvel pelas mensagens (dados) do jogador quando estб a pй. Ex: teclas pressionadas, posiзгo atual, vida, colete, arma em mгos, velocidade, animaзхes, posiзгo de surfing em algum veнculo, se o jogador esta "surfando" algum veнculo, aзгo especial, etc, sгo as mensagens do pacote.
Tipos de Pacotes:
-Outcoming Packets: Pacotes mandados pelo servidor ao cliente.
-Incoming Packets: Pacotes mandados pelo cliente ao servidor.
Prioridades:
-SYSTEM_PRIORITY: Usada pelo RakNet para enviar chamadas de prioridade acima do normal.

-HIGH_PRIORITY: Chamadas de alta prioridade sгo enviadas antes das chamadas de prioridade mйdia.

-MEDIUM_PRIORITY: As chamadas de prioridade mйdia sгo enviadas antes das chamadas de baixa prioridade.

-LOW_PRIORITY: As chamadas de baixa prioridade sу sгo enviadas quando nenhuma outra chamada estб aguardando.
Confiabilidades:
-UNRELIABLE: Os pacotes UNRELIABLE sгo enviados por UDP direto. Eles podem chegar fora de ordem, ou nгo. Isto й melhor para os dados que nгo sгo importantes ou os dados que vocк envia com muita freqькncia, mesmo que alguns pacotes sejam perdidos, os pacotes mais novos serгo compensados.
Vantagens - Esses pacotes nгo precisam ser reconhecidos pela rede, salvando o tamanho de um cabeзalho UDP em reconhecimento (cerca de 50 bytes ou mais). As economias podem realmente se somar.
Desvantagens - Sem pedidos de pacotes, os pacotes podem nunca chegar, esses pacotes sгo os primeiros a serem descartados se o buffer de envio estiver cheio.

-UNRELIABLE_SEQUENCED: Os pacotes UNRELIABLE_SEQUENCED sгo os mesmos que os pacotes UNRELIABLE, exceto que apenas o pacote mais recente й aceito. Os pacotes mais antigos sгo ignorados. Vantagens - Mesma baixa sobrecarga que pacotes UNRELIABLE, e vocк nгo precisa se preocupar com pacotes mais antigos que mudam seus dados para valores antigos.
Desvantagens - muitos pacotes serгo descartados, uma vez que eles nunca podem chegar por causa do UDP e podem cair mesmo quando eles chegam. Esses pacotes sгo os primeiros a serem descartados se o buffer de envio estiver cheio. O ъltimo pacote enviado pode nunca chegar, o que pode ser um problema se vocк parar de enviar pacotes em algum ponto particular.

-RELIABLE: Os pacotes RELIABLE sгo pacotes UDP monitorados por uma camada de confiabilidade para garantir que eles chegam ao destino.
Vantagens - Vocк sabe que o pacote chegarб lб. Eventualmente ...
Desvantagens - Retransmissхes e reconhecimentos podem adicionar exigкncias significativas de largura de banda. Os pacotes podem chegar muito tarde se a rede estiver ocupada. Nгo hб pedidos de pacotes.

-RELIABLE_ORDERED: Os pacotes RELIABLE_ORDERED sгo pacotes UDP monitorados por uma camada de confiabilidade para garantir que eles chegam ao destino. Vantagens - O pacote chegarб na ordem em que foi enviado. Estes sгo, de longe, os mais fбceis de programar, porque vocк nгo precisa se preocupar com comportamento estranho devido a falta de ordem ou pacotes perdidos.
Desvantagens - Retransmissхes e reconhecimentos podem adicionar exigкncias significativas de largura de banda. Os pacotes podem chegar muito tarde se a rede estiver ocupada. Um pacote tardio pode atrasar muitos pacotes que chegaram mais cedo, resultando em espasmos significativos. No entanto, essa desvantagem pode ser atenuada pelo uso inteligente de fluxos de pedidos.

-RELIABLE_SEQUENCED: Os pacotes RELIABLE_SEQUENCED sгo pacotes UDP monitorados por uma camada de confiabilidade para garantir que eles chegam ao destino e sгo seqьenciados no destino.
Vantagens - Vocк obtйm a confiabilidade dos pacotes UDP, o pedido de pacotes ordenados, mas nгo precisa aguardar pacotes antigos. Mais pacotes chegarгo com esse mйtodo do que com o mйtodo UNRELIABLE_SEQUENCED, e eles serгo distribuнdos de forma mais uniforme. A vantagem mais importante no entanto й que o ъltimo pacote enviado chegarб, onde com UNRELIABLE_SEQUENCED o ъltimo pacote enviado pode nгo chegar.
Desvantagens - Desperdнcio de largura de banda, porque ele usa a sobrecarga de pacotes UDP confiбveis para garantir a chegada de pacotes atrasados que apenas sejam ignorados de qualquer maneira.
• O que й BitStream?
A classe BitStream й uma classe auxiliar na biblioteca RakNet, que й usada para fazer um wrap de uma matriz dinвmica com a finalidade de (des)empacotar bits.
• Modificando as mensagens (dados) de um pacote
PHP Code:
#define ID_PLAYER_SYNC  207
public OnIncomingPacket(playeridpacketidBitStream:bs)
{
    if (
packetid == ID_PLAYER_SYNC)
    {
        new 
onFootData[PR_OnFootSync];
        
BS_IgnoreBits(bs8);
        
BS_ReadOnFootSync(bsonFootData);
        
onFootData[PR_weaponId] = 38;
        
BS_SetWriteOffset(bs8);
        
BS_WriteOnFootSync(bsonFootData);
    }
    return 
1;

No exemplo acima, modificamos a mensagem de arma atual do jogador, logo fazendo com que todos o vejam segurando uma minigun (38).

BS_IgnoreBits(bs, 8); - Antes de ler os dados do pacote, ignoramos os primeiros 8 bits (1 byte), pois esses contйm o identificador do pacote.

BS_ReadOnFootSync(bs, onFootData); - Apуs ignorar os primeiros 8 bits, podemos ler o pacote, que terб seus dados passados para onFootData (referenciando o enumerador PR_OnFootSync).

onFootData[PR_weaponId] = 38; - Mudamos o ID da arma no pacote, que queremos que outros jogadores vejam.

BS_SetWriteOffset(bs, 8); - Mudamos a offset de escrita de dados para depois dos 8 bits, pois nгo queremos escrever em cima do identificador do pacote.

BS_WriteOnFootSync(bs, onFootData); - Entгo, escrevemos os novos dados de sincronizaзгo a pй no BitStream.

return 1; - Retornamos 1, permitindo o envio do pacote com os dados escritos no BitStream.
• Mandando um pacote
Para mandar um pacote, temos que escrever seus dados em um BitStream, sendo o primeiro parвmetro o seu identificador (8 bits).

PHP Code:
#define ID_BULLET_SYNC  206
SendBullet(fromtodata[PR_BulletSync])
{
    new 
BitStream:bs BS_New();
    
BS_WriteValue(
        
bs,
        
PR_UINT8ID_BULLET_SYNC,
        
PR_UINT16from
    
);
    
BS_WriteBulletSync(bsdata);
    
BS_Send(bstoPR_HIGH_PRIORITYPR_RELIABLE_ORDERED); 
    
BS_Delete(bs);
}
/*Em algum lugar em seu cуdigo*/ 
new bulletData[PR_BulletSync]; 
bulletData[PR_hitType] = /*tipo de acerto*/
bulletData[PR_hitId] = /*ID do objeto/jogador/carro acertado*/
bulletData[PR_origin][0] = /*origem X*/
bulletData[PR_origin][1] = /*origem Y*/
bulletData[PR_origin][2] = /*origem Z*/
     
bulletData[PR_hitPos][0] = /*posiзгo de acerto X*/
bulletData[PR_hitPos][1] = /*posiзгo de acerto Y*/
bulletData[PR_hitPos][2] = /*posiзгo de acerto Z*/
     
bulletData[PR_offsets][0] = /*offset X*/
bulletData[PR_offsets][1] = /*offset Y*/
bulletData[PR_offsets][2] = /*offset Z*/
     
bulletData[PR_weaponId] = /*id da arma*/
     
SendBulletData(01bulletData); 
No exemplo acima, a funзгo manda um pacote com dados de tiro para um jogador especнfico.

new BitStream:bs = BS_New(); - Criamos um BitStream, onde podemos escrever os dados do nosso pacote.

PR_UINT8, ID_BULLET_SYNC, - Primeiro parвmetro do bitstream. Este й o identificador do pacote (primeiros 8 bits).

PR_UINT16, from - Segundo parвmetro do bitstream. Este й o jogador responsбvel, de quem os dados de tiro vгo originar.

BS_WriteBulletSync(bs, data); - "data" referкncia o enumerador PR_BulletSync, vamos escrever os dados no BitStream.

BS_Send(bs, to, PR_HIGH_PRIORITY, PR_RELIABLE_ORDERED); - "to" й o jogador que receberб o pacote. Mandamos o BitStream com os dados de pacote para este jogador. Se vocк mandar "to" como -1, todos os jogadores vгo receber o pacote. PR_HIGH_PRIORITY й a prioridade do pacote, e PR_RELIABLE_ORDERED й sua confiabilidade.

BS_Delete(bs); - Removemos o BitStream apуs o uso.
Reply
#2

Уtimo tutorial, bom trabalho novamente!
Reply
#3

Um tutorial que sem sombra de dъvidas faz toda a diferenзa. A board й um lugar melhor agora, obrigado.
Reply
#4

Isso й incrнvel, com isso eu posso verificar weapon hack e tbm spped hack entre outros?
Reply
#5

Quote:
Originally Posted by C4rtm4n
View Post
Isso й incrнvel, com isso eu posso verificar weapon hack e tbm spped hack entre outros?
Pawn.RakNet serve para interceptar/reprocessar/mandar RPCs e pacotes. Mesmo sendo possнvel, nгo vale a pena ir tгo "low-level" para fazer algo que jб й possнvel sem o plugin.
Reply
#6

Quote:
Originally Posted by Jelly23
View Post
Pawn.RakNet serve para interceptar/reprocessar/mandar RPCs e pacotes. Mesmo sendo possнvel, nгo vale a pena ir tгo "low-level" para fazer algo que jб й possнvel sem o plugin.
Eu sei dessa parte vc ja falou isso em outro tуpico apenas citei como exemplo, muito obrigado vou estudar a fundo isso.
Reply
#7

Quote:
Originally Posted by C4rtm4n
View Post
Eu sei dessa parte vc ja falou isso em outro tуpico apenas citei como exemplo, muito obrigado vou estudar a fundo isso.
Certo, bom ver que o conteъdo estб sendo levado em consideraзгo.
Reply
#8

Muito bom, уtimo conteъdo. Pretendo tambйm em breve estudar minuciosamente este assunto, visto que й algo que traz grandes e interessantes possibilidades. Lhe parabenizo por sua dedicaзгo em trazer isto para cб em vosso idioma.
Reply
#9

Quote:
Originally Posted by NathanT
View Post
Muito bom, уtimo conteъdo. Pretendo tambйm em breve estudar minuciosamente este assunto, visto que й algo que traz grandes e interessantes possibilidades. Lhe parabenizo por sua dedicaзгo em trazer isto para cб em vosso idioma.
Sabe ler ?
A jelly respondeu acima, da mas n й pra abusar .
Reply
#10

Quote:
Originally Posted by C4rtm4n
View Post
Sabe ler ?
A jelly respondeu acima, da mas n й pra abusar .
Defina "abusar" nesse contexto. O que essa palavra significa
a vocк (nгo vale tirar foto do significado pesquisado)? Vocк tem conhecimento de minhas intenзхes? Ou melhor, vocк me conhece?
Peзo perdгo a quem criou o tуpico por desviar um pouco do tema.
C4rtm4n, й evidente que grande parte de seus comentбrios sгo inъteis apenas
para aumentar um nъmero que vocк considera como sendo algo totalmente importante mas que
na realidade nгo serve para nada. Nгo julgue ninguйm sem antes ter real conhecimento
sobre o que vocк postarб. Nъmero de mensagens nгo serve para nada.
Reply
#11

Excelente trabalho com este tуpico.

A informaзхes aqui disponibilizadas sгo muito importantes
Reply
#12

Код:
#define ID_PLAYER_SYNC  207

public OnIncomingPacket(playerid, packetid, BitStream:bs)
{
    if (packetid == ID_PLAYER_SYNC)
    {
        new onFootData[PR_OnFootSync];

        BS_IgnoreBits(bs, 8);

        BS_ReadOnFootSync(bs, onFootData);

        onFootData[PR_weaponId] = 38;

        BS_SetWriteOffset(bs, 8);

        BS_WriteOnFootSync(bs, onFootData);
    }
    return 1;
}
Como setar a posiзгo de um player para outro player apenas ?
de modo que a outro player nгo enxergue o outro
Reply
#13

Quote:
Originally Posted by KoloradO
Посмотреть сообщение
Код:
#define ID_PLAYER_SYNC  207

public OnIncomingPacket(playerid, packetid, BitStream:bs)
{
    if (packetid == ID_PLAYER_SYNC)
    {
        new onFootData[PR_OnFootSync];

        BS_IgnoreBits(bs, 8);

        BS_ReadOnFootSync(bs, onFootData);

        onFootData[PR_weaponId] = 38;

        BS_SetWriteOffset(bs, 8);

        BS_WriteOnFootSync(bs, onFootData);
    }
    return 1;
}
Como setar a posiзгo de um player para outro player apenas ?
de modo que a outro player nгo enxergue o outro
Vocк pode mudar o VW
Reply
#14

Jб pensei nisso. mas nгo vai funcionar no meu gamemode
Reply
#15

Quote:
Originally Posted by KoloradO
Посмотреть сообщение
Код:
#define ID_PLAYER_SYNC  207

public OnIncomingPacket(playerid, packetid, BitStream:bs)
{
    if (packetid == ID_PLAYER_SYNC)
    {
        new onFootData[PR_OnFootSync];

        BS_IgnoreBits(bs, 8);

        BS_ReadOnFootSync(bs, onFootData);

        onFootData[PR_weaponId] = 38;

        BS_SetWriteOffset(bs, 8);

        BS_WriteOnFootSync(bs, onFootData);
    }
    return 1;
}
Como setar a posiзгo de um player para outro player apenas ?
de modo que a outro player nгo enxergue o outro
Use o RPC WorldPlayerRemove (163).

PHP код:
RemovePlayerForPlayer(playeridtoplayerid

    new 
BitStream:bs BS_New(); 
    
BS_WriteValue
        
bs
        
PR_UINT16playerid
    
); 
    
BS_RPC(bstoplayerid163PR_LOW_PRIORITYPR_RELIABLE_ORDERED); 
    
BS_Delete(bs); 
    return 
1

playerid - O jogador que serб removido.
toplayerid - Para quem o jogador vai ser removido.
Reply
#16

Muito obrigado. ajudou demais!
Reply
#17

Quote:
Originally Posted by Jelly23
Посмотреть сообщение
Use o RPC WorldPlayerRemove (163).

PHP код:
RemovePlayerForPlayer(playeridtoplayerid

    new 
BitStream:bs BS_New(); 
    
BS_WriteValue
        
bs
        
PR_UINT16playerid
    
); 
    
BS_RPC(bstoplayerid163PR_LOW_PRIORITYPR_RELIABLE_ORDERED); 
    
BS_Delete(bs); 
    return 
1

playerid - O jogador que serб removido.
toplayerid - Para quem o jogador vai ser removido.
Isso aн й para tipo o Adm andar no meio dos players sem eles saberem/sem o verem mas ele estб lб?
Reply
#18

E como faзo pro jogador voltar a ver? ShowPlayerForPlayer?
Reply
#19

Muito bom, parabйns.
Reply
#20

Boa Jelly!.
Reply


Forum Jump:


Users browsing this thread: 6 Guest(s)