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.
158 lines
4.4 KiB
158 lines
4.4 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//===========================================================================// |
|
|
|
#include "cbase.h" |
|
#include "c_basetempentity.h" |
|
#include "iefx.h" |
|
#include "tier1/KeyValues.h" |
|
#include "toolframework_client.h" |
|
#include "fx.h" |
|
#include "decals.h" |
|
#include "tier0/vprof.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: World Decal TE |
|
//----------------------------------------------------------------------------- |
|
class C_TEWorldDecal : public C_BaseTempEntity |
|
{ |
|
public: |
|
DECLARE_CLASS( C_TEWorldDecal, C_BaseTempEntity ); |
|
DECLARE_CLIENTCLASS(); |
|
|
|
C_TEWorldDecal( void ); |
|
virtual ~C_TEWorldDecal( void ); |
|
|
|
virtual void PostDataUpdate( DataUpdateType_t updateType ); |
|
|
|
virtual void Precache( void ); |
|
|
|
public: |
|
Vector m_vecOrigin; |
|
int m_nIndex; |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Networking |
|
//----------------------------------------------------------------------------- |
|
IMPLEMENT_CLIENTCLASS_EVENT_DT(C_TEWorldDecal, DT_TEWorldDecal, CTEWorldDecal) |
|
RecvPropVector( RECVINFO(m_vecOrigin)), |
|
RecvPropInt( RECVINFO(m_nIndex)), |
|
END_RECV_TABLE() |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Constructor, destructor |
|
//----------------------------------------------------------------------------- |
|
C_TEWorldDecal::C_TEWorldDecal( void ) |
|
{ |
|
m_vecOrigin.Init(); |
|
m_nIndex = 0; |
|
} |
|
|
|
C_TEWorldDecal::~C_TEWorldDecal( void ) |
|
{ |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void C_TEWorldDecal::Precache( void ) |
|
{ |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Shared code |
|
//----------------------------------------------------------------------------- |
|
static inline void RecordWorldDecal( const Vector *pos, int index ) |
|
{ |
|
if ( !ToolsEnabled() ) |
|
return; |
|
|
|
if ( clienttools->IsInRecordingMode() ) |
|
{ |
|
KeyValues *msg = new KeyValues( "TempEntity" ); |
|
|
|
msg->SetInt( "te", TE_WORLD_DECAL ); |
|
msg->SetString( "name", "TE_WorldDecal" ); |
|
msg->SetFloat( "time", gpGlobals->curtime ); |
|
msg->SetFloat( "originx", pos->x ); |
|
msg->SetFloat( "originy", pos->y ); |
|
msg->SetFloat( "originz", pos->z ); |
|
msg->SetString( "decalname", effects->Draw_DecalNameFromIndex( index ) ); |
|
|
|
ToolFramework_PostToolMessage( HTOOLHANDLE_INVALID, msg ); |
|
msg->deleteThis(); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void C_TEWorldDecal::PostDataUpdate( DataUpdateType_t updateType ) |
|
{ |
|
VPROF( "C_TEWorldDecal::PostDataUpdate" ); |
|
|
|
if ( r_decals.GetInt() ) |
|
{ |
|
C_BaseEntity *ent = cl_entitylist->GetEnt( 0 ); |
|
if ( ent ) |
|
{ |
|
bool bNoBlood = UTIL_IsLowViolence(); |
|
bool bIsBlood = false; |
|
|
|
if ( bNoBlood ) |
|
{ |
|
const char *pchDecalName = decalsystem->GetDecalNameForIndex( m_nIndex ); |
|
if ( pchDecalName && V_stristr( pchDecalName, "blood" ) ) |
|
{ |
|
bIsBlood = true; |
|
} |
|
} |
|
|
|
if ( !( bNoBlood && bIsBlood ) ) |
|
{ |
|
effects->DecalShoot( m_nIndex, 0, ent->GetModel(), ent->GetAbsOrigin(), ent->GetAbsAngles(), m_vecOrigin, 0, 0 ); |
|
} |
|
} |
|
} |
|
RecordWorldDecal( &m_vecOrigin, m_nIndex ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Client-side effects |
|
//----------------------------------------------------------------------------- |
|
void TE_WorldDecal( IRecipientFilter& filter, float delay, const Vector* pos, int index ) |
|
{ |
|
if ( r_decals.GetInt() ) |
|
{ |
|
C_BaseEntity *ent = cl_entitylist->GetEnt( 0 ); |
|
if ( ent ) |
|
{ |
|
effects->DecalShoot( index, 0, ent->GetModel(), ent->GetAbsOrigin(), ent->GetAbsAngles(), *pos, 0, 0 ); |
|
} |
|
} |
|
RecordWorldDecal( pos, index ); |
|
} |
|
|
|
|
|
void TE_WorldDecal( IRecipientFilter& filter, float delay, KeyValues *pKeyValues ) |
|
{ |
|
Vector vecOrigin; |
|
vecOrigin.x = pKeyValues->GetFloat( "originx" ); |
|
vecOrigin.y = pKeyValues->GetFloat( "originy" ); |
|
vecOrigin.z = pKeyValues->GetFloat( "originz" ); |
|
const char *pDecalName = pKeyValues->GetString( "decalname" ); |
|
|
|
TE_WorldDecal( filter, 0.0f, &vecOrigin, effects->Draw_DecalIndexFromName( (char*)pDecalName ) ); |
|
}
|
|
|