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/hl2mp/c_te_hl2mp_shotgun_shot.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/hl2mp/c_te_hl2mp_shotgun_shot.cpp')
| -rw-r--r-- | game/client/hl2mp/c_te_hl2mp_shotgun_shot.cpp | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/game/client/hl2mp/c_te_hl2mp_shotgun_shot.cpp b/game/client/hl2mp/c_te_hl2mp_shotgun_shot.cpp new file mode 100644 index 0000000..4283c3b --- /dev/null +++ b/game/client/hl2mp/c_te_hl2mp_shotgun_shot.cpp @@ -0,0 +1,160 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "cbase.h" +#include "c_basetempentity.h" +#include <cliententitylist.h> +#include "ammodef.h" +#include "c_te_effect_dispatch.h" +#include "shot_manipulator.h" + +class C_TEHL2MPFireBullets : public C_BaseTempEntity +{ +public: + DECLARE_CLASS( C_TEHL2MPFireBullets, C_BaseTempEntity ); + DECLARE_CLIENTCLASS(); + + virtual void PostDataUpdate( DataUpdateType_t updateType ); + + void CreateEffects( void ); + +public: + int m_iPlayer; + Vector m_vecOrigin; + Vector m_vecDir; + int m_iAmmoID; + int m_iWeaponIndex; + int m_iSeed; + float m_flSpread; + int m_iShots; + bool m_bDoImpacts; + bool m_bDoTracers; +}; + +class CTraceFilterSkipPlayerAndViewModelOnly : public CTraceFilter +{ +public: + virtual bool ShouldHitEntity( IHandleEntity *pServerEntity, int contentsMask ) + { + C_BaseEntity *pEntity = EntityFromEntityHandle( pServerEntity ); + if( pEntity && + ( ( dynamic_cast<C_BaseViewModel *>( pEntity ) != NULL ) || + ( dynamic_cast<C_BasePlayer *>( pEntity ) != NULL ) ) ) + { + return false; + } + else + { + return true; + } + } +}; + +void C_TEHL2MPFireBullets::CreateEffects( void ) +{ + CAmmoDef* pAmmoDef = GetAmmoDef(); + + if ( pAmmoDef == NULL ) + return; + + C_BaseEntity *pEnt = ClientEntityList().GetEnt( m_iPlayer ); + + if ( pEnt ) + { + C_BasePlayer *pPlayer = dynamic_cast<C_BasePlayer *>(pEnt); + + if ( pPlayer && pPlayer->GetActiveWeapon() ) + { + C_BaseCombatWeapon *pWpn = dynamic_cast<C_BaseCombatWeapon *>( pPlayer->GetActiveWeapon() ); + + if ( pWpn ) + { + int iSeed = m_iSeed; + + CShotManipulator Manipulator( m_vecDir ); + + for (int iShot = 0; iShot < m_iShots; iShot++) + { + RandomSeed( iSeed ); // init random system with this seed + + // Don't run the biasing code for the player at the moment. + Vector vecDir = Manipulator.ApplySpread( Vector( m_flSpread, m_flSpread, m_flSpread ) ); + Vector vecEnd = m_vecOrigin + vecDir * MAX_TRACE_LENGTH; + trace_t tr; + CTraceFilterSkipPlayerAndViewModelOnly traceFilter; + + if( m_iShots > 1 && iShot % 2 ) + { + // Half of the shotgun pellets are hulls that make it easier to hit targets with the shotgun. + UTIL_TraceHull( m_vecOrigin, vecEnd, Vector( -3, -3, -3 ), Vector( 3, 3, 3 ), MASK_SHOT, &traceFilter, &tr ); + } + else + { + UTIL_TraceLine( m_vecOrigin, vecEnd, MASK_SHOT, &traceFilter, &tr); + } + + if ( m_bDoTracers ) + { + const char *pTracerName = pWpn->GetTracerType(); + + CEffectData data; + data.m_vStart = tr.startpos; + data.m_vOrigin = tr.endpos; + data.m_hEntity = pWpn->GetRefEHandle(); + data.m_flScale = 0.0f; + data.m_fFlags |= TRACER_FLAG_USEATTACHMENT; + // Stomp the start, since it's not going to be used anyway + data.m_nAttachmentIndex = 1; + + if ( pTracerName ) + { + DispatchEffect( pTracerName, data ); + } + else + { + DispatchEffect( "Tracer", data ); + } + } + + if ( m_bDoImpacts ) + { + pWpn->DoImpactEffect( tr, pAmmoDef->DamageType( m_iAmmoID ) ); + } + + iSeed++; + } + } + } + } + +} + +void C_TEHL2MPFireBullets::PostDataUpdate( DataUpdateType_t updateType ) +{ + if ( m_bDoTracers || m_bDoImpacts ) + { + CreateEffects(); + } +} + + +IMPLEMENT_CLIENTCLASS_EVENT( C_TEHL2MPFireBullets, DT_TEHL2MPFireBullets, CTEHL2MPFireBullets ); + + +BEGIN_RECV_TABLE_NOBASE(C_TEHL2MPFireBullets, DT_TEHL2MPFireBullets ) + RecvPropVector( RECVINFO( m_vecOrigin ) ), + RecvPropVector( RECVINFO( m_vecDir ) ), + RecvPropInt( RECVINFO( m_iAmmoID ) ), + RecvPropInt( RECVINFO( m_iSeed ) ), + RecvPropInt( RECVINFO( m_iShots ) ), + RecvPropInt( RECVINFO( m_iPlayer ) ), + RecvPropInt( RECVINFO( m_iWeaponIndex ) ), + RecvPropFloat( RECVINFO( m_flSpread ) ), + RecvPropBool( RECVINFO( m_bDoImpacts ) ), + RecvPropBool( RECVINFO( m_bDoTracers ) ), +END_RECV_TABLE() + + |