Quantcast
Channel: SA-MP Forums
Viewing all articles
Browse latest Browse all 18226

[Tutorial] Handlers - Pawn.RakNet

$
0
0
• Handlers - Pawn.RakNet
Outros tutoriais de Pawn.RakNet: RPC - Pawn.RakNet | Pacotes - Pawn.RakNet

Com handlers (manipuladores), você pode registrar uma callback para manipular pacotes e RPCs. Basicamente seria a mesma coisa que usar as callbacks originais OnIncomingRPC/Packet e OnOutcomingRPC/Packet, sendo que apenas o pacote/RPC específico utilizado por você ao registrar o handler, vai chegar na callback.

Tipos de handlers:
-PR_INCOMING_RPC: RPCs mandados pelo cliente ao servidor.
-PR_INCOMING_PACKET: Pacotes mandados pelo cliente ao servidor.
-PR_OUTCOMING_RPC: RPCs mandados pelo servidor ao cliente.
-PR_OUTCOMING_PACKET: Pacotes mandados pelo servidor ao cliente.
Função:
Code:

PR_RegHandler(id, const publicname[], PR_HandlerType:type)
id - O ID do Pacote/RPC que vai utilizar o handler.
publicname - A callback que será utilizada como handler (manipulador) do Pacote/RPC.
type - O tipo de handler (manipulador) que você vai registrar.
• Registrando um handler
Registrar um handler é bem simples. Leve em consideração que a callback de um handler deve ter dois parâmetros, sendo um para o jogador que vai receber/enviar o pacote/RPC (playerid) e outro para o BitStream (BitStream:bs).

PHP Code:

#define ID_PLAYER_SYNC  207

public OnGameModeInit()
{
    
PR_RegHandler(ID_PLAYER_SYNC"OnFootSync"PR_INCOMING_PACKET);
    return 
1;
}

forward OnFootSync(playeridBitStream:bs);
public 
OnFootSync(playeridBitStream:bs)
{
    new 
On_FootSync[PR_OnFootSync];

    
BS_IgnoreBits(bs8);
    
BS_ReadOnFootSync(bsOn_FootSync);

    
printf("Minha arma atual tem o ID: %i"On_FootSync[PR_weaponId]);
    return 
1;


O exemplo acima é facil de entender, podemos manipular o pacote 207 na callback OnFootSync.

Não vou explicar por que ignorar 8 bits, isso já foi explicado no tutorial anterior sobre pacotes. Eu recomendo você a ler os últimos dois tutoriais sobre RPCs e Pacotes antes de chegar no assunto de handlers (manipuladores).
• Erros relacionados com handlers
Esses são dois erros que podem aparecer em seus logs ao tentar registrar um handler:
n_PR_RegHandler: Public "Nome da callback que você usou" does not exist. - Bem óbvio, a callback que você registrou ao handler não existe, logo ele não funcionará.
n_PR_RegHandler: invalid array(T, N) subscript - O ID do RPC/Pacote é inválido, como, por exemplo, um ID de RPC acima de MAX_RPC_MAP_SIZE.
• Considerações
- Leve em consideração que as callbacks originais (OnIncomingPacket/RPC e OnOutcomingPacket/RPC) sempre vão ser chamadas antes das callbacks dos handlers. Então, se você tem um handler para o pacote 208 e retornar 0 na callback original, a callback do handler não será chamada. O mesmo se aplica a outros handlers, se você retornar 0 em handlers que foram registrados antes para um mesmo RPC/Pacote, as callbacks desse mesmo RPC/Pacote que pertencem a handlers que foram registrados depois, não vão ser chamadas.

-Se você registrar um handler e deixar o segundo parâmetro da função vazio (a callback do handler), o servidor vai sofrer um crash.

Viewing all articles
Browse latest Browse all 18226

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>