All pastes #1254889 Raw Edit

IsPlayerInArc

public cpp v1 · immutable
#1254889 ·published 2008-11-13 01:55 UTC
rendered paste body
#if !defined INFINITY	#define INFINITY Float:0x7F800000#endif#define _IsPlayerInArc_ResolveAngle(%0) \	((%0 == 0.0) ? (INFINITY) : ((%0 == 180.0) ? (-INFINITY) : ((%0 == 90.0 || %0 == 270.0) ? (py) : (((x - px) / floattan(%0, degrees)) + py))))stock IsPlayerInArc(playerid, Float:angle1, Float:angle2, Float:distance, Float:px, Float:py, Float:pz){	// Bound angle 1 for simple calculations	if (angle1 >= angle2 + 360.0 || angle2 >= angle1 + 360.0)	{		return 1;	}	else if (angle1 == angle2)	{		return 0;	}	// Get the player's position	new		Float:x,		Float:y,		Float:z;	GetPlayerPos(playerid, x, y, z);	// Check if they're in range - no point doing complex maths if they're not	if (((x - px) * (x - px)) + ((y - py) * (y - py)) + ((z - pz) * (z - pz)) > (distance * distance) || angle1 == angle2)	{		return 0;	}	while (angle1 > 360.0)	{		angle1 -= 360.0;	}	while (angle1 < 0.0)	{		angle1 += 360.0;	}	// Bound angle 2	while (angle2 > 360.0)	{		angle2 -= 360.0;	}	while (angle2 < 0.0)	{		angle2 += 360.0;	}	new		Float:p1 = _IsPlayerInArc_ResolveAngle(angle1),		Float:p2 = _IsPlayerInArc_ResolveAngle(angle2);	// Handle all events, 180 needs dealing with specially	if (angle1 == 180.0)	{		if (angle2 < angle1)		{			return (x >= px) && (p2 >= y);		}		else		{			return (x <= px) && (p2 >= y);		}	}	else if (angle2 == 180.0)	{		if (angle1 < angle2)		{			return (x >= px) && (p1 >= y);		}		else		{			return (x <= px) && (p1 >= y);		}	}	else if (angle1 < 180.0)	{		// The order here is very important		if (angle2 > angle1 + 180.0)		{			return (p1 >= y) || (p2 >= y);		}		else if (angle2 < angle1)		{			return (p1 <= y) && (p2 >= y);		}		else if (angle2 <= 180.0)		{			return (p1 >= y) && (p2 <= y);		}		else		{			return (p1 >= y) && (p2 >= y);		}	}	else	{		// The order here is very important		if (angle2 < angle1 - 180.0)		{			return (p1 >= y) || (p2 >= y);		}		else if (angle2 < 180.0)		{			return (p1 >= y) && (p2 >= y);		}		else if (angle2 < angle1)		{			return (p1 >= y) && (p2 <= y);		}		else		{			return (p1 <= y) && (p2 >= y);		}	}}