diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/fx_tracer.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/fx_tracer.cpp')
| -rw-r--r-- | game/client/fx_tracer.cpp | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/game/client/fx_tracer.cpp b/game/client/fx_tracer.cpp new file mode 100644 index 0000000..cec013a --- /dev/null +++ b/game/client/fx_tracer.cpp @@ -0,0 +1,194 @@ +//========= 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" + +ConVar r_drawtracers( "r_drawtracers", "1", FCVAR_CHEAT ); +ConVar r_drawtracers_firstperson( "r_drawtracers_firstperson", "1", FCVAR_ARCHIVE, "Toggle visibility of first person weapon tracers" ); + +#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; + + if ( !r_drawtracers.GetBool() ) + return; + + if ( !r_drawtracers_firstperson.GetBool() ) + { + C_BasePlayer *pPlayer = dynamic_cast<C_BasePlayer*>( data.GetEntity() ); + + if ( pPlayer && !pPlayer->ShouldDrawThisPlayer() ) + 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; + + if ( !r_drawtracers.GetBool() ) + return; + + if ( !r_drawtracers_firstperson.GetBool() ) + { + C_BasePlayer *pPlayer = dynamic_cast<C_BasePlayer*>( data.GetEntity() ); + + if ( pPlayer && !pPlayer->ShouldDrawThisPlayer() ) + 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 ); + |