source-engine/game/client/dod/c_dod_smokegrenade.cpp

141 lines
3.3 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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;
}
}
}
}