Skip to content

Commit 6e5ba55

Browse files
committed
Revert suspension related changes for now, as we need stable master.
It will be re-introduced later (revised). The now-reverted changes were prompted by exposing GTA streaming race conditions, but since what exposed them was also reverted for stability reasons, it's not urgent. Everything (and related) will be re-pushed when fully tested.
1 parent 8a09cdf commit 6e5ba55

File tree

7 files changed

+16
-89
lines changed

7 files changed

+16
-89
lines changed

Client/game_sa/CModelInfoSA.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -488,15 +488,6 @@ bool CModelInfoSA::DoIsLoaded()
488488
return bLoaded;
489489
}
490490

491-
bool CModelInfoSA::IsCollisionLoaded()
492-
{
493-
m_pInterface = ppModelInfo[m_dwModelID];
494-
if (!m_pInterface || !m_pInterface->pColModel)
495-
return false;
496-
497-
return m_pInterface->pColModel->m_data != nullptr;
498-
}
499-
500491
unsigned short CModelInfoSA::GetFlags()
501492
{
502493
return ppModelInfo[m_dwModelID]->usFlags;

Client/game_sa/CModelInfoSA.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,6 @@ class CModelInfoSA : public CModelInfo
389389
void Remove();
390390
bool UnloadUnused();
391391
bool IsLoaded();
392-
bool IsCollisionLoaded() override;
393392
bool DoIsLoaded();
394393
unsigned short GetFlags();
395394
unsigned short GetOriginalFlags();

Client/game_sa/CVehicleSA.cpp

Lines changed: 16 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,8 +1360,11 @@ void CVehicleSA::SetHandlingData(CHandlingEntry* pHandling)
13601360
// Store the handling and recalculate it
13611361
m_pHandlingData = static_cast<CHandlingEntrySA*>(pHandling);
13621362
pVehicleInterface->pHandlingData = m_pHandlingData->GetInterface();
1363-
1364-
RecalculateHandling();
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();
13651368
}
13661369

13671370
void CVehicleSA::SetFlyingHandlingData(CFlyingHandlingEntry* pFlyingHandling)
@@ -1382,18 +1385,16 @@ void CVehicleSA::RecalculateHandling()
13821385
if (!pInt)
13831386
return;
13841387

1388+
// Ensure collision model is loaded before recalculating (needed for suspension lines)
13851389
CModelInfo* pModelInfo = pGame->GetModelInfo(GetModelIndex());
1386-
auto* pModelInterface = pModelInfo ? pModelInfo->GetInterface() : nullptr;
1387-
auto* pColModelInterface = pModelInterface ? pModelInterface->pColModel : nullptr;
1388-
bool bSuspensionDataReady = pColModelInterface && pColModelInterface->m_data;
1389-
bool bHasSuspension = pModelInfo &&
1390-
(pModelInfo->IsCar() || pModelInfo->IsMonsterTruck() || pModelInfo->IsTrailer() || pModelInfo->IsBike());
1390+
if (!pModelInfo || !pModelInfo->GetInterface()->pColModel || !pModelInfo->GetInterface()->pColModel->m_data)
1391+
return;
13911392

13921393
m_pHandlingData->Recalculate();
13931394

13941395
// Recalculate the suspension lines (only for vehicles that have suspension)
1395-
// Skip until collision data streams in to avoid accessing null suspension lines
1396-
if (bSuspensionDataReady && bHasSuspension)
1396+
// Already validated that pColModel and m_data exist above
1397+
if (pModelInfo->IsCar() || pModelInfo->IsMonsterTruck() || pModelInfo->IsTrailer() || pModelInfo->IsBike())
13971398
RecalculateSuspensionLines();
13981399

13991400
// Put it in our interface
@@ -1838,37 +1839,20 @@ void CVehicleSA::RecalculateSuspensionLines()
18381839

18391840
DWORD dwModel = GetModelIndex();
18401841
CModelInfo* pModelInfo = pGame->GetModelInfo(dwModel);
1841-
if (pModelInfo && (pModelInfo->IsCar() || pModelInfo->IsMonsterTruck() || pModelInfo->IsTrailer()))
1842+
if (pModelInfo && pModelInfo->IsMonsterTruck() || pModelInfo->IsCar())
18421843
{
18431844
// Trains (Their trailers do as well!)
18441845
if (pModelInfo->IsTrain() || dwModel == 571 || dwModel == 570 || dwModel == 569 || dwModel == 590)
18451846
return;
18461847

18471848
// Ensure collision model is loaded before setting up suspension
1848-
auto* pColModelInterface = pModelInfo->GetInterface()->pColModel;
1849-
if (!pColModelInterface || !pColModelInterface->m_data)
1849+
if (!pModelInfo->GetInterface()->pColModel || !pModelInfo->GetInterface()->pColModel->m_data)
18501850
return;
18511851

1852-
struct ScopedModelRef
1853-
{
1854-
explicit ScopedModelRef(CModelInfo* model)
1855-
: m_Model(model)
1856-
{
1857-
if (m_Model)
1858-
m_Model->ModelAddRef(EModelRequestType::BLOCKING, "CVehicleSA::RecalculateSuspensionLines");
1859-
}
1860-
1861-
~ScopedModelRef()
1862-
{
1863-
if (m_Model)
1864-
m_Model->RemoveRef();
1865-
}
1866-
1867-
CModelInfo* m_Model;
1868-
} modelRef(pModelInfo);
1869-
1870-
GetVehicleInterface()->SetupSuspensionLines();
1871-
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.
18721856
CopyGlobalSuspensionLinesToPrivate();
18731857
}
18741858
}

Client/mods/deathmatch/logic/CClientVehicle.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4300,15 +4300,6 @@ void CClientVehicle::ApplyHandling()
43004300
if (!m_pVehicle)
43014301
return;
43024302

4303-
// Ensure model is loaded before recalculating handling
4304-
CModelInfo* pModelInfo = g_pGame->GetModelInfo(GetModel());
4305-
if (!pModelInfo || !pModelInfo->IsLoaded())
4306-
return;
4307-
4308-
// Ensure collision model is loaded before recalculating (needed for suspension lines)
4309-
if (!pModelInfo->IsCollisionLoaded())
4310-
return;
4311-
43124303
m_pVehicle->RecalculateHandling();
43134304

43144305
if (m_eVehicleType == CLIENTVEHICLE_BMX || m_eVehicleType == CLIENTVEHICLE_BIKE)

Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9015,10 +9015,6 @@ bool CStaticFunctionDefinitions::SetVehicleHandling(CClientVehicle* pVehicle, Ha
90159015
{
90169016
if (SetEntryHandling(pEntry, eProperty, ucValue))
90179017
{
9018-
CModelInfo* pModelInfo = g_pGame->GetModelInfo(pVehicle->GetModel());
9019-
if (!pModelInfo || !pModelInfo->IsLoaded())
9020-
return false;
9021-
90229018
pVehicle->ApplyHandling();
90239019
return true;
90249020
}
@@ -9036,10 +9032,6 @@ bool CStaticFunctionDefinitions::SetVehicleHandling(CClientVehicle* pVehicle, Ha
90369032
{
90379033
if (SetEntryHandling(pEntry, eProperty, uiValue))
90389034
{
9039-
CModelInfo* pModelInfo = g_pGame->GetModelInfo(pVehicle->GetModel());
9040-
if (!pModelInfo || !pModelInfo->IsLoaded())
9041-
return false;
9042-
90439035
pVehicle->ApplyHandling();
90449036
return true;
90459037
}
@@ -9057,10 +9049,6 @@ bool CStaticFunctionDefinitions::SetVehicleHandling(CClientVehicle* pVehicle, Ha
90579049
{
90589050
if (SetEntryHandling(pEntry, eProperty, fValue))
90599051
{
9060-
CModelInfo* pModelInfo = g_pGame->GetModelInfo(pVehicle->GetModel());
9061-
if (!pModelInfo || !pModelInfo->IsLoaded())
9062-
return false;
9063-
90649052
pVehicle->ApplyHandling();
90659053
return true;
90669054
}
@@ -9078,10 +9066,6 @@ bool CStaticFunctionDefinitions::SetVehicleHandling(CClientVehicle* pVehicle, Ha
90789066
{
90799067
if (SetEntryHandling(pEntry, eProperty, strValue))
90809068
{
9081-
CModelInfo* pModelInfo = g_pGame->GetModelInfo(pVehicle->GetModel());
9082-
if (!pModelInfo || !pModelInfo->IsLoaded())
9083-
return false;
9084-
90859069
pVehicle->ApplyHandling();
90869070
return true;
90879071
}
@@ -9099,10 +9083,6 @@ bool CStaticFunctionDefinitions::SetVehicleHandling(CClientVehicle* pVehicle, Ha
90999083
{
91009084
if (SetEntryHandling(pEntry, eProperty, vecValue))
91019085
{
9102-
CModelInfo* pModelInfo = g_pGame->GetModelInfo(pVehicle->GetModel());
9103-
if (!pModelInfo || !pModelInfo->IsLoaded())
9104-
return false;
9105-
91069086
pVehicle->ApplyHandling();
91079087
return true;
91089088
}
@@ -9161,10 +9141,6 @@ bool CStaticFunctionDefinitions::ResetVehicleHandling(CClientVehicle* pVehicle)
91619141
pEntry->SetSuspensionUpperLimit(pEntry->GetSuspensionLowerLimit() - 0.1f);
91629142
}
91639143

9164-
CModelInfo* pModelInfo = g_pGame->GetModelInfo(pVehicle->GetModel());
9165-
if (!pModelInfo || !pModelInfo->IsLoaded())
9166-
return false;
9167-
91689144
pVehicle->ApplyHandling();
91699145

91709146
return true;
@@ -9214,10 +9190,6 @@ bool CStaticFunctionDefinitions::ResetVehicleHandlingProperty(CClientVehicle* pV
92149190
return false;
92159191
}
92169192

9217-
CModelInfo* pModelInfo = g_pGame->GetModelInfo(pVehicle->GetModel());
9218-
if (!pModelInfo || !pModelInfo->IsLoaded())
9219-
return false;
9220-
92219193
pVehicle->ApplyHandling();
92229194

92239195
return true;

Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2518,15 +2518,6 @@ int CLuaVehicleDefs::SetVehicleHandling(lua_State* luaVM)
25182518

25192519
if (!argStream.HasErrors())
25202520
{
2521-
// Check if the vehicle model is loaded
2522-
CModelInfo* pModelInfo = g_pGame->GetModelInfo(pVehicle->GetModel());
2523-
if (!pModelInfo || !pModelInfo->IsLoaded())
2524-
{
2525-
m_pScriptDebugging->LogWarning(luaVM, "setVehicleHandling failed: vehicle model not loaded");
2526-
lua_pushboolean(luaVM, false);
2527-
return 1;
2528-
}
2529-
25302521
if (argStream.NextIsString())
25312522
{
25322523
SString strProperty;

Client/sdk/game/CModelInfo.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,6 @@ class CModelInfo
162162
virtual BYTE GetVehicleType() const noexcept = 0;
163163
virtual void Request(EModelRequestType requestType, const char* szTag /* = NULL*/) = 0;
164164
virtual bool IsLoaded() = 0;
165-
virtual bool IsCollisionLoaded() = 0;
166165
virtual unsigned short GetFlags() = 0;
167166
virtual unsigned short GetOriginalFlags() = 0;
168167
virtual void SetFlags(unsigned short usFlags) = 0;

0 commit comments

Comments
 (0)