[Ajuda] Pawn.RakNet
#1

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 ?
Reply
#2

UP..
Reply
#3

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

Reply
#4

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?
Reply
#5

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
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)