aboutsummaryrefslogtreecommitdiff
path: root/sp/src/game/client/hl2/c_func_tankmortar.cpp
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /sp/src/game/client/hl2/c_func_tankmortar.cpp
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'sp/src/game/client/hl2/c_func_tankmortar.cpp')
-rw-r--r--sp/src/game/client/hl2/c_func_tankmortar.cpp249
1 files changed, 249 insertions, 0 deletions
diff --git a/sp/src/game/client/hl2/c_func_tankmortar.cpp b/sp/src/game/client/hl2/c_func_tankmortar.cpp
new file mode 100644
index 00000000..5d23995d
--- /dev/null
+++ b/sp/src/game/client/hl2/c_func_tankmortar.cpp
@@ -0,0 +1,249 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "cbase.h"
+#include "fx_quad.h"
+#include "fx.h"
+
+class C_MortarShell : public C_BaseEntity
+{
+public:
+
+ DECLARE_CLASS( C_MortarShell, C_BaseEntity );
+ DECLARE_CLIENTCLASS();
+
+ void OnDataChanged( DataUpdateType_t updateType );
+ int DrawModel( int flags );
+
+ RenderGroup_t GetRenderGroup( void ) { return RENDER_GROUP_TRANSLUCENT_ENTITY; }
+
+private:
+
+ void AddRisingParticles( float flPerc );
+ void AddExplodingParticles( float flPerc );
+
+ inline float GetStartPerc( void );
+ inline float GetEndPerc( void );
+
+ CSmartPtr<CSimpleEmitter> m_pEmitter;
+ TimedEvent m_ParticleEvent;
+
+ float m_flLifespan;
+ float m_flRadius;
+ float m_flStarttime;
+ Vector m_vecSurfaceNormal;
+};
+
+IMPLEMENT_CLIENTCLASS_DT( C_MortarShell, DT_MortarShell, CMortarShell )
+ RecvPropFloat( RECVINFO( m_flLifespan ) ),
+ RecvPropFloat( RECVINFO( m_flRadius ) ),
+ RecvPropVector( RECVINFO( m_vecSurfaceNormal ) ),
+END_RECV_TABLE()
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : updateType -
+//-----------------------------------------------------------------------------
+void C_MortarShell::OnDataChanged( DataUpdateType_t updateType )
+{
+ BaseClass::OnDataChanged( updateType );
+
+ if ( updateType == DATA_UPDATE_CREATED )
+ {
+ m_flStarttime = gpGlobals->curtime;
+ AddToLeafSystem( RENDER_GROUP_TRANSLUCENT_ENTITY );
+
+ m_pEmitter = CSimpleEmitter::Create( "C_EntityDissolve" );
+ m_pEmitter->SetSortOrigin( GetAbsOrigin() );
+
+ m_ParticleEvent.Init( 128 );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : flPerc -
+//-----------------------------------------------------------------------------
+void C_MortarShell::AddRisingParticles( float flPerc )
+{
+ SimpleParticle *sParticle;
+
+ Vector offset;
+ float radius = m_flRadius * 0.25f * flPerc;
+
+ float val = RemapValClamped( gpGlobals->curtime, m_flStarttime, m_flStarttime + m_flLifespan, 0.0f, 1.0f );
+
+ float flCur = gpGlobals->frametime;
+
+ // Anime ground effects
+ while ( m_ParticleEvent.NextEvent( flCur ) )
+ {
+ offset.x = random->RandomFloat( -radius, radius );
+ offset.y = random->RandomFloat( -radius, radius );
+ offset.z = random->RandomFloat( -8.0f, 8.0f );
+
+ offset += GetAbsOrigin();
+
+ sParticle = (SimpleParticle *) m_pEmitter->AddParticle( sizeof(SimpleParticle), m_pEmitter->GetPMaterial( "effects/spark" ), offset );
+
+ if ( sParticle == NULL )
+ return;
+
+ sParticle->m_vecVelocity = Vector( Helper_RandomFloat( -4.0f, 4.0f ), Helper_RandomFloat( -4.0f, 4.0f ), Helper_RandomFloat( 32.0f, 256.0f ) * Bias( val, 0.25f ) );
+
+ sParticle->m_uchStartSize = random->RandomFloat( 4, 8 ) * flPerc;
+
+ sParticle->m_flDieTime = random->RandomFloat( 0.5f, 1.0f );
+
+ sParticle->m_flLifetime = 0.0f;
+
+ sParticle->m_flRoll = Helper_RandomInt( 0, 360 );
+
+ float alpha = 255 * flPerc;
+
+ sParticle->m_flRollDelta = Helper_RandomFloat( -8.0f * flPerc, 8.0f * flPerc );
+ sParticle->m_uchColor[0] = alpha;
+ sParticle->m_uchColor[1] = alpha;
+ sParticle->m_uchColor[2] = alpha;
+ sParticle->m_uchStartAlpha = alpha;
+ sParticle->m_uchEndAlpha = 0;
+ sParticle->m_uchEndSize = 0;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : flPerc -
+//-----------------------------------------------------------------------------
+void C_MortarShell::AddExplodingParticles( float flPerc )
+{
+ SimpleParticle *sParticle;
+
+ Vector offset;
+ float radius = 48.0f * flPerc;
+
+ float flCur = gpGlobals->frametime;
+
+ // Anime ground effects
+ while ( m_ParticleEvent.NextEvent( flCur ) )
+ {
+ offset.x = random->RandomFloat( -radius, radius );
+ offset.y = random->RandomFloat( -radius, radius );
+ offset.z = random->RandomFloat( -8.0f, 8.0f );
+
+ offset += GetAbsOrigin();
+
+ sParticle = (SimpleParticle *) m_pEmitter->AddParticle( sizeof(SimpleParticle), m_pEmitter->GetPMaterial( "effects/spark" ), offset );
+
+ if ( sParticle == NULL )
+ return;
+
+ sParticle->m_vecVelocity = RandomVector( -1.0f, 1.0f ) + Vector( 0, 0, 1 );
+ sParticle->m_vecVelocity *= ( 750.0f * flPerc );
+
+ sParticle->m_uchStartSize = random->RandomFloat( 2, 4 ) * flPerc;
+
+ sParticle->m_flDieTime = random->RandomFloat( 0.25f, 0.5f );
+
+ sParticle->m_flLifetime = 0.0f;
+
+ sParticle->m_flRoll = Helper_RandomInt( 0, 360 );
+
+ float alpha = 255 * flPerc;
+
+ sParticle->m_flRollDelta = Helper_RandomFloat( -8.0f * flPerc, 8.0f * flPerc );
+ sParticle->m_uchColor[0] = alpha;
+ sParticle->m_uchColor[1] = alpha;
+ sParticle->m_uchColor[2] = alpha;
+ sParticle->m_uchStartAlpha = alpha;
+ sParticle->m_uchEndAlpha = 0;
+ sParticle->m_uchEndSize = 0;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : inline float
+//-----------------------------------------------------------------------------
+inline float C_MortarShell::GetStartPerc( void )
+{
+ float val = RemapValClamped( gpGlobals->curtime, m_flStarttime, m_flStarttime + m_flLifespan, 0.0f, 1.0f );
+
+ return ( Gain( val, 0.2f ) );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : inline float
+//-----------------------------------------------------------------------------
+inline float C_MortarShell::GetEndPerc( void )
+{
+ float val = RemapValClamped( gpGlobals->curtime, m_flStarttime + m_flLifespan, m_flStarttime + m_flLifespan + 1.0f, 1.0f, 0.0f );
+
+ return ( Gain( val, 0.75f ) );
+}
+
+#define ALPHA_MIN 0.0f
+#define ALPHA_MAX 1.0f
+
+#define SCALE_MIN 8
+#define SCALE_MAX 200
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_MortarShell::DrawModel( int flags )
+{
+ if ( gpGlobals->frametime <= 0.0f )
+ return 0;
+
+ float flPerc;
+ bool ending;
+
+ // See if we're in the beginning phase
+ if ( gpGlobals->curtime < ( m_flStarttime + m_flLifespan ) )
+ {
+ flPerc = GetStartPerc();
+ ending = false;
+ }
+ else
+ {
+ flPerc = GetEndPerc();
+ ending = true;
+ }
+
+ float flAlpha = ALPHA_MIN + ( ( ALPHA_MAX - ALPHA_MIN ) * flPerc );
+ float flScale = ( ending ) ? m_flRadius : ( (m_flRadius*0.1f)+ ( ( m_flRadius - (m_flRadius*0.1f) ) * flPerc ) );
+
+ // Do the ground effect
+ FX_AddQuad( GetAbsOrigin() + ( m_vecSurfaceNormal * 2.0f ),
+ m_vecSurfaceNormal,
+ flScale,
+ flScale,
+ 1.0f,
+ flAlpha,
+ flAlpha,
+ 1.0f,
+ 0,
+ 0,
+ Vector( 1.0f, 1.0f, 1.0f ),
+ 0.0001f,
+ "effects/combinemuzzle2_nocull",
+ 0 );
+
+ if ( !ending )
+ {
+ // Add extra effects on startup
+ AddRisingParticles( flPerc );
+ }
+ else
+ {
+ // Add exploding particles after the impact
+ AddExplodingParticles( flPerc );
+ }
+
+ return 1;
+}