/* Weapon RG6 Buldog Grenade Launcher by NiHiLaNTh. Two fire modes swithable by right mouse button - instant explosion and bouncing! Credits: KORD_12.7, Shapirlic, Arkshine, GordonFreeman(RU) Only for HL and only under WeaponMod module!!! Have Fun! */ /* AMX Mod X * 6G30 aka RG6. * * http://aghl.ru/forum/ - Russian Half-Life and Adrenaline Gamer Community * * This file is provided as is (no warranties) */ #pragma semicolon 1 #pragma ctrlchar '\' #include #include #include #include // Plugin settings #define PLUGIN "6G30 aka RG-6" #define VERSION "1.3a_aghlru" #define AUTHOR "NiHiLaNTh" // Modification for aghl.ru by KORD_12.7 // Weapon settings #define WEAPON_NAME "weapon_6g30" #define WEAPON_SLOT 2 #define WEAPON_POSITION 3 #define WEAPON_PRIMARY_AMMO "ARgrenades" #define WEAPON_PRIMARY_AMMO_MAX 10 #define WEAPON_SECONDARY_AMMO "" // NULL #define WEAPON_SECONDARY_AMMO_MAX -1 #define WEAPON_MAX_CLIP 6 #define WEAPON_DEFAULT_AMMO 6 #define WEAPON_FLAGS 0 #define WEAPON_WEIGHT 20 #define WEAPON_DAMAGE 100.0 // Hud #define WEAPON_HUD_TXT "sprites/weapon_6g30.txt" #define WEAPON_HUD_SPR "sprites/weapon_6g30.spr" #define WEAPON_CROSSHAIR "sprites/rgcross.spr" // Models #define MODEL_WORLD "models/w_rg6.mdl" #define MODEL_VIEW "models/v_rg6.mdl" #define MODEL_PLAYER "models/p_rg6.mdl" // Sounds #define SOUND_FIRE "weapons/rg6/fire1.wav" #define SOUND_RELOAD_0 "weapons/rg6/start.wav" #define SOUND_RELOAD_1 "weapons/rg6/reload.wav" #define SOUND_RELOAD_2 "weapons/rg6/next.wav" #define SOUND_RELOAD_3 "weapons/rg6/end.wav" // Grenade velocity #define GRENADE_VELOCITY 1500 #define GRENADE_CLASSNAME "rg6grenade" // Animation #define ANIM_EXTENSION "gauss" // Animation Sequence enum _:eRG6 { RG6_IDLE = 0, RG6_HOLSTER, RG6_DRAW, RG6_SHOOT, RG6_RELOAD1, RG6_RELOAD2, RG6_RELOAD3 }; #define SET_SIZE(%0,%1,%2) engfunc(EngFunc_SetSize,%0,%1,%2) new g_iszGrenadeClassName; //********************************************** //* Precache resources * //********************************************** public plugin_precache() { PRECACHE_MODEL(MODEL_VIEW); PRECACHE_MODEL(MODEL_WORLD); PRECACHE_MODEL(MODEL_PLAYER); PRECACHE_SOUND(SOUND_FIRE); PRECACHE_SOUND(SOUND_RELOAD_0); PRECACHE_SOUND(SOUND_RELOAD_1); PRECACHE_SOUND(SOUND_RELOAD_2); PRECACHE_SOUND(SOUND_RELOAD_3); PRECACHE_GENERIC(WEAPON_HUD_TXT); PRECACHE_GENERIC(WEAPON_HUD_SPR); PRECACHE_GENERIC(WEAPON_CROSSHAIR); g_iszGrenadeClassName = engfunc(EngFunc_AllocString, GRENADE_CLASSNAME); } //********************************************** //* Register weapon. * //********************************************** public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR); new iRG6 = wpnmod_register_weapon ( WEAPON_NAME, WEAPON_SLOT, WEAPON_POSITION, WEAPON_PRIMARY_AMMO, WEAPON_PRIMARY_AMMO_MAX, WEAPON_SECONDARY_AMMO, WEAPON_SECONDARY_AMMO_MAX, WEAPON_MAX_CLIP, WEAPON_FLAGS, WEAPON_WEIGHT ); wpnmod_register_weapon_forward(iRG6, Fwd_Wpn_Spawn, "CRG6__Spawn" ); wpnmod_register_weapon_forward(iRG6, Fwd_Wpn_Deploy, "CRG6__Deploy" ); wpnmod_register_weapon_forward(iRG6, Fwd_Wpn_Idle, "CRG6__WeaponIdle" ); wpnmod_register_weapon_forward(iRG6, Fwd_Wpn_PrimaryAttack, "CRG6__PrimaryAttack" ); wpnmod_register_weapon_forward(iRG6, Fwd_Wpn_SecondaryAttack, "CRG6__SecondaryAttack" ); wpnmod_register_weapon_forward(iRG6, Fwd_Wpn_Reload, "CRG6__Reload" ); wpnmod_register_weapon_forward(iRG6, Fwd_Wpn_Holster, "CRG6__Holster" ); } //********************************************** //* Weapon spawn. * //********************************************** public CRG6__Spawn(const iItem) { // Setting world model SET_MODEL(iItem, MODEL_WORLD); // Give a default ammo to weapon wpnmod_set_offset_int(iItem, Offset_iDefaultAmmo, WEAPON_DEFAULT_AMMO); } //********************************************** //* Deploys the weapon. * //********************************************** public CRG6__Deploy(const iItem, const iPlayer, const iClip) { return wpnmod_default_deploy(iItem, MODEL_VIEW, MODEL_PLAYER, RG6_DRAW, ANIM_EXTENSION); } //********************************************** //* Called when the weapon is holster. * //********************************************** public CRG6__Holster(const iItem) { // Cancel any reload in progress. wpnmod_set_offset_int(iItem, Offset_iInSpecialReload, 0); } //********************************************** //* The main attack of a weapon is triggered. * //********************************************** public CRG6__PrimaryAttack(const iItem, const iPlayer, iClip) { Grenade_Fire(iItem, iPlayer, false, iClip); } public CRG6__SecondaryAttack(const iItem, const iPlayer, iClip) { Grenade_Fire(iItem, iPlayer, true, iClip); } //********************************************** //* Displays the idle animation for the weapon.* //********************************************** public CRG6__WeaponIdle(const iItem, const iPlayer, const iClip, const iAmmo) { wpnmod_reset_empty_sound( iItem ); if( wpnmod_get_offset_float( iItem, Offset_flTimeWeaponIdle ) > 0.0 ) { return; } new fInSpecialReload = wpnmod_get_offset_int( iItem, Offset_iInSpecialReload ); if( !iClip && !fInSpecialReload && iAmmo ) { CRG6__Reload( iItem, iPlayer, iClip, iAmmo ); } else if( fInSpecialReload != 0 ) { if( iClip != WEAPON_MAX_CLIP && iAmmo ) { CRG6__Reload( iItem, iPlayer, iClip, iAmmo ); } else { // reload debounce has timed out wpnmod_send_weapon_anim( iItem, RG6_RELOAD3 ); wpnmod_set_offset_int( iItem, Offset_iInSpecialReload, 0 ); wpnmod_set_offset_float( iItem, Offset_flTimeWeaponIdle, 1.5 ); } } } //********************************************** //* Called when the weapon is reloaded. * //********************************************** public CRG6__Reload(const iItem, const iPlayer, const iClip, const iAmmo) { if(iAmmo <= 0 || iClip == WEAPON_MAX_CLIP) { return; } // don't reload until recoil is done if (wpnmod_get_offset_float(iItem, Offset_flNextPrimaryAttack) > 0.0) { return; } switch (wpnmod_get_offset_int(iItem, Offset_iInSpecialReload)) { case 0: { wpnmod_send_weapon_anim( iItem, RG6_RELOAD1 ); wpnmod_set_offset_int( iItem, Offset_iInSpecialReload, 1 ); wpnmod_set_offset_float( iItem, Offset_flTimeWeaponIdle, 0.5 ); wpnmod_set_offset_float( iItem, Offset_flNextPrimaryAttack, 1.0 ); wpnmod_set_offset_float( iItem, Offset_flNextSecondaryAttack, 1.0 ); } case 1: { if( wpnmod_get_offset_float( iItem, Offset_flTimeWeaponIdle ) > 0.0 ) return; // was waiting for gun to move to side wpnmod_set_offset_int( iItem, Offset_iInSpecialReload, 2 ); emit_sound( iPlayer, CHAN_ITEM, SOUND_RELOAD_1, VOL_NORM, ATTN_NORM, 0, PITCH_NORM ); wpnmod_send_weapon_anim( iItem, RG6_RELOAD2 ); wpnmod_set_offset_float( iItem, Offset_flTimeWeaponIdle, 1.25 ); } default: { wpnmod_set_offset_int( iItem, Offset_iClip, iClip + 1 ); wpnmod_set_player_ammo( iPlayer, WEAPON_PRIMARY_AMMO, iAmmo - 1 ); wpnmod_set_offset_int( iItem, Offset_iInSpecialReload, 1 ); } } } //********************************************** //* Launch a contact grenade. * //********************************************** Grenade_Fire(const iItem, const iPlayer, const iToss, iClip) { if (pev(iPlayer, pev_waterlevel) == 3 || iClip <= 0) { wpnmod_play_empty_sound(iItem); wpnmod_set_offset_float(iItem, Offset_flNextPrimaryAttack, 0.15); wpnmod_set_offset_float(iItem, Offset_flNextSecondaryAttack, 0.15); return; } new Float: vecOrigin[3]; new Float: vecVelocity[3]; wpnmod_send_weapon_anim(iItem, RG6_SHOOT); wpnmod_set_player_anim(iPlayer, PLAYER_ATTACK1); wpnmod_set_offset_int(iItem, Offset_iClip, iClip -= 1); wpnmod_set_offset_int(iItem, Offset_iInSpecialReload, 0); wpnmod_set_offset_int(iPlayer, Offset_iWeaponVolume, NORMAL_GUN_VOLUME); wpnmod_set_offset_int(iPlayer, Offset_iWeaponFlash, BRIGHT_GUN_FLASH); wpnmod_set_offset_float(iItem, Offset_flNextPrimaryAttack, 0.35); wpnmod_set_offset_float(iItem, Offset_flNextSecondaryAttack, 0.35); wpnmod_set_offset_float(iItem, Offset_flTimeWeaponIdle, (iClip != 0) ? 5.0 : 0.75); set_pev(iPlayer, pev_punchangle, Float:{ -7.0, -0.0, 0.0 }); set_pev(iPlayer, pev_effects, pev(iPlayer, pev_effects) | EF_MUZZLEFLASH); emit_sound(iPlayer, CHAN_WEAPON, SOUND_FIRE, 0.9, ATTN_NORM, 0, PITCH_NORM); velocity_by_aim(iPlayer, GRENADE_VELOCITY, vecVelocity); wpnmod_get_gun_position(iPlayer, vecOrigin, .flUpScale = -2.0); if (iToss) { state stTimedGrenade; } else { state stContactGrenade; } LaunchGrenade(iPlayer, vecOrigin, vecVelocity); } LaunchGrenade(const iPlayer, const Float: vecOrigin[3], const Float: vecVelocity[3]) { new iGrenade = wpnmod_fire_contact_grenade(iPlayer, vecOrigin, vecVelocity); if (pev_valid(iGrenade)) { set_pev(iGrenade, pev_dmg, WEAPON_DAMAGE); set_pev_string(iGrenade, pev_classname, g_iszGrenadeClassName); } } LaunchGrenade(const iPlayer, const Float: vecOrigin[3], const Float: vecVelocity[3]) { new iGrenade = wpnmod_fire_timed_grenade(iPlayer, vecOrigin, vecVelocity); if (pev_valid(iGrenade)) { set_pev(iGrenade, pev_dmg, WEAPON_DAMAGE); set_pev(iGrenade, pev_avelocity, Float: {300.0, 300.0, 300.0}); set_pev_string(iGrenade, pev_classname, g_iszGrenadeClassName); SET_MODEL(iGrenade, "models/grenade.mdl"); SET_SIZE(iGrenade, Float: {-4.0, -4.0, -4.0}, Float: {4.0, 4.0, 4.0}); } }