1
0

angdist.inc 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // Angle & Distance Management by SlashQ
  2. // I didn't make these, but rather optimize the codes & shove them in an include.
  3. #include <a_samp>
  4. stock Float:GetDistanceBetweenPlayers(p1, p2) {
  5. new
  6. Float: x1,
  7. Float: y1,
  8. Float: z1,
  9. Float: x2,
  10. Float: y2,
  11. Float: z2;
  12. if(!IsPlayerConnected(p1) || !IsPlayerConnected(p2)) return -1.00;
  13. GetPlayerPos(p1, x1, y1, z1);
  14. GetPlayerPos(p2, x2, y2, z2);
  15. return floatsqroot(floatpower(floatabs(floatsub(x2, x1)), 2) + floatpower(floatabs(floatsub(y2, y1)), 2) + floatpower(floatabs(floatsub(z2, z1)), 2));
  16. }
  17. stock Float:DistanceCameraTargetToLocation(Float:camX, Float:camY, Float:camZ, Float:objX, Float:objY, Float:objZ, Float:frX, Float:frY, Float:frZ) {
  18. new
  19. Float: dist = floatsqroot((camX - objX) * (camX - objX) + (camY - objY) * (camY - objY) + (camZ - objZ) * (camZ - objZ)),
  20. Float: tmpX = (frX * dist) + camX,
  21. Float: tmpY = (frY * dist) + camY,
  22. Float: tmpZ = (frZ * dist) + camZ;
  23. return floatsqroot((tmpX - objX) * (tmpX - objX) + (tmpY - objY) * (tmpY - objY) + (tmpZ - objZ) * (tmpZ - objZ));
  24. }
  25. stock Float:GetPointAngleToPoint(Float:x2, Float:y2, Float:X, Float:Y) {
  26. new
  27. Float:dx,
  28. Float:dy,
  29. Float:angle;
  30. dx = floatabs(floatsub(x2, X));
  31. dy = floatabs(floatsub(y2, Y));
  32. if (dy == 0.0 || dx == 0.0)
  33. {
  34. if(dy == 0 && dx > 0) angle = 0.0;
  35. else if(dy == 0 && dx < 0) angle = 180.0;
  36. else if(dy > 0 && dx == 0) angle = 90.0;
  37. else if(dy < 0 && dx == 0) angle = 270.0;
  38. else if(dy == 0 && dx == 0) angle = 0.0;
  39. }
  40. else
  41. {
  42. angle = atan(dx / dy);
  43. if(X > x2 && Y <= y2) angle += 90.0;
  44. else if(X <= x2 && Y < y2) angle = floatsub(90.0, angle);
  45. else if(X < x2 && Y >= y2) angle -= 90.0;
  46. else if(X >= x2 && Y > y2) angle = floatsub(270.0, angle);
  47. }
  48. return floatadd(angle, 90.0);
  49. }
  50. stock GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, &Float:z, &Float:a) {
  51. GetPlayerPos(playerid, x, y, z);
  52. GetPlayerFacingAngle(playerid, a);
  53. if (GetPlayerVehicleID(playerid)) GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
  54. x += (DISTANCE * floatsin(-a, degrees));
  55. y += (DISTANCE * floatcos(-a, degrees));
  56. return 1;
  57. }
  58. stock GetXYInFrontOfPoint(&Float:x, &Float:y, Float:angle, Float:distance) {
  59. x += (distance * floatsin(-angle, degrees));
  60. y += (distance * floatcos(-angle, degrees));
  61. return 1;
  62. }
  63. stock IsPlayerAimingAt(playerid, Float:x, Float:y, Float:z, Float:radius) {
  64. new
  65. Float: cam_x,
  66. Float: cam_y,
  67. Float: cam_z,
  68. Float: vector_x,
  69. Float: vector_y,
  70. Float: vector_z,
  71. Float: vertical,
  72. Float: horizontal,
  73. Float: angle,
  74. Float: resize_x,
  75. Float: resize_y,
  76. Float: resize_z;
  77. GetPlayerCameraPos(playerid, cam_x, cam_y, cam_z);
  78. GetPlayerCameraFrontVector(playerid, vector_x, vector_y, vector_z);
  79. if(GetPlayerWeapon(playerid) > 0)
  80. {
  81. if(GetPlayerWeapon(playerid) == 34 || GetPlayerWeapon(playerid) == 35 || GetPlayerWeapon(playerid) == 36)
  82. {
  83. if (DistanceCameraTargetToLocation(cam_x, cam_y, cam_z, x, y, z, vector_x, vector_y, vector_z) < radius) return 1;
  84. return 0;
  85. }
  86. else if(GetPlayerWeapon(playerid) == 30 || GetPlayerWeapon(playerid) == 31)
  87. {
  88. vertical = 4.0;
  89. horizontal = -1.6;
  90. }
  91. else if(GetPlayerWeapon(playerid) == 33)
  92. {
  93. vertical = 2.7;
  94. horizontal = -1.0;
  95. }
  96. else
  97. {
  98. vertical = 6.0;
  99. horizontal = -2.2;
  100. }
  101. }
  102. angle = GetPointAngleToPoint(0, 0, floatsqroot(vector_x * vector_x + vector_y * vector_y), vector_z) - 270.0;
  103. resize_x = floatsin((angle + vertical), degrees);
  104. resize_y = floatsin((angle + vertical), degrees);
  105. resize_z = floatsin((angle + vertical), degrees);
  106. GetXYInFrontOfPoint(resize_x, resize_y, GetPointAngleToPoint(0, 0, vector_x, vector_y) + horizontal, floatcos(angle + vertical, degrees));
  107. if (DistanceCameraTargetToLocation(cam_x, cam_y, cam_z, x, y, z, resize_x, resize_y, resize_z) < radius) return 1;
  108. return 0;
  109. }
  110. stock IsPlayerAimingAtPlayer(playerid, targetid) {
  111. new
  112. Float:x,
  113. Float:y,
  114. Float:z;
  115. GetPlayerPos(targetid, x, y, z);
  116. if(IsPlayerAimingAt(playerid, x, y, z - 0.75, 0.25)) return 1;
  117. else if(IsPlayerAimingAt(playerid, x, y, z - 0.25, 0.25)) return 1;
  118. else if(IsPlayerAimingAt(playerid, x, y, z + 0.25, 0.25)) return 1;
  119. else if(IsPlayerAimingAt(playerid, x, y, z + 0.75, 0.25)) return 1;
  120. return 0;
  121. }