aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/client/EffectsClient.cpp
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/client/EffectsClient.cpp
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/client/EffectsClient.cpp')
-rw-r--r--mp/src/game/client/EffectsClient.cpp231
1 files changed, 231 insertions, 0 deletions
diff --git a/mp/src/game/client/EffectsClient.cpp b/mp/src/game/client/EffectsClient.cpp
new file mode 100644
index 00000000..341d2d97
--- /dev/null
+++ b/mp/src/game/client/EffectsClient.cpp
@@ -0,0 +1,231 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Utility code.
+//
+// $NoKeywords: $
+//=============================================================================//
+#include "cbase.h"
+#include "IEffects.h"
+#include "fx.h"
+#include "c_te_legacytempents.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+//-----------------------------------------------------------------------------
+// Client-server neutral effects interface
+//-----------------------------------------------------------------------------
+class CEffectsClient : public IEffects
+{
+public:
+ CEffectsClient();
+ virtual ~CEffectsClient();
+
+ // Members of the IEffect interface
+ virtual void Beam( const Vector &Start, const Vector &End, int nModelIndex,
+ int nHaloIndex, unsigned char frameStart, unsigned char frameRate,
+ float flLife, unsigned char width, unsigned char endWidth, unsigned char fadeLength,
+ unsigned char noise, unsigned char red, unsigned char green,
+ unsigned char blue, unsigned char brightness, unsigned char speed);
+ virtual void Smoke( const Vector &origin, int modelIndex, float scale, float framerate );
+ virtual void Sparks( const Vector &position, int nMagnitude = 1, int nTrailLength = 1, const Vector *pvecDir = NULL );
+ virtual void Dust( const Vector &pos, const Vector &dir, float size, float speed );
+ virtual void MuzzleFlash( const Vector &origin, const QAngle &angles, float fScale, int type );
+ virtual void MetalSparks( const Vector &position, const Vector &direction );
+ virtual void EnergySplash( const Vector &position, const Vector &direction, bool bExplosive = false );
+ virtual void Ricochet( const Vector &position, const Vector &direction );
+
+ // FIXME: Should these methods remain in this interface? Or go in some
+ // other client-server neutral interface?
+ virtual float Time();
+ virtual bool IsServer();
+ virtual void SuppressEffectsSounds( bool bSuppress );
+
+private:
+ //-----------------------------------------------------------------------------
+ // Purpose: Returning true means don't even call TE func
+ // Input : filter -
+ // *suppress_host -
+ // Output : static bool
+ //-----------------------------------------------------------------------------
+ bool SuppressTE( C_RecipientFilter& filter )
+ {
+ if ( !CanPredict() )
+ return true;
+
+ if ( !filter.GetRecipientCount() )
+ {
+ // Suppress it
+ return true;
+ }
+
+ // There's at least one recipient
+ return false;
+ }
+
+ bool m_bSuppressSound;
+};
+
+
+//-----------------------------------------------------------------------------
+// Client-server neutral effects interface accessor
+//-----------------------------------------------------------------------------
+static CEffectsClient s_EffectClient;
+EXPOSE_SINGLE_INTERFACE_GLOBALVAR(CEffectsClient, IEffects, IEFFECTS_INTERFACE_VERSION, s_EffectClient);
+IEffects *g_pEffects = &s_EffectClient;
+
+ConVar r_decals( "r_decals", "2048" );
+
+//-----------------------------------------------------------------------------
+// constructor, destructor
+//-----------------------------------------------------------------------------
+CEffectsClient::CEffectsClient()
+{
+ m_bSuppressSound = false;
+}
+
+CEffectsClient::~CEffectsClient()
+{
+}
+
+
+//-----------------------------------------------------------------------------
+// Suppress sound on effects
+//-----------------------------------------------------------------------------
+void CEffectsClient::SuppressEffectsSounds( bool bSuppress )
+{
+ m_bSuppressSound = bSuppress;
+}
+
+
+//-----------------------------------------------------------------------------
+// Generates a beam
+//-----------------------------------------------------------------------------
+void CEffectsClient::Beam( const Vector &vecStartPoint, const Vector &vecEndPoint,
+ int nModelIndex, int nHaloIndex, unsigned char frameStart, unsigned char nFrameRate,
+ float flLife, unsigned char nWidth, unsigned char nEndWidth, unsigned char nFadeLength,
+ unsigned char noise, unsigned char r, unsigned char g,
+ unsigned char b, unsigned char brightness, unsigned char nSpeed)
+{
+ Assert(0);
+// CBroadcastRecipientFilter filter;
+// if ( !SuppressTE( filter ) )
+// {
+// beams->CreateBeamPoints( vecStartPoint, vecEndPoint, nModelIndex, nHaloIndex,
+// m_fHaloScale,
+// flLife, 0.1 * nWidth, 0.1 * nEndWidth, nFadeLength, 0.01 * nAmplitude, a, 0.1 * nSpeed,
+// m_nStartFrame, 0.1 * nFrameRate, r, g, b );
+// }
+}
+
+
+//-----------------------------------------------------------------------------
+// Generates various tempent effects
+//-----------------------------------------------------------------------------
+void CEffectsClient::Smoke( const Vector &vecOrigin, int modelIndex, float scale, float framerate )
+{
+ CPVSFilter filter( vecOrigin );
+ if ( !SuppressTE( filter ) )
+ {
+ int iColor = random->RandomInt(20,35);
+ color32 color;
+ color.r = iColor;
+ color.g = iColor;
+ color.b = iColor;
+ color.a = iColor;
+ QAngle angles;
+ VectorAngles( Vector(0,0,1), angles );
+ FX_Smoke( vecOrigin, angles, scale * 0.1f, 4, (unsigned char *)&color, 255 );
+ }
+}
+
+void CEffectsClient::Sparks( const Vector &position, int nMagnitude, int nTrailLength, const Vector *pVecDir )
+{
+ CPVSFilter filter( position );
+ if ( !SuppressTE( filter ) )
+ {
+ FX_ElectricSpark( position, nMagnitude, nTrailLength, pVecDir );
+ }
+}
+
+void CEffectsClient::Dust( const Vector &pos, const Vector &dir, float size, float speed )
+{
+ CPVSFilter filter( pos );
+ if ( !SuppressTE( filter ) )
+ {
+ FX_Dust( pos, dir, size, speed );
+ }
+}
+
+void CEffectsClient::MuzzleFlash( const Vector &vecOrigin, const QAngle &vecAngles, float flScale, int iType )
+{
+ CPVSFilter filter( vecOrigin );
+ if ( !SuppressTE( filter ) )
+ {
+ switch( iType )
+ {
+ case MUZZLEFLASH_TYPE_DEFAULT:
+ FX_MuzzleEffect( vecOrigin, vecAngles, flScale, INVALID_EHANDLE_INDEX );
+ break;
+
+ case MUZZLEFLASH_TYPE_GUNSHIP:
+ FX_GunshipMuzzleEffect( vecOrigin, vecAngles, flScale, INVALID_EHANDLE_INDEX );
+ break;
+
+ case MUZZLEFLASH_TYPE_STRIDER:
+ FX_StriderMuzzleEffect( vecOrigin, vecAngles, flScale, INVALID_EHANDLE_INDEX );
+ break;
+
+ default:
+ Msg("No case for Muzzleflash type: %d\n", iType );
+ break;
+ }
+ }
+}
+
+void CEffectsClient::MetalSparks( const Vector &position, const Vector &direction )
+{
+ CPVSFilter filter( position );
+ if ( !SuppressTE( filter ) )
+ {
+ FX_MetalSpark( position, direction, direction );
+ }
+}
+
+void CEffectsClient::EnergySplash( const Vector &position, const Vector &direction, bool bExplosive )
+{
+ CPVSFilter filter( position );
+ if ( !SuppressTE( filter ) )
+ {
+ FX_EnergySplash( position, direction, bExplosive );
+ }
+}
+
+void CEffectsClient::Ricochet( const Vector &position, const Vector &direction )
+{
+ CPVSFilter filter( position );
+ if ( !SuppressTE( filter ) )
+ {
+ FX_MetalSpark( position, direction, direction );
+
+ if ( !m_bSuppressSound )
+ {
+ FX_RicochetSound( position );
+ }
+ }
+}
+
+// FIXME: Should these methods remain in this interface? Or go in some
+// other client-server neutral interface?
+float CEffectsClient::Time()
+{
+ return gpGlobals->curtime;
+}
+
+
+bool CEffectsClient::IsServer()
+{
+ return false;
+}
+
+