Skip to content

Commit 5d06c12

Browse files
Synchronize changes from 1.6 master branch [ci skip]
21593b9 Add damageable objects support (PR #3793) 9d24451 Update client en_US pot
2 parents 44574d1 + 21593b9 commit 5d06c12

File tree

7 files changed

+60
-1
lines changed

7 files changed

+60
-1
lines changed

Client/game_sa/CModelInfoSA.cpp

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1761,6 +1761,24 @@ void CModelInfoSA::MakeObjectModel(ushort usBaseID)
17611761
CopyStreamingInfoFromModel(usBaseID);
17621762
}
17631763

1764+
void CModelInfoSA::MakeObjectDamageableModel(std::uint16_t baseModel)
1765+
{
1766+
CDamageableModelInfoSAInterface* m_pInterface = new CDamageableModelInfoSAInterface();
1767+
1768+
CDamageableModelInfoSAInterface* pBaseObjectInfo = static_cast<CDamageableModelInfoSAInterface*>(ppModelInfo[baseModel]);
1769+
MemCpyFast(m_pInterface, pBaseObjectInfo, sizeof(CDamageableModelInfoSAInterface));
1770+
m_pInterface->usNumberOfRefs = 0;
1771+
m_pInterface->pRwObject = nullptr;
1772+
m_pInterface->usUnknown = 65535;
1773+
m_pInterface->usDynamicIndex = 65535;
1774+
m_pInterface->m_damagedAtomic = nullptr;
1775+
1776+
ppModelInfo[m_dwModelID] = m_pInterface;
1777+
1778+
m_dwParentID = baseModel;
1779+
CopyStreamingInfoFromModel(baseModel);
1780+
}
1781+
17641782
void CModelInfoSA::MakeTimedObjectModel(ushort usBaseID)
17651783
{
17661784
CTimeModelInfoSAInterface* m_pInterface = new CTimeModelInfoSAInterface();
@@ -1826,7 +1844,14 @@ void CModelInfoSA::DeallocateModel(void)
18261844
delete reinterpret_cast<CPedModelInfoSAInterface*>(ppModelInfo[m_dwModelID]);
18271845
break;
18281846
case eModelInfoType::ATOMIC:
1829-
delete reinterpret_cast<CBaseModelInfoSAInterface*>(ppModelInfo[m_dwModelID]);
1847+
if (IsDamageableAtomic())
1848+
{
1849+
delete reinterpret_cast<CDamageableModelInfoSAInterface*>(ppModelInfo[m_dwModelID]);
1850+
}
1851+
else
1852+
{
1853+
delete reinterpret_cast<CBaseModelInfoSAInterface*>(ppModelInfo[m_dwModelID]);
1854+
}
18301855
break;
18311856
case eModelInfoType::CLUMP:
18321857
delete reinterpret_cast<CClumpModelInfoSAInterface*>(ppModelInfo[m_dwModelID]);
@@ -2081,6 +2106,12 @@ bool CModelInfoSA::IsTowableBy(CModelInfo* towingModel)
20812106
return isTowable;
20822107
}
20832108

2109+
bool CModelInfoSA::IsDamageableAtomic()
2110+
{
2111+
void* asDamagable = ((void* (*)())m_pInterface->VFTBL->AsDamageAtomicModelInfoPtr)();
2112+
return asDamagable != nullptr;
2113+
}
2114+
20842115
//////////////////////////////////////////////////////////////////////////////////////////
20852116
//
20862117
// CModelInfoSA::ForceUnload

Client/game_sa/CModelInfoSA.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,12 @@ class CTimeModelInfoSAInterface : public CBaseModelInfoSAInterface
259259
CTimeInfoSAInterface timeInfo;
260260
};
261261

262+
class CDamageableModelInfoSAInterface : public CBaseModelInfoSAInterface
263+
{
264+
public:
265+
void* m_damagedAtomic;
266+
};
267+
262268
class CVehicleModelVisualInfoSAInterface // Not sure about this name. If somebody knows more, please change
263269
{
264270
public:
@@ -447,6 +453,7 @@ class CModelInfoSA : public CModelInfo
447453
// CModelInfoSA methods
448454
void MakePedModel(char* szTexture);
449455
void MakeObjectModel(ushort usBaseModelID);
456+
void MakeObjectDamageableModel(std::uint16_t usBaseModelID) override;
450457
void MakeVehicleAutomobile(ushort usBaseModelID);
451458
void MakeTimedObjectModel(ushort usBaseModelID);
452459
void MakeClumpModel(ushort usBaseModelID);
@@ -467,6 +474,7 @@ class CModelInfoSA : public CModelInfo
467474
bool IsTowableBy(CModelInfo* towingModel) override;
468475

469476
bool IsDynamic() { return m_pInterface ? m_pInterface->usDynamicIndex != MODEL_PROPERTIES_GROUP_STATIC : false; };
477+
bool IsDamageableAtomic() override;
470478

471479
static bool IsVehicleModel(std::uint32_t model) noexcept;
472480

Client/mods/deathmatch/logic/CClientModel.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,17 @@ bool CClientModel::Allocate(ushort usParentID)
5151
return true;
5252
}
5353
break;
54+
case eClientModelType::OBJECT_DAMAGEABLE:
55+
{
56+
bool isValidModel = g_pClientGame->GetObjectManager()->IsValidModel(usParentID);
57+
bool isDamagable = pParentModelInfo->IsDamageableAtomic();
58+
if (isValidModel && isDamagable)
59+
{
60+
pModelInfo->MakeObjectDamageableModel(usParentID);
61+
return true;
62+
}
63+
break;
64+
}
5465
case eClientModelType::CLUMP:
5566
if (g_pClientGame->GetObjectManager()->IsValidModel(usParentID))
5667
{
@@ -109,6 +120,7 @@ void CClientModel::RestoreEntitiesUsingThisModel()
109120
{
110121
case eClientModelType::PED:
111122
case eClientModelType::OBJECT:
123+
case eClientModelType::OBJECT_DAMAGEABLE:
112124
case eClientModelType::CLUMP:
113125
case eClientModelType::TIMED_OBJECT:
114126
case eClientModelType::VEHICLE:
@@ -174,6 +186,7 @@ void CClientModel::RestoreDFF(CModelInfo* pModelInfo)
174186
}
175187
case eClientModelType::CLUMP:
176188
case eClientModelType::OBJECT:
189+
case eClientModelType::OBJECT_DAMAGEABLE:
177190
case eClientModelType::TIMED_OBJECT:
178191
{
179192
const auto& objects = &g_pClientGame->GetManager()->GetObjectManager()->GetObjects();

Client/mods/deathmatch/logic/CClientModel.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ enum class eClientModelType
1818
{
1919
PED,
2020
OBJECT,
21+
OBJECT_DAMAGEABLE,
2122
VEHICLE,
2223
TIMED_OBJECT,
2324
CLUMP,

Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,7 @@ IMPLEMENT_ENUM_END("surface-adhesion-group")
707707
IMPLEMENT_ENUM_CLASS_BEGIN(eClientModelType)
708708
ADD_ENUM(eClientModelType::PED, "ped")
709709
ADD_ENUM(eClientModelType::OBJECT, "object")
710+
ADD_ENUM(eClientModelType::OBJECT_DAMAGEABLE, "object-damageable")
710711
ADD_ENUM(eClientModelType::VEHICLE, "vehicle")
711712
ADD_ENUM(eClientModelType::TIMED_OBJECT, "timed-object")
712713
ADD_ENUM(eClientModelType::CLUMP, "clump")

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -892,6 +892,9 @@ int CLuaEngineDefs::EngineRequestModel(lua_State* luaVM)
892892
case eClientModelType::OBJECT:
893893
usParentID = 1337; // BinNt07_LA (trash can)
894894
break;
895+
case eClientModelType::OBJECT_DAMAGEABLE:
896+
usParentID = 994; // lhouse_barrier2
897+
break;
895898
case eClientModelType::VEHICLE:
896899
usParentID = VT_LANDSTAL;
897900
break;

Client/sdk/game/CModelInfo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ class CModelInfo
236236
virtual RwObject* GetRwObject() = 0;
237237
virtual void MakePedModel(char* szTexture) = 0;
238238
virtual void MakeObjectModel(unsigned short usBaseID) = 0;
239+
virtual void MakeObjectDamageableModel(std::uint16_t baseID) = 0;
239240
virtual void MakeVehicleAutomobile(unsigned short usBaseID) = 0;
240241
virtual void MakeTimedObjectModel(unsigned short usBaseID) = 0;
241242
virtual void MakeClumpModel(unsigned short usBaseID) = 0;
@@ -252,4 +253,5 @@ class CModelInfo
252253

253254
virtual unsigned int GetParentID() = 0;
254255
virtual bool IsDynamic() = 0;
256+
virtual bool IsDamageableAtomic() = 0;
255257
};

0 commit comments

Comments
 (0)