diff options
Diffstat (limited to 'game/shared/dod/weapon_dodfireselect.cpp')
| -rw-r--r-- | game/shared/dod/weapon_dodfireselect.cpp | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/game/shared/dod/weapon_dodfireselect.cpp b/game/shared/dod/weapon_dodfireselect.cpp new file mode 100644 index 0000000..9b1038a --- /dev/null +++ b/game/shared/dod/weapon_dodfireselect.cpp @@ -0,0 +1,211 @@ +//========= 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 |