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.
160 lines
4.3 KiB
160 lines
4.3 KiB
//========= 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(); |
|
}
|
|
|