Raised This Month: $51 Target: $400
 12% 

[L4D2] Airstuck teleportation patch


  
 
 
Thread Tools Display Modes
Prev Previous Post   Next Post Next
Krevik
Junior Member
Join Date: Mar 2021
Old 03-26-2021 , 15:55   Re: [L4D2] Airstuck teleportation patch
Reply With Quote #11

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
 



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 12:51.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode