Skip to content

Commit f317af9

Browse files
Synchronize changes from 1.6 branch [ci skip]
297fea1 Addendum to last de12081 Revert suspension related changes for now, as we need stable master. It will be re-introduced later (revised).
2 parents 27c54ab + 297fea1 commit f317af9

File tree

8 files changed

+10
-112
lines changed

8 files changed

+10
-112
lines changed

Client/game_sa/CModelInfoSA.cpp

Lines changed: 1 addition & 14 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;
@@ -1289,15 +1280,11 @@ unsigned int CModelInfoSA::GetNumRemaps()
12891280

12901281
void* CModelInfoSA::GetVehicleSuspensionData()
12911282
{
1292-
if (!GetInterface()->pColModel || !GetInterface()->pColModel->m_data)
1293-
return nullptr;
12941283
return GetInterface()->pColModel->m_data->m_suspensionLines;
12951284
}
12961285

12971286
void* CModelInfoSA::SetVehicleSuspensionData(void* pSuspensionLines)
12981287
{
1299-
if (!GetInterface()->pColModel || !GetInterface()->pColModel->m_data)
1300-
return nullptr;
13011288
CColDataSA* pColData = GetInterface()->pColModel->m_data;
13021289
void* pOrigSuspensionLines = pColData->m_suspensionLines;
13031290
pColData->m_suspensionLines = reinterpret_cast<CColLineSA*>(pSuspensionLines);
@@ -1630,7 +1617,7 @@ void CModelInfoSA::RestoreColModel()
16301617

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

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/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: 7 additions & 43 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
{
@@ -1839,20 +1809,14 @@ void CVehicleSA::RecalculateSuspensionLines()
18391809

18401810
DWORD dwModel = GetModelIndex();
18411811
CModelInfo* pModelInfo = pGame->GetModelInfo(dwModel);
1842-
if (pModelInfo && (pModelInfo->IsCar() || pModelInfo->IsMonsterTruck() || pModelInfo->IsTrailer()))
1812+
if (pModelInfo && pModelInfo->IsMonsterTruck() || pModelInfo->IsCar())
18431813
{
18441814
// Trains (Their trailers do as well!)
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
}

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
@@ -8905,10 +8905,6 @@ bool CStaticFunctionDefinitions::SetVehicleHandling(CClientVehicle* pVehicle, Ha
89058905
{
89068906
if (SetEntryHandling(pEntry, eProperty, ucValue))
89078907
{
8908-
CModelInfo* pModelInfo = g_pGame->GetModelInfo(pVehicle->GetModel());
8909-
if (!pModelInfo || !pModelInfo->IsLoaded())
8910-
return false;
8911-
89128908
pVehicle->ApplyHandling();
89138909
return true;
89148910
}
@@ -8926,10 +8922,6 @@ bool CStaticFunctionDefinitions::SetVehicleHandling(CClientVehicle* pVehicle, Ha
89268922
{
89278923
if (SetEntryHandling(pEntry, eProperty, uiValue))
89288924
{
8929-
CModelInfo* pModelInfo = g_pGame->GetModelInfo(pVehicle->GetModel());
8930-
if (!pModelInfo || !pModelInfo->IsLoaded())
8931-
return false;
8932-
89338925
pVehicle->ApplyHandling();
89348926
return true;
89358927
}
@@ -8947,10 +8939,6 @@ bool CStaticFunctionDefinitions::SetVehicleHandling(CClientVehicle* pVehicle, Ha
89478939
{
89488940
if (SetEntryHandling(pEntry, eProperty, fValue))
89498941
{
8950-
CModelInfo* pModelInfo = g_pGame->GetModelInfo(pVehicle->GetModel());
8951-
if (!pModelInfo || !pModelInfo->IsLoaded())
8952-
return false;
8953-
89548942
pVehicle->ApplyHandling();
89558943
return true;
89568944
}
@@ -8968,10 +8956,6 @@ bool CStaticFunctionDefinitions::SetVehicleHandling(CClientVehicle* pVehicle, Ha
89688956
{
89698957
if (SetEntryHandling(pEntry, eProperty, strValue))
89708958
{
8971-
CModelInfo* pModelInfo = g_pGame->GetModelInfo(pVehicle->GetModel());
8972-
if (!pModelInfo || !pModelInfo->IsLoaded())
8973-
return false;
8974-
89758959
pVehicle->ApplyHandling();
89768960
return true;
89778961
}
@@ -8989,10 +8973,6 @@ bool CStaticFunctionDefinitions::SetVehicleHandling(CClientVehicle* pVehicle, Ha
89898973
{
89908974
if (SetEntryHandling(pEntry, eProperty, vecValue))
89918975
{
8992-
CModelInfo* pModelInfo = g_pGame->GetModelInfo(pVehicle->GetModel());
8993-
if (!pModelInfo || !pModelInfo->IsLoaded())
8994-
return false;
8995-
89968976
pVehicle->ApplyHandling();
89978977
return true;
89988978
}
@@ -9051,10 +9031,6 @@ bool CStaticFunctionDefinitions::ResetVehicleHandling(CClientVehicle* pVehicle)
90519031
pEntry->SetSuspensionUpperLimit(pEntry->GetSuspensionLowerLimit() - 0.1f);
90529032
}
90539033

9054-
CModelInfo* pModelInfo = g_pGame->GetModelInfo(pVehicle->GetModel());
9055-
if (!pModelInfo || !pModelInfo->IsLoaded())
9056-
return false;
9057-
90589034
pVehicle->ApplyHandling();
90599035

90609036
return true;
@@ -9104,10 +9080,6 @@ bool CStaticFunctionDefinitions::ResetVehicleHandlingProperty(CClientVehicle* pV
91049080
return false;
91059081
}
91069082

9107-
CModelInfo* pModelInfo = g_pGame->GetModelInfo(pVehicle->GetModel());
9108-
if (!pModelInfo || !pModelInfo->IsLoaded())
9109-
return false;
9110-
91119083
pVehicle->ApplyHandling();
91129084

91139085
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)