diff --git a/src/game/client/tf/c_obj_sentrygun.cpp b/src/game/client/tf/c_obj_sentrygun.cpp index 3cc421c2d..97202b452 100644 --- a/src/game/client/tf/c_obj_sentrygun.cpp +++ b/src/game/client/tf/c_obj_sentrygun.cpp @@ -60,7 +60,7 @@ C_ObjectSentrygun::C_ObjectSentrygun() m_nShieldLevel = SHIELD_NONE; m_nOldShieldLevel = SHIELD_NONE; m_hLaserBeamEffect = NULL; - m_pTempShield = NULL; + m_hShieldModel = NULL; m_bNearMiss = false; m_flNextNearMissCheck = 0.f; @@ -312,7 +312,7 @@ void C_ObjectSentrygun::SetDormant( bool bDormant ) if ( IsDormant() && !bDormant ) { // Make sure our shield is where we are. We may have moved since last seen. - if ( m_pTempShield ) + if ( m_hShieldModel ) { m_bRecreateShield = true; m_bRecreateLaserBeam = true; @@ -329,13 +329,12 @@ void C_ObjectSentrygun::CreateShield( void ) { DestroyShield(); - model_t *pModel = (model_t *) engine->LoadModel( "models/buildables/sentry_shield.mdl" ); - m_pTempShield = tempents->SpawnTempModel( pModel, GetAbsOrigin(), GetAbsAngles(), Vector(0, 0, 0), 1, FTENT_NEVERDIE ); - if ( m_pTempShield ) + m_hShieldModel = C_SentrygunShield::Create( "models/buildables/sentry_shield.mdl" ); + if ( m_hShieldModel ) { - m_pTempShield->ChangeTeam( GetTeamNumber() ); - m_pTempShield->m_nSkin = ( GetTeamNumber() == TF_TEAM_RED ) ? 0 : 1; - //m_pTempShield->m_nRenderFX = kRenderFxDistort; + m_hShieldModel->FollowEntity( this, false ); + m_hShieldModel->ChangeTeam( GetTeamNumber() ); + m_hShieldModel->m_nSkin = ( GetTeamNumber() == TF_TEAM_RED ) ? 0 : 1; } m_hShieldEffect = ParticleProp()->Create( "turret_shield", PATTACH_ABSORIGIN_FOLLOW, 0, Vector( 0,0,30) ); @@ -356,12 +355,10 @@ void C_ObjectSentrygun::CreateShield( void ) //----------------------------------------------------------------------------- void C_ObjectSentrygun::DestroyShield( void ) { - if ( m_pTempShield ) + if ( m_hShieldModel ) { - m_pTempShield->flags = FTENT_FADEOUT; - m_pTempShield->die = gpGlobals->curtime; - m_pTempShield->fadeSpeed = 1.0f; - m_pTempShield = NULL; + m_hShieldModel->StartFadeOut( 1.0f ); + m_hShieldModel = NULL; } if ( m_hShieldEffect ) @@ -758,4 +755,49 @@ const char* C_ObjectSentrygun::GetStatusName() const return "#TF_Object_Sentry"; } +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +C_SentrygunShield* C_SentrygunShield::Create( const char* pszModelName ) +{ + C_SentrygunShield* pShield = new C_SentrygunShield(); + if ( !pShield ) + return NULL; + if ( !pShield->InitializeAsClientEntity( pszModelName, RENDER_GROUP_TRANSLUCENT_ENTITY ) ) + { + pShield->Release(); + return NULL; + } + + pShield->AddEffects( EF_NORECEIVESHADOW | EF_NOSHADOW ); + return pShield; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void C_SentrygunShield::ClientThink() +{ + if ( m_flFadeOutEndTime <= gpGlobals->curtime ) + { + Release(); + return; + } + + float flAlpha = RemapVal( gpGlobals->curtime, m_flFadeOutStartTime, m_flFadeOutEndTime, 255.0f, 0.0f ); + SetRenderColorA( (byte)flAlpha ); + SetNextClientThink( CLIENT_THINK_ALWAYS ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void C_SentrygunShield::StartFadeOut( float flDuration ) +{ + SetRenderMode( kRenderTransTexture ); + + m_flFadeOutStartTime = gpGlobals->curtime; + m_flFadeOutEndTime = gpGlobals->curtime + flDuration; + SetNextClientThink( gpGlobals->curtime ); +} \ No newline at end of file diff --git a/src/game/client/tf/c_obj_sentrygun.h b/src/game/client/tf/c_obj_sentrygun.h index edbc23850..387ae4050 100644 --- a/src/game/client/tf/c_obj_sentrygun.h +++ b/src/game/client/tf/c_obj_sentrygun.h @@ -27,6 +27,25 @@ enum SHIELD_MAX, // 10% damage taken, no inactive period }; +//----------------------------------------------------------------------------- +// Purpose: Wrangler shield +//----------------------------------------------------------------------------- +class C_SentrygunShield : public C_BaseAnimating +{ + DECLARE_CLASS( C_SentrygunShield, C_BaseAnimating ); + +public: + static C_SentrygunShield* Create( const char* pszModelName ); + + virtual void ClientThink(); + + void StartFadeOut( float flDuration ); + +private: + float m_flFadeOutStartTime; + float m_flFadeOutEndTime; +}; + //----------------------------------------------------------------------------- // Purpose: Sentry object //----------------------------------------------------------------------------- @@ -124,7 +143,7 @@ private: bool m_bRecreateLaserBeam; float m_flNextNearMissCheck; - C_LocalTempEntity *m_pTempShield; + CHandle m_hShieldModel; HPARTICLEFFECT m_hSirenEffect; HPARTICLEFFECT m_hShieldEffect;