source-engine/game/shared/dod/weapon_dodfireselect.cpp
2022-04-16 12:05:19 +03:00

212 lines
4.4 KiB
C++

//========= 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