summaryrefslogtreecommitdiff
path: root/game/shared/dod/weapon_dodbaserpg.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_dodbaserpg.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_dodbaserpg.cpp')
-rw-r--r--game/shared/dod/weapon_dodbaserpg.cpp345
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