| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- /*
- file: items/grenade_launchers.inc
- description: Custom grenade launcher script for special factions and groups.
- author: Jay Cortez
- date created: 31st March 2018
- */
- // If this script needs to be disabled, simply set the define below to true
- #define GRENADE_LAUNCHERS_DISABLED true
- #if GRENADE_LAUNCHERS_DISABLED == true
- #endinput
- #endif
- #include <projectile>
- #define GRENADE_SPEED 40.0
- #define GRENADE_OBJECT 342
- new bool:grenadeLoaded[MAX_PLAYERS],
- grenadeObject[MAX_PLAYERS],
- bool:grenadeLaunched[MAX_PLAYERS];
- Hook:GrLaunch_OnPlayerConnect(playerid) {
- grenadeLoaded[playerid] = false;
- grenadeLaunched[playerid] = false;
- grenadeObject[playerid] = INVALID_OBJECT_ID;
- }
- // Command to load grenades into the grenade launcher attachment
- CMD:loadgrenades(playerid, params[])
- return cmd_loadgrenade(playerid, params);
- CMD:grenadelauncher(playerid, params[])
- return cmd_loadgrenade(playerid, params);
- CMD:loadgrenade(playerid, params[]) {
- if(!CanUseGrenadeLauncher(playerid))
- return 1;
- if(grenadeLaunched[playerid])
- return SendClientMessage(playerid, COLOR_GREY, "You have already fired a grenade, let it explode first.");
- if(grenadeLoaded[playerid])
- return SendClientMessage(playerid, COLOR_GREY, "There is already a grenade in your grenade launcher.");
- if(!PlayerHasWeapon(playerid, WEAPON_GRENADE))
- return SendClientMessage(playerid, COLOR_GREY, "You do not have any grenades on you.");
- if(!PlayerHasWeapon(playerid, WEAPON_M4))
- return SendClientMessage(playerid, COLOR_GREY, "You do not have a M4 carbine on you.");
- ApplyAnimationEx(playerid, "COLT45", "sawnoff_reload", 4.0, 0, 0, 0, 0, 0);
- grenadeLoaded[playerid] = true;
- SendClientMessage(playerid, COLOR_LIGHTBLUE, "* You have loaded a grenade into the grenade launcher attachment.");
- return 1;
- }
- // Determines who is allowed to use the grenade launchers
- CanUseGrenadeLauncher(playerid) {
- if(
- PlayerInfo[playerid][pGroup] == GROUP_S9 ||
- PlayerInfo[playerid][pGroup] == GROUP_HITMAN
- ) return true;
- return false;
- }
- // Called when the player fires a shot
- Hook:GrLaunch_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ) {
- if(CanUseGrenadeLauncher(playerid) && grenadeLoaded[playerid]) {
- if(weaponid == WEAPON_M4) {
- // Set variables
- grenadeLoaded[playerid] = false;
- grenadeLaunched[playerid] = true;
- // Get vector
- new Float:fPX,
- Float:fPY,
- Float:fPZ;
- GetPlayerCameraPos(playerid, fPX, fPY, fPZ);
- new Float:fVX,
- Float:fVY,
- Float:fVZ;
- GetPlayerCameraFrontVector(playerid, fVX, fVY, fVZ);
- const Float:fScale = 5.0;
- new Float:object_x = fPX + floatmul(fVX, fScale);
- new Float:object_y = fPY + floatmul(fVY, fScale);
- new Float:object_z = fPZ + floatmul(fVZ, fScale);
- // Create the projectile
- 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);
-
- // Create the object
- new obj = CreateDynamicObject(GRENADE_OBJECT, object_x, object_y, object_z + 0.5, 0, 0, 0);
- grenadeObject[playerid] = obj;
- Streamer_SetIntData(STREAMER_TYPE_OBJECT, obj, E_STREAMER_EXTRA_ID, proj);
- // Update streamer for all players
- for(new i, j = GetPlayerPoolSize(); i <= j; i++)
- {
- Streamer_UpdateEx(i, object_x, object_y, object_z, .type = STREAMER_TYPE_OBJECT);
- }
- displayCenterHUDInfo(playerid, "~r~~k~~SNEAK_ABOUT~ ~w~to explode grenade.", 4);
- return 0;
- }
- }
- return 1;
- }
- public OnProjectileUpdate(projid)
- {
- new Float:projx,
- Float:projy,
- Float:projz;
- for (new i; i < MAX_PLAYERS; i++)
- {
- if(
- !IsPlayerConnected(i) ||
- !CanUseGrenadeLauncher(i) ||
- grenadeObject[i] == INVALID_OBJECT_ID
- ) continue;
- if(Streamer_GetIntData(STREAMER_TYPE_OBJECT, grenadeObject[i], E_STREAMER_EXTRA_ID) == projid)
- {
- GetProjectilePos(projid, projx, projy, projz);
- SetDynamicObjectPos(grenadeObject[i], projx, projy, projz);
- GetProjectileRot(projid, projx, projy, projz);
- SetDynamicObjectRot(grenadeObject[i], projx, projy, projz);
- break;
- }
- }
- return 1;
- }
- public OnProjectileCollide(projid, type, Float:x, Float:y, Float:z, extraid)
- {
- for(new i; i < MAX_PLAYERS; i++)
- {
- if(
- !IsPlayerConnected(i) ||
- !CanUseGrenadeLauncher(i) ||
- !grenadeLaunched[i]
- ) continue;
- if(Streamer_GetIntData(STREAMER_TYPE_OBJECT, grenadeObject[i], E_STREAMER_EXTRA_ID) == projid)
- {
- CreateExplosion(x, y, z, 2, 10.0);
- StopProjectile(projid);
- DestroyDynamicObjectEx(grenadeObject[i]);
- grenadeLaunched[i] = false;
- break;
- }
- }
- return 1;
- }
- // Called when key state changes
- Hook:GrLa_OnPlayerKeyStateChange(playerid, newkeys, oldkeys) {
- // Explode the grenade
- if(CanUseGrenadeLauncher(playerid) && grenadeLaunched[playerid]) {
- if(PRESSED(KEY_WALK)) {
- new projid = Streamer_GetIntData(STREAMER_TYPE_OBJECT, grenadeObject[playerid], E_STREAMER_EXTRA_ID);
- new Float:x, Float:y, Float:z;
- GetDynamicObjectPos(grenadeObject[playerid], x, y, z);
- CreateExplosion(x, y, z, 2, 10.0);
- StopProjectile(projid);
- DestroyDynamicObjectEx(grenadeObject[playerid]);
- grenadeLaunched[playerid] = false;
- OnePlayAnim(playerid, "PED", "bomber", 4.1, 0, 0, 0, 0, 0);
- }
- }
- }
|