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 "weapon_sdkbase.h"
#include "sdk_fx_shared.h"
#if defined( CLIENT_DLL )
#define CWeaponMP5 C_WeaponMP5
#include "c_sdk_player.h"
#else
#include "sdk_player.h"
#endif
class CWeaponMP5 : public CWeaponSDKBase { public: DECLARE_CLASS( CWeaponMP5, CWeaponSDKBase ); DECLARE_NETWORKCLASS(); DECLARE_PREDICTABLE(); CWeaponMP5();
virtual void PrimaryAttack(); virtual bool Deploy(); virtual bool Reload(); virtual void WeaponIdle();
virtual SDKWeaponID GetWeaponID( void ) const { return WEAPON_MP5; }
private:
CWeaponMP5( const CWeaponMP5 & );
void Fire( float flSpread ); };
IMPLEMENT_NETWORKCLASS_ALIASED( WeaponMP5, DT_WeaponMP5 )
BEGIN_NETWORK_TABLE( CWeaponMP5, DT_WeaponMP5 ) END_NETWORK_TABLE()
BEGIN_PREDICTION_DATA( CWeaponMP5 ) END_PREDICTION_DATA()
LINK_ENTITY_TO_CLASS( weapon_mp5, CWeaponMP5 ); PRECACHE_WEAPON_REGISTER( weapon_mp5 );
CWeaponMP5::CWeaponMP5() { }
bool CWeaponMP5::Deploy( ) { CSDKPlayer *pPlayer = GetPlayerOwner(); pPlayer->m_iShotsFired = 0;
return BaseClass::Deploy(); }
bool CWeaponMP5::Reload( ) { CSDKPlayer *pPlayer = GetPlayerOwner();
if (pPlayer->GetAmmoCount( GetPrimaryAmmoType() ) <= 0) return false;
int iResult = DefaultReload( GetMaxClip1(), GetMaxClip2(), ACT_VM_RELOAD ); if ( !iResult ) return false;
pPlayer->SetAnimation( PLAYER_RELOAD );
#ifndef CLIENT_DLL
if ((iResult) && (pPlayer->GetFOV() != pPlayer->GetDefaultFOV())) { pPlayer->SetFOV( pPlayer, pPlayer->GetDefaultFOV() ); } #endif
pPlayer->m_iShotsFired = 0;
return true; }
void CWeaponMP5::PrimaryAttack( void ) { const CSDKWeaponInfo &pWeaponInfo = GetSDKWpnData(); CSDKPlayer *pPlayer = GetPlayerOwner();
float flCycleTime = pWeaponInfo.m_flCycleTime;
bool bPrimaryMode = true;
float flSpread = 0.01f;
// more spread when jumping
if ( !FBitSet( pPlayer->GetFlags(), FL_ONGROUND ) ) flSpread = 0.05f; pPlayer->m_iShotsFired++;
// Out of ammo?
if ( m_iClip1 <= 0 ) { if (m_bFireOnEmpty) { PlayEmptySound(); m_flNextPrimaryAttack = gpGlobals->curtime + 0.2; } }
SendWeaponAnim( ACT_VM_PRIMARYATTACK );
m_iClip1--;
// player "shoot" animation
pPlayer->SetAnimation( PLAYER_ATTACK1 );
FX_FireBullets( pPlayer->entindex(), pPlayer->Weapon_ShootPosition(), pPlayer->EyeAngles() + pPlayer->GetPunchAngle(), GetWeaponID(), bPrimaryMode?Primary_Mode:Secondary_Mode, CBaseEntity::GetPredictionRandomSeed() & 255, flSpread );
pPlayer->DoMuzzleFlash(); m_flNextPrimaryAttack = m_flNextSecondaryAttack = gpGlobals->curtime + flCycleTime;
if (!m_iClip1 && pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0) { // HEV suit - indicate out of ammo condition
pPlayer->SetSuitUpdate("!HEV_AMO0", false, 0); }
// start idle animation in 5 seconds
SetWeaponIdleTime( gpGlobals->curtime + 5.0 ); }
void CWeaponMP5::WeaponIdle() { if (m_flTimeWeaponIdle > gpGlobals->curtime) return;
// only idle if the slid isn't back
if ( m_iClip1 != 0 ) { SetWeaponIdleTime( gpGlobals->curtime + 5.0f ); SendWeaponAnim( ACT_VM_IDLE ); } }
|