Files
HL2Overcharged/game/client/overcharged/c_te_IonBang.cpp
2025-05-21 21:09:22 +03:00

110 lines
3.5 KiB
C++

//========= 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_TEIonExplosion : public C_TEParticleSystem
{
public:
DECLARE_CLASS(C_TEIonExplosion, 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_TEIonExplosion, DT_TEIonExplosion, CTE_IonBang)
RecvPropVector(RECVINFO(m_vecNormal)),
RecvPropFloat(RECVINFO(m_flScale)),
RecvPropInt(RECVINFO(m_nRadius)),
RecvPropInt(RECVINFO(m_nMagnitude)),
END_RECV_TABLE()
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void C_TEIonExplosion::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 RecordIonExplosion(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_IonExplosion");
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_TEIonExplosion::PostDataUpdate(DataUpdateType_t updateType)
{
AffectRagdolls();
FX_ConcussiveExplosion(m_vecOrigin, m_vecNormal);
RecordIonExplosion(m_vecOrigin, m_vecNormal);
}
void TE_IonExplosion(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);
}