@@ -1350,21 +1350,10 @@ CFlyingHandlingEntry* CVehicleSA::GetFlyingHandlingData()
13501350
13511351void CVehicleSA::SetHandlingData (CHandlingEntry* pHandling)
13521352{
1353- if (!pHandling)
1354- return ;
1355-
1356- CVehicleSAInterface* pVehicleInterface = GetVehicleInterface ();
1357- if (!pVehicleInterface)
1358- return ;
1359-
13601353 // Store the handling and recalculate it
13611354 m_pHandlingData = static_cast <CHandlingEntrySA*>(pHandling);
1362- pVehicleInterface->pHandlingData = m_pHandlingData->GetInterface ();
1363-
1364- // Only recalculate if collision model is loaded (needed for suspension lines)
1365- CModelInfo* pModelInfo = pGame->GetModelInfo (GetModelIndex ());
1366- if (pModelInfo && pModelInfo->GetInterface ()->pColModel && pModelInfo->GetInterface ()->pColModel ->m_data )
1367- RecalculateHandling ();
1355+ GetVehicleInterface ()->pHandlingData = m_pHandlingData->GetInterface ();
1356+ RecalculateHandling ();
13681357}
13691358
13701359void CVehicleSA::SetFlyingHandlingData (CFlyingHandlingEntry* pFlyingHandling)
@@ -1380,24 +1369,13 @@ void CVehicleSA::RecalculateHandling()
13801369 if (!m_pHandlingData)
13811370 return ;
13821371
1383- // Validate vehicle interface
1384- CVehicleSAInterface* pInt = GetVehicleInterface ();
1385- if (!pInt)
1386- return ;
1387-
1388- // Ensure collision model is loaded before recalculating (needed for suspension lines)
1389- CModelInfo* pModelInfo = pGame->GetModelInfo (GetModelIndex ());
1390- if (!pModelInfo || !pModelInfo->GetInterface ()->pColModel || !pModelInfo->GetInterface ()->pColModel ->m_data )
1391- return ;
1392-
13931372 m_pHandlingData->Recalculate ();
13941373
1395- // Recalculate the suspension lines (only for vehicles that have suspension)
1396- // Already validated that pColModel and m_data exist above
1397- if (pModelInfo->IsCar () || pModelInfo->IsMonsterTruck () || pModelInfo->IsTrailer () || pModelInfo->IsBike ())
1398- RecalculateSuspensionLines ();
1374+ // Recalculate the suspension lines
1375+ RecalculateSuspensionLines ();
13991376
14001377 // Put it in our interface
1378+ CVehicleSAInterface* pInt = GetVehicleInterface ();
14011379 unsigned int uiHandlingFlags = m_pHandlingData->GetInterface ()->uiHandlingFlags ;
14021380 bool hydralicsInstalled = false , nitroInstalled = false ;
14031381
@@ -1780,11 +1758,6 @@ void* CVehicleSA::GetPrivateSuspensionLines()
17801758 if (m_pSuspensionLines == NULL )
17811759 {
17821760 CModelInfo* pModelInfo = pGame->GetModelInfo (GetModelIndex ());
1783- // pColModel can be NULL if collision data hasn't been streamed in yet.
1784- // GTA SA loads visual models and collision models separately via CColStore.
1785- // The model can be marked as "loaded" even if collision data is still pending.
1786- if (!pModelInfo->GetInterface ()->pColModel || !pModelInfo->GetInterface ()->pColModel ->m_data )
1787- return NULL ;
17881761 CColDataSA* pColData = pModelInfo->GetInterface ()->pColModel ->m_data ;
17891762 if (pModelInfo->IsMonsterTruck ())
17901763 {
@@ -1809,9 +1782,6 @@ void* CVehicleSA::GetPrivateSuspensionLines()
18091782void CVehicleSA::CopyGlobalSuspensionLinesToPrivate ()
18101783{
18111784 CModelInfo* pModelInfo = pGame->GetModelInfo (GetModelIndex ());
1812- // Collision model may not be loaded yet (see GetPrivateSuspensionLines)
1813- if (!pModelInfo->GetInterface ()->pColModel || !pModelInfo->GetInterface ()->pColModel ->m_data )
1814- return ;
18151785 CColDataSA* pColData = pModelInfo->GetInterface ()->pColModel ->m_data ;
18161786 if (pModelInfo->IsMonsterTruck ())
18171787 {
@@ -1845,14 +1815,8 @@ void CVehicleSA::RecalculateSuspensionLines()
18451815 if (pModelInfo->IsTrain () || dwModel == 571 || dwModel == 570 || dwModel == 569 || dwModel == 590 )
18461816 return ;
18471817
1848- // Ensure collision model is loaded before setting up suspension
1849- if (!pModelInfo->GetInterface ()->pColModel || !pModelInfo->GetInterface ()->pColModel ->m_data )
1850- return ;
1818+ GetVehicleInterface ()->SetupSuspensionLines ();
18511819
1852- // Note: We skip calling SetupSuspensionLines() because it's GTA SA's native code that can
1853- // access pColModel->m_data without validation. If collision model is unloaded during execution
1854- // (race condition), it causes crashes. CopyGlobalSuspensionLinesToPrivate() is safer as it
1855- // validates collision model before accessing.
18561820 CopyGlobalSuspensionLinesToPrivate ();
18571821 }
18581822}
0 commit comments