grenade_launchers.inc 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. /*
  2. file: items/grenade_launchers.inc
  3. description: Custom grenade launcher script for special factions and groups.
  4. author: Jay Cortez
  5. date created: 31st March 2018
  6. */
  7. // If this script needs to be disabled, simply set the define below to true
  8. #define GRENADE_LAUNCHERS_DISABLED true
  9. #if GRENADE_LAUNCHERS_DISABLED == true
  10. #endinput
  11. #endif
  12. #include <projectile>
  13. #define GRENADE_SPEED 40.0
  14. #define GRENADE_OBJECT 342
  15. new bool:grenadeLoaded[MAX_PLAYERS],
  16. grenadeObject[MAX_PLAYERS],
  17. bool:grenadeLaunched[MAX_PLAYERS];
  18. Hook:GrLaunch_OnPlayerConnect(playerid) {
  19. grenadeLoaded[playerid] = false;
  20. grenadeLaunched[playerid] = false;
  21. grenadeObject[playerid] = INVALID_OBJECT_ID;
  22. }
  23. // Command to load grenades into the grenade launcher attachment
  24. CMD:loadgrenades(playerid, params[])
  25. return cmd_loadgrenade(playerid, params);
  26. CMD:grenadelauncher(playerid, params[])
  27. return cmd_loadgrenade(playerid, params);
  28. CMD:loadgrenade(playerid, params[]) {
  29. if(!CanUseGrenadeLauncher(playerid))
  30. return 1;
  31. if(grenadeLaunched[playerid])
  32. return SendClientMessage(playerid, COLOR_GREY, "You have already fired a grenade, let it explode first.");
  33. if(grenadeLoaded[playerid])
  34. return SendClientMessage(playerid, COLOR_GREY, "There is already a grenade in your grenade launcher.");
  35. if(!PlayerHasWeapon(playerid, WEAPON_GRENADE))
  36. return SendClientMessage(playerid, COLOR_GREY, "You do not have any grenades on you.");
  37. if(!PlayerHasWeapon(playerid, WEAPON_M4))
  38. return SendClientMessage(playerid, COLOR_GREY, "You do not have a M4 carbine on you.");
  39. ApplyAnimationEx(playerid, "COLT45", "sawnoff_reload", 4.0, 0, 0, 0, 0, 0);
  40. grenadeLoaded[playerid] = true;
  41. SendClientMessage(playerid, COLOR_LIGHTBLUE, "* You have loaded a grenade into the grenade launcher attachment.");
  42. return 1;
  43. }
  44. // Determines who is allowed to use the grenade launchers
  45. CanUseGrenadeLauncher(playerid) {
  46. if(
  47. PlayerInfo[playerid][pGroup] == GROUP_S9 ||
  48. PlayerInfo[playerid][pGroup] == GROUP_HITMAN
  49. ) return true;
  50. return false;
  51. }
  52. // Called when the player fires a shot
  53. Hook:GrLaunch_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ) {
  54. if(CanUseGrenadeLauncher(playerid) && grenadeLoaded[playerid]) {
  55. if(weaponid == WEAPON_M4) {
  56. // Set variables
  57. grenadeLoaded[playerid] = false;
  58. grenadeLaunched[playerid] = true;
  59. // Get vector
  60. new Float:fPX,
  61. Float:fPY,
  62. Float:fPZ;
  63. GetPlayerCameraPos(playerid, fPX, fPY, fPZ);
  64. new Float:fVX,
  65. Float:fVY,
  66. Float:fVZ;
  67. GetPlayerCameraFrontVector(playerid, fVX, fVY, fVZ);
  68. const Float:fScale = 5.0;
  69. new Float:object_x = fPX + floatmul(fVX, fScale);
  70. new Float:object_y = fPY + floatmul(fVY, fScale);
  71. new Float:object_z = fPZ + floatmul(fVZ, fScale);
  72. // Create the projectile
  73. new proj = Projectile(object_x, object_y, object_z, GRENADE_SPEED * fVX, GRENADE_SPEED * fVY, (GRENADE_SPEED * fVZ) + 5.0, .air_resistance = 1.0, .sphere_radius = 0.010, .gravity = 15.0);
  74. // Create the object
  75. new obj = CreateDynamicObject(GRENADE_OBJECT, object_x, object_y, object_z + 0.5, 0, 0, 0);
  76. grenadeObject[playerid] = obj;
  77. Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, proj);
  78. // Update streamer for all players
  79. for(new i, j = GetPlayerPoolSize(); i <= j; i++)
  80. {
  81. Streamer_UpdateEx(i, object_x, object_y, object_z, .type = STREAMER_TYPE_OBJECT);
  82. }
  83. displayCenterHUDInfo(playerid, "~r~~k~~SNEAK_ABOUT~ ~w~to explode grenade.", 4);
  84. return 0;
  85. }
  86. }
  87. return 1;
  88. }
  89. public OnProjectileUpdate(projid)
  90. {
  91. new Float:projx,
  92. Float:projy,
  93. Float:projz;
  94. for (new i; i < MAX_PLAYERS; i++)
  95. {
  96. if(
  97. !IsPlayerConnected(i) ||
  98. !CanUseGrenadeLauncher(i) ||
  99. grenadeObject[i] == INVALID_OBJECT_ID
  100. ) continue;
  101. if(Streamer_GetIntData(STREAMER_TYPE_OBJECT, grenadeObject[i], E_STREAMER_EXTRA_ID) == projid)
  102. {
  103. GetProjectilePos(projid, projx, projy, projz);
  104. SetDynamicObjectPos(grenadeObject[i], projx, projy, projz);
  105. GetProjectileRot(projid, projx, projy, projz);
  106. SetDynamicObjectRot(grenadeObject[i], projx, projy, projz);
  107. break;
  108. }
  109. }
  110. return 1;
  111. }
  112. public OnProjectileCollide(projid, type, Float:x, Float:y, Float:z, extraid)
  113. {
  114. for(new i; i < MAX_PLAYERS; i++)
  115. {
  116. if(
  117. !IsPlayerConnected(i) ||
  118. !CanUseGrenadeLauncher(i) ||
  119. !grenadeLaunched[i]
  120. ) continue;
  121. if(Streamer_GetIntData(STREAMER_TYPE_OBJECT, grenadeObject[i], E_STREAMER_EXTRA_ID) == projid)
  122. {
  123. CreateExplosion(x, y, z, 2, 10.0);
  124. StopProjectile(projid);
  125. DestroyDynamicObjectEx(grenadeObject[i]);
  126. grenadeLaunched[i] = false;
  127. break;
  128. }
  129. }
  130. return 1;
  131. }
  132. // Called when key state changes
  133. Hook:GrLa_OnPlayerKeyStateChange(playerid, newkeys, oldkeys) {
  134. // Explode the grenade
  135. if(CanUseGrenadeLauncher(playerid) && grenadeLaunched[playerid]) {
  136. if(PRESSED(KEY_WALK)) {
  137. new projid = Streamer_GetIntData(STREAMER_TYPE_OBJECT, grenadeObject[playerid], E_STREAMER_EXTRA_ID);
  138. new Float:x, Float:y, Float:z;
  139. GetDynamicObjectPos(grenadeObject[playerid], x, y, z);
  140. CreateExplosion(x, y, z, 2, 10.0);
  141. StopProjectile(projid);
  142. DestroyDynamicObjectEx(grenadeObject[playerid]);
  143. grenadeLaunched[playerid] = false;
  144. OnePlayAnim(playerid, "PED", "bomber", 4.1, 0, 0, 0, 0, 0);
  145. }
  146. }
  147. }