Skip to content

Commit 5564c75

Browse files
Synchronize changes from 1.6 master branch [ci skip]
61d1caf Fix class hierarchy. Remove VTBL hacks (#3766)
2 parents ef1384d + 61d1caf commit 5564c75

28 files changed

+327
-454
lines changed

Client/game_sa/CBuildingRemovalSA.cpp

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,15 @@ void CBuildingRemovalSA::RemoveBuilding(uint16_t usModelToRemove, float fRange,
5454
if (pFind->m_iCount <= 0 && pFind->m_pInterface)
5555
{
5656
// Grab distances across each axis
57-
float fDistanceX = fX - pFind->m_pInterface->Placeable.m_transform.m_translate.fX;
58-
float fDistanceY = fY - pFind->m_pInterface->Placeable.m_transform.m_translate.fY;
59-
float fDistanceZ = fZ - pFind->m_pInterface->Placeable.m_transform.m_translate.fZ;
57+
float fDistanceX = fX - pFind->m_pInterface->m_transform.m_translate.fX;
58+
float fDistanceY = fY - pFind->m_pInterface->m_transform.m_translate.fY;
59+
float fDistanceZ = fZ - pFind->m_pInterface->m_transform.m_translate.fZ;
6060

61-
if (pFind->m_pInterface->Placeable.matrix != NULL)
61+
if (pFind->m_pInterface->matrix != NULL)
6262
{
63-
fDistanceX = fX - pFind->m_pInterface->Placeable.matrix->vPos.fX;
64-
fDistanceY = fY - pFind->m_pInterface->Placeable.matrix->vPos.fY;
65-
fDistanceZ = fZ - pFind->m_pInterface->Placeable.matrix->vPos.fZ;
63+
fDistanceX = fX - pFind->m_pInterface->matrix->vPos.fX;
64+
fDistanceY = fY - pFind->m_pInterface->matrix->vPos.fY;
65+
fDistanceZ = fZ - pFind->m_pInterface->matrix->vPos.fZ;
6666
}
6767

6868
// Square root 'em
@@ -80,7 +80,7 @@ void CBuildingRemovalSA::RemoveBuilding(uint16_t usModelToRemove, float fRange,
8080
if ((pInterface->nType == ENTITY_TYPE_BUILDING || pInterface->nType == ENTITY_TYPE_DUMMY || pInterface->nType == ENTITY_TYPE_OBJECT) &&
8181
pInterface->bRemoveFromWorld != 1)
8282
{
83-
if ((DWORD)(pInterface->vtbl) != VTBL_CPlaceable)
83+
if (!pInterface->IsPlaceableVTBL())
8484
{
8585
// Add the Data Building to the list
8686
pRemoval->AddDataBuilding(pInterface);
@@ -113,15 +113,15 @@ void CBuildingRemovalSA::RemoveBuilding(uint16_t usModelToRemove, float fRange,
113113
if (pFindBinary->m_iCount <= 0 && pFindBinary->m_pInterface)
114114
{
115115
// Grab distances across each axis
116-
float fDistanceX = fX - pFindBinary->m_pInterface->Placeable.m_transform.m_translate.fX;
117-
float fDistanceY = fY - pFindBinary->m_pInterface->Placeable.m_transform.m_translate.fY;
118-
float fDistanceZ = fZ - pFindBinary->m_pInterface->Placeable.m_transform.m_translate.fZ;
116+
float fDistanceX = fX - pFindBinary->m_pInterface->m_transform.m_translate.fX;
117+
float fDistanceY = fY - pFindBinary->m_pInterface->m_transform.m_translate.fY;
118+
float fDistanceZ = fZ - pFindBinary->m_pInterface->m_transform.m_translate.fZ;
119119

120-
if (pFindBinary->m_pInterface->Placeable.matrix != NULL)
120+
if (pFindBinary->m_pInterface->matrix != NULL)
121121
{
122-
fDistanceX = fX - pFindBinary->m_pInterface->Placeable.matrix->vPos.fX;
123-
fDistanceY = fY - pFindBinary->m_pInterface->Placeable.matrix->vPos.fY;
124-
fDistanceZ = fZ - pFindBinary->m_pInterface->Placeable.matrix->vPos.fZ;
122+
fDistanceX = fX - pFindBinary->m_pInterface->matrix->vPos.fX;
123+
fDistanceY = fY - pFindBinary->m_pInterface->matrix->vPos.fY;
124+
fDistanceZ = fZ - pFindBinary->m_pInterface->matrix->vPos.fZ;
125125
}
126126

127127
// Square root 'em
@@ -139,7 +139,7 @@ void CBuildingRemovalSA::RemoveBuilding(uint16_t usModelToRemove, float fRange,
139139
if ((pInterface->nType == ENTITY_TYPE_BUILDING || pInterface->nType == ENTITY_TYPE_DUMMY || pInterface->nType == ENTITY_TYPE_OBJECT) &&
140140
pInterface->bRemoveFromWorld != 1)
141141
{
142-
if ((DWORD)(pInterface->vtbl) != VTBL_CPlaceable)
142+
if (!pInterface->IsPlaceableVTBL())
143143
{
144144
// Add the Data Building to the list
145145
pRemoval->AddBinaryBuilding(pInterface);
@@ -211,7 +211,7 @@ bool CBuildingRemovalSA::RestoreBuilding(uint16_t usModelToRestore, float fRange
211211
pEntity->bRemoveFromWorld != 1)
212212
{
213213
// Don't call this on entities being removed.
214-
if ((DWORD)(pEntity->vtbl) != VTBL_CPlaceable)
214+
if (!pEntity->IsPlaceableVTBL())
215215
{
216216
pGame->GetWorld()->Add(pEntity, Building_Restore);
217217
m_pRemovedEntities[(DWORD)pEntity] = false;
@@ -243,7 +243,7 @@ bool CBuildingRemovalSA::RestoreBuilding(uint16_t usModelToRestore, float fRange
243243
if ((pEntity->nType == ENTITY_TYPE_BUILDING || pEntity->nType == ENTITY_TYPE_DUMMY || pEntity->nType == ENTITY_TYPE_OBJECT) &&
244244
pEntity->bRemoveFromWorld != 1)
245245
{
246-
if ((DWORD)(pEntity->vtbl) != VTBL_CPlaceable)
246+
if (!pEntity->IsPlaceableVTBL())
247247
{
248248
pGame->GetWorld()->Add(pEntity, Building_Restore2);
249249
m_pRemovedEntities[(DWORD)pEntity] = false;
@@ -277,15 +277,15 @@ bool CBuildingRemovalSA::RestoreBuilding(uint16_t usModelToRestore, float fRange
277277
if (pFound)
278278
{
279279
// Grab distances across each axis
280-
float fDistanceX = fX - pFound->m_pInterface->Placeable.m_transform.m_translate.fX;
281-
float fDistanceY = fY - pFound->m_pInterface->Placeable.m_transform.m_translate.fY;
282-
float fDistanceZ = fZ - pFound->m_pInterface->Placeable.m_transform.m_translate.fZ;
280+
float fDistanceX = fX - pFound->m_pInterface->m_transform.m_translate.fX;
281+
float fDistanceY = fY - pFound->m_pInterface->m_transform.m_translate.fY;
282+
float fDistanceZ = fZ - pFound->m_pInterface->m_transform.m_translate.fZ;
283283

284-
if (pFound->m_pInterface->Placeable.matrix != NULL)
284+
if (pFound->m_pInterface->matrix != NULL)
285285
{
286-
fDistanceX = fX - pFound->m_pInterface->Placeable.matrix->vPos.fX;
287-
fDistanceY = fY - pFound->m_pInterface->Placeable.matrix->vPos.fY;
288-
fDistanceZ = fZ - pFound->m_pInterface->Placeable.matrix->vPos.fZ;
286+
fDistanceX = fX - pFound->m_pInterface->matrix->vPos.fX;
287+
fDistanceY = fY - pFound->m_pInterface->matrix->vPos.fY;
288+
fDistanceZ = fZ - pFound->m_pInterface->matrix->vPos.fZ;
289289
}
290290

291291
// Square root 'em
@@ -309,15 +309,15 @@ bool CBuildingRemovalSA::RestoreBuilding(uint16_t usModelToRestore, float fRange
309309
if (pFoundBinary)
310310
{
311311
// Grab distances across each axis
312-
float fDistanceX = fX - pFoundBinary->m_pInterface->Placeable.m_transform.m_translate.fX;
313-
float fDistanceY = fY - pFoundBinary->m_pInterface->Placeable.m_transform.m_translate.fY;
314-
float fDistanceZ = fZ - pFoundBinary->m_pInterface->Placeable.m_transform.m_translate.fZ;
312+
float fDistanceX = fX - pFoundBinary->m_pInterface->m_transform.m_translate.fX;
313+
float fDistanceY = fY - pFoundBinary->m_pInterface->m_transform.m_translate.fY;
314+
float fDistanceZ = fZ - pFoundBinary->m_pInterface->m_transform.m_translate.fZ;
315315

316-
if (pFoundBinary->m_pInterface->Placeable.matrix != NULL)
316+
if (pFoundBinary->m_pInterface->matrix != NULL)
317317
{
318-
fDistanceX = fX - pFoundBinary->m_pInterface->Placeable.matrix->vPos.fX;
319-
fDistanceY = fY - pFoundBinary->m_pInterface->Placeable.matrix->vPos.fY;
320-
fDistanceZ = fZ - pFoundBinary->m_pInterface->Placeable.matrix->vPos.fZ;
318+
fDistanceX = fX - pFoundBinary->m_pInterface->matrix->vPos.fX;
319+
fDistanceY = fY - pFoundBinary->m_pInterface->matrix->vPos.fY;
320+
fDistanceZ = fZ - pFoundBinary->m_pInterface->matrix->vPos.fZ;
321321
}
322322

323323
// Square root 'em
@@ -386,15 +386,15 @@ bool CBuildingRemovalSA::IsObjectRemoved(CEntitySAInterface* pInterface)
386386
if (pFind->m_cInterior == -1 || pFind->m_cInterior == pInterface->m_areaCode)
387387
{
388388
// Grab the distance
389-
float fDistanceX = pFind->m_vecPos.fX - pInterface->Placeable.m_transform.m_translate.fX;
390-
float fDistanceY = pFind->m_vecPos.fY - pInterface->Placeable.m_transform.m_translate.fY;
391-
float fDistanceZ = pFind->m_vecPos.fZ - pInterface->Placeable.m_transform.m_translate.fZ;
389+
float fDistanceX = pFind->m_vecPos.fX - pInterface->m_transform.m_translate.fX;
390+
float fDistanceY = pFind->m_vecPos.fY - pInterface->m_transform.m_translate.fY;
391+
float fDistanceZ = pFind->m_vecPos.fZ - pInterface->m_transform.m_translate.fZ;
392392

393-
if (pInterface->Placeable.matrix != NULL)
393+
if (pInterface->matrix != NULL)
394394
{
395-
fDistanceX = pFind->m_vecPos.fX - pInterface->Placeable.matrix->vPos.fX;
396-
fDistanceY = pFind->m_vecPos.fY - pInterface->Placeable.matrix->vPos.fY;
397-
fDistanceZ = pFind->m_vecPos.fZ - pInterface->Placeable.matrix->vPos.fZ;
395+
fDistanceX = pFind->m_vecPos.fX - pInterface->matrix->vPos.fX;
396+
fDistanceY = pFind->m_vecPos.fY - pInterface->matrix->vPos.fY;
397+
fDistanceZ = pFind->m_vecPos.fZ - pInterface->matrix->vPos.fZ;
398398
}
399399

400400
float fDistance = sqrt(fDistanceX * fDistanceX + fDistanceY * fDistanceY + fDistanceZ * fDistanceZ);
@@ -457,7 +457,7 @@ void CBuildingRemovalSA::ClearRemovedBuildingLists(uint* pOutAmount)
457457
pEntity->bRemoveFromWorld != 1)
458458
{
459459
// Don't call this on entities being removed.
460-
if ((DWORD)(pEntity->vtbl) != VTBL_CPlaceable)
460+
if (!pEntity->IsPlaceableVTBL())
461461
{
462462
pGame->GetWorld()->Add(pEntity, BuildingRemovalReset);
463463
m_pRemovedEntities[(DWORD)pEntity] = false;
@@ -483,7 +483,7 @@ void CBuildingRemovalSA::ClearRemovedBuildingLists(uint* pOutAmount)
483483
pEntity->bRemoveFromWorld != 1)
484484
{
485485
// Don't call this on entities being removed.
486-
if ((DWORD)(pEntity->vtbl) != VTBL_CPlaceable)
486+
if (!pEntity->IsPlaceableVTBL())
487487
{
488488
pGame->GetWorld()->Add(pEntity, BuildingRemovalReset2);
489489
m_pRemovedEntities[(DWORD)pEntity] = false;
@@ -546,15 +546,15 @@ SBuildingRemoval* CBuildingRemovalSA::GetBuildingRemoval(CEntitySAInterface* pIn
546546
if (pFind)
547547
{
548548
// Grab the distance
549-
float fDistanceX = pFind->m_vecPos.fX - pInterface->Placeable.m_transform.m_translate.fX;
550-
float fDistanceY = pFind->m_vecPos.fY - pInterface->Placeable.m_transform.m_translate.fY;
551-
float fDistanceZ = pFind->m_vecPos.fZ - pInterface->Placeable.m_transform.m_translate.fZ;
549+
float fDistanceX = pFind->m_vecPos.fX - pInterface->m_transform.m_translate.fX;
550+
float fDistanceY = pFind->m_vecPos.fY - pInterface->m_transform.m_translate.fY;
551+
float fDistanceZ = pFind->m_vecPos.fZ - pInterface->m_transform.m_translate.fZ;
552552

553-
if (pInterface->Placeable.matrix != NULL)
553+
if (pInterface->matrix != NULL)
554554
{
555-
fDistanceX = pFind->m_vecPos.fX - pInterface->Placeable.matrix->vPos.fX;
556-
fDistanceY = pFind->m_vecPos.fY - pInterface->Placeable.matrix->vPos.fY;
557-
fDistanceZ = pFind->m_vecPos.fZ - pInterface->Placeable.matrix->vPos.fZ;
555+
fDistanceX = pFind->m_vecPos.fX - pInterface->matrix->vPos.fX;
556+
fDistanceY = pFind->m_vecPos.fY - pInterface->matrix->vPos.fY;
557+
fDistanceZ = pFind->m_vecPos.fZ - pInterface->matrix->vPos.fZ;
558558
}
559559

560560
float fDistance = sqrt(fDistanceX * fDistanceX + fDistanceY * fDistanceY + fDistanceZ * fDistanceZ);

Client/game_sa/CBuildingSA.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,9 @@ void CBuildingSA::AllocateMatrix()
7474
{
7575
auto* newMatrix = g_matrixPool.AllocateItem();
7676
std::memset(newMatrix, 0, sizeof(CMatrixLinkSAInterface));
77-
newMatrix->SetTranslateOnly(m_pInterface->Placeable.m_transform.m_translate);
77+
newMatrix->SetTranslateOnly(m_pInterface->m_transform.m_translate);
7878

79-
m_pInterface->Placeable.matrix = reinterpret_cast<CMatrix_Padded*>(newMatrix);
79+
m_pInterface->matrix = reinterpret_cast<CMatrix_Padded*>(newMatrix);
8080
}
8181

8282
void CBuildingSA::ReallocateMatrix()
@@ -85,26 +85,26 @@ void CBuildingSA::ReallocateMatrix()
8585
return;
8686

8787
auto* newMatrix = g_matrixPool.AllocateItem();
88-
std::memcpy(newMatrix, m_pInterface->Placeable.matrix, sizeof(CMatrixLinkSAInterface));
88+
std::memcpy(newMatrix, m_pInterface->matrix, sizeof(CMatrixLinkSAInterface));
8989
newMatrix->m_pOwner = nullptr;
9090
newMatrix->m_pPrev = nullptr;
9191
newMatrix->m_pNext = nullptr;
9292

9393
m_pInterface->RemoveMatrix();
94-
m_pInterface->Placeable.matrix = reinterpret_cast<CMatrix_Padded*>(newMatrix);
94+
m_pInterface->matrix = reinterpret_cast<CMatrix_Padded*>(newMatrix);
9595
}
9696

9797
void CBuildingSA::RemoveAllocatedMatrix()
9898
{
9999
if (!m_pInterface->HasMatrix())
100100
return;
101101

102-
CMatrixLinkSAInterface* pMatrix = reinterpret_cast<CMatrixLinkSAInterface*>(m_pInterface->Placeable.matrix);
102+
CMatrixLinkSAInterface* pMatrix = reinterpret_cast<CMatrixLinkSAInterface*>(m_pInterface->matrix);
103103

104104
if (pMatrix->m_pOwner || (pMatrix->m_pNext && pMatrix->m_pPrev))
105105
return;
106106

107-
g_matrixPool.RemoveItem(reinterpret_cast<CMatrixLinkSAInterface*>(m_pInterface->Placeable.matrix));
107+
g_matrixPool.RemoveItem(reinterpret_cast<CMatrixLinkSAInterface*>(m_pInterface->matrix));
108108
g_matrixPool.SetCapacity(0);
109-
m_pInterface->Placeable.matrix = nullptr;
109+
m_pInterface->matrix = nullptr;
110110
}

Client/game_sa/CBuildingsPoolSA.cpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ void CBuildingsPoolSA::RemoveBuilding(CBuilding* pBuilding)
148148
std::uint16_t modelId = pInterface->m_nModelIndex;
149149

150150
// Call virtual destructor
151-
((void*(__thiscall*)(void*, char))pInterface->vtbl->SCALAR_DELETING_DESTRUCTOR)(pInterface, 0);
151+
pInterface->Destructor(false);
152152

153153
// Remove col reference
154154
auto modelInfo = pGame->GetModelInfo(modelId);
@@ -172,7 +172,7 @@ void CBuildingsPoolSA::RemoveAllWithBackup()
172172
if (m_pOriginalBuildingsBackup)
173173
return;
174174

175-
m_pOriginalBuildingsBackup = std::make_unique<std::array<std::pair<bool, CBuildingSAInterface>, MAX_BUILDINGS>>();
175+
m_pOriginalBuildingsBackup = std::make_unique<backup_array_t>();
176176

177177
auto pBuildsingsPool = (*m_ppBuildingPoolInterface);
178178
for (size_t i = 0; i < MAX_BUILDINGS; i++)
@@ -189,7 +189,7 @@ void CBuildingsPoolSA::RemoveAllWithBackup()
189189
pBuildsingsPool->Release(i);
190190

191191
(*m_pOriginalBuildingsBackup)[i].first = true;
192-
(*m_pOriginalBuildingsBackup)[i].second = *building;
192+
std::memcpy(&(*m_pOriginalBuildingsBackup)[i].second, building, sizeof(CBuildingSAInterface));
193193
}
194194
else
195195
{
@@ -212,9 +212,8 @@ void CBuildingsPoolSA::RestoreBackup()
212212
{
213213
if (originalData[i].first)
214214
{
215-
pBuildsingsPool->AllocateAt(i);
216-
auto pBuilding = pBuildsingsPool->GetObject(i);
217-
*pBuilding = originalData[i].second;
215+
auto* pBuilding = pBuildsingsPool->AllocateAtNoInit(i);
216+
std::memcpy(pBuilding, &originalData[i].second, sizeof(CBuildingSAInterface));
218217

219218
worldSA->Add(pBuilding, CBuildingPool_Constructor);
220219
buildingRemovealSA->AddDataBuilding(pBuilding);
@@ -322,13 +321,13 @@ void CBuildingsPoolSA::UpdateIplEntrysPointers(uint32_t offset)
322321

323322
void CBuildingsPoolSA::UpdateBackupLodPointers(uint32_t offset)
324323
{
325-
std::array<std::pair<bool, CBuildingSAInterface>, MAX_BUILDINGS> *arr = m_pOriginalBuildingsBackup.get();
324+
backup_array_t* arr = m_pOriginalBuildingsBackup.get();
326325
for (auto i = 0; i < MAX_BUILDINGS; i++)
327326
{
328-
std::pair<bool, CBuildingSAInterface>* data = &(*arr)[i];
327+
std::pair<bool, building_buffer_t>* data = &(*arr)[i];
329328
if (data->first)
330329
{
331-
CBuildingSAInterface* building = &data->second;
330+
CBuildingSAInterface* building = reinterpret_cast<CBuildingSAInterface*>(&data->second);
332331
if (building->m_pLod != nullptr)
333332
{
334333
building->m_pLod = (CBuildingSAInterface*)((uint32_t)building->m_pLod + offset);

Client/game_sa/CBuildingsPoolSA.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,8 @@ class CBuildingsPoolSA : public CBuildingsPool
4444
SVectorPoolData<CBuildingSA> m_buildingPool{MAX_BUILDINGS};
4545
CPoolSAInterface<CBuildingSAInterface>** m_ppBuildingPoolInterface;
4646

47-
std::unique_ptr<std::array<std::pair<bool, CBuildingSAInterface>, MAX_BUILDINGS>> m_pOriginalBuildingsBackup;
47+
using building_buffer_t = std::uint8_t[sizeof(CBuildingSAInterface)];
48+
using backup_array_t = std::array<std::pair<bool, building_buffer_t>, MAX_BUILDINGS>;
49+
50+
std::unique_ptr<backup_array_t> m_pOriginalBuildingsBackup;
4851
};

Client/game_sa/CCameraSA.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ void CCameraSA::RestoreLastGoodState()
187187

188188
CMatrix* CCameraSA::GetMatrix(CMatrix* matrix)
189189
{
190-
CMatrix_Padded* pCamMatrix = &GetInterface()->m_cameraMatrix; // ->Placeable.matrix;
190+
CMatrix_Padded* pCamMatrix = &GetInterface()->m_cameraMatrix; // ->matrix;
191191
if (pCamMatrix)
192192
{
193193
matrix->vFront = pCamMatrix->vFront;
@@ -210,7 +210,7 @@ CMatrix* CCameraSA::GetMatrix(CMatrix* matrix)
210210

211211
void CCameraSA::SetMatrix(CMatrix* matrix)
212212
{
213-
CMatrix_Padded* pCamMatrix = GetInterface()->Placeable.matrix;
213+
CMatrix_Padded* pCamMatrix = GetInterface()->matrix;
214214
if (pCamMatrix)
215215
{
216216
pCamMatrix->vFront = matrix->vFront;

Client/game_sa/CCameraSA.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,9 @@ class CTrainCamNode
7777

7878
/*** END PURE R* CLASSES ***/
7979

80-
class CCameraSAInterface
80+
class CCameraSAInterface : public CPlaceableSAInterface
8181
{
8282
public:
83-
// CPlaceable
84-
CPlaceableSAInterface Placeable;
85-
std::uint8_t specialPadding[4]; // Temporary padding due to incorrect CPlaceableSAInterface class
86-
// End CPlaceable
87-
8883
// move these out the class, have decided to set up a mirrored enumerated type thingy at the top
8984
bool m_bAboveGroundTrainNodesLoaded;
9085
bool m_bBelowGroundTrainNodesLoaded;

0 commit comments

Comments
 (0)