13.08.2018, 23:56
(
Последний раз редактировалось BrunoBM23; 12.10.2018 в 20:25.
)
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(playerid, amount)
{
Dinheiro[playerid] += amount;
GivePlayerMoney(playerid, amount);
return 1;
}
stock MinhaInclude_ResetPlayerMoney(playerid)
{
Dinheiro[playerid] = 0;
ResetPlayerMoney(playerid);
return 1;
}
...MinhaInclude_GivePlayerMoney = Hook em GivePlayerMoney
...MinhaInclude_ResetPlayerMoney = Hook em ResetPlayerMoney
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(playerid, rpcid, BitStream:bs)
{
if(rpcid == ORPC_GivePlayerMoney)
{
BS_ReadValue(
bs,
PR_UINT32, Dinheiro[playerid]
);
}
else if(rpcid == ORPC_ResetPlayerMoney)
{
Dinheiro[playerid] = 0;
}
return 1;
}
Onde eu posso encontrar os IDs de RPCs? https://github.com/BrunoBM16/samp-rpc-list/wiki