You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.0 KiB
106 lines
3.0 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: Game-specific explosion effects |
|
// |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "c_te_effect_dispatch.h" |
|
#include "tempent.h" |
|
#include "c_te_legacytempents.h" |
|
#include "dod_shareddefs.h" |
|
#include "engine/IEngineSound.h" |
|
#include "c_basetempentity.h" |
|
#include "tier0/vprof.h" |
|
#include "fx_explosion.h" |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void DODExplosionCallback( const Vector &vecOrigin, const Vector &vecNormal ) |
|
{ |
|
// Calculate the angles, given the normal. |
|
bool bInAir = false; |
|
QAngle angExplosion( 0.0f, 0.0f, 0.0f ); |
|
|
|
// Cannot use zeros here because we are sending the normal at a smaller bit size. |
|
if ( fabs( vecNormal.x ) < 0.05f && fabs( vecNormal.y ) < 0.05f && fabs( vecNormal.z ) < 0.05f ) |
|
{ |
|
bInAir = true; |
|
angExplosion.Init(); |
|
} |
|
else |
|
{ |
|
VectorAngles( vecNormal, angExplosion ); |
|
bInAir = false; |
|
} |
|
|
|
// Base explosion effect and sound. |
|
char *pszEffect = "explosion"; |
|
char *pszSound = "BaseExplosionEffect.Sound"; |
|
|
|
// Explosions. |
|
|
|
if ( UTIL_PointContents( vecOrigin ) & CONTENTS_WATER ) |
|
{ |
|
WaterExplosionEffect().Create( vecOrigin, 1 /*m_nMagnitude*/, 1 /*m_fScale*/, 0 /*m_nFlags*/ ); |
|
return; |
|
} |
|
else if ( bInAir ) |
|
{ |
|
pszEffect = "explosioncore_midair"; |
|
} |
|
else |
|
{ |
|
pszEffect = "explosioncore_floor"; |
|
} |
|
|
|
CLocalPlayerFilter filter; |
|
C_BaseEntity::EmitSound( filter, SOUND_FROM_WORLD, pszSound, &vecOrigin ); |
|
|
|
DispatchParticleEffect( pszEffect, vecOrigin, angExplosion ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
class C_TEDODExplosion : public C_BaseTempEntity |
|
{ |
|
public: |
|
|
|
DECLARE_CLASS( C_TEDODExplosion, C_BaseTempEntity ); |
|
DECLARE_CLIENTCLASS(); |
|
|
|
C_TEDODExplosion( void ); |
|
|
|
virtual void PostDataUpdate( DataUpdateType_t updateType ); |
|
|
|
public: |
|
Vector m_vecOrigin; |
|
Vector m_vecNormal; |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
C_TEDODExplosion::C_TEDODExplosion( void ) |
|
{ |
|
m_vecOrigin.Init(); |
|
m_vecNormal.Init(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void C_TEDODExplosion::PostDataUpdate( DataUpdateType_t updateType ) |
|
{ |
|
VPROF( "C_TETFExplosion::PostDataUpdate" ); |
|
DODExplosionCallback( m_vecOrigin, m_vecNormal ); |
|
} |
|
|
|
IMPLEMENT_CLIENTCLASS_EVENT_DT( C_TEDODExplosion, DT_TEDODExplosion, CTEDODExplosion ) |
|
RecvPropFloat( RECVINFO( m_vecOrigin[0] ) ), |
|
RecvPropFloat( RECVINFO( m_vecOrigin[1] ) ), |
|
RecvPropFloat( RECVINFO( m_vecOrigin[2] ) ), |
|
RecvPropVector( RECVINFO( m_vecNormal ) ), |
|
END_RECV_TABLE() |
|
|
|
|