source-engine/game/shared/tfc/weapon_tfc_shotgun.cpp

233 lines
5.6 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "util.h"
#include "weapon_tfc_shotgun.h"
#include "decals.h"
#include "in_buttons.h"
#if defined( CLIENT_DLL )
#include "c_tfc_player.h"
#else
#include "tfc_player.h"
#endif
#define RE_SHOTGUN_TIME 2
// ----------------------------------------------------------------------------- //
// CTFCShotgun tables.
// ----------------------------------------------------------------------------- //
IMPLEMENT_NETWORKCLASS_ALIASED( TFCShotgun, DT_WeaponShotgun )
BEGIN_NETWORK_TABLE( CTFCShotgun, DT_WeaponShotgun )
END_NETWORK_TABLE()
BEGIN_PREDICTION_DATA( CTFCShotgun )
END_PREDICTION_DATA()
LINK_ENTITY_TO_CLASS( weapon_shotgun, CTFCShotgun );
PRECACHE_WEAPON_REGISTER( weapon_shotgun );
#ifndef CLIENT_DLL
BEGIN_DATADESC( CTFCShotgun )
END_DATADESC()
#endif
// ----------------------------------------------------------------------------- //
// CTFCShotgun implementation.
// ----------------------------------------------------------------------------- //
CTFCShotgun::CTFCShotgun()
{
m_fReloadTime = 0.25; // Time to insert an individual shell
m_iShellsReloaded = 1; // Number of shells inserted each reload
m_flPumpTime = -1;
m_fInSpecialReload = 0;
m_flNextReload = -1;
}
TFCWeaponID CTFCShotgun::GetWeaponID() const
{
return WEAPON_SHOTGUN;
}
void CTFCShotgun::PrimaryAttack()
{
CTFCPlayer *pOwner = GetPlayerOwner();
if ( !pOwner )
return;
Assert( Clip1() != 0 );
WeaponSound( SINGLE );
SendWeaponAnim( ACT_VM_PRIMARYATTACK );
pOwner->DoAnimationEvent( PLAYERANIMEVENT_FIRE_GUN );
// Shoot!
FireBulletsInfo_t info;
info.m_vecSrc = pOwner->Weapon_ShootPosition();
info.m_vecDirShooting = pOwner->GetAutoaimVector( AUTOAIM_5DEGREES );
info.m_iShots = 6;
info.m_flDistance = 2048;
info.m_iAmmoType = GetPrimaryAmmoType();
info.m_vecSpread = VECTOR_CONE_TF_SHOTGUN;
info.m_iTracerFreq = 0;
info.m_flDamage = 4;
pOwner->FireBullets( info );
m_flTimeWeaponIdle = gpGlobals->curtime + 5.0;
m_fInSpecialReload = 0;
pOwner->m_Shared.RemoveStateFlags( TFSTATE_RELOADING );
// Setup fire delays
m_iClip1 -= 1;
if ( Clip1() != 0 )
m_flPumpTime = gpGlobals->curtime + 0.5;
m_flNextPrimaryAttack = gpGlobals->curtime + 0.5;
}
void CTFCShotgun::SecondaryAttack()
{
return;
}
bool CTFCShotgun::Reload()
{
CTFCPlayer *pOwner = GetPlayerOwner();
if ( !pOwner )
return false;
if ( pOwner->GetAmmoCount( GetPrimaryAmmoType() ) < m_iShellsReloaded || Clip1() == GetMaxClip1() )
{
return false;
}
if (gpGlobals->curtime < m_flNextReload)
{
return false;
}
// don't reload until recoil is done
if (gpGlobals->curtime < m_flNextPrimaryAttack)
{
return false;
}
// check to see if we're ready to reload
if (m_fInSpecialReload == 0)
{
SendWeaponAnim( ACT_VM_PULLBACK ); // (ie: start reload)
pOwner->m_Shared.AddStateFlags( TFSTATE_RELOADING );
m_fInSpecialReload = 1;
m_flTimeWeaponIdle = gpGlobals->curtime + 0.1; // 0.6;
m_flNextPrimaryAttack = gpGlobals->curtime + 0.1; // 1.0;
}
else if (m_fInSpecialReload == 1)
{
if ( m_flTimeWeaponIdle > gpGlobals->curtime )
{
return false;
}
// was waiting for gun to move to side
m_fInSpecialReload = 2;
SendWeaponAnim( ACT_VM_RELOAD );
WeaponSound( RELOAD );
m_flNextReload = gpGlobals->curtime + m_fReloadTime; //0.5;
m_flTimeWeaponIdle = gpGlobals->curtime + m_fReloadTime; //0.5;
}
else
{
// Add them to the clip
m_iClip1 += m_iShellsReloaded;
pOwner->RemoveAmmo( m_iShellsReloaded, GetPrimaryAmmoType() );
m_fInSpecialReload = 1;
pOwner->m_Shared.RemoveStateFlags( TFSTATE_RELOADING );
}
return true;
}
void CTFCShotgun::WeaponIdle()
{
CTFCPlayer *pOwner = GetPlayerOwner();
if ( !pOwner )
return;
// After firing, pump the shotgun.
if ( m_flPumpTime != -1 && gpGlobals->curtime >= m_flPumpTime )
{
SendWeaponAnim( ACT_VM_PULLBACK_HIGH );
WeaponSound( SPECIAL1 ); // Pump sound.
m_flPumpTime = -1;
}
if ( gpGlobals->curtime > m_flTimeWeaponIdle)
{
if (Clip1() == 0 && m_fInSpecialReload == 0 && pOwner->GetAmmoCount( GetPrimaryAmmoType() ) >= m_iShellsReloaded)
{
Reload( );
}
else if (m_fInSpecialReload != 0)
{
if (Clip1() != GetMaxClip1() && pOwner->GetAmmoCount( GetPrimaryAmmoType() ) >= m_iShellsReloaded)
{
Reload( );
}
else
{
// play pumping sound
SendWeaponAnim( ACT_VM_PULLBACK_HIGH );
WeaponSound( SPECIAL1 ); // Pump sound.
m_fInSpecialReload = 0;
m_flTimeWeaponIdle = gpGlobals->curtime + 1.5;
}
}
else
{
SendWeaponAnim( ACT_VM_IDLE );
m_flTimeWeaponIdle = gpGlobals->curtime + GetViewModelSequenceDuration();
}
}
}
#ifdef CLIENT_DLL
// ------------------------------------------------------------------------------------------------ //
// ------------------------------------------------------------------------------------------------ //
// CLIENT DLL SPECIFIC CODE
// ------------------------------------------------------------------------------------------------ //
// ------------------------------------------------------------------------------------------------ //
#else
// ------------------------------------------------------------------------------------------------ //
// ------------------------------------------------------------------------------------------------ //
// GAME DLL SPECIFIC CODE
// ------------------------------------------------------------------------------------------------ //
// ------------------------------------------------------------------------------------------------ //
#endif