source-engine/game/shared/hl1/hl1mp_weapon_glock.cpp
2022-04-16 12:05:19 +03:00

206 lines
4.0 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Glock - hand gun
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "npcevent.h"
#include "hl1mp_basecombatweapon_shared.h"
//#include "basecombatcharacter.h"
//#include "AI_BaseNPC.h"
#ifdef CLIENT_DLL
#include "c_baseplayer.h"
#else
#include "player.h"
#endif
#include "gamerules.h"
#include "in_buttons.h"
#ifdef CLIENT_DLL
#else
#include "soundent.h"
#include "game.h"
#endif
#include "vstdlib/random.h"
#include "engine/IEngineSound.h"
#ifdef CLIENT_DLL
#define CWeaponGlock C_WeaponGlock
#endif
class CWeaponGlock : public CBaseHL1MPCombatWeapon
{
DECLARE_CLASS( CWeaponGlock, CBaseHL1MPCombatWeapon );
DECLARE_NETWORKCLASS();
DECLARE_PREDICTABLE();
public:
CWeaponGlock(void);
void Precache( void );
void PrimaryAttack( void );
void SecondaryAttack( void );
bool Reload( void );
void WeaponIdle( void );
void DryFire( void );
private:
void GlockFire( float flSpread , float flCycleTime, bool fUseAutoAim );
};
IMPLEMENT_NETWORKCLASS_ALIASED( WeaponGlock, DT_WeaponGlock );
BEGIN_NETWORK_TABLE( CWeaponGlock, DT_WeaponGlock )
END_NETWORK_TABLE()
LINK_ENTITY_TO_CLASS( weapon_glock, CWeaponGlock );
BEGIN_PREDICTION_DATA( CWeaponGlock )
END_PREDICTION_DATA()
PRECACHE_WEAPON_REGISTER( weapon_glock );
CWeaponGlock::CWeaponGlock( void )
{
m_bReloadsSingly = false;
m_bFiresUnderwater = true;
}
void CWeaponGlock::Precache( void )
{
BaseClass::Precache();
}
void CWeaponGlock::DryFire( void )
{
WeaponSound( EMPTY );
SendWeaponAnim( ACT_VM_DRYFIRE );
m_flNextPrimaryAttack = gpGlobals->curtime + 0.2;
}
void CWeaponGlock::PrimaryAttack( void )
{
GlockFire( 0.01, 0.3, TRUE );
}
void CWeaponGlock::SecondaryAttack( void )
{
GlockFire( 0.1, 0.2, FALSE );
}
void CWeaponGlock::GlockFire( float flSpread , float flCycleTime, bool fUseAutoAim )
{
// Only the player fires this way so we can cast
CBasePlayer *pPlayer = ToBasePlayer( GetOwner() );
if ( !pPlayer )
{
return;
}
if ( m_iClip1 <= 0 )
{
if ( !m_bFireOnEmpty )
{
Reload();
}
else
{
DryFire();
}
return;
}
WeaponSound( SINGLE );
pPlayer->DoMuzzleFlash();
m_iClip1--;
if ( m_iClip1 == 0 )
SendWeaponAnim( ACT_GLOCK_SHOOTEMPTY );
else
SendWeaponAnim( ACT_VM_PRIMARYATTACK );
pPlayer->SetAnimation( PLAYER_ATTACK1 );
m_flNextPrimaryAttack = gpGlobals->curtime + flCycleTime;
m_flNextSecondaryAttack = gpGlobals->curtime + flCycleTime;
Vector vecSrc = pPlayer->Weapon_ShootPosition();
Vector vecAiming;
if ( fUseAutoAim )
{
vecAiming = pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES );
}
else
{
vecAiming = pPlayer->GetAutoaimVector( 0 );
}
// pPlayer->FireBullets( 1, vecSrc, vecAiming, Vector( flSpread, flSpread, flSpread ), MAX_TRACE_LENGTH, m_iPrimaryAmmoType, 0 );
FireBulletsInfo_t info( 1, vecSrc, vecAiming, Vector( flSpread, flSpread, flSpread ), MAX_TRACE_LENGTH, m_iPrimaryAmmoType );
info.m_pAttacker = pPlayer;
pPlayer->FireBullets( info );
EjectShell( pPlayer, 0 );
pPlayer->ViewPunch( QAngle( -2, 0, 0 ) );
#if !defined(CLIENT_DLL)
pPlayer->SetMuzzleFlashTime( gpGlobals->curtime + 0.5 );
CSoundEnt::InsertSound( SOUND_COMBAT, GetAbsOrigin(), 400, 0.2 );
#endif
if ( !m_iClip1 && pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0 )
{
// HEV suit - indicate out of ammo condition
pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0);
}
SetWeaponIdleTime( gpGlobals->curtime + random->RandomFloat( 10, 15 ) );
}
bool CWeaponGlock::Reload( void )
{
bool iResult;
if ( m_iClip1 == 0 )
iResult = DefaultReload( GetMaxClip1(), GetMaxClip2(), ACT_GLOCK_SHOOT_RELOAD );
else
iResult = DefaultReload( GetMaxClip1(), GetMaxClip2(), ACT_VM_RELOAD );
return iResult;
}
void CWeaponGlock::WeaponIdle( void )
{
CBasePlayer *pPlayer = ToBasePlayer( GetOwner() );
if ( pPlayer )
{
pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES );
}
// only idle if the slid isn't back
if ( m_iClip1 != 0 )
{
BaseClass::WeaponIdle();
}
}