summaryrefslogtreecommitdiff
path: root/game/server/hl2/env_alyxemp.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/hl2/env_alyxemp.cpp
downloadarchived-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.cpp272
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() );
+}