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/dod/c_dod_smokegrenade.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/dod/c_dod_smokegrenade.cpp')
| -rw-r--r-- | game/client/dod/c_dod_smokegrenade.cpp | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/game/client/dod/c_dod_smokegrenade.cpp b/game/client/dod/c_dod_smokegrenade.cpp new file mode 100644 index 0000000..8af4998 --- /dev/null +++ b/game/client/dod/c_dod_smokegrenade.cpp @@ -0,0 +1,141 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#include "cbase.h" +#include "c_dod_smokegrenade.h" +#include "dod_shareddefs.h" +#include "tier1/KeyValues.h" +#include "toolframework_client.h" +#include "fx.h" +#include "view.h" +#include "smoke_fog_overlay.h" + +IMPLEMENT_NETWORKCLASS_ALIASED( DODSmokeGrenade, DT_DODSmokeGrenade ) + +BEGIN_RECV_TABLE(C_DODSmokeGrenade, DT_DODSmokeGrenade ) + RecvPropTime(RECVINFO(m_flSmokeSpawnTime)), +END_NETWORK_TABLE() + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +C_DODSmokeGrenade::C_DODSmokeGrenade( void ) +{ +} + +const char *C_DODSmokeGrenade::GetOverviewSpriteName( void ) +{ + const char *pszSprite = ""; + + switch( GetTeamNumber() ) + { + case TEAM_ALLIES: + pszSprite = "sprites/minimap_icons/minimap_smoke_us"; + break; + case TEAM_AXIS: + pszSprite = "sprites/minimap_icons/minimap_smoke_ger"; + break; + default: + break; + } + + return pszSprite; +} + +void C_DODSmokeGrenade::OnDataChanged( DataUpdateType_t updateType ) +{ + BaseClass::OnDataChanged(updateType); + + if(updateType == DATA_UPDATE_CREATED ) + { + SetNextClientThink( CLIENT_THINK_ALWAYS ); + } +} + +static inline float& EngineGetSmokeFogOverlayAlpha() +{ + return g_SmokeFogOverlayAlpha; +} + +#define SMOKE_CLOUD_RADIUS 330 +#define EXPAND_TIME 2.0 + +float C_DODSmokeGrenade::CalcSmokeCloudRadius( void ) +{ + float flLifetime = gpGlobals->curtime - m_flSmokeSpawnTime; + if( flLifetime > EXPAND_TIME ) + flLifetime = EXPAND_TIME; + + float flRadius = SMOKE_CLOUD_RADIUS * (float)sin(flLifetime * M_PI * 0.5 / EXPAND_TIME); + + return flRadius; +} + +float C_DODSmokeGrenade::CalcSmokeCloudAlpha( void ) +{ + float flLifetime = gpGlobals->curtime - m_flSmokeSpawnTime; + //if( flLifetime > SMOKESPHERE_EXPAND_TIME ) + // flLifetime = SMOKESPHERE_EXPAND_TIME; + + const float flFadedInTime = 3; + const float flStartFadingOutTime = 9; + const float flEndFadingOutTime = 12; + + float flFadeAlpha; + + // Update our fade alpha. + if( flLifetime < flFadedInTime ) + { + float fadePercent = flLifetime / flFadedInTime; + flFadeAlpha = SimpleSpline( fadePercent ); + } + else if ( flLifetime > flEndFadingOutTime ) + { + flFadeAlpha = 0.0; + } + else if ( flLifetime > flStartFadingOutTime ) + { + float fadePercent = ( flLifetime - flStartFadingOutTime ) / ( flEndFadingOutTime - flStartFadingOutTime ); + flFadeAlpha = SimpleSpline( 1.0 - fadePercent ); + } + else + { + flFadeAlpha = 1.0; + } + + return flFadeAlpha; +} + +// Add our influence to the global smoke fog alpha. +void C_DODSmokeGrenade::ClientThink( void ) +{ + if ( m_flSmokeSpawnTime > 0 ) + { + float flExpandRadius = CalcSmokeCloudRadius(); + + Vector vecSmokePos = GetAbsOrigin(); + vecSmokePos.z += 32; + + float testDist = (MainViewOrigin() - vecSmokePos).Length(); + + // The center of the smoke cloud that always gives full fog overlay + float flCoreDistance = flExpandRadius * 0.3; + + if( testDist < flExpandRadius ) + { + float flFadeAlpha = CalcSmokeCloudAlpha(); + + if( testDist < flCoreDistance ) + { + EngineGetSmokeFogOverlayAlpha() += flFadeAlpha; + } + else + { + EngineGetSmokeFogOverlayAlpha() += (1 - ( testDist - flCoreDistance ) / ( flExpandRadius - flCoreDistance ) ) * flFadeAlpha; + } + } + } +}
\ No newline at end of file |