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/hl2/c_weapon_crossbow.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/hl2/c_weapon_crossbow.cpp')
| -rw-r--r-- | game/client/hl2/c_weapon_crossbow.cpp | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/game/client/hl2/c_weapon_crossbow.cpp b/game/client/hl2/c_weapon_crossbow.cpp new file mode 100644 index 0000000..a486041 --- /dev/null +++ b/game/client/hl2/c_weapon_crossbow.cpp @@ -0,0 +1,159 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "cbase.h" +#include "model_types.h" +#include "clienteffectprecachesystem.h" +#include "fx.h" +#include "c_te_effect_dispatch.h" +#include "beamdraw.h" + +CLIENTEFFECT_REGISTER_BEGIN( PrecacheEffectCrossbow ) +CLIENTEFFECT_MATERIAL( "effects/muzzleflash1" ) +CLIENTEFFECT_REGISTER_END() + +// +// Crossbow bolt +// + +class C_CrossbowBolt : public C_BaseCombatCharacter +{ + DECLARE_CLASS( C_CrossbowBolt, C_BaseCombatCharacter ); + DECLARE_CLIENTCLASS(); +public: + + C_CrossbowBolt( void ); + + virtual RenderGroup_t GetRenderGroup( void ) + { + // We want to draw translucent bits as well as our main model + return RENDER_GROUP_TWOPASS; + } + + virtual void ClientThink( void ); + + virtual void OnDataChanged( DataUpdateType_t updateType ); + virtual int DrawModel( int flags ); + +private: + + C_CrossbowBolt( const C_CrossbowBolt & ); // not defined, not accessible + + Vector m_vecLastOrigin; + bool m_bUpdated; +}; + +IMPLEMENT_CLIENTCLASS_DT( C_CrossbowBolt, DT_CrossbowBolt, CCrossbowBolt ) +END_RECV_TABLE() + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +C_CrossbowBolt::C_CrossbowBolt( void ) +{ +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : updateType - +//----------------------------------------------------------------------------- +void C_CrossbowBolt::OnDataChanged( DataUpdateType_t updateType ) +{ + BaseClass::OnDataChanged( updateType ); + + if ( updateType == DATA_UPDATE_CREATED ) + { + m_bUpdated = false; + m_vecLastOrigin = GetAbsOrigin(); + SetNextClientThink( CLIENT_THINK_ALWAYS ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : flags - +// Output : int +//----------------------------------------------------------------------------- +int C_CrossbowBolt::DrawModel( int flags ) +{ + // See if we're drawing the motion blur + if ( flags & STUDIO_TRANSPARENCY ) + { + float color[3]; + IMaterial *pBlurMaterial = materials->FindMaterial( "effects/muzzleflash1", NULL, false ); + + Vector vecDir = GetAbsOrigin() - m_vecLastOrigin; + float speed = VectorNormalize( vecDir ); + + speed = clamp( speed, 0, 32 ); + + if ( speed > 0 ) + { + float stepSize = MIN( ( speed * 0.5f ), 4.0f ); + + Vector spawnPos = GetAbsOrigin() + ( vecDir * 24.0f ); + Vector spawnStep = -vecDir * stepSize; + + CMatRenderContextPtr pRenderContext( materials ); + pRenderContext->Bind( pBlurMaterial ); + + float alpha; + + // Draw the motion blurred trail + for ( int i = 0; i < 20; i++ ) + { + spawnPos += spawnStep; + + alpha = RemapValClamped( i, 5, 11, 0.25f, 0.05f ); + + color[0] = color[1] = color[2] = alpha; + + DrawHalo( pBlurMaterial, spawnPos, 3.0f, color ); + } + } + + if ( gpGlobals->frametime > 0.0f && !m_bUpdated) + { + m_bUpdated = true; + m_vecLastOrigin = GetAbsOrigin(); + } + + return 1; + } + + // Draw the normal portion + return BaseClass::DrawModel( flags ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void C_CrossbowBolt::ClientThink( void ) +{ + m_bUpdated = false; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : &data - +//----------------------------------------------------------------------------- +void CrosshairLoadCallback( const CEffectData &data ) +{ + IClientRenderable *pRenderable = data.GetRenderable( ); + if ( !pRenderable ) + return; + + Vector position; + QAngle angles; + + // If we found the attachment, emit sparks there + if ( pRenderable->GetAttachment( data.m_nAttachmentIndex, position, angles ) ) + { + FX_ElectricSpark( position, 1.0f, 1.0f, NULL ); + } +} + +DECLARE_CLIENT_EFFECT( "CrossbowLoad", CrosshairLoadCallback ); |