@@ -2155,6 +2155,22 @@ CWeapon* CClientPed::GetWeapon ( void )
21552155 return NULL ;
21562156}
21572157
2158+ eWeaponType CClientPed::GetWeaponType (eWeaponSlot slot)
2159+ {
2160+ if ( slot >= WEAPONSLOT_MAX )
2161+ return WEAPONTYPE_UNARMED;
2162+
2163+ if ( m_pPlayerPed )
2164+ {
2165+ CWeapon* pWeapon = GetWeapon (slot);
2166+ if ( pWeapon )
2167+ {
2168+ return pWeapon->GetType ();
2169+ }
2170+ return WEAPONTYPE_UNARMED;
2171+ }
2172+ return m_WeaponTypes[slot];
2173+ }
21582174
21592175void CClientPed::RemoveWeapon ( eWeaponType weaponType )
21602176{
@@ -2258,6 +2274,49 @@ bool CClientPed::HasWeapon ( eWeaponType weaponType )
22582274 return false ;
22592275}
22602276
2277+
2278+ //
2279+ // Check and attempt to fix weapons for remote players
2280+ //
2281+ void CClientPed::ValidateRemoteWeapons ( void )
2282+ {
2283+ // Must be streamed in remote player
2284+ if ( !m_pPlayerPed || IsLocalPlayer () || GetType () != CCLIENTPLAYER )
2285+ return ;
2286+
2287+ // Check everything matches
2288+ bool bMismatch = false ;
2289+ for ( uint i = 0 ; i < WEAPONSLOT_MAX; i++ )
2290+ {
2291+ eWeaponType slotWeaponType = GetWeaponType ((eWeaponSlot)i);
2292+ if ( m_WeaponTypes[i] != slotWeaponType )
2293+ {
2294+ SString strPlayerName = ((CClientPlayer*)this )->GetNick ();
2295+ AddReportLog (5430 , SString ( " Mismatch in slot %d Wanted type:%d Got type:%d (%s)" , i, m_WeaponTypes[i], slotWeaponType, *strPlayerName ), 30 );
2296+ bMismatch = true ;
2297+ }
2298+ }
2299+
2300+ if ( !bMismatch )
2301+ {
2302+ // All fine. Save current slot
2303+ m_CurrentWeaponSlot = m_pPlayerPed->GetCurrentWeaponSlot ();
2304+ return ;
2305+ }
2306+
2307+ // Fix wrongness
2308+ for ( uint i = 0 ; i < WEAPONSLOT_MAX; i++ )
2309+ {
2310+ if ( m_WeaponTypes[i] != WEAPONTYPE_UNARMED )
2311+ {
2312+ bool bSetAsCurrent = (i == m_CurrentWeaponSlot);
2313+ GiveWeapon (m_WeaponTypes[i], m_usWeaponAmmo[i], bSetAsCurrent);
2314+ }
2315+ }
2316+ m_pPlayerPed->SetCurrentWeaponSlot (m_CurrentWeaponSlot);
2317+ }
2318+
2319+
22612320eMovementState CClientPed::GetMovementState ( void )
22622321{
22632322 // Do we have a player, and are we on foot? (streamed in)
@@ -2792,6 +2851,8 @@ void CClientPed::StreamedInPulse ( bool bDoStandardPulses )
27922851 if ( item.bCurrentWeapon )
27932852 pWeapon->SetAsCurrentWeapon ( );
27942853 }
2854+
2855+ ValidateRemoteWeapons ();
27952856 }
27962857}
27972858
0 commit comments