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.
273 lines
7.6 KiB
273 lines
7.6 KiB
![]()
4 years ago
|
//========= 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() );
|
||
|
}
|