View Single Post
Krevik
Junior Member
Join Date: Mar 2021
Old 03-26-2021 , 15:55   Re: [L4D2] Airstuck teleportation patch
Reply With Quote #41

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;
}

Last edited by Krevik; 03-27-2021 at 11:13. Reason: improved logic
Krevik is offline