summaryrefslogtreecommitdiff
path: root/game/client/tf2/c_basecombatcharacter_tf2.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/client/tf2/c_basecombatcharacter_tf2.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/client/tf2/c_basecombatcharacter_tf2.cpp')
-rw-r--r--game/client/tf2/c_basecombatcharacter_tf2.cpp284
1 files changed, 284 insertions, 0 deletions
diff --git a/game/client/tf2/c_basecombatcharacter_tf2.cpp b/game/client/tf2/c_basecombatcharacter_tf2.cpp
new file mode 100644
index 0000000..87df975
--- /dev/null
+++ b/game/client/tf2/c_basecombatcharacter_tf2.cpp
@@ -0,0 +1,284 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: TF2 Specific C_BaseCombatCharacter code.
+//
+//=============================================================================//
+#include "cbase.h"
+#include "c_basecombatcharacter.h"
+#include "tf_shareddefs.h"
+#include "particles_simple.h"
+#include "functionproxy.h"
+#include "IEffects.h"
+#include "weapon_combatshield.h"
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_BaseCombatCharacter::Release( void )
+{
+ RemoveAllPowerups();
+
+ BaseClass::Release();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_BaseCombatCharacter::SetDormant( bool bDormant )
+{
+ // If we're going dormant, stop all our powerup sounds
+ if ( bDormant )
+ {
+ RemoveAllPowerups();
+ }
+ else
+ {
+ // Restart any powerups on him
+ for ( int i = 0; i < MAX_POWERUPS; i++ )
+ {
+ if ( m_iPowerups & (1 << i) )
+ {
+ PowerupStart( i, false );
+ }
+ }
+ }
+
+ BaseClass::SetDormant( bDormant );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : updateType -
+//-----------------------------------------------------------------------------
+void C_BaseCombatCharacter::OnPreDataChanged( DataUpdateType_t updateType )
+{
+ BaseClass::OnPreDataChanged( updateType );
+
+ m_iPrevPowerups = m_iPowerups;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_BaseCombatCharacter::OnDataChanged( DataUpdateType_t updateType )
+{
+ BaseClass::OnDataChanged( updateType );
+
+ if ( updateType == DATA_UPDATE_CREATED )
+ {
+ SetNextClientThink( CLIENT_THINK_ALWAYS );
+ }
+
+ // Power state changed?
+ if ( m_iPowerups != m_iPrevPowerups )
+ {
+ for ( int i = 0; i < MAX_POWERUPS; i++ )
+ {
+ bool bPoweredNow = ( m_iPowerups & (1 << i) );
+ bool bPoweredThen = ( m_iPrevPowerups & (1 << i) );
+
+ if ( !bPoweredThen && bPoweredNow )
+ {
+ PowerupStart( i, true );
+ }
+ else if ( bPoweredThen && !bPoweredNow )
+ {
+ PowerupEnd( i );
+ }
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Powerup has just started
+// If bInitial is set, the server's just told us this powerup has come on.
+// If it's false, the entity had it on when it left PVS, and now it's re-entered
+//-----------------------------------------------------------------------------
+void C_BaseCombatCharacter::PowerupStart( int iPowerup, bool bInitial )
+{
+ Assert( iPowerup >= 0 && iPowerup < MAX_POWERUPS );
+
+ switch( iPowerup )
+ {
+ case POWERUP_BOOST:
+ break;
+
+ case POWERUP_EMP:
+ {
+ // Play the EMP sound
+ if ( !bInitial )
+ {
+ EmitSound( "BaseCombatCharacter.EMPPulse" );
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Powerup has just finished
+//-----------------------------------------------------------------------------
+void C_BaseCombatCharacter::PowerupEnd( int iPowerup )
+{
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_BaseCombatCharacter::RemoveAllPowerups( void )
+{
+ // Stop any powerups we have
+ if ( m_iPowerups )
+ {
+ for ( int i = 0; i < MAX_POWERUPS; i++ )
+ {
+ if ( m_iPowerups & (1 << i) )
+ {
+ PowerupEnd( i );
+ }
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_BaseCombatCharacter::ClientThink( void )
+{
+ BaseClass::ClientThink();
+
+ if ( !IsDormant() )
+ {
+ if ( HasPowerup(POWERUP_EMP) )
+ {
+ AddEMPEffect( WorldAlignSize().Length() * 0.15 );
+ }
+
+ if ( HasPowerup(POWERUP_BOOST) )
+ {
+ AddBuffEffect( WorldAlignSize().Length() * 0.15 );
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Draw an effect to show this entity has been EMPed
+//-----------------------------------------------------------------------------
+void C_BaseCombatCharacter::AddEMPEffect( float flSize )
+{
+ // Don't draw on the local player
+ if ( this == C_BasePlayer::GetLocalPlayer() )
+ return;
+
+ CSmartPtr<CSimpleEmitter> pEmitter;
+ PMaterialHandle hParticleMaterial;
+ TimedEvent pParticleEvent;
+
+ pParticleEvent.Init( 300 );
+ pEmitter = CSimpleEmitter::Create( "ObjectEMPEffect" );
+ hParticleMaterial = pEmitter->GetPMaterial( "sprites/chargeball" );
+
+ // Add particles
+ float flCur = gpGlobals->frametime;
+ Vector vCenter = WorldSpaceCenter( );
+
+ while ( pParticleEvent.NextEvent( flCur ) )
+ {
+ Vector vPos;
+ Vector vOffset = RandomVector( -1, 1 );
+ VectorNormalize( vOffset );
+ vPos = vCenter + (vOffset * RandomFloat( 0, flSize ));
+
+ pEmitter->SetSortOrigin( vPos );
+ SimpleParticle *pParticle = pEmitter->AddSimpleParticle( hParticleMaterial, vPos );
+ if ( pParticle )
+ {
+ // Move the points along the path.
+ pParticle->m_vecVelocity.Init();
+ pParticle->m_flRoll = 0;
+ pParticle->m_flRollDelta = 0;
+ pParticle->m_flDieTime = 0.4f;
+ pParticle->m_flLifetime = 0;
+ pParticle->m_uchColor[0] = 255;
+ pParticle->m_uchColor[1] = 255;
+ pParticle->m_uchColor[2] = 255;
+ pParticle->m_uchStartAlpha = 32;
+ pParticle->m_uchEndAlpha = 0;
+ pParticle->m_uchStartSize = 4;
+ pParticle->m_uchEndSize = 2;
+ pParticle->m_iFlags = 0;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Draw an effect to show this entity is being buffed
+//-----------------------------------------------------------------------------
+void C_BaseCombatCharacter::AddBuffEffect( float flSize )
+{
+ // Don't draw on the local player
+ if ( this == C_BasePlayer::GetLocalPlayer() )
+ return;
+
+ CSmartPtr<CSimpleEmitter> pEmitter;
+ PMaterialHandle hParticleMaterial;
+ TimedEvent pParticleEvent;
+
+ pParticleEvent.Init( 300 );
+ pEmitter = CSimpleEmitter::Create( "ObjectBuffEffect" );
+ hParticleMaterial = pEmitter->GetPMaterial( "sprites/chargeball" );
+
+ // Add particles
+ float flCur = gpGlobals->frametime;
+ Vector vCenter = WorldSpaceCenter( );
+
+ while ( pParticleEvent.NextEvent( flCur ) )
+ {
+ Vector vPos;
+ Vector vOffset = RandomVector( -1, 1 );
+ VectorNormalize( vOffset );
+ vPos = vCenter + (vOffset * RandomFloat( 0, flSize ));
+
+ SimpleParticle *pParticle = pEmitter->AddSimpleParticle( hParticleMaterial, vPos );
+ if ( pParticle )
+ {
+ // Move the points along the path.
+ pParticle->m_vecVelocity.Init();
+ pParticle->m_flRoll = 0;
+ pParticle->m_flRollDelta = 0;
+ pParticle->m_flDieTime = 0.4f;
+ pParticle->m_flLifetime = 0;
+ pParticle->m_uchColor[1] = 255; pParticle->m_uchColor[0] = pParticle->m_uchColor[2] = 0;
+ pParticle->m_uchStartAlpha = 128;
+ pParticle->m_uchEndAlpha = 0;
+ pParticle->m_uchStartSize = 3;
+ pParticle->m_uchEndSize = 1;
+ pParticle->m_iFlags = 0;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Returns shield if owned.
+//-----------------------------------------------------------------------------
+C_WeaponCombatShield *C_BaseCombatCharacter::GetShield( void )
+{
+ C_BaseCombatWeapon *pWeapon;
+ if ( GetTeamNumber() == TEAM_ALIENS )
+ {
+ pWeapon = Weapon_OwnsThisType( "weapon_combat_shield_alien" );
+ }
+ else
+ {
+ pWeapon = Weapon_OwnsThisType( "weapon_combat_shield" );
+ }
+
+ if ( !pWeapon )
+ return NULL;
+
+ return ( CWeaponCombatShield* )pWeapon;
+}