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.
211 lines
4.4 KiB
211 lines
4.4 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
#include "fx_dod_shared.h" |
|
#include "weapon_dodfireselect.h" |
|
|
|
#ifdef CLIENT_DLL |
|
#include "prediction.h" |
|
#endif |
|
|
|
IMPLEMENT_NETWORKCLASS_ALIASED( DODFireSelectWeapon, DT_FireSelectWeapon ) |
|
|
|
|
|
BEGIN_NETWORK_TABLE( CDODFireSelectWeapon, DT_FireSelectWeapon ) |
|
#ifdef CLIENT_DLL |
|
RecvPropBool( RECVINFO( m_bSemiAuto ) ) |
|
#else |
|
SendPropBool( SENDINFO( m_bSemiAuto ) ) |
|
#endif |
|
END_NETWORK_TABLE() |
|
|
|
BEGIN_PREDICTION_DATA( CDODFireSelectWeapon ) |
|
END_PREDICTION_DATA() |
|
|
|
|
|
CDODFireSelectWeapon::CDODFireSelectWeapon() |
|
{ |
|
} |
|
|
|
void CDODFireSelectWeapon::Spawn( void ) |
|
{ |
|
m_bSemiAuto = false; |
|
|
|
#ifdef CLIENT_DLL |
|
ResetViewModelAnimDir(); |
|
#endif |
|
|
|
m_iAltFireHint = HINT_USE_SEMI_AUTO; |
|
|
|
BaseClass::Spawn(); |
|
} |
|
|
|
void CDODFireSelectWeapon::PrimaryAttack( void ) |
|
{ |
|
if ( IsSemiAuto() ) |
|
{ |
|
// If semi auto, set this flag which will prevent us from |
|
// attacking again until the button is released. |
|
m_bInAttack = true; |
|
} |
|
|
|
BaseClass::PrimaryAttack(); |
|
} |
|
|
|
float CDODFireSelectWeapon::GetFireDelay( void ) |
|
{ |
|
if ( IsSemiAuto() ) |
|
{ |
|
return m_pWeaponInfo->m_flSecondaryFireDelay; |
|
} |
|
else |
|
{ |
|
return m_pWeaponInfo->m_flFireDelay; |
|
} |
|
} |
|
|
|
void CDODFireSelectWeapon::SecondaryAttack( void ) |
|
{ |
|
// toggle fire mode ( full auto, semi auto ) |
|
m_bSemiAuto = !m_bSemiAuto; |
|
|
|
#ifndef CLIENT_DLL |
|
CDODPlayer *pPlayer = GetDODPlayerOwner(); |
|
if ( pPlayer ) |
|
{ |
|
pPlayer->RemoveHintTimer( m_iAltFireHint ); |
|
} |
|
#endif |
|
|
|
if ( m_bSemiAuto ) |
|
{ |
|
#ifdef CLIENT_DLL |
|
if ( prediction->IsFirstTimePredicted() ) |
|
{ |
|
m_flPosChangeTimer = gpGlobals->curtime; |
|
m_bAnimToSemiAuto = false; |
|
} |
|
#endif |
|
|
|
SendWeaponAnim( ACT_VM_UNDEPLOY ); |
|
} |
|
else |
|
{ |
|
#ifdef CLIENT_DLL |
|
if ( prediction->IsFirstTimePredicted() ) |
|
{ |
|
m_flPosChangeTimer = gpGlobals->curtime; |
|
m_bAnimToSemiAuto = true; |
|
} |
|
#endif |
|
|
|
SendWeaponAnim( ACT_VM_DEPLOY ); |
|
} |
|
|
|
#ifdef CLIENT_DLL |
|
if ( prediction->IsFirstTimePredicted() ) |
|
{ |
|
m_flPosChangeTimer = gpGlobals->curtime; |
|
} |
|
#endif |
|
|
|
m_flNextSecondaryAttack = gpGlobals->curtime + SequenceDuration(); |
|
m_flNextPrimaryAttack = gpGlobals->curtime + SequenceDuration(); |
|
} |
|
|
|
bool CDODFireSelectWeapon::IsSemiAuto( void ) |
|
{ |
|
return m_bSemiAuto; |
|
} |
|
|
|
float CDODFireSelectWeapon::GetWeaponAccuracy( float flPlayerSpeed ) |
|
{ |
|
float flSpread; |
|
|
|
if ( IsSemiAuto() ) |
|
flSpread = m_pWeaponInfo->m_flSecondaryAccuracy; |
|
else |
|
flSpread = m_pWeaponInfo->m_flAccuracy; |
|
|
|
if( flPlayerSpeed > 45 ) |
|
flSpread += m_pWeaponInfo->m_flAccuracyMovePenalty; |
|
|
|
return flSpread; |
|
} |
|
|
|
Activity CDODFireSelectWeapon::GetIdleActivity( void ) |
|
{ |
|
if ( !IsSemiAuto() ) |
|
return ACT_VM_IDLE_DEPLOYED; |
|
|
|
return BaseClass::GetIdleActivity(); |
|
} |
|
|
|
Activity CDODFireSelectWeapon::GetPrimaryAttackActivity( void ) |
|
{ |
|
if ( !IsSemiAuto() ) |
|
return ACT_VM_PRIMARYATTACK_DEPLOYED; |
|
|
|
return BaseClass::GetPrimaryAttackActivity(); |
|
} |
|
|
|
Activity CDODFireSelectWeapon::GetReloadActivity( void ) |
|
{ |
|
if ( !IsSemiAuto() ) |
|
return ACT_VM_RELOAD_DEPLOYED; |
|
|
|
return BaseClass::GetReloadActivity(); |
|
} |
|
|
|
Activity CDODFireSelectWeapon::GetDrawActivity( void ) |
|
{ |
|
if ( !IsSemiAuto() ) |
|
return ACT_VM_DRAW_DEPLOYED; |
|
|
|
return BaseClass::GetDrawActivity(); |
|
} |
|
|
|
void CDODFireSelectWeapon::Drop( const Vector &vecVelocity ) |
|
{ |
|
// always full auto when you pick up a weapon |
|
m_bSemiAuto = false; |
|
|
|
return BaseClass::Drop( vecVelocity ); |
|
} |
|
|
|
#ifdef CLIENT_DLL |
|
Vector CDODFireSelectWeapon::GetDesiredViewModelOffset( C_DODPlayer *pOwner ) |
|
{ |
|
Vector viewOffset = pOwner->GetViewOffset(); |
|
|
|
float flPercent = ( viewOffset.z - VEC_PRONE_VIEW_SCALED( pOwner ).z ) / ( VEC_VIEW_SCALED( pOwner ).z - VEC_PRONE_VIEW_SCALED( pOwner ).z ); |
|
|
|
Vector offset = ( flPercent * GetDODWpnData().m_vecViewNormalOffset + |
|
( 1.0 - flPercent ) * GetDODWpnData().m_vecViewProneOffset ); |
|
|
|
static float flLastPercent = 0; |
|
|
|
if ( prediction->InPrediction() ) |
|
{ |
|
return ( flLastPercent * offset + |
|
( 1.0 - flLastPercent ) * GetDODWpnData().m_vecViewProneOffset ); |
|
} |
|
|
|
float timer = gpGlobals->curtime - m_flPosChangeTimer; |
|
|
|
// how long since we changed iron sight mode |
|
float flPosChangePercent = clamp( ( timer / ( 0.3 ) ), 0.0, 1.0 ); |
|
|
|
float flZoomPercent = ( m_bAnimToSemiAuto ? ( 1.0 - flPosChangePercent ) : flPosChangePercent ); |
|
|
|
// store this value to use when called in prediction |
|
flLastPercent = flZoomPercent; |
|
|
|
return ( flZoomPercent * GetDODWpnData().m_vecIronSightOffset + |
|
( 1.0 - flZoomPercent ) * offset ); |
|
} |
|
#endif
|
|
|