[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
#2

Nгo sabia '-'

Tenho um pequeno interesse em estudar Pawn.RakNet

Bom Trabalho!
Reply
#3

isso й muito bom para quem utiliza muito conteudo de terceiros, ou filterscripts
Reply
#4

Atualizado.
Reply
#5

Acredito que CallRemoteFunction jб daria conta, nгo?

Mas tutorial do Pawn Raknet й sempre bem vindo, to adorando usa-lo.
Reply
#6

Quote:
Originally Posted by RiqueP
Посмотреть сообщение
Acredito que CallRemoteFunction jб daria conta, nгo?

Mas tutorial do Pawn Raknet й sempre bem vindo, to adorando usa-lo.
Sim, mas o propуsito e nгo necessitar de fazer adaptaзхes em outras instвncias da AMX. Utilizando CallRemoteFunction, ainda necessita que vocк modifique determinada instвncia e adicione a funзгo que deve ser executada, o que vai contra o propуsito do tуpico.

Exemplo: Vocк poderia saber quando o servidor deu uma arma a um jogador independente da instвncia da AMX onde GivePlayerWeapon foi utilizado, pois vocк estб verificando quando o servidor enviou determinado RPC para dar uma arma ao jogador, e nгo quando a funзгo foi executada.

Levando isso em conta, vocк pode fazer bibliotecas plug 'n play, onde nenhuma adaptaзгo em outras instвncias da AMX й necessбria, como no exemplo de anti-cheat providenciado acima (Sem falsos positivos por questгo de funзхes relacionadas serem utilizadas em outras instвncias).
Reply
#7

Bacana, outra grande vantagem estб na expansibilidade e manutenibilidade de sistemas. Em um cenбrio hipotйtico usando CallRemoteFunction, alйm de ter que mexer em todas as ocorrкncias de uma determinada funзгo em scripts de terceiros, se por ventura algo for alterado, o programador teria que modificar novamente essas ocorrкncias.

A vantagem apesar de parecer ser pouca, nгo й! E trбs seguranзa e flexibilidade para quem quer desenvolver.
Reply
#8

Quote:
Originally Posted by BrunoBM23
Посмотреть сообщение
Sim, mas o propуsito e nгo necessitar de fazer adaptaзхes em outras instвncias da AMX. Utilizando CallRemoteFunction, ainda necessita que vocк modifique determinada instвncia e adicione a funзгo que deve ser executada, o que vai contra o propуsito do tуpico.

Exemplo: Vocк poderia saber quando o servidor deu uma arma a um jogador independente da instвncia da AMX onde GivePlayerWeapon foi utilizado, pois vocк estб verificando quando o servidor enviou determinado RPC para dar uma arma ao jogador, e nгo quando a funзгo foi executada.

Levando isso em conta, vocк pode fazer bibliotecas plug 'n play, onde nenhuma adaptaзгo em outras instвncias da AMX й necessбria, como no exemplo de anti-cheat providenciado acima (Sem falsos positivos por questгo de funзхes relacionadas serem utilizadas em outras instвncias).
Eu fiquei com a mesma duvida do colega acima sobre a diferenзa da utilizaзгo do CallRemoteFunction e o Raknet.
E a sua explicaзгo nгo esclareceu muito pra mim, talvez para ele tenha sido boa...

O que vocк quer dizer com modificar determinada instвncia e adicionar a funзгo que deve ser executada?

Estou com essa duvida, porque ambos os mйtodos de certa forma sгo RPC, entгo se vocк vai utilizar o Raknet em um filterscript pra enviar dados para o GM, vocк ainda sim precisa implementar algo como Raknet.send dentro do filterscript, nгo?

Eu me lembro de ter usado o raknet mas era a versгo do C++ que й a mesma que o prуprio samp usa para manter os dados de players, etc, sincronizados com o servidor e vice-versa, nгo sei tambйm o quгo semelhante й essa biblioteca de pawn com a do C++.
Reply
#9

Quote:
Originally Posted by WLSF
Посмотреть сообщение
Eu fiquei com a mesma duvida do colega acima sobre a diferenзa da utilizaзгo do CallRemoteFunction e o Raknet.
E a sua explicaзгo nгo esclareceu muito pra mim, talvez para ele tenha sido boa...

O que vocк quer dizer com modificar determinada instвncia e adicionar a funзгo que deve ser executada?

Estou com essa duvida, porque ambos os mйtodos de certa forma sгo RPC, entгo se vocк vai utilizar o Raknet em um filterscript pra enviar dados para o GM, vocк ainda sim precisa implementar algo como Raknet.send dentro do filterscript, nгo?
Nгo, vocк nгo precisa modificar as outras instвncias da amx (outros filterscripts/gamemode). E realmente nгo importa se й um filterscript ou nгo. Estamos verificando se o servidor estб mandando pacotes para o cliente, e nгo verificando se uma determinada funзгo foi executada na prуpria instвncia.

O plugin й um wrapper para vocк trabalhar com RakNet em Pawn e muda o endereзo da virtual table. Entгo as funзхes Receive e Send da RakNet layer do SA-MP chamam algumas callbacks (OnIncomingPacket/RPC e OnOutcomingPacket/RPC) nas instвncias da amx (Nesse ponto, jб espero vocк saber o que й uma instвncia da amx) onde elas existem. Entгo nesse caso, essas callbacks sу precisam existir em uma ъnica instвncia, e vocк poderб trabalhar com todos os pacotes/RPCs enviados/recebidos pelo servidor.

Embora seja um pouco ambнguo, alguns pacotes em RakNet sгo chamados de RPCs, a ъnica diferenзa й eles executam uma funзгo que foi atribuнda a seu ID (O pessoal geralmente chama de "fancy packet", e vocк provavelmente entenda por que). Todas as funзхes com propуsitos de mudar a posiзгo, etc sгo RPCs.

Independente da instвncia, podemos saber quando o servidor tentou, por exemplo, mudar a posiзгo do jogador, pois nesse caso estamos verificando se um RPC (Nada mais do que um pacote) estб sendo enviado para o cliente com esse propуsito.
Reply
#10

Excelente mйtodo, simples e prбtico, ainda nгo entendi o porque de surgirem tantas dъvidas.

Grato pela contribuiзгo.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)