@@ -1479,6 +1479,7 @@ void CTFPlayerShared::OnDataChanged( void )
14791479 {
14801480 m_hDisguiseWeapon->UpdateVisibility ();
14811481 m_hDisguiseWeapon->UpdateParticleSystems ();
1482+ m_hDisguiseWeapon->UpdateAttachmentModels ();
14821483 }
14831484
14841485 // XXX(JohnS): This is not the right place to do these things, SetWeaponVisible on the *client* is just stomping
@@ -7229,6 +7230,8 @@ void CTFPlayerShared::OnRemoveDisguising( void )
72297230void CTFPlayerShared::OnRemoveDisguised ( void )
72307231{
72317232#ifdef CLIENT_DLL
7233+ // Save the disguise target before clearing it, so we can mark bodygroups dirty.
7234+ CTFPlayer *pOldDisguiseTarget = ToTFPlayer ( m_hDisguiseTarget.Get () );
72327235
72337236 if ( m_pOuter->GetPredictable () && ( !prediction->IsFirstTimePredicted () || m_bSyncingConditions ) )
72347237 return ;
@@ -7253,7 +7256,14 @@ void CTFPlayerShared::OnRemoveDisguised( void )
72537256 UpdateCritBoostEffect ( kCritBoost_ForceRefresh );
72547257 m_pOuter->UpdateSpyStateChange ();
72557258
7259+ // Mark the old disguise target's bodygroups as dirty so they'll be recalculated.
7260+ if ( pOldDisguiseTarget )
7261+ {
7262+ pOldDisguiseTarget->SetBodygroupsDirty ();
7263+ }
7264+
72567265#else
7266+
72577267 m_nDisguiseTeam = TF_SPY_UNDEFINED ;
72587268 m_nDisguiseClass.Set ( TF_CLASS_UNDEFINED );
72597269 m_nDisguiseSkinOverride = 0 ;
@@ -8223,6 +8233,15 @@ void CTFPlayerShared::Disguise( int nTeam, int nClass, CTFPlayer* pDesiredTarget
82238233 }
82248234 }
82258235
8236+ #ifdef CLIENT_DLL
8237+ // Save the old disguise target before changing disguise, so we can clean up bodygroups.
8238+ CTFPlayer *pOldDisguiseTarget = ToTFPlayer ( m_hDisguiseTarget.Get () );
8239+ if ( pOldDisguiseTarget )
8240+ {
8241+ pOldDisguiseTarget->SetBodygroupsDirty ();
8242+ }
8243+ #endif
8244+
82268245 m_hDesiredDisguiseTarget.Set ( pDesiredTarget );
82278246 m_nDesiredDisguiseClass = nClass;
82288247 m_nDesiredDisguiseTeam = nTeam;
@@ -8402,6 +8421,7 @@ void CTFPlayerShared::DetermineDisguiseWeapon( bool bForcePrimary )
84028421 {
84038422 CTFWeaponBase *pLastDisguiseWeapon = m_hDisguiseWeapon;
84048423 CTFWeaponBase *pFirstValidWeapon = NULL ;
8424+
84058425 // Cycle through the target's weapons and see if we have a match.
84068426 // Note that it's possible the disguise target doesn't have a weapon in the slot we want,
84078427 // for example if they have replaced it with an unlockable that isn't a weapon (wearable).
@@ -8505,6 +8525,7 @@ void CTFPlayerShared::DetermineDisguiseWeapon( bool bForcePrimary )
85058525 m_hDisguiseWeapon->m_bDisguiseWeapon = true ;
85068526 m_hDisguiseWeapon->SetContextThink ( &CTFWeaponBase::DisguiseWeaponThink, gpGlobals->curtime + 0.5 , " DisguiseWeaponThink" );
85078527
8528+ m_hDisguiseWeapon->UpdateExtraWearables ();
85088529
85098530 // Ammo/clip state is displayed to attached medics
85108531 m_iDisguiseAmmo = 0 ;
@@ -8539,14 +8560,31 @@ void CTFPlayerShared::DetermineDisguiseWeapon( bool bForcePrimary )
85398560void CTFPlayerShared::DetermineDisguiseWearables ()
85408561{
85418562 CTFPlayer *pDisguiseTarget = ToTFPlayer ( m_hDisguiseTarget.Get () );
8542- if ( !pDisguiseTarget )
8543- return ;
85448563
85458564 // Remove any existing disguise wearables.
85468565 RemoveDisguiseWearables ();
85478566
8567+ if ( !pDisguiseTarget )
8568+ {
8569+ // No target exists, reset disguise body to default state.
8570+ SetDisguiseBody ( 0 );
8571+ return ;
8572+ }
8573+
85488574 if ( GetDisguiseClass () != pDisguiseTarget->GetPlayerClass ()->GetClassIndex () )
8575+ {
8576+ // Class mismatch, reset disguise body to default.
8577+ SetDisguiseBody ( 0 );
8578+ #ifdef CLIENT_DLL
8579+ // Mark bodygroups dirty even when not copying wearables (class mismatch).
8580+ pDisguiseTarget->SetBodygroupsDirty ();
8581+ #endif
85498582 return ;
8583+ }
8584+
8585+ // Reset disguise body to default before applying new wearables.
8586+ // This ensures old bodygroup modifications don't carry over.
8587+ SetDisguiseBody ( 0 );
85508588
85518589 // Equip us with copies of our disguise target's wearables.
85528590 int iPlayerSkinOverride = 0 ;
@@ -8592,6 +8630,11 @@ void CTFPlayerShared::DetermineDisguiseWearables()
85928630 }
85938631
85948632 m_nDisguiseSkinOverride = iPlayerSkinOverride;
8633+
8634+ #ifdef CLIENT_DLL
8635+ // Mark bodygroups dirty after creating disguise wearables.
8636+ pDisguiseTarget->SetBodygroupsDirty ();
8637+ #endif
85958638}
85968639
85978640void CTFPlayerShared::RemoveDisguiseWearables ()
0 commit comments