summaryrefslogtreecommitdiff
path: root/game/shared/dod/weapon_dodsniper.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/dod/weapon_dodsniper.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/shared/dod/weapon_dodsniper.cpp')
-rw-r--r--game/shared/dod/weapon_dodsniper.cpp414
1 files changed, 414 insertions, 0 deletions
diff --git a/game/shared/dod/weapon_dodsniper.cpp b/game/shared/dod/weapon_dodsniper.cpp
new file mode 100644
index 0000000..70d3568
--- /dev/null
+++ b/game/shared/dod/weapon_dodsniper.cpp
@@ -0,0 +1,414 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "cbase.h"
+#include "fx_dod_shared.h"
+#include "weapon_dodsniper.h"
+
+#ifdef CLIENT_DLL
+ #include "prediction.h"
+#endif
+
+IMPLEMENT_NETWORKCLASS_ALIASED( DODSniperWeapon, DT_SniperWeapon )
+
+#ifdef CLIENT_DLL
+
+ void RecvProxy_AnimStart( const CRecvProxyData *pData, void *pStruct, void *pOut )
+ {
+ CDODSniperWeapon *pWpn = (CDODSniperWeapon *) pStruct;
+ pWpn->m_bDoViewAnim = ( pData->m_Value.m_Int > 0 );
+ }
+
+#endif
+
+BEGIN_NETWORK_TABLE( CDODSniperWeapon, DT_SniperWeapon )
+ #ifdef CLIENT_DLL
+ RecvPropBool( RECVINFO( m_bZoomed ) ),
+ RecvPropInt( RECVINFO( m_bDoViewAnim ), 0, RecvProxy_AnimStart )
+ #else
+ SendPropBool( SENDINFO( m_bZoomed ) ),
+ SendPropBool( SENDINFO( m_bDoViewAnim ) )
+ #endif
+END_NETWORK_TABLE()
+
+
+#ifdef CLIENT_DLL
+
+ BEGIN_PREDICTION_DATA( CDODSniperWeapon )
+ DEFINE_PRED_FIELD( m_bZoomed, FIELD_BOOLEAN, FTYPEDESC_INSENDTABLE )
+ END_PREDICTION_DATA()
+
+#else
+
+ BEGIN_DATADESC( CDODSniperWeapon )
+ END_DATADESC()
+
+#endif
+
+
+CDODSniperWeapon::CDODSniperWeapon()
+{
+}
+
+void CDODSniperWeapon::Spawn( void )
+{
+ BaseClass::Spawn();
+
+ ResetTimers();
+
+#ifdef CLIENT_DLL
+ m_bDoViewAnimCache = false;
+ m_flZoomPercent = 0.0f;
+#endif
+
+ m_bShouldRezoomAfterShot = true;
+}
+
+void CDODSniperWeapon::ResetTimers( void )
+{
+ m_flUnzoomTime = -1;
+ m_flRezoomTime = -1;
+ m_flZoomOutTime = -1;
+ m_flZoomInTime = -1;
+ m_bRezoomAfterShot = false;
+ m_bRezoomAfterReload = false;
+}
+
+bool CDODSniperWeapon::Holster( CBaseCombatWeapon *pSwitchingTo )
+{
+#ifndef CLIENT_DLL
+ ZoomOut();
+
+ ResetTimers();
+#endif
+
+ return BaseClass::Holster( pSwitchingTo );
+}
+
+void CDODSniperWeapon::PrimaryAttack( void )
+{
+ BaseClass::PrimaryAttack();
+
+ CDODPlayer *pPlayer = ToDODPlayer( GetOwner() );
+
+ if ( IsZoomed() && ShouldZoomOutBetweenShots() )
+ {
+ //If we have more bullets, zoom out, play the bolt animation and zoom back in
+ if( m_iClip1 > 0 && m_bShouldRezoomAfterShot && ( pPlayer && pPlayer->ShouldAutoRezoom() ) )
+ {
+ SetRezoom( true, 0.5f ); // zoom out in 0.5 seconds, then rezoom
+ }
+ else //just zoom out
+ {
+ SetRezoom( false, 0.5f ); // just zoom out in 0.5 seconds
+ }
+ }
+
+ // overwrite the next secondary attack, so we can zoom sooned after we've fired
+ if ( m_bRezoomAfterShot && m_iClip1 > 0 )
+ m_flNextSecondaryAttack = gpGlobals->curtime + 2.0;
+ else
+ m_flNextSecondaryAttack = SequenceDuration();
+}
+
+void CDODSniperWeapon::SecondaryAttack( void )
+{
+ CBasePlayer *pPlayer = ToBasePlayer( GetOwner() );
+
+ Assert( pPlayer );
+
+ if ( !pPlayer )
+ return;
+
+ ToggleZoom();
+}
+
+bool CDODSniperWeapon::Reload( void )
+{
+ bool bSuccess = BaseClass::Reload();
+
+ if ( bSuccess && IsZoomed() )
+ {
+ //if ( ShouldRezoomAfterReload() )
+ // m_bRezoomAfterReload = true;
+
+ ZoomOut();
+ }
+
+ if ( !bSuccess )
+ m_bRezoomAfterReload = false;
+
+ return bSuccess;
+}
+
+void CDODSniperWeapon::FinishReload( void )
+{
+ BaseClass::FinishReload();
+
+ if ( m_bRezoomAfterReload )
+ {
+ ZoomIn();
+ m_bRezoomAfterReload = false;
+ }
+}
+
+float CDODSniperWeapon::GetWeaponAccuracy( float flPlayerSpeed )
+{
+ //snipers and deployable weapons inherit this and override when we need a different accuracy
+
+ float flSpread = m_pWeaponInfo->m_flAccuracy;
+
+ if ( IsZoomed() && ( gpGlobals->curtime - m_flZoomChangeTime ) > DOD_SNIPER_ZOOM_CHANGE_TIME )
+ {
+ flSpread = m_pWeaponInfo->m_flSecondaryAccuracy;
+ }
+
+ if( flPlayerSpeed > 45 )
+ flSpread += m_pWeaponInfo->m_flAccuracyMovePenalty;
+
+ return flSpread;
+}
+
+bool CDODSniperWeapon::IsZoomed( void )
+{
+ // check the player?
+ return IsSniperZoomed();
+}
+
+bool CDODSniperWeapon::ShouldDrawCrosshair( void )
+{
+ //if ( IsFullyZoomed() )
+ // return false;
+
+ // don't draw if we are zoomed at all
+ if ( m_bZoomed )
+ return false;
+
+ return BaseClass::ShouldDrawCrosshair();
+}
+
+#include "in_buttons.h"
+
+void CDODSniperWeapon::ItemPostFrame( void )
+{
+ if ( m_flUnzoomTime > 0 && gpGlobals->curtime > m_flUnzoomTime )
+ {
+ if ( m_bRezoomAfterShot )
+ {
+ ZoomOutIn();
+ m_bRezoomAfterShot = false;
+ }
+ else
+ {
+ ZoomOut();
+ }
+
+ m_flUnzoomTime = -1;
+ }
+
+ CDODPlayer *pPlayer = ToDODPlayer( GetPlayerOwner() );
+ Assert( pPlayer );
+
+ if ( m_flRezoomTime > 0 )
+ {
+ // if the player is sprinting and moving at all, cancel the rezoom
+ if ( ( pPlayer->m_nButtons & IN_SPEED ) > 0 &&
+ pPlayer->GetAbsVelocity().Length2D() > 20 )
+ {
+ m_flRezoomTime = -1;
+ }
+ else if ( gpGlobals->curtime > m_flRezoomTime )
+ {
+ ZoomIn();
+ m_flRezoomTime = -1;
+ }
+ }
+
+ if ( m_flZoomInTime > 0 && gpGlobals->curtime > m_flZoomInTime )
+ {
+#ifndef CLIENT_DLL
+ CDODPlayer *pPlayer = ToDODPlayer( GetPlayerOwner() );
+ Assert( pPlayer );
+ pPlayer->SetFOV( pPlayer, GetZoomedFOV(), 0.1f );
+#endif
+ m_flZoomInTime = -1;
+ m_flZoomOutTime = -1;
+ }
+
+ if ( m_flZoomInTime > 0 && (pPlayer->m_nButtons & IN_ATTACK) )
+ {
+ m_bInAttack = true;
+ }
+
+ BaseClass::ItemPostFrame();
+}
+
+void CDODSniperWeapon::Drop( const Vector &vecVelocity )
+{
+ // If a player is killed while deployed, this resets the weapon state
+ if ( IsZoomed() )
+ ZoomOut();
+
+ ResetTimers();
+
+ BaseClass::Drop( vecVelocity );
+}
+
+void CDODSniperWeapon::ToggleZoom( void )
+{
+ CDODPlayer *pPlayer = GetDODPlayerOwner();
+
+ if ( !pPlayer->m_Shared.IsJumping() )
+ {
+ if( !IsZoomed() )
+ {
+ if ( CanAttack() )
+ {
+#ifndef CLIENT_DLL
+ pPlayer->RemoveHintTimer( m_iAltFireHint );
+#endif
+
+ ZoomIn();
+ }
+ }
+ else
+ {
+ ZoomOut();
+ }
+ }
+}
+
+void CDODSniperWeapon::ZoomIn( void )
+{
+ m_flZoomInTime = gpGlobals->curtime + DOD_SNIPER_ZOOM_CHANGE_TIME;
+
+#ifndef CLIENT_DLL
+ SetZoomed( true );
+
+ m_bDoViewAnim = !m_bDoViewAnim;
+#endif
+
+ m_flNextPrimaryAttack = MAX( gpGlobals->curtime + 0.5, m_flNextPrimaryAttack );
+ m_flNextSecondaryAttack = MAX( gpGlobals->curtime + 0.5, m_flNextSecondaryAttack );
+ m_flTimeWeaponIdle = gpGlobals->curtime + m_pWeaponInfo->m_flTimeToIdleAfterFire;
+
+ m_flZoomChangeTime = gpGlobals->curtime;
+}
+
+void CDODSniperWeapon::ZoomOut( void )
+{
+ bool bWasZoomed = IsZoomed();
+
+#ifndef CLIENT_DLL
+ CDODPlayer *pPlayer = ToDODPlayer( GetPlayerOwner() );
+ Assert( pPlayer );
+
+ pPlayer->SetFOV( pPlayer, 90, 0.1f );
+ SetZoomed( false );
+
+ m_bDoViewAnim = !m_bDoViewAnim;
+#endif
+
+ if ( bWasZoomed )
+ {
+ m_flNextPrimaryAttack = MAX( gpGlobals->curtime + 0.5, m_flNextPrimaryAttack );
+ m_flNextSecondaryAttack = MAX( gpGlobals->curtime + 0.5, m_flNextSecondaryAttack );
+ m_flTimeWeaponIdle = gpGlobals->curtime + m_pWeaponInfo->m_flTimeToIdleAfterFire;
+ }
+
+ m_flZoomChangeTime = gpGlobals->curtime;
+
+ // if we are thinking about zooming, cancel it
+ m_flZoomInTime = -1;
+ m_flUnzoomTime = -1;
+ m_flRezoomTime = -1;
+}
+
+// reduce rezoome time, to account for fade in we're replacing with anim
+#define REZOOM_TIME 1.2f
+
+void CDODSniperWeapon::ZoomOutIn( void )
+{
+ ZoomOut();
+
+ m_flRezoomTime = gpGlobals->curtime + 1.0;
+}
+
+void CDODSniperWeapon::SetRezoom( bool bRezoom, float flDelay )
+{
+ m_flUnzoomTime = gpGlobals->curtime + flDelay;
+
+ m_bRezoomAfterShot = bRezoom;
+}
+
+bool CDODSniperWeapon::IsFullyZoomed( void )
+{
+ return ( IsZoomed() == true &&
+ (( gpGlobals->curtime - m_flZoomChangeTime ) > DOD_SNIPER_ZOOM_CHANGE_TIME) );
+}
+
+bool CDODSniperWeapon::IsZoomingIn( void )
+{
+ return ( m_flZoomInTime > gpGlobals->curtime );
+}
+
+#ifdef CLIENT_DLL
+
+ float CDODSniperWeapon::GetZoomedPercentage( void )
+ {
+ return m_flZoomPercent;
+ }
+
+ Vector CDODSniperWeapon::GetDesiredViewModelOffset( C_DODPlayer *pOwner )
+ {
+ static Vector vecLastResult = vec3_origin;
+
+ if ( prediction->InPrediction() && !prediction->IsFirstTimePredicted() )
+ {
+ return vecLastResult;
+ }
+
+ if ( m_bDoViewAnim != m_bDoViewAnimCache )
+ {
+ // start the anim timer
+ m_flViewAnimTimer = gpGlobals->curtime + DOD_SNIPER_ZOOM_CHANGE_TIME;
+ m_bDoViewAnimCache = m_bDoViewAnim.m_Value;
+ }
+
+ Vector viewOffset = pOwner->GetViewOffset();
+
+ float flPercent = clamp( ( viewOffset.z - VEC_PRONE_VIEW_SCALED( pOwner ).z ) / ( VEC_VIEW_SCALED( pOwner ).z - VEC_PRONE_VIEW_SCALED( pOwner ).z ), 0.0, 1.0 );
+
+ Vector offset = ( flPercent * GetDODWpnData().m_vecViewNormalOffset +
+ ( 1.0 - flPercent ) * GetDODWpnData().m_vecViewProneOffset );
+
+
+ // how long since we changed iron sight mode
+ float flZoomAnimPercent = clamp( ( (m_flViewAnimTimer - gpGlobals->curtime) / ( DOD_SNIPER_ZOOM_CHANGE_TIME ) ), 0.0, 1.0 );
+
+ m_flZoomPercent = ( IsZoomed() ? ( 1.0 - flZoomAnimPercent ) : flZoomAnimPercent );
+
+ //Msg( "(%.1f) zoom %.2f %.2f\n", gpGlobals->curtime, m_flViewAnimTimer - gpGlobals->curtime, m_flZoomPercent );
+
+ // use that percent to interp to iron sight position
+ Vector vecResult = ( m_flZoomPercent * GetDODWpnData().m_vecIronSightOffset +
+ ( 1.0 - m_flZoomPercent ) * offset );
+
+ // store this value to use when called in prediction
+ vecLastResult = vecResult;
+
+ return vecResult;
+ }
+
+ float CDODSniperWeapon::GetViewModelSwayScale( void )
+ {
+ if ( IsFullyZoomed() )
+ return 0;
+
+ return BaseClass::GetViewModelSwayScale();
+ }
+
+#endif //CLIENT_DLL