diff options
Diffstat (limited to 'game/shared/dod/weapon_dodbaserpg.cpp')
| -rw-r--r-- | game/shared/dod/weapon_dodbaserpg.cpp | 345 |
1 files changed, 345 insertions, 0 deletions
diff --git a/game/shared/dod/weapon_dodbaserpg.cpp b/game/shared/dod/weapon_dodbaserpg.cpp new file mode 100644 index 0000000..a9d196d --- /dev/null +++ b/game/shared/dod/weapon_dodbaserpg.cpp @@ -0,0 +1,345 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// + +#include "cbase.h" +#include "dod_gamerules.h" +#include "weapon_dodbaserpg.h" + + +#ifdef CLIENT_DLL + + #include "c_dod_player.h" + #include "prediction.h" + +#else + + #include "dod_player.h" + +#endif + +IMPLEMENT_NETWORKCLASS_ALIASED( DODBaseRocketWeapon, DT_BaseRocketWeapon ) + +BEGIN_NETWORK_TABLE( CDODBaseRocketWeapon, DT_BaseRocketWeapon ) + +#ifdef CLIENT_DLL + RecvPropBool( RECVINFO(m_bDeployed) ) +#else + SendPropBool( SENDINFO(m_bDeployed) ) +#endif + +END_NETWORK_TABLE() + +BEGIN_PREDICTION_DATA( CDODBaseRocketWeapon ) +END_PREDICTION_DATA() + +#ifndef CLIENT_DLL + +BEGIN_DATADESC( CDODBaseRocketWeapon ) +END_DATADESC() + +#endif + +LINK_ENTITY_TO_CLASS( weapon_dodbaserpg, CDODBaseRocketWeapon ); + +CDODBaseRocketWeapon::CDODBaseRocketWeapon() +{ +} + +void CDODBaseRocketWeapon::Precache() +{ + BaseClass::Precache(); +} + +bool CDODBaseRocketWeapon::Reload( void ) +{ + CDODPlayer *pPlayer = GetDODPlayerOwner(); + + if (pPlayer->GetAmmoCount( GetPrimaryAmmoType() ) <= 0) + { + CDODPlayer *pDODPlayer = ToDODPlayer( pPlayer ); + pDODPlayer->HintMessage( HINT_AMMO_EXHAUSTED ); + return false; + } + + Activity actReload; + + if( IsDeployed() ) + actReload = ACT_VM_RELOAD_DEPLOYED; + else + actReload = ACT_VM_RELOAD; + + int iResult = DefaultReload( GetMaxClip1(), GetMaxClip2(), actReload ); + if ( !iResult ) + return false; + + pPlayer->SetAnimation( PLAYER_RELOAD ); + + // if we don't want the auto-rezoom, undeploy here + if ( !pPlayer->ShouldAutoRezoom() ) + { + m_bDeployed = false; + pPlayer->SetBazookaDeployed( m_bDeployed ); + } + + return true; +} + +bool CDODBaseRocketWeapon::ShouldPlayerBeSlow( void ) +{ + if( IsDeployed() && !m_bInReload ) + { + return true; + } + else + return false; +} + +void CDODBaseRocketWeapon::Spawn( ) +{ + WEAPON_FILE_INFO_HANDLE hWpnInfo = LookupWeaponInfoSlot( GetClassname() ); + + Assert( hWpnInfo != GetInvalidWeaponInfoHandle() ); + + CDODWeaponInfo *pWeaponInfo = dynamic_cast< CDODWeaponInfo* >( GetFileWeaponInfoFromHandle( hWpnInfo ) ); + + Assert( pWeaponInfo && "Failed to get CDODWeaponInfo in weapon spawn" ); + + m_pWeaponInfo = pWeaponInfo; + + BaseClass::Spawn(); +} + +void CDODBaseRocketWeapon::Drop( const Vector &vecVelocity ) +{ + SetDeployed( false ); + + BaseClass::Drop( vecVelocity ); +} + +bool CDODBaseRocketWeapon::Deploy( ) +{ + return DefaultDeploy( (char*)GetViewModel(), (char*)GetWorldModel(), GetDrawActivity(), (char*)GetAnimPrefix() ); +} + +Activity CDODBaseRocketWeapon::GetDrawActivity( void ) +{ + return ACT_VM_DRAW; +} + +bool CDODBaseRocketWeapon::CanHolster( void ) +{ + // can't holster if we are delpoyed and not reloading + if ( IsDeployed() && !m_bInReload ) + return false; + + return true; +} + +bool CDODBaseRocketWeapon::Holster( CBaseCombatWeapon *pSwitchingTo ) +{ +#ifndef CLIENT_DLL + + CDODPlayer *pPlayer = ToDODPlayer( GetPlayerOwner() ); + pPlayer->SetBazookaDeployed( false ); + +#endif + + SetDeployed( false ); + + return BaseClass::Holster(pSwitchingTo); +} + + +void CDODBaseRocketWeapon::PrimaryAttack() +{ + Assert( m_pWeaponInfo ); + + CDODPlayer *pPlayer = ToDODPlayer( GetPlayerOwner() ); + + // Out of ammo? + if ( m_iClip1 <= 0 ) + { + if (m_bFireOnEmpty) + { + PlayEmptySound(); + m_flNextPrimaryAttack = gpGlobals->curtime + 0.2; + } + + return; + } + + if( pPlayer->GetWaterLevel() > 2 ) + { + PlayEmptySound(); + m_flNextPrimaryAttack = gpGlobals->curtime + 1.0; + return; + } + + if( IsDeployed() ) + { + // player "shoot" animation + pPlayer->SetAnimation( PLAYER_ATTACK1 ); + + SendWeaponAnim( ACT_VM_PRIMARYATTACK ); + + FireRocket(); + + DoFireEffects(); + + m_iClip1--; + +#ifdef CLIENT_DLL + if ( prediction->IsFirstTimePredicted() ) + pPlayer->DoRecoil( GetWeaponID(), GetRecoil() ); +#endif + + if ( m_iClip1 <= 0 && pPlayer->GetAmmoCount( GetPrimaryAmmoType() ) <= 0 ) + { + Lower(); + } + + m_flNextPrimaryAttack = gpGlobals->curtime + SequenceDuration() + 0.5; + m_flTimeWeaponIdle = gpGlobals->curtime + SequenceDuration() + 0.5; //length of the fire anim! + +#ifndef CLIENT_DLL + IGameEvent * event = gameeventmanager->CreateEvent( "dod_stats_weapon_attack" ); + if ( event ) + { + event->SetInt( "attacker", pPlayer->GetUserID() ); + event->SetInt( "weapon", GetStatsWeaponID() ); + + gameeventmanager->FireEvent( event ); + } +#endif //CLIENT_DLL + } + else + { +#ifdef CLIENT_DLL + pPlayer->HintMessage( HINT_SHOULDER_WEAPON, true ); +#endif + + m_flNextPrimaryAttack = gpGlobals->curtime + 2.0f; + } +} + +void CDODBaseRocketWeapon::FireRocket( void ) +{ + Assert( !"Derived classes must implement this." ); +} + +void CDODBaseRocketWeapon::DoFireEffects() +{ + CBasePlayer *pPlayer = GetPlayerOwner(); + + if ( pPlayer ) + pPlayer->DoMuzzleFlash(); + + //smoke etc +} + +void CDODBaseRocketWeapon::SecondaryAttack() +{ + CBasePlayer *pPlayer = GetPlayerOwner(); + + //if we're underwater, lower it + if( pPlayer->GetWaterLevel() > 2 ) + { + if( IsDeployed() ) + Lower(); + return; + } + + if( IsDeployed() ) + { + Lower(); + } + else + { + if ( CanAttack() ) + Raise(); + } +} + +void CDODBaseRocketWeapon::WeaponIdle() +{ + if (m_flTimeWeaponIdle > gpGlobals->curtime) + return; + + SendWeaponAnim( GetIdleActivity() ); + + m_flTimeWeaponIdle = gpGlobals->curtime + SequenceDuration(); +} + +Activity CDODBaseRocketWeapon::GetIdleActivity( void ) +{ + Activity actIdle; + + if( IsDeployed() ) + actIdle = ACT_VM_IDLE_DEPLOYED; + else + actIdle = ACT_VM_IDLE; + + return actIdle; +} + +/* Raise the Bazooka to your shoulder */ +void CDODBaseRocketWeapon::Raise() +{ + //raise to the shoulder + SendWeaponAnim( GetRaiseActivity() ); + + m_bDeployed = true; + + m_flNextPrimaryAttack = gpGlobals->curtime + SequenceDuration(); + m_flNextSecondaryAttack = gpGlobals->curtime + SequenceDuration(); + m_flTimeWeaponIdle = gpGlobals->curtime + SequenceDuration(); +} + +/* Lower the bazooka to running position */ +bool CDODBaseRocketWeapon::Lower() +{ + SendWeaponAnim( GetLowerActivity() ); + + m_bDeployed = false; + + CDODPlayer *pPlayer = ToDODPlayer( GetPlayerOwner() ); + pPlayer->SetBazookaDeployed( m_bDeployed ); + + m_flNextPrimaryAttack = gpGlobals->curtime + SequenceDuration(); + m_flNextSecondaryAttack = gpGlobals->curtime + SequenceDuration(); + m_flTimeWeaponIdle = gpGlobals->curtime + SequenceDuration(); + + return true; +} + +Activity CDODBaseRocketWeapon::GetLowerActivity( void ) +{ + return ACT_VM_UNDEPLOY; +} + +Activity CDODBaseRocketWeapon::GetRaiseActivity( void ) +{ + return ACT_VM_DEPLOY; +} + +#ifdef CLIENT_DLL + +ConVar deployed_bazooka_sensitivity( "deployed_bazooka_sensitivity", "0.6", FCVAR_CHEAT, "Mouse sensitivity while deploying a bazooka" ); + +void CDODBaseRocketWeapon::OverrideMouseInput( float *x, float *y ) +{ + if( m_bDeployed ) + { + float flSensitivity = deployed_bazooka_sensitivity.GetFloat(); + + *x *= flSensitivity; + *y *= flSensitivity; + } +} + +#endif
\ No newline at end of file |