Skip to content

Commit 7f7bf76

Browse files
committed
Addendum to last
1 parent 6e5ba55 commit 7f7bf76

File tree

3 files changed

+9
-54
lines changed

3 files changed

+9
-54
lines changed

Client/game_sa/CModelInfoSA.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,15 +1280,11 @@ unsigned int CModelInfoSA::GetNumRemaps()
12801280

12811281
void* CModelInfoSA::GetVehicleSuspensionData()
12821282
{
1283-
if (!GetInterface()->pColModel || !GetInterface()->pColModel->m_data)
1284-
return nullptr;
12851283
return GetInterface()->pColModel->m_data->m_suspensionLines;
12861284
}
12871285

12881286
void* CModelInfoSA::SetVehicleSuspensionData(void* pSuspensionLines)
12891287
{
1290-
if (!GetInterface()->pColModel || !GetInterface()->pColModel->m_data)
1291-
return nullptr;
12921288
CColDataSA* pColData = GetInterface()->pColModel->m_data;
12931289
void* pOrigSuspensionLines = pColData->m_suspensionLines;
12941290
pColData->m_suspensionLines = reinterpret_cast<CColLineSA*>(pSuspensionLines);
@@ -1621,7 +1617,7 @@ void CModelInfoSA::RestoreColModel()
16211617

16221618
// Force the game to load the original collision model data, if we applied a custom collision model before
16231619
// there was any object/building, which would've provoked CColStore to request it.
1624-
if (m_pInterface->pColModel && !m_pInterface->pColModel->m_data && m_dwReferences > 1)
1620+
if (!m_pInterface->pColModel->m_data && m_dwReferences > 1)
16251621
{
16261622
pGame->GetStreaming()->RemoveModel(RESOURCE_ID_COL + m_pInterface->pColModel->m_sphere.m_collisionSlot);
16271623
}

Client/game_sa/CPhysicalSA.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,9 @@ CRect* CPhysicalSAInterface::GetBoundRect_(CRect* pRect)
2222
{
2323
CVector boundCentre;
2424
CEntitySAInterface::GetBoundCentre(&boundCentre);
25-
CBaseModelInfoSAInterface* pModelInfo = CModelInfoSAInterface::GetModelInfo(m_nModelIndex);
26-
27-
if (!pModelInfo || !pModelInfo->pColModel)
28-
return pRect;
29-
30-
float fRadius = pModelInfo->pColModel->m_sphere.m_radius;
25+
float fRadius = CModelInfoSAInterface::GetModelInfo(m_nModelIndex)->pColModel->m_sphere.m_radius;
3126
*pRect = CRect(boundCentre.fX - fRadius, boundCentre.fY - fRadius, boundCentre.fX + fRadius, boundCentre.fY + fRadius);
32-
pRect->FixIncorrectTopLeft(); // Fix #1613: custom map collision crashes in CPhysical class (infinite loop)
27+
pRect->FixIncorrectTopLeft(); // Fix #1613: custom map collision crashes in CPhysical class (infinite loop)
3328
return pRect;
3429
}
3530

Client/game_sa/CVehicleSA.cpp

Lines changed: 6 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1350,21 +1350,10 @@ CFlyingHandlingEntry* CVehicleSA::GetFlyingHandlingData()
13501350

13511351
void 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

13701359
void 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()
18091782
void 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

Comments
 (0)