From 39ed87570bdb2f86969d4be821c94b722dc71179 Mon Sep 17 00:00:00 2001 From: Joe Ludwig Date: Wed, 26 Jun 2013 15:22:04 -0700 Subject: First version of the SOurce SDK 2013 --- mp/src/game/server/EnvSpark.cpp | 195 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 mp/src/game/server/EnvSpark.cpp (limited to 'mp/src/game/server/EnvSpark.cpp') diff --git a/mp/src/game/server/EnvSpark.cpp b/mp/src/game/server/EnvSpark.cpp new file mode 100644 index 00000000..844d46d0 --- /dev/null +++ b/mp/src/game/server/EnvSpark.cpp @@ -0,0 +1,195 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: A point entity that periodically emits sparks and "bzzt" sounds. +// +// $NoKeywords: $ +//=============================================================================// + +#include "cbase.h" +#include "IEffects.h" +#include "engine/IEngineSound.h" +#include "envspark.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +//----------------------------------------------------------------------------- +// Purpose: Emits sparks from the given location and plays a random spark sound. +// Input : pev - +// location - +//----------------------------------------------------------------------------- +void DoSpark( CBaseEntity *ent, const Vector &location, int nMagnitude, int nTrailLength, bool bPlaySound, const Vector &vecDir ) +{ + g_pEffects->Sparks( location, nMagnitude, nTrailLength, &vecDir ); + + if ( bPlaySound ) + { + ent->EmitSound( "DoSpark" ); + } +} + +const int SF_SPARK_START_ON = 64; +const int SF_SPARK_GLOW = 128; +const int SF_SPARK_SILENT = 256; +const int SF_SPARK_DIRECTIONAL = 512; + +BEGIN_DATADESC( CEnvSpark ) + + DEFINE_KEYFIELD( m_flDelay, FIELD_FLOAT, "MaxDelay" ), + DEFINE_FIELD( m_nGlowSpriteIndex, FIELD_INTEGER ), + DEFINE_KEYFIELD( m_nMagnitude, FIELD_INTEGER, "Magnitude" ), + DEFINE_KEYFIELD( m_nTrailLength, FIELD_INTEGER, "TrailLength" ), + + // Function Pointers + DEFINE_FUNCTION( SparkThink ), + + DEFINE_INPUTFUNC( FIELD_VOID, "StartSpark", InputStartSpark ), + DEFINE_INPUTFUNC( FIELD_VOID, "StopSpark", InputStopSpark ), + DEFINE_INPUTFUNC( FIELD_VOID, "ToggleSpark", InputToggleSpark ), + DEFINE_INPUTFUNC( FIELD_VOID, "SparkOnce", InputSparkOnce ), + + DEFINE_OUTPUT( m_OnSpark, "OnSpark" ), + +END_DATADESC() + + +LINK_ENTITY_TO_CLASS( env_spark, CEnvSpark ); + + +//----------------------------------------------------------------------------- +// Purpose: Constructor! Exciting, isn't it? +//----------------------------------------------------------------------------- +CEnvSpark::CEnvSpark( void ) +{ + m_nMagnitude = 1; + m_nTrailLength = 1; +} + + +//----------------------------------------------------------------------------- +// Purpose: Called when spawning, after keyvalues have been handled. +//----------------------------------------------------------------------------- +void CEnvSpark::Spawn(void) +{ + SetThink( NULL ); + SetUse( NULL ); + + if ( FBitSet(m_spawnflags, SF_SPARK_START_ON ) ) + { + SetThink( &CEnvSpark::SparkThink ); // start sparking + } + + SetNextThink( gpGlobals->curtime + 0.1 + random->RandomFloat( 0, 1.5 ) ); + + // Negative delays are not allowed + if ( m_flDelay < 0 ) + { + m_flDelay = 0; + } + +#ifdef HL1_DLL + // Don't allow 0 delays in HL1 Port. Enforce a default + if( m_flDelay == 0 ) + { + m_flDelay = 1.0f; + } +#endif//HL1_DLL + + Precache( ); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CEnvSpark::Precache(void) +{ + m_nGlowSpriteIndex = PrecacheModel( "sprites/glow01.vmt" ); + + PrecacheScriptSound( "DoSpark" ); +} + +extern ConVar phys_pushscale; + +//----------------------------------------------------------------------------- +// Purpose: Emits sparks at random intervals. +//----------------------------------------------------------------------------- +void CEnvSpark::SparkThink(void) +{ + SetNextThink( gpGlobals->curtime + 0.1 + random->RandomFloat(0, m_flDelay) ); + + Vector vecDir = vec3_origin; + if ( FBitSet( m_spawnflags, SF_SPARK_DIRECTIONAL ) ) + { + AngleVectors( GetAbsAngles(), &vecDir ); + } + + DoSpark( this, WorldSpaceCenter(), m_nMagnitude, m_nTrailLength, !( m_spawnflags & SF_SPARK_SILENT ), vecDir ); + + m_OnSpark.FireOutput( this, this ); + + if (FBitSet(m_spawnflags, SF_SPARK_GLOW)) + { + CPVSFilter filter( GetAbsOrigin() ); + te->GlowSprite( filter, 0.0, &GetAbsOrigin(), m_nGlowSpriteIndex, 0.2, 1.5, 25 ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: Input handler for starting the sparks. +//----------------------------------------------------------------------------- +void CEnvSpark::InputStartSpark( inputdata_t &inputdata ) +{ + StartSpark(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CEnvSpark::StartSpark( void ) +{ + SetThink( &CEnvSpark::SparkThink ); + SetNextThink( gpGlobals->curtime ); +} + +//----------------------------------------------------------------------------- +// Purpose: Shoot one spark. +//----------------------------------------------------------------------------- +void CEnvSpark::InputSparkOnce( inputdata_t &inputdata ) +{ + SparkThink(); + SetNextThink( TICK_NEVER_THINK ); +} + +//----------------------------------------------------------------------------- +// Purpose: Input handler for starting the sparks. +//----------------------------------------------------------------------------- +void CEnvSpark::InputStopSpark( inputdata_t &inputdata ) +{ + StopSpark(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CEnvSpark::StopSpark( void ) +{ + SetThink( NULL ); +} + +//----------------------------------------------------------------------------- +// Purpose: Input handler for toggling the on/off state of the sparks. +//----------------------------------------------------------------------------- +void CEnvSpark::InputToggleSpark( inputdata_t &inputdata ) +{ + if ( GetNextThink() == TICK_NEVER_THINK ) + { + InputStartSpark( inputdata ); + } + else + { + InputStopSpark( inputdata ); + } +} + + -- cgit v1.2.3