summaryrefslogtreecommitdiff
path: root/game/shared/dod/weapon_dodfireselect.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/shared/dod/weapon_dodfireselect.cpp')
-rw-r--r--game/shared/dod/weapon_dodfireselect.cpp211
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