Team Fortress 2 Source Code as on 22/4/2020
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.
|
|
//========= 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
|