diff options
| author | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
|---|---|---|
| committer | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
| commit | 39ed87570bdb2f86969d4be821c94b722dc71179 (patch) | |
| tree | abc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/client/fx_tracer.cpp | |
| download | source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip | |
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/client/fx_tracer.cpp')
| -rw-r--r-- | mp/src/game/client/fx_tracer.cpp | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/mp/src/game/client/fx_tracer.cpp b/mp/src/game/client/fx_tracer.cpp new file mode 100644 index 00000000..86f92cc0 --- /dev/null +++ b/mp/src/game/client/fx_tracer.cpp @@ -0,0 +1,169 @@ +//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+#include "cbase.h"
+#include "fx.h"
+#include "c_te_effect_dispatch.h"
+#include "basecombatweapon_shared.h"
+#include "baseviewmodel_shared.h"
+#include "particles_new.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+#define TRACER_SPEED 5000
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+Vector GetTracerOrigin( const CEffectData &data )
+{
+ Vector vecStart = data.m_vStart;
+ QAngle vecAngles;
+
+ int iAttachment = data.m_nAttachmentIndex;;
+
+ // Attachment?
+ if ( data.m_fFlags & TRACER_FLAG_USEATTACHMENT )
+ {
+ C_BaseViewModel *pViewModel = NULL;
+
+ // If the entity specified is a weapon being carried by this player, use the viewmodel instead
+ IClientRenderable *pRenderable = data.GetRenderable();
+ if ( !pRenderable )
+ return vecStart;
+
+ C_BaseEntity *pEnt = data.GetEntity();
+
+// This check should probably be for all multiplayer games, investigate later
+#if defined( HL2MP ) || defined( TF_CLIENT_DLL )
+ if ( pEnt && pEnt->IsDormant() )
+ return vecStart;
+#endif
+
+ C_BaseCombatWeapon *pWpn = dynamic_cast<C_BaseCombatWeapon *>( pEnt );
+ if ( pWpn && pWpn->ShouldDrawUsingViewModel() )
+ {
+ C_BasePlayer *player = ToBasePlayer( pWpn->GetOwner() );
+
+ // Use GetRenderedWeaponModel() instead?
+ pViewModel = player ? player->GetViewModel( 0 ) : NULL;
+ if ( pViewModel )
+ {
+ // Get the viewmodel and use it instead
+ pRenderable = pViewModel;
+ }
+ }
+
+ // Get the attachment origin
+ if ( !pRenderable->GetAttachment( iAttachment, vecStart, vecAngles ) )
+ {
+ DevMsg( "GetTracerOrigin: Couldn't find attachment %d on model %s\n", iAttachment,
+ modelinfo->GetModelName( pRenderable->GetModel() ) );
+ }
+ }
+
+ return vecStart;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void TracerCallback( const CEffectData &data )
+{
+ C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
+ if ( !player )
+ return;
+
+ // Grab the data
+ Vector vecStart = GetTracerOrigin( data );
+ float flVelocity = data.m_flScale;
+ bool bWhiz = (data.m_fFlags & TRACER_FLAG_WHIZ);
+ int iEntIndex = data.entindex();
+
+ if ( iEntIndex && iEntIndex == player->index )
+ {
+ Vector foo = data.m_vStart;
+ QAngle vangles;
+ Vector vforward, vright, vup;
+
+ engine->GetViewAngles( vangles );
+ AngleVectors( vangles, &vforward, &vright, &vup );
+
+ VectorMA( data.m_vStart, 4, vright, foo );
+ foo[2] -= 0.5f;
+
+ FX_PlayerTracer( foo, (Vector&)data.m_vOrigin );
+ return;
+ }
+
+ // Use default velocity if none specified
+ if ( !flVelocity )
+ {
+ flVelocity = TRACER_SPEED;
+ }
+
+ // Do tracer effect
+ FX_Tracer( (Vector&)vecStart, (Vector&)data.m_vOrigin, flVelocity, bWhiz );
+}
+
+DECLARE_CLIENT_EFFECT( "Tracer", TracerCallback );
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void ParticleTracerCallback( const CEffectData &data )
+{
+ C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
+ if ( !player )
+ return;
+
+ // Grab the data
+ Vector vecStart = GetTracerOrigin( data );
+ Vector vecEnd = data.m_vOrigin;
+
+ // Adjust view model tracers
+ C_BaseEntity *pEntity = data.GetEntity();
+ if ( data.entindex() && data.entindex() == player->index )
+ {
+ QAngle vangles;
+ Vector vforward, vright, vup;
+
+ engine->GetViewAngles( vangles );
+ AngleVectors( vangles, &vforward, &vright, &vup );
+
+ VectorMA( data.m_vStart, 4, vright, vecStart );
+ vecStart[2] -= 0.5f;
+ }
+
+ // Create the particle effect
+ QAngle vecAngles;
+ Vector vecToEnd = vecEnd - vecStart;
+ VectorNormalize(vecToEnd);
+ VectorAngles( vecToEnd, vecAngles );
+ DispatchParticleEffect( data.m_nHitBox, vecStart, vecEnd, vecAngles, pEntity );
+
+ if ( data.m_fFlags & TRACER_FLAG_WHIZ )
+ {
+ FX_TracerSound( vecStart, vecEnd, TRACER_TYPE_DEFAULT );
+ }
+}
+
+DECLARE_CLIENT_EFFECT( "ParticleTracer", ParticleTracerCallback );
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void TracerSoundCallback( const CEffectData &data )
+{
+ // Grab the data
+ Vector vecStart = GetTracerOrigin( data );
+
+ // Do tracer effect
+ FX_TracerSound( vecStart, (Vector&)data.m_vOrigin, data.m_fFlags );
+}
+
+DECLARE_CLIENT_EFFECT( "TracerSound", TracerSoundCallback );
+
|