[Tutorial] Interligaзгo de sistemas - Pawn.RakNet
#1

Interligaзгo de sistemas - Pawn.RakNet


Vocк sabia que vocк pode fazer o uso de RPCs para interligar sistemas em instвncias de amx diferentes, como filterscripts e gamemode?

Vamos supor que vocк tem um sistema de dinheiro controlado pelo servidor, onde o dinheiro do cliente nгo importa, e vamos supor que esse sistema faz parte de uma include que й usada em seu gamemode, sendo estas algumas funзхes:

PHP код:
static Dinheiro[MAX_PLAYERS];
stock MinhaInclude_GivePlayerMoney(playeridamount)
{
    
Dinheiro[playerid] += amount;
    
GivePlayerMoney(playeridamount);
    return 
1;
}
stock MinhaInclude_ResetPlayerMoney(playerid)
{
    
Dinheiro[playerid] = 0;
    
ResetPlayerMoney(playerid);
    return 
1;
}
...
MinhaInclude_GivePlayerMoney Hook em GivePlayerMoney
...MinhaInclude_ResetPlayerMoney Hook em ResetPlayerMoney 
Se vocк nгo pretende usar funзхes relacionadas a dinheiro em outras instвncias de amx, vocк nгo precisa modificar nada. Se vocк pretende usar as funзхes em outras instвncias de amx, vocк terб problemas, e o dinheiro na matriz 'Dinheiro' nгo vai ser atualizado, a nгo ser que a funзгo tenha sido usada na mesma instвncia da amx onde a include se encontra (nesse caso, o gamemode).

Para contornar esse problema, vocк tem a alternativa de adaptar o filterscript usando pVars (que podem ser usadas em instвncias de amx distintas) ou criando uma funзгo com a keyword public que vocк pode executar atravйs do gamemode, usando CallRemoteFunction. Porйm, ambos os mйtodos requerem que vocк modifique essas instвncias (filterscript), adaptando as para funcionar com o seu sistema do gamemode.

Uma vantagem ao verificar os RPCs que o servidor envia й simplesmente o fato de que independente da instвncia da amx onde funзхes como SetPlayerPos, GivePlayerMoney ou SetPlayerHealth forem usadas, a callback OnOutcomingRPC serб executada, indicando que o servidor estб prestes a enviar determinado RPC ao cliente.

Verificando os RPCs enviados, vocк pode ter uma interligaзгo entre instвncias de amx distintas que usam determinadas funзхes relacionadas ao cliente, sem precisar fazer adaptaзхes nelas. Veja o exemplo das funзхes do exemplo de include, usando Pawn.RakNet:

PHP код:
/*Outgoing RPCS - RPCs que sгo enviados do servidor ao cliente*/
const ORPC_GivePlayerMoney 18;
const 
ORPC_ResetPlayerMoney 20;
static 
Dinheiro[MAX_PLAYERS];
/*OnOutcomingRPC*/
public OnOutcomingRPC(playeridrpcidBitStream:bs)
{
    if(
rpcid == ORPC_GivePlayerMoney)
    {            
        
BS_ReadValue(
            
bs,
            
PR_UINT32Dinheiro[playerid]
        );
    }
    else if(
rpcid == ORPC_ResetPlayerMoney)
    {
        
Dinheiro[playerid] = 0;
    }
    return 
1;

Qual a diferenзa nesse caso? Como dito antes, vocк nгo vai precisar adaptar outras instвncias de amx para funcionar com o seu sistema, pois vocк estб verificando quando o servidor estб enviando estes RPCs e nгo quando uma determinada funзгo й executada na prуpria instвncia da amx. Logo, vocк pode comeзar a usar seu sistema sem precisar se preocupar ou adaptar outras instвncias que venham a fazer o uso de funзхes relacionadas, porйm leve em consideraзгo que isto apenas funciona se determinada funзгo manda um RPC ao cliente.

Onde eu posso encontrar os IDs de RPCs? https://github.com/BrunoBM16/samp-rpc-list/wiki
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 3 Guest(s)