It may be better to check three things at once (WHEN TELEPORTING):
-is outside world
-is distance made lastly big (ONLY XY coords, to avoid fake reports while jumping with survivor from height especially near 0,0,0 position)
-is close to 0,0,0 when the distance is big
And when checking if should save position should check if:
-isn't outside the world
-isn't distance made lastly big (also XY only coords)
-isn't too close to 0,0,0.
Something like here, however I am not familiar with sourcepawn code so I may have made some mistakes here. I am testing this on my server right now, will see.
Code:
public int GetXZDistance(float[3] vec1, float[3] vec2){
return SquareRoot(FloatAbs(((vec2[0]-vec1[0])*(vec2[0]-vec1[0]))+((vec2[1]-vec1[1])*(vec2[1]-vec1[1]))));
}
public Action SaveVictimPosition_Timer(Handle timer, any victim)
{
static float prevVictimPos[3];
static bool isOutsideWorld;
if (IsClientInGame(victim) && GetClientTeam(victim) == 2 && IsPlayerAlive(victim))
{
GetClientAbsOrigin(victim, prevVictimPos);
isOutsideWorld = TR_PointOutsideWorld(prevVictimPos);
float zeroVector[] = {0.0,0.0,0.0};
float distance = GetXZDistance(prevVictimPos, g_fVictimPrevPos);
float distanceToZero = GetXZDistance(prevVictimPos, zeroVector);
if ( !isOutsideWorld && distance < 700 && distanceToZero > 300)
{
g_fVictimPrevPos = prevVictimPos;
#if debug
CPrintToChatAll("{blue}[Jockey UnTeleport]{default} victim position saved.");
#endif
}
}
return Plugin_Continue;
}
public Action JockeyRideCheck_Timer(Handle timer, any victim)
{
static float newVictimPos[3];
static bool isOutsideWorld;
if (IsClientInGame(victim) && GetClientTeam(victim) == 2 && IsPlayerAlive(victim))
{
GetClientAbsOrigin(victim, newVictimPos);
isOutsideWorld = TR_PointOutsideWorld(newVictimPos);
float zeroVector[] = {0.0,0.0,0.0};
float distance = GetXZDistance(newVictimPos, g_fVictimPrevPos);
float distanceToZero = GetXZDistance(newVictimPos, zeroVector);
if ( isOutsideWorld || ( distance > 700 && distanceToZero < 300 ) )
{
CPrintToChatAll("[{green}!{default}] {olive}Jockey {default}teleported {green}survivor{default}. Moving {green}survivor {default}back to previous position.");
TeleportToPrevPos(victim);
}
}
return Plugin_Continue;
}