Функция позволяет узнать угол поворота от точки до точки.
Код
stock Float:PointAngle(playerid, Float:xa, Float:ya, Float:xb, Float:yb)
{
new Float:carangle;
new Float:xc, Float:yc;
new Float:angle;
xc = floatabs(floatsub(xa,xb));
yc = floatabs(floatsub(ya,yb));
if (yc == 0.0 || xc == 0.0)
{
if(yc == 0 && xc > 0) angle = 0.0;
else if(yc == 0 && xc < 0) angle = 180.0;
else if(yc > 0 && xc == 0) angle = 90.0;
else if(yc < 0 && xc == 0) angle = 270.0;
else if(yc == 0 && xc == 0) angle = 0.0;
}
else
{
angle = atan(xc/yc);
if(xb > xa && yb <= ya) angle += 90.0;
else if(xb <= xa && yb < ya) angle = floatsub(90.0, angle);
else if(xb < xa && yb >= ya) angle -= 90.0;
else if(xb >= xa && yb > ya) angle = floatsub(270.0, angle);
}
GetVehicleZAngle(GetPlayerVehicleID(playerid), carangle);
return floatadd(angle, -carangle);
}
Оптимизация:
#define fclamp360(%0) %0 += (%0 >= 360.0) ? -360.0 : ((%0 < 0.0) ? 360.0 : 0.0)
Код
#define fclamp360(%0) %0 += (%0 >= 360.0) ? -360.0 : ((%0 < 0.0) ? 360.0 : 0.0)
stock ReturnZAngleToPoint(playerid, Float:x, Float:y)
{
new Float:P[4];
GetPlayerPos(playerid,P[0],P[1],P[2]);
P[3] = (180.0 - atan2(floatsub(P[0],x),floatsub(P[1],y)));
fclamp360(P[3]);
return P[3];
}