diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/hl2/env_alyxemp.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/server/hl2/env_alyxemp.cpp')
| -rw-r--r-- | game/server/hl2/env_alyxemp.cpp | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/game/server/hl2/env_alyxemp.cpp b/game/server/hl2/env_alyxemp.cpp new file mode 100644 index 0000000..b56a103 --- /dev/null +++ b/game/server/hl2/env_alyxemp.cpp @@ -0,0 +1,272 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Alyx's EMP effect +// +//=============================================================================// + +#include "cbase.h" +#include "env_alyxemp_shared.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +#define EMP_BEAM_SPRITE "effects/laser1.vmt" + + +LINK_ENTITY_TO_CLASS( env_alyxemp, CAlyxEmpEffect ); + +BEGIN_DATADESC( CAlyxEmpEffect ) + + DEFINE_KEYFIELD( m_nType, FIELD_INTEGER, "Type" ), + DEFINE_KEYFIELD( m_strTargetName, FIELD_STRING, "EndTargetName" ), + + DEFINE_FIELD( m_nState, FIELD_INTEGER ), + DEFINE_FIELD( m_flDuration, FIELD_FLOAT ), + DEFINE_FIELD( m_flStartTime, FIELD_TIME ), + DEFINE_FIELD( m_hTargetEnt, FIELD_EHANDLE ), + DEFINE_FIELD( m_hBeam, FIELD_EHANDLE ), + + DEFINE_FIELD( m_iState, FIELD_INTEGER ), + DEFINE_FIELD( m_bAutomated, FIELD_BOOLEAN ), + + DEFINE_THINKFUNC( AutomaticThink ), + + DEFINE_INPUTFUNC( FIELD_FLOAT, "StartCharge", InputStartCharge ), + DEFINE_INPUTFUNC( FIELD_VOID, "StartDischarge", InputStartDischarge ), + DEFINE_INPUTFUNC( FIELD_FLOAT, "Stop", InputStop ), + DEFINE_INPUTFUNC( FIELD_STRING, "SetTargetEnt", InputSetTargetEnt ), + +END_DATADESC() + +IMPLEMENT_SERVERCLASS_ST( CAlyxEmpEffect, DT_AlyxEmpEffect ) + SendPropInt( SENDINFO(m_nState), 8, SPROP_UNSIGNED), + SendPropFloat( SENDINFO(m_flDuration), 0, SPROP_NOSCALE), + SendPropFloat( SENDINFO(m_flStartTime), 0, SPROP_NOSCALE), +END_SEND_TABLE() + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CAlyxEmpEffect::Spawn( void ) +{ + Precache(); + + // No model but we still need to force this! + AddEFlags( EFL_FORCE_CHECK_TRANSMIT ); + + // No shadows + AddEffects( EF_NOSHADOW | EF_NORECEIVESHADOW ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CAlyxEmpEffect::Activate( void ) +{ + // Start out with a target entity + SetTargetEntity( STRING(m_strTargetName) ); + + BaseClass::Activate(); +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *szEntityName - +//----------------------------------------------------------------------------- +void CAlyxEmpEffect::SetTargetEntity( const char *szEntityName ) +{ + // Find and store off our target entity + CBaseEntity *pTargetEnt = NULL; + if ( szEntityName && szEntityName[0] ) + { + pTargetEnt = gEntList.FindEntityByName( NULL, szEntityName ); + + if ( pTargetEnt == NULL ) + { + Assert(0); + DevMsg( "Unable to find env_alyxemp (%s) target %s!\n", GetEntityName().ToCStr(), szEntityName ); + } + } + + SetTargetEntity( pTargetEnt ); +} + +//----------------------------------------------------------------------------- +// Passing NULL is ok! +//----------------------------------------------------------------------------- +void CAlyxEmpEffect::SetTargetEntity( CBaseEntity *pTarget ) +{ + m_hTargetEnt.Set( pTarget ); +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void CAlyxEmpEffect::ActivateAutomatic( CBaseEntity *pAlyx, CBaseEntity *pTarget ) +{ + Assert( pAlyx->GetBaseAnimating() != NULL ); + + SetParent( pAlyx, pAlyx->GetBaseAnimating()->LookupAttachment("LeftHand") ); + SetLocalOrigin( vec3_origin ); + + m_iState = ALYXEMP_STATE_OFF; + SetTargetEntity( pTarget ); + SetThink( &CAlyxEmpEffect::AutomaticThink ); + SetNextThink( gpGlobals->curtime ); + + m_bAutomated = true; +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CAlyxEmpEffect::AutomaticThink() +{ + bool bSetNextThink = true; + + switch( m_iState ) + { + case ALYXEMP_STATE_OFF: + StartCharge( 0.05f ); + break; + + case ALYXEMP_STATE_CHARGING: + StartDischarge(); + break; + + case ALYXEMP_STATE_DISCHARGING: + Stop( 1.0f ); + bSetNextThink = false; + break; + } + + m_iState++; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CAlyxEmpEffect::Precache( void ) +{ + PrecacheModel( EMP_BEAM_SPRITE ); + + PrecacheScriptSound( "AlyxEmp.Charge" ); + PrecacheScriptSound( "AlyxEmp.Discharge" ); + PrecacheScriptSound( "AlyxEmp.Stop" ); +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : &inputdata - +//----------------------------------------------------------------------------- +void CAlyxEmpEffect::InputStartCharge( inputdata_t &inputdata ) +{ + StartCharge( inputdata.value.Float() ); +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CAlyxEmpEffect::StartCharge( float flDuration ) +{ + EmitSound( "AlyxEmp.Charge" ); + + m_nState = (int)ALYXEMP_STATE_CHARGING; + m_flDuration = flDuration; + m_flStartTime = gpGlobals->curtime; + + if( m_bAutomated ) + { + SetNextThink( gpGlobals->curtime + m_flDuration ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : &inputdata - +//----------------------------------------------------------------------------- +void CAlyxEmpEffect::InputStartDischarge( inputdata_t &inputdata ) +{ + StartDischarge(); +} + +void CAlyxEmpEffect::StartDischarge() +{ + EmitSound( "AlyxEmp.Discharge" ); + + m_nState = (int)ALYXEMP_STATE_DISCHARGING; + m_flStartTime = gpGlobals->curtime; + + // Beam effects on the target entity! + if ( !m_hBeam && m_hTargetEnt ) + { + // Check to store off our view model index + m_hBeam = CBeam::BeamCreate( EMP_BEAM_SPRITE, 8 ); + + if ( m_hBeam != NULL ) + { + m_hBeam->PointEntInit( m_hTargetEnt->GetAbsOrigin(), this ); + m_hBeam->SetStartEntity( m_hTargetEnt ); + m_hBeam->SetWidth( 4 ); + m_hBeam->SetEndWidth( 8 ); + m_hBeam->SetBrightness( 255 ); + m_hBeam->SetColor( 255, 255, 255 ); + m_hBeam->LiveForTime( 999.0f ); + m_hBeam->RelinkBeam(); + m_hBeam->SetNoise( 16 ); + } + + // End hit + Vector shotDir = ( GetAbsOrigin() - m_hTargetEnt->GetAbsOrigin() ); + VectorNormalize( shotDir ); + + CPVSFilter filter( m_hTargetEnt->GetAbsOrigin() ); + te->GaussExplosion( filter, 0.0f, m_hTargetEnt->GetAbsOrigin() - ( shotDir * 4.0f ), RandomVector(-1.0f, 1.0f), 0 ); + } + + if( m_bAutomated ) + { + SetNextThink( gpGlobals->curtime + 0.5f ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : &inputdata - +//----------------------------------------------------------------------------- +void CAlyxEmpEffect::InputStop( inputdata_t &inputdata ) +{ + float flDuration = inputdata.value.Float(); + + Stop( flDuration ); +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void CAlyxEmpEffect::Stop( float flDuration ) +{ + EmitSound( "AlyxEmp.Stop" ); + + m_nState = (int)ALYXEMP_STATE_OFF; + m_flDuration = flDuration; + m_flStartTime = gpGlobals->curtime; + + if ( m_hBeam != NULL ) + { + UTIL_Remove( m_hBeam ); + m_hBeam = NULL; + } + + if( m_bAutomated ) + { + SetThink( &CAlyxEmpEffect::SUB_Remove ); + SetNextThink( gpGlobals->curtime + flDuration + 1.0f ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : &inputdata - +//----------------------------------------------------------------------------- +void CAlyxEmpEffect::InputSetTargetEnt( inputdata_t &inputdata ) +{ + SetTargetEntity( inputdata.value.String() ); +} |