SSGamers - 12 Anos online por você.

#SSGamers - A Comunidade que mais crescer no brasil!

Participe do fórum, é rápido e fácil

SSGamers - 12 Anos online por você.

#SSGamers - A Comunidade que mais crescer no brasil!

SSGamers - 12 Anos online por você.

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Chegou o novo tema 6.5.5 - SSGamers - Servidores online de qualidade - Aproveite e entre para nossa comunidade, inscreva-se já! - Ouça nossa web radio - Veja nossas novidades - Participe dos nossos setores de jogos online - Parcerias aberta fale já com um administrador.

    [Tutorial] Offsets de escrita/leitura - Pawn.RakNet

    Weslley_Script
    Weslley_Script
    SS - Fundador
    SS - Fundador


    Steam Steam : WeslleySSGames
    Zello : WeslleySSGames
    Mensagens : 11381
    Moedas : 1031991
    Data de inscrição : 06/10/2011
    Idade : 28
    Localização : Brasil

    [Tutorial] Offsets de escrita/leitura - Pawn.RakNet Empty [Tutorial] Offsets de escrita/leitura - Pawn.RakNet

    Mensagem por Weslley_Script Qui 16 Mar 2023 - 7:17

    Offsets de escrita/leitura - Pawn.RakNet


    Jб vi o pessoal tendo dъvidas em questгo das offsets de escrita e leitura no bitstream de um pacote, entгo resolvi criar este tutorial.

    Antes que possamos entender como isso funciona e quais seriam as offsets de cada parвmetro em um RPC ou pacote, temos que entender primeiramente quantos bits/bytes cada tipo de valor й equivalente. Abaixo, temos uma pequena tabela com essa informaзгo:













    Tipo de valorBitsBytes
    FLOAT324
    (U)INT32324
    (U)INT16162
    (U)INT881
    BOOL10,125
    Entendendo isso, vamos levar em consideraзгo o seguinte:

    Offset de leitura/escrita de um parвmetro = Soma da quantidade de bits do tipo de valor dos parвmetros anteriores.

    Jб tendo levado em consideraзгo a informaзгo acima, vamos para um exemplo:



    Código:
    new BitStream:my_bs = BS_New();
    BS_WriteValue (
        my_bs,
        PR_UINT16, 1,
        PR_UINT32, 2,
        PR_UINT16, 3,
        PR_UINT8, 4
    ); 

    No bitstream acima, temos um total de 9 bytes, que sгo equivalentes a 72 bits, pois 8 bits = 1 byte.

    Vamos supor que queremos ler o valor do ъltimo parвmetro, que й 4 e tem o tipo UINT8. Existem duas maneiras de ler esse valor, que seriam utilizando BS_SetReadOffset para mudar a offset de leitura, ou usando BS_IgnoreBits para ignorar os outros bits e ler apenas os ъltimos 8.

    Entгo levando em consideraзгo que com a soma da quantidade de bits do tipo de valor dos parвmetros anteriores vamos chegar atй as offsets do parвmetro que queremos, vamos fazer o seguinte:

    Exemplo 1 - BS_IgnoreBits
    Somando os bits dos parвmetros anteriores ao ъltimo, vamos chegar a 64 bits (16 + 32 + 16). Esses 64 bits sгo o nъmero que vamos ignorar, usando a funзгo da seguinte maneira:



    Código:
    BS_IgnoreBits(my_bs, 64); 

    Apуs haver ignorado os 64 bits que nгo temos intenзгo em ler, podemos ler o ъltimo parвmetro:



    Código:
    new var;
        
    BS_ReadValue (
        my_bs,
        PR_UINT8, var
    ); 

    Logo, apenas os ъltimos 8 bits vгo ser lidos.

    Exemplo 2 - BS_SetReadOffset
    A lуgica й a mesma, nуs vamos somar os bits dos parвmetros anteriores ao ъltimo, logo, vamos mudar as offsets de leitura para 64:



    Código:
    BS_SetReadOffset(my_bs, 64); 

    Apуs haver mudado a offset de leitura para 64, podemos ler o ъltimo parвmetro:



    Código:
    new var;
        
    BS_ReadValue (
        my_bs,
        PR_UINT8, var
    ); 

    Assim como no primeiro exemplo, apenas os ъltimos 8 bits vгo ser lidos.

    Leve em consideraзгo que a mesma lуgica se aplica para offsets de escrita. Assim como temos as funзхes BS_SetReadOffset, BS_GetReadOffset e BS_ResetReadPointer para leitura, temos BS_SetWriteOffset, BS_GetWriteOffset e BS_ResetWritePointer para escrita, enfim, essas funзхes fazem o seguinte:

    BS_SetWriteOffset - Muda as offsets de escrita.
    BS_GetWriteOffset - Obtйm a offset de escrita atual.
    BS_ResetWritePointer - "Reseta" as offsets de escrita, mudando para 0.

    BS_SetReadOffset - Muda as offsets de leitura.
    BS_GetReadOffset - Obtйm a offset de leitura atual.
    BS_ResetReadPointer - "Reseta" as offsets de leitura, mudando para 0.

    Sobre a escrita/leitura de dados
    O pessoal acha que vocк estб limitado a ler/escrever os dados usando a funзгo BS_WriteValue/BS_ReadValue uma ъnica vez, mas isso nгo й verdade. Como explicado acima, um bitstream tem offsets de leitura e escrita, e essa й a maneira utilizada para saber em qual offset vocк se encontra, logo, o seguinte tambйm й possнvel:



    Código:
    new BitStream:my_bs = BS_New();
    BS_WriteValue (
        my_bs,
        PR_UINT16, 1
    );
    BS_WriteValue (
        my_bs,
        PR_UINT32, 2
    );
    BS_WriteValue (
        my_bs,
        PR_UINT16, 3
    );
    BS_WriteValue (
        my_bs,
        PR_UINT8, 4
    ); 

    No exemplo acima, nуs escrevemos 72 bits no bitstream. Essa maneira й equivalente a:



    Código:
    new BitStream:my_bs = BS_New();
    BS_WriteValue (
        my_bs,
        PR_UINT16, 1,
        PR_UINT32, 2,
        PR_UINT16, 3,
        PR_UINT8, 4
    ); 

    Alguns RPCs tem estruturas bem longas, e poder escrever/ler seus parвmetros usando BS_WriteValue/BS_ReadValue mais de uma vez й algo beneficial, jб que temos um limite de 32 parвmetros por funзгo no Pawn.

    Creditos: Jelly23



    [Tutorial] Offsets de escrita/leitura - Pawn.RakNet D07Xwqb
    [Tutorial] Offsets de escrita/leitura - Pawn.RakNet Yjab9HN

      Data/hora atual: Sex 17 maio 2024 - 3:26