You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
233 lines
5.6 KiB
233 lines
5.6 KiB
![]()
4 years ago
|
//========= 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
|