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