|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//===========================================================================//
#include "cbase.h"
#include "c_te_particlesystem.h"
#include "fx.h"
#include "ragdollexplosionenumerator.h"
#include "tier1/KeyValues.h"
#include "toolframework_client.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
//-----------------------------------------------------------------------------
// Purpose: Concussive explosion entity
//-----------------------------------------------------------------------------
class C_TEConcussiveExplosion : public C_TEParticleSystem { public: DECLARE_CLASS( C_TEConcussiveExplosion, C_TEParticleSystem ); DECLARE_CLIENTCLASS();
virtual void PostDataUpdate( DataUpdateType_t updateType );
void AffectRagdolls( void );
Vector m_vecNormal; float m_flScale; int m_nRadius; int m_nMagnitude; };
//-----------------------------------------------------------------------------
// Networking
//-----------------------------------------------------------------------------
IMPLEMENT_CLIENTCLASS_EVENT_DT( C_TEConcussiveExplosion, DT_TEConcussiveExplosion, CTEConcussiveExplosion ) RecvPropVector( RECVINFO(m_vecNormal)), RecvPropFloat( RECVINFO(m_flScale)), RecvPropInt( RECVINFO(m_nRadius)), RecvPropInt( RECVINFO(m_nMagnitude)), END_RECV_TABLE()
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void C_TEConcussiveExplosion::AffectRagdolls( void ) { if ( ( m_nRadius == 0 ) || ( m_nMagnitude == 0 ) ) return;
CRagdollExplosionEnumerator ragdollEnum( m_vecOrigin, m_nRadius, m_nMagnitude ); partition->EnumerateElementsInSphere( PARTITION_CLIENT_RESPONSIVE_EDICTS, m_vecOrigin, m_nRadius, false, &ragdollEnum ); }
//-----------------------------------------------------------------------------
// Recording
//-----------------------------------------------------------------------------
static inline void RecordConcussiveExplosion( const Vector& start, const Vector &vecDirection ) { if ( !ToolsEnabled() ) return;
if ( clienttools->IsInRecordingMode() ) { KeyValues *msg = new KeyValues( "TempEntity" );
msg->SetInt( "te", TE_CONCUSSIVE_EXPLOSION ); msg->SetString( "name", "TE_ConcussiveExplosion" ); msg->SetFloat( "time", gpGlobals->curtime ); msg->SetFloat( "originx", start.x ); msg->SetFloat( "originy", start.y ); msg->SetFloat( "originz", start.z ); msg->SetFloat( "directionx", vecDirection.x ); msg->SetFloat( "directiony", vecDirection.y ); msg->SetFloat( "directionz", vecDirection.z );
ToolFramework_PostToolMessage( HTOOLHANDLE_INVALID, msg ); msg->deleteThis(); } }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void C_TEConcussiveExplosion::PostDataUpdate( DataUpdateType_t updateType ) { AffectRagdolls();
FX_ConcussiveExplosion( m_vecOrigin, m_vecNormal ); RecordConcussiveExplosion( m_vecOrigin, m_vecNormal ); } void TE_ConcussiveExplosion( IRecipientFilter& filter, float delay, KeyValues *pKeyValues ) { Vector vecOrigin, vecDirection; vecOrigin.x = pKeyValues->GetFloat( "originx" ); vecOrigin.y = pKeyValues->GetFloat( "originy" ); vecOrigin.z = pKeyValues->GetFloat( "originz" ); vecDirection.x = pKeyValues->GetFloat( "directionx" ); vecDirection.y = pKeyValues->GetFloat( "directiony" ); vecDirection.z = pKeyValues->GetFloat( "directionz" ); FX_ConcussiveExplosion( vecOrigin, vecDirection ); }
|