Fix Wrangler shield not moving with sentrygun

This commit is contained in:
ficool2 2025-06-28 13:39:32 +01:00 committed by EricS-Valve
parent 39f6dde8fb
commit 57a8b644af
2 changed files with 75 additions and 14 deletions

View File

@ -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 );
}

View File

@ -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<C_SentrygunShield> m_hShieldModel;
HPARTICLEFFECT m_hSirenEffect;
HPARTICLEFFECT m_hShieldEffect;