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.
212 lines
4.4 KiB
212 lines
4.4 KiB
3 years ago
|
//========= 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
|