6G30 aka RG6 Buldog Grenade Launcher

6G30 aka RG6 Buldog Grenade Launcher 1.3-aghl

Нет прав для скачивания
Код:
/*
    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 <amxmodx>
#include <hamsandwich>
#include <hl_wpnmod>
#include <xs>


// 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]) <stContactGrenade>
{
    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]) <stTimedGrenade>
{
    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});
    }
}
Назад
Верх