SA-MP Forums Archive
[Ajuda] Pawn.RakNet - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Português/Portuguese (https://sampforum.blast.hk/forumdisplay.php?fid=34)
+---- Thread: [Ajuda] Pawn.RakNet (/showthread.php?tid=660413)



Pawn.RakNet - KoloradO - 02.11.2018

Pessoal estou com um pequeno probleminha, fiz esse cуdigo aqui sу pra dar um exemplo do meu problema:

PHP Code:
#include <a_samp>
#undef MAX_PLAYERS
#define MAX_PLAYERS 100
#define FILTERSCRIPT
#include <Pawn.RakNet>
static
    
Float:old_pos[MAX_PLAYERS][3];
public 
OnPlayerUpdate(playerid){
    if(
GetPlayerDistanceFromPoint(playeridold_pos[playerid][0], old_pos[playerid][1], old_pos[playerid][2]) > 40.0)
    {
        
// Teleport Hack
    
}
    else 
GetPlayerPos(playeridold_pos[playerid][0], old_pos[playerid][1], old_pos[playerid][2]);
    
    return 
1;
}
public 
OnOutcomingRPC(playeridrpcidBitStream:bs){
    if(
rpcid == 12// SetPlayerPos
    
{
        
BS_ReadValue(bs,
            
PR_FLOATold_pos[playerid][0],
            
PR_FLOATold_pos[playerid][1],
            
PR_FLOATold_pos[playerid][2]);
    }
    return 
1;

Neste caso, quando eu uso SetPlayerPos no jogador, ele detecta TELEPORT mesmo eu pegando a posiзгo dele no OnOutcomingRPC.

Por que isso acontece e como resolver sem usar TIMER ?


Re: Pawn.RakNet - KoloradO - 03.11.2018

UP..


Re: Pawn.RakNet - BrunoBM23 - 03.11.2018

Por que old_pos vai ter as novas posiзхes antes mesmo do jogador ser teleportado atй lб.

PHP Code:
if(GetPlayerDistanceFromPoint(playeridold_pos[playerid][0], old_pos[playerid][1], old_pos[playerid][2]) > 40.0
Entгo faz sentido a distвncia de GetPlayerDistanceFromPoint ser maior que 40. Pois essa funзгo vai verificar a distвncia entre sua posiзгo atual e a nova, que nesse caso, й old_pos (Em que o jogador ainda nгo chegou).

Usar gettime para um pequeno delay geralmente funciona.

PHP Code:
#include <a_samp> 
#undef MAX_PLAYERS 
#define MAX_PLAYERS 100 
#define FILTERSCRIPT 
#include <Pawn.RakNet> 
static 
    
Float:old_pos[MAX_PLAYERS][3],
    
teleport_time[MAX_PLAYERS];
public 
OnPlayerConnect(playerid)
{
    
teleport_time[playerid] = 0;
    return 
1;
}
public 
OnPlayerUpdate(playerid){ 
    if(
GetPlayerDistanceFromPoint(playeridold_pos[playerid][0], old_pos[playerid][1], old_pos[playerid][2]) > 40.0 && teleport_time[playerid] < gettime()) 
    { 
        
// Teleport Hack 
    

    else 
GetPlayerPos(playeridold_pos[playerid][0], old_pos[playerid][1], old_pos[playerid][2]); 
     
    return 
1

public 
OnOutcomingRPC(playeridrpcidBitStream:bs){ 
    if(
rpcid == 12// SetPlayerPos 
    
{
        
teleport_time[playerid] = gettime() + 3
        
BS_ReadValue(bs
            
PR_FLOATold_pos[playerid][0], 
            
PR_FLOATold_pos[playerid][1], 
            
PR_FLOATold_pos[playerid][2]); 
    } 
    return 
1




Re: Pawn.RakNet - KoloradO - 03.11.2018

Quote:
Originally Posted by BrunoBM23
View Post
Por que old_pos vai ter as novas posiзхes antes mesmo do jogador ser teleportado atй lб.

PHP Code:
if(GetPlayerDistanceFromPoint(playeridold_pos[playerid][0], old_pos[playerid][1], old_pos[playerid][2]) > 40.0
Entгo faz sentido a distвncia de GetPlayerDistanceFromPoint ser maior que 40. Pois essa funзгo vai verificar a distвncia entre sua posiзгo atual e a nova, que nesse caso, й old_pos (Em que o jogador ainda nгo chegou).

Usar gettime para um pequeno delay geralmente funciona.

PHP Code:
#include <a_samp> 
#undef MAX_PLAYERS 
#define MAX_PLAYERS 100 
#define FILTERSCRIPT 
#include <Pawn.RakNet> 
static 
    
Float:old_pos[MAX_PLAYERS][3],
    
teleport_time[MAX_PLAYERS];
public 
OnPlayerConnect(playerid)
{
    
teleport_time[playerid] = 0;
    return 
1;
}
public 
OnPlayerUpdate(playerid){ 
    if(
GetPlayerDistanceFromPoint(playeridold_pos[playerid][0], old_pos[playerid][1], old_pos[playerid][2]) > 40.0 && teleport_time[playerid] < gettime()) 
    { 
        
// Teleport Hack 
    

    else 
GetPlayerPos(playeridold_pos[playerid][0], old_pos[playerid][1], old_pos[playerid][2]); 
     
    return 
1

public 
OnOutcomingRPC(playeridrpcidBitStream:bs){ 
    if(
rpcid == 12// SetPlayerPos 
    
{
        
teleport_time[playerid] = gettime() + 3
        
BS_ReadValue(bs
            
PR_FLOATold_pos[playerid][0], 
            
PR_FLOATold_pos[playerid][1], 
            
PR_FLOATold_pos[playerid][2]); 
    } 
    return 
1

ah sim, mas eu nгo queria usar timer pois os hackers se aproveitam disso, exemplo:

O jogador usa algum comando de teleport como /SF, entгo ele vai ficar imune ao AntiTeleport por alguns segundos jб que a funзгo SetPlayerPos foi usada nele entende?


Re: Pawn.RakNet - BrunoBM23 - 03.11.2018

Quote:
Originally Posted by KoloradO
View Post
ah sim, mas eu nгo queria usar timer pois os hackers se aproveitam disso, exemplo:

O jogador usa algum comando de teleport como /SF, entгo ele vai ficar imune ao AntiTeleport por alguns segundos jб que a funзгo SetPlayerPos foi usada nele entende?
Sim, mas vocк precisa de um delay. Vocк nunca terб uma forma precisa de saber quando o RPC realmente chegou ao cliente. Vocк terб vбrios problemas que enfrentar, como o famoso RT (Relуgio Travado) ou dessincronizaзгo: https://sampforum.blast.hk/showthread.php?tid=659658