Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "extdll.h"
- #include "util.h"
- #include "cbase.h"
- #include "monsters.h"
- #include "weapons.h"
- #include "nodes.h"
- #include "player.h"
- #include "gamerules.h"
- enum autoshotgun_e {
- SHOTGUN_IDLE = 0,
- SHOTGUN_FIRE,
- SHOTGUN_FIRE2,
- SHOTGUN_RELOAD,
- SHOTGUN_PUMP,
- SHOTGUN_START_RELOAD,
- SHOTGUN_DRAW,
- SHOTGUN_HOLSTER,
- SHOTGUN_IDLE4,
- SHOTGUN_IDLE_DEEP
- };
- LINK_ENTITY_TO_CLASS( weapon_autoshotgun, CAutoShotgun );
- void CAutoShotgun::Spawn( )
- {
- Precache( );
- m_iId = WEAPON_AUTOSHOTGUN;
- SET_MODEL(ENT(pev), "models/w_shotgun.mdl");
- m_iDefaultAmmo = SHOTGUN_DEFAULT_GIVE;
- FallInit();// get ready to fall
- }
- void CAutoShotgun::Precache( void )
- {
- PRECACHE_MODEL("models/v_autoshotgun.mdl");
- PRECACHE_MODEL("models/w_shotgun.mdl");
- PRECACHE_MODEL("models/p_shotgun.mdl");
- m_iShell = PRECACHE_MODEL ("models/shotgunshell.mdl");// shotgun shell
- PRECACHE_SOUND("items/9mmclip1.wav");
- PRECACHE_SOUND ("weapons/dbarrel1.wav");//shotgun
- PRECACHE_SOUND ("weapons/sbarrel1.wav");//shotgun
- PRECACHE_SOUND ("weapons/reload1.wav"); // shotgun reload
- PRECACHE_SOUND ("weapons/reload2.wav"); // shotgun reload
- PRECACHE_SOUND ("weapons/reload3.wav"); // shotgun reload
- // PRECACHE_SOUND ("weapons/sshell1.wav"); // shotgun reload - played on client
- // PRECACHE_SOUND ("weapons/sshell3.wav"); // shotgun reload - played on client
- PRECACHE_SOUND ("weapons/357_cock1.wav"); // gun empty sound
- PRECACHE_SOUND ("weapons/scock1.wav"); // cock gun
- m_usAutoShotgun = PRECACHE_EVENT( 1, "events/autoshotgun.sc" );
- }
- int CAutoShotgun::AddToPlayer( CBasePlayer *pPlayer )
- {
- if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
- {
- MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
- WRITE_BYTE( m_iId );
- MESSAGE_END();
- return TRUE;
- }
- return FALSE;
- }
- int CAutoShotgun::GetItemInfo(ItemInfo *p)
- {
- p->pszName = STRING(pev->classname);
- p->pszAmmo1 = "buckshot";
- p->iMaxAmmo1 = BUCKSHOT_MAX_CARRY;
- p->pszAmmo2 = NULL;
- p->iMaxAmmo2 = -1;
- p->iMaxClip = SHOTGUN_MAX_CLIP;
- p->iSlot = 2;
- p->iPosition = 3;
- p->iFlags = 0;
- p->iId = m_iId = WEAPON_AUTOSHOTGUN;
- p->iWeight = SHOTGUN_WEIGHT;
- return 1;
- }
- BOOL CAutoShotgun::Deploy( )
- {
- return DefaultDeploy( "models/v_autoshotgun.mdl", "models/p_shotgun.mdl", SHOTGUN_DRAW, "shotgun" );
- }
- void CAutoShotgun::PrimaryAttack()
- {
- // don't fire underwater
- if (m_pPlayer->pev->waterlevel == 3)
- {
- PlayEmptySound( );
- m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15;
- return;
- }
- if (m_iClip <= 0)
- {
- Reload( );
- if (m_iClip == 0)
- PlayEmptySound( );
- return;
- }
- m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME;
- m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH;
- m_iClip--;
- int flags;
- #if defined( CLIENT_WEAPONS )
- flags = FEV_NOTHOST;
- #else
- flags = 0;
- #endif
- m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH;
- Vector vecSrc = m_pPlayer->GetGunPosition( );
- Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
- Vector vecDir;
- PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usAutoShotgun, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
- if (!m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0)
- // HEV suit - indicate out of ammo condition
- m_pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0);
- if (m_iClip != 0)
- m_flPumpTime = gpGlobals->time + 0.5;
- m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.375;
- // m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.75;
- if (m_iClip != 0)
- m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 5.0;
- else
- m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.375;
- m_fInSpecialReload = 0;
- }
- void CAutoShotgun::Reload( void )
- {
- if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == SHOTGUN_MAX_CLIP)
- return;
- // don't reload until recoil is done
- if (m_flNextPrimaryAttack > UTIL_WeaponTimeBase())
- return;
- // check to see if we're ready to reload
- if (m_fInSpecialReload == 0)
- {
- SendWeaponAnim( SHOTGUN_START_RELOAD );
- m_fInSpecialReload = 1;
- m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.6;
- m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.6;
- m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.0;
- m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0;
- return;
- }
- else if (m_fInSpecialReload == 1)
- {
- if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase())
- return;
- // was waiting for gun to move to side
- m_fInSpecialReload = 2;
- if (RANDOM_LONG(0,1))
- EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/reload1.wav", 1, ATTN_NORM, 0, 85 + RANDOM_LONG(0,0x1f));
- else
- EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/reload3.wav", 1, ATTN_NORM, 0, 85 + RANDOM_LONG(0,0x1f));
- SendWeaponAnim( SHOTGUN_RELOAD );
- m_flNextReload = UTIL_WeaponTimeBase() + 0.5;
- m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5;
- }
- else
- {
- // Add them to the clip
- m_iClip += 1;
- m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= 1;
- m_fInSpecialReload = 1;
- }
- }
- void CAutoShotgun::WeaponIdle( void )
- {
- ResetEmptySound( );
- m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
- if ( m_flPumpTime && m_flPumpTime < gpGlobals->time )
- {
- // play pumping sound
- EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/scock1.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG(0,0x1f));
- m_flPumpTime = 0;
- }
- if (m_flTimeWeaponIdle < UTIL_WeaponTimeBase() )
- {
- if (m_iClip == 0 && m_fInSpecialReload == 0 && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType])
- {
- Reload( );
- }
- else if (m_fInSpecialReload != 0)
- {
- if (m_iClip != 8 && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType])
- {
- Reload( );
- }
- else
- {
- // reload debounce has timed out
- SendWeaponAnim( SHOTGUN_PUMP );
- // play cocking sound
- EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/scock1.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG(0,0x1f));
- m_fInSpecialReload = 0;
- m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.5;
- }
- }
- else
- {
- int iAnim;
- float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 );
- if (flRand <= 0.8)
- {
- iAnim = SHOTGUN_IDLE_DEEP;
- m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (60.0/12.0);// * RANDOM_LONG(2, 5);
- }
- else if (flRand <= 0.95)
- {
- iAnim = SHOTGUN_IDLE;
- m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (20.0/9.0);
- }
- else
- {
- iAnim = SHOTGUN_IDLE4;
- m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (20.0/9.0);
- }
- SendWeaponAnim( iAnim );
- }
- }
- }
- /*
- class CShotgunAmmo : public CBasePlayerAmmo
- {
- void Spawn( void )
- {
- Precache( );
- SET_MODEL(ENT(pev), "models/w_shotbox.mdl");
- CBasePlayerAmmo::Spawn( );
- }
- void Precache( void )
- {
- PRECACHE_MODEL ("models/w_shotbox.mdl");
- PRECACHE_SOUND("items/9mmclip1.wav");
- }
- BOOL AddAmmo( CBaseEntity *pOther )
- {
- if (pOther->GiveAmmo( AMMO_BUCKSHOTBOX_GIVE, "buckshot", BUCKSHOT_MAX_CARRY ) != -1)
- {
- EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM);
- return TRUE;
- }
- return FALSE;
- }
- };
- LINK_ENTITY_TO_CLASS( ammo_buckshot, CShotgunAmmo );
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement