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.
161 lines
4.3 KiB
161 lines
4.3 KiB
![]()
4 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Client side antlion guard. Used to create dlight for the cave guard.
|
||
|
//
|
||
|
//=============================================================================
|
||
|
|
||
|
#include "cbase.h"
|
||
|
#include "c_ai_basenpc.h"
|
||
|
#include "dlight.h"
|
||
|
#include "iefx.h"
|
||
|
|
||
|
// memdbgon must be the last include file in a .cpp file!!!
|
||
|
#include "tier0/memdbgon.h"
|
||
|
|
||
|
|
||
|
#if HL2_EPISODIC
|
||
|
// When enabled, add code to have the antlion bleed profusely as it is badly injured.
|
||
|
#define ANTLIONGUARD_BLOOD_EFFECTS 2
|
||
|
#endif
|
||
|
|
||
|
|
||
|
class C_NPC_AntlionGuard : public C_AI_BaseNPC
|
||
|
{
|
||
|
public:
|
||
|
C_NPC_AntlionGuard() {}
|
||
|
|
||
|
DECLARE_CLASS( C_NPC_AntlionGuard, C_AI_BaseNPC );
|
||
|
DECLARE_CLIENTCLASS();
|
||
|
DECLARE_DATADESC();
|
||
|
|
||
|
virtual void OnDataChanged( DataUpdateType_t type );
|
||
|
virtual void ClientThink();
|
||
|
|
||
|
private:
|
||
|
|
||
|
bool m_bCavernBreed;
|
||
|
bool m_bInCavern;
|
||
|
dlight_t *m_dlight;
|
||
|
|
||
|
#if HL2_EPISODIC
|
||
|
unsigned char m_iBleedingLevel; //< the version coming from the server
|
||
|
unsigned char m_iPerformingBleedingLevel; //< the version we're currently performing (for comparison to one above)
|
||
|
CNewParticleEffect *m_pBleedingFX;
|
||
|
|
||
|
/// update the hemorrhage particle effect
|
||
|
virtual void UpdateBleedingPerformance( void );
|
||
|
#endif
|
||
|
|
||
|
C_NPC_AntlionGuard( const C_NPC_AntlionGuard & );
|
||
|
};
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Save/restore
|
||
|
//-----------------------------------------------------------------------------
|
||
|
BEGIN_DATADESC( C_NPC_AntlionGuard )
|
||
|
END_DATADESC()
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Networking
|
||
|
//-----------------------------------------------------------------------------
|
||
|
IMPLEMENT_CLIENTCLASS_DT(C_NPC_AntlionGuard, DT_NPC_AntlionGuard, CNPC_AntlionGuard)
|
||
|
RecvPropBool( RECVINFO( m_bCavernBreed ) ),
|
||
|
RecvPropBool( RECVINFO( m_bInCavern ) ),
|
||
|
|
||
|
#if ANTLIONGUARD_BLOOD_EFFECTS
|
||
|
RecvPropInt( RECVINFO( m_iBleedingLevel ) ),
|
||
|
#endif
|
||
|
END_RECV_TABLE()
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void C_NPC_AntlionGuard::OnDataChanged( DataUpdateType_t type )
|
||
|
{
|
||
|
BaseClass::OnDataChanged( type );
|
||
|
|
||
|
if ( (type == DATA_UPDATE_CREATED) && m_bCavernBreed && m_bInCavern )
|
||
|
{
|
||
|
SetNextClientThink( CLIENT_THINK_ALWAYS );
|
||
|
}
|
||
|
|
||
|
|
||
|
#if HL2_EPISODIC
|
||
|
if (m_iBleedingLevel != m_iPerformingBleedingLevel)
|
||
|
{
|
||
|
UpdateBleedingPerformance();
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
|
||
|
#if HL2_EPISODIC
|
||
|
//-----------------------------------------------------------------------------
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void C_NPC_AntlionGuard::UpdateBleedingPerformance()
|
||
|
{
|
||
|
// get my particles
|
||
|
CParticleProperty * pProp = ParticleProp();
|
||
|
|
||
|
// squelch the prior effect if it exists
|
||
|
if (m_pBleedingFX)
|
||
|
{
|
||
|
pProp->StopEmission(m_pBleedingFX);
|
||
|
m_pBleedingFX = NULL;
|
||
|
}
|
||
|
|
||
|
// kick off a new effect
|
||
|
switch (m_iBleedingLevel)
|
||
|
{
|
||
|
case 1: // light bleeding
|
||
|
{
|
||
|
m_pBleedingFX = pProp->Create( "blood_antlionguard_injured_light", PATTACH_ABSORIGIN_FOLLOW );
|
||
|
AssertMsg1( m_pBleedingFX, "Particle system couldn't make %s", "blood_antlionguard_injured_light" );
|
||
|
if ( m_pBleedingFX )
|
||
|
{
|
||
|
pProp->AddControlPoint( m_pBleedingFX, 1, this, PATTACH_ABSORIGIN_FOLLOW );
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 2: // severe bleeding
|
||
|
{
|
||
|
m_pBleedingFX = pProp->Create( "blood_antlionguard_injured_heavy", PATTACH_ABSORIGIN_FOLLOW );
|
||
|
AssertMsg1( m_pBleedingFX, "Particle system couldn't make %s", "blood_antlionguard_injured_heavy" );
|
||
|
if ( m_pBleedingFX )
|
||
|
{
|
||
|
pProp->AddControlPoint( m_pBleedingFX, 1, this, PATTACH_ABSORIGIN_FOLLOW );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
m_iPerformingBleedingLevel = m_iBleedingLevel;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void C_NPC_AntlionGuard::ClientThink()
|
||
|
{
|
||
|
// update the dlight. (always done because clienthink only exists for cavernguard)
|
||
|
if (!m_dlight)
|
||
|
{
|
||
|
m_dlight = effects->CL_AllocDlight( index );
|
||
|
m_dlight->color.r = 220;
|
||
|
m_dlight->color.g = 255;
|
||
|
m_dlight->color.b = 80;
|
||
|
m_dlight->radius = 180;
|
||
|
m_dlight->minlight = 128.0 / 256.0f;
|
||
|
m_dlight->flags = DLIGHT_NO_MODEL_ILLUMINATION;
|
||
|
}
|
||
|
|
||
|
m_dlight->origin = GetAbsOrigin();
|
||
|
// dl->die = gpGlobals->curtime + 0.1f;
|
||
|
|
||
|
BaseClass::ClientThink();
|
||
|
}
|