summaryrefslogtreecommitdiff
path: root/game/client/hl2mp/c_te_hl2mp_shotgun_shot.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/hl2mp/c_te_hl2mp_shotgun_shot.cpp
downloadarchived-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.cpp160
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()
+
+