From eacbadda199e94404f761b634ff8cdbc5b498501 Mon Sep 17 00:00:00 2001 From: MegadreamsBE Date: Wed, 3 Sep 2025 18:31:22 -0400 Subject: [PATCH 1/2] Add ability to make client-side vehicles damageable --- Client/mods/deathmatch/logic/CClientVehicle.cpp | 9 ++++++++- Client/mods/deathmatch/logic/CClientVehicle.h | 3 ++- Client/mods/deathmatch/logic/CDeathmatchVehicle.cpp | 4 ++-- Client/mods/deathmatch/logic/CDeathmatchVehicle.h | 2 +- .../mods/deathmatch/logic/CStaticFunctionDefinitions.cpp | 4 ++-- .../mods/deathmatch/logic/CStaticFunctionDefinitions.h | 2 +- Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp | 5 ++++- 7 files changed, 20 insertions(+), 9 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientVehicle.cpp b/Client/mods/deathmatch/logic/CClientVehicle.cpp index e47c40e2e5e..12b3c62d8f3 100644 --- a/Client/mods/deathmatch/logic/CClientVehicle.cpp +++ b/Client/mods/deathmatch/logic/CClientVehicle.cpp @@ -35,7 +35,7 @@ std::set ms_AttachedVehiclesToIgnore; #define VEHICLE_INTERPOLATION_WARP_THRESHOLD 15 #define VEHICLE_INTERPOLATION_WARP_THRESHOLD_FOR_SPEED 10 -CClientVehicle::CClientVehicle(CClientManager* pManager, ElementID ID, unsigned short usModel, unsigned char ucVariation, unsigned char ucVariation2) +CClientVehicle::CClientVehicle(CClientManager* pManager, ElementID ID, unsigned short usModel, unsigned char ucVariation, unsigned char ucVariation2, bool damageable) : ClassInit(this), CClientStreamElement(pManager->GetVehicleStreamer(), ID) { CClientEntityRefManager::AddEntityRefs(ENTITY_REF_DEBUG(this, "CClientVehicle"), &m_pDriver, &m_pOccupyingDriver, &m_pPreviousLink, &m_pNextLink, @@ -137,6 +137,7 @@ CClientVehicle::CClientVehicle(CClientManager* pManager, ElementID ID, unsigned m_bSyncUnoccupiedDamage = false; m_bScriptCanBeDamaged = true; m_bTyresCanBurst = true; + m_localCanBeDamaged = damageable; m_ucOverrideLights = 0; m_pTowedVehicle = NULL; m_pTowedByVehicle = NULL; @@ -1176,6 +1177,9 @@ void CClientVehicle::CalcAndUpdateCanBeDamagedFlag() if (m_bSyncUnoccupiedDamage) bCanBeDamaged = true; + if (IsLocalEntity()) + bCanBeDamaged = m_localCanBeDamaged; + // Script override if (!m_bScriptCanBeDamaged) bCanBeDamaged = false; @@ -1218,6 +1222,9 @@ void CClientVehicle::CalcAndUpdateTyresCanBurstFlag() if (m_bSyncUnoccupiedDamage) bTyresCanBurst = true; + if (IsLocalEntity()) + bTyresCanBurst = m_localCanBeDamaged; + // Script override if (!m_bScriptCanBeDamaged) bTyresCanBurst = false; diff --git a/Client/mods/deathmatch/logic/CClientVehicle.h b/Client/mods/deathmatch/logic/CClientVehicle.h index 99c00b46334..06ac64e8d44 100644 --- a/Client/mods/deathmatch/logic/CClientVehicle.h +++ b/Client/mods/deathmatch/logic/CClientVehicle.h @@ -160,7 +160,7 @@ class CClientVehicle : public CClientStreamElement protected: // Use CDeathmatchVehicle constructor for now. Will get removed later when this class is // cleaned up. - CClientVehicle(CClientManager* pManager, ElementID ID, unsigned short usModel, unsigned char ucVariation, unsigned char ucVariation2); + CClientVehicle(CClientManager* pManager, ElementID ID, unsigned short usModel, unsigned char ucVariation, unsigned char ucVariation2, bool damageable = false); public: ~CClientVehicle(); @@ -627,6 +627,7 @@ class CClientVehicle : public CClientStreamElement bool m_bCanBeDamaged; bool m_bScriptCanBeDamaged; bool m_bSyncUnoccupiedDamage; + bool m_localCanBeDamaged{false}; bool m_bTyresCanBurst; SFixedArray m_ucDoorStates; SFixedArray m_ucWheelStates; diff --git a/Client/mods/deathmatch/logic/CDeathmatchVehicle.cpp b/Client/mods/deathmatch/logic/CDeathmatchVehicle.cpp index 31ac68753b5..c8697585501 100644 --- a/Client/mods/deathmatch/logic/CDeathmatchVehicle.cpp +++ b/Client/mods/deathmatch/logic/CDeathmatchVehicle.cpp @@ -13,8 +13,8 @@ #include "net/SyncStructures.h" CDeathmatchVehicle::CDeathmatchVehicle(CClientManager* pManager, CUnoccupiedVehicleSync* pUnoccupiedVehicleSync, ElementID ID, unsigned short usVehicleModel, - unsigned char ucVariant, unsigned char ucVariant2) - : ClassInit(this), CClientVehicle(pManager, ID, usVehicleModel, ucVariant, ucVariant2) + unsigned char ucVariant, unsigned char ucVariant2, bool damageable) + : ClassInit(this), CClientVehicle(pManager, ID, usVehicleModel, ucVariant, ucVariant2, damageable) { m_pUnoccupiedVehicleSync = pUnoccupiedVehicleSync; GetInitialDoorStates(m_ucLastDoorStates); diff --git a/Client/mods/deathmatch/logic/CDeathmatchVehicle.h b/Client/mods/deathmatch/logic/CDeathmatchVehicle.h index 9d09bac0e4a..077a18fafda 100644 --- a/Client/mods/deathmatch/logic/CDeathmatchVehicle.h +++ b/Client/mods/deathmatch/logic/CDeathmatchVehicle.h @@ -18,7 +18,7 @@ class CDeathmatchVehicle final : public CClientVehicle DECLARE_CLASS(CDeathmatchVehicle, CClientVehicle) public: CDeathmatchVehicle(CClientManager* pManager, class CUnoccupiedVehicleSync* pUnoccupiedVehicleSync, ElementID ID, unsigned short usVehicleModel, - unsigned char ucVariant, unsigned char ucVariant2); + unsigned char ucVariant, unsigned char ucVariant2, bool damageable = false); ~CDeathmatchVehicle(); bool IsSyncing() { return m_bIsSyncing; }; diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index a9447a58a55..a54b7c5903d 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -2858,7 +2858,7 @@ bool CStaticFunctionDefinitions::IsTrainChainEngine(CClientVehicle& Vehicle, boo } CClientVehicle* CStaticFunctionDefinitions::CreateVehicle(CResource& Resource, unsigned short usModel, const CVector& vecPosition, const CVector& vecRotation, - const char* szRegPlate, unsigned char ucVariant, unsigned char ucVariant2) + const char* szRegPlate, unsigned char ucVariant, unsigned char ucVariant2, bool damageable) { if (CClientVehicleManager::IsValidModel(usModel) && (ucVariant <= 5 || ucVariant == 255) && (ucVariant2 <= 5 || ucVariant2 == 255)) { @@ -2867,7 +2867,7 @@ CClientVehicle* CStaticFunctionDefinitions::CreateVehicle(CResource& Resource, u if (ucVariant2 == 255 && ucVariant == 255) CClientVehicleManager::GetRandomVariation(usModel, ucVariation, ucVariation2); - CClientVehicle* pVehicle = new CDeathmatchVehicle(m_pManager, NULL, INVALID_ELEMENT_ID, usModel, ucVariation, ucVariation2); + CClientVehicle* pVehicle = new CDeathmatchVehicle(m_pManager, NULL, INVALID_ELEMENT_ID, usModel, ucVariation, ucVariation2, damageable); pVehicle->SetParent(Resource.GetResourceDynamicEntity()); pVehicle->SetPosition(vecPosition); diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h index 75999cf0882..692a73fd0c7 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h @@ -202,7 +202,7 @@ class CStaticFunctionDefinitions // Vehicle get funcs static CClientVehicle* CreateVehicle(CResource& Resource, unsigned short usModel, const CVector& vecPosition, const CVector& vecRotation, - const char* szRegPlate = NULL, unsigned char ucVariant = 5, unsigned char ucVariant2 = 5); + const char* szRegPlate = NULL, unsigned char ucVariant = 5, unsigned char ucVariant2 = 5, bool damageable = false); static bool GetVehicleModelFromName(const char* szName, unsigned short& usModel); static bool GetVehicleUpgradeSlotName(unsigned char ucSlot, SString& strOutName); static bool GetVehicleUpgradeSlotName(unsigned short usUpgrade, SString& strOutName); diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp index 94945f0fbc5..ca04396e1d0 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp @@ -1532,6 +1532,7 @@ int CLuaVehicleDefs::CreateVehicle(lua_State* luaVM) unsigned char ucVariant = 255; unsigned char ucVariant2 = 255; SString strRegPlate = ""; + bool damageable = false; CScriptArgReader argStream(luaVM); argStream.ReadNumber(usModel); argStream.ReadVector3D(vecPosition); @@ -1539,6 +1540,7 @@ int CLuaVehicleDefs::CreateVehicle(lua_State* luaVM) argStream.ReadString(strRegPlate, ""); argStream.ReadNumber(ucVariant, 255); argStream.ReadNumber(ucVariant2, 255); + argStream.ReadBool(damageable, false); if (!argStream.HasErrors()) { @@ -1550,7 +1552,8 @@ int CLuaVehicleDefs::CreateVehicle(lua_State* luaVM) { // Create the vehicle and return its handle CClientVehicle* pVehicle = CStaticFunctionDefinitions::CreateVehicle(*pResource, usModel, vecPosition, vecRotation, - strRegPlate == "" ? NULL : strRegPlate.c_str(), ucVariant, ucVariant2); + strRegPlate == "" ? NULL : strRegPlate.c_str(), ucVariant, ucVariant2, + damageable); if (pVehicle) { CElementGroup* pGroup = pResource->GetElementGroup(); From 1a05b9c1ab634a081df76fe86514914e17512509 Mon Sep 17 00:00:00 2001 From: MegadreamsBE Date: Wed, 3 Sep 2025 19:55:22 -0400 Subject: [PATCH 2/2] Update damageable logic to be set through SetVehicleDamageProof --- Client/mods/deathmatch/logic/CClientVehicle.cpp | 9 ++++----- Client/mods/deathmatch/logic/CClientVehicle.h | 3 +-- Client/mods/deathmatch/logic/CDeathmatchVehicle.cpp | 4 ++-- Client/mods/deathmatch/logic/CDeathmatchVehicle.h | 2 +- .../mods/deathmatch/logic/CStaticFunctionDefinitions.cpp | 4 ++-- .../mods/deathmatch/logic/CStaticFunctionDefinitions.h | 2 +- Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp | 5 +---- 7 files changed, 12 insertions(+), 17 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientVehicle.cpp b/Client/mods/deathmatch/logic/CClientVehicle.cpp index 12b3c62d8f3..36807a2a141 100644 --- a/Client/mods/deathmatch/logic/CClientVehicle.cpp +++ b/Client/mods/deathmatch/logic/CClientVehicle.cpp @@ -35,7 +35,7 @@ std::set ms_AttachedVehiclesToIgnore; #define VEHICLE_INTERPOLATION_WARP_THRESHOLD 15 #define VEHICLE_INTERPOLATION_WARP_THRESHOLD_FOR_SPEED 10 -CClientVehicle::CClientVehicle(CClientManager* pManager, ElementID ID, unsigned short usModel, unsigned char ucVariation, unsigned char ucVariation2, bool damageable) +CClientVehicle::CClientVehicle(CClientManager* pManager, ElementID ID, unsigned short usModel, unsigned char ucVariation, unsigned char ucVariation2) : ClassInit(this), CClientStreamElement(pManager->GetVehicleStreamer(), ID) { CClientEntityRefManager::AddEntityRefs(ENTITY_REF_DEBUG(this, "CClientVehicle"), &m_pDriver, &m_pOccupyingDriver, &m_pPreviousLink, &m_pNextLink, @@ -135,9 +135,8 @@ CClientVehicle::CClientVehicle(CClientManager* pManager, ElementID ID, unsigned memset(&m_ucLightStates[0], 0, sizeof(m_ucLightStates)); m_bCanBeDamaged = true; m_bSyncUnoccupiedDamage = false; - m_bScriptCanBeDamaged = true; + m_bScriptCanBeDamaged = !IsLocalEntity(); m_bTyresCanBurst = true; - m_localCanBeDamaged = damageable; m_ucOverrideLights = 0; m_pTowedVehicle = NULL; m_pTowedByVehicle = NULL; @@ -1178,7 +1177,7 @@ void CClientVehicle::CalcAndUpdateCanBeDamagedFlag() bCanBeDamaged = true; if (IsLocalEntity()) - bCanBeDamaged = m_localCanBeDamaged; + bCanBeDamaged = m_bScriptCanBeDamaged; // Script override if (!m_bScriptCanBeDamaged) @@ -1223,7 +1222,7 @@ void CClientVehicle::CalcAndUpdateTyresCanBurstFlag() bTyresCanBurst = true; if (IsLocalEntity()) - bTyresCanBurst = m_localCanBeDamaged; + bTyresCanBurst = m_bScriptCanBeDamaged; // Script override if (!m_bScriptCanBeDamaged) diff --git a/Client/mods/deathmatch/logic/CClientVehicle.h b/Client/mods/deathmatch/logic/CClientVehicle.h index 06ac64e8d44..99c00b46334 100644 --- a/Client/mods/deathmatch/logic/CClientVehicle.h +++ b/Client/mods/deathmatch/logic/CClientVehicle.h @@ -160,7 +160,7 @@ class CClientVehicle : public CClientStreamElement protected: // Use CDeathmatchVehicle constructor for now. Will get removed later when this class is // cleaned up. - CClientVehicle(CClientManager* pManager, ElementID ID, unsigned short usModel, unsigned char ucVariation, unsigned char ucVariation2, bool damageable = false); + CClientVehicle(CClientManager* pManager, ElementID ID, unsigned short usModel, unsigned char ucVariation, unsigned char ucVariation2); public: ~CClientVehicle(); @@ -627,7 +627,6 @@ class CClientVehicle : public CClientStreamElement bool m_bCanBeDamaged; bool m_bScriptCanBeDamaged; bool m_bSyncUnoccupiedDamage; - bool m_localCanBeDamaged{false}; bool m_bTyresCanBurst; SFixedArray m_ucDoorStates; SFixedArray m_ucWheelStates; diff --git a/Client/mods/deathmatch/logic/CDeathmatchVehicle.cpp b/Client/mods/deathmatch/logic/CDeathmatchVehicle.cpp index c8697585501..31ac68753b5 100644 --- a/Client/mods/deathmatch/logic/CDeathmatchVehicle.cpp +++ b/Client/mods/deathmatch/logic/CDeathmatchVehicle.cpp @@ -13,8 +13,8 @@ #include "net/SyncStructures.h" CDeathmatchVehicle::CDeathmatchVehicle(CClientManager* pManager, CUnoccupiedVehicleSync* pUnoccupiedVehicleSync, ElementID ID, unsigned short usVehicleModel, - unsigned char ucVariant, unsigned char ucVariant2, bool damageable) - : ClassInit(this), CClientVehicle(pManager, ID, usVehicleModel, ucVariant, ucVariant2, damageable) + unsigned char ucVariant, unsigned char ucVariant2) + : ClassInit(this), CClientVehicle(pManager, ID, usVehicleModel, ucVariant, ucVariant2) { m_pUnoccupiedVehicleSync = pUnoccupiedVehicleSync; GetInitialDoorStates(m_ucLastDoorStates); diff --git a/Client/mods/deathmatch/logic/CDeathmatchVehicle.h b/Client/mods/deathmatch/logic/CDeathmatchVehicle.h index 077a18fafda..9d09bac0e4a 100644 --- a/Client/mods/deathmatch/logic/CDeathmatchVehicle.h +++ b/Client/mods/deathmatch/logic/CDeathmatchVehicle.h @@ -18,7 +18,7 @@ class CDeathmatchVehicle final : public CClientVehicle DECLARE_CLASS(CDeathmatchVehicle, CClientVehicle) public: CDeathmatchVehicle(CClientManager* pManager, class CUnoccupiedVehicleSync* pUnoccupiedVehicleSync, ElementID ID, unsigned short usVehicleModel, - unsigned char ucVariant, unsigned char ucVariant2, bool damageable = false); + unsigned char ucVariant, unsigned char ucVariant2); ~CDeathmatchVehicle(); bool IsSyncing() { return m_bIsSyncing; }; diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index a54b7c5903d..a9447a58a55 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -2858,7 +2858,7 @@ bool CStaticFunctionDefinitions::IsTrainChainEngine(CClientVehicle& Vehicle, boo } CClientVehicle* CStaticFunctionDefinitions::CreateVehicle(CResource& Resource, unsigned short usModel, const CVector& vecPosition, const CVector& vecRotation, - const char* szRegPlate, unsigned char ucVariant, unsigned char ucVariant2, bool damageable) + const char* szRegPlate, unsigned char ucVariant, unsigned char ucVariant2) { if (CClientVehicleManager::IsValidModel(usModel) && (ucVariant <= 5 || ucVariant == 255) && (ucVariant2 <= 5 || ucVariant2 == 255)) { @@ -2867,7 +2867,7 @@ CClientVehicle* CStaticFunctionDefinitions::CreateVehicle(CResource& Resource, u if (ucVariant2 == 255 && ucVariant == 255) CClientVehicleManager::GetRandomVariation(usModel, ucVariation, ucVariation2); - CClientVehicle* pVehicle = new CDeathmatchVehicle(m_pManager, NULL, INVALID_ELEMENT_ID, usModel, ucVariation, ucVariation2, damageable); + CClientVehicle* pVehicle = new CDeathmatchVehicle(m_pManager, NULL, INVALID_ELEMENT_ID, usModel, ucVariation, ucVariation2); pVehicle->SetParent(Resource.GetResourceDynamicEntity()); pVehicle->SetPosition(vecPosition); diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h index 692a73fd0c7..75999cf0882 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h @@ -202,7 +202,7 @@ class CStaticFunctionDefinitions // Vehicle get funcs static CClientVehicle* CreateVehicle(CResource& Resource, unsigned short usModel, const CVector& vecPosition, const CVector& vecRotation, - const char* szRegPlate = NULL, unsigned char ucVariant = 5, unsigned char ucVariant2 = 5, bool damageable = false); + const char* szRegPlate = NULL, unsigned char ucVariant = 5, unsigned char ucVariant2 = 5); static bool GetVehicleModelFromName(const char* szName, unsigned short& usModel); static bool GetVehicleUpgradeSlotName(unsigned char ucSlot, SString& strOutName); static bool GetVehicleUpgradeSlotName(unsigned short usUpgrade, SString& strOutName); diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp index ca04396e1d0..94945f0fbc5 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp @@ -1532,7 +1532,6 @@ int CLuaVehicleDefs::CreateVehicle(lua_State* luaVM) unsigned char ucVariant = 255; unsigned char ucVariant2 = 255; SString strRegPlate = ""; - bool damageable = false; CScriptArgReader argStream(luaVM); argStream.ReadNumber(usModel); argStream.ReadVector3D(vecPosition); @@ -1540,7 +1539,6 @@ int CLuaVehicleDefs::CreateVehicle(lua_State* luaVM) argStream.ReadString(strRegPlate, ""); argStream.ReadNumber(ucVariant, 255); argStream.ReadNumber(ucVariant2, 255); - argStream.ReadBool(damageable, false); if (!argStream.HasErrors()) { @@ -1552,8 +1550,7 @@ int CLuaVehicleDefs::CreateVehicle(lua_State* luaVM) { // Create the vehicle and return its handle CClientVehicle* pVehicle = CStaticFunctionDefinitions::CreateVehicle(*pResource, usModel, vecPosition, vecRotation, - strRegPlate == "" ? NULL : strRegPlate.c_str(), ucVariant, ucVariant2, - damageable); + strRegPlate == "" ? NULL : strRegPlate.c_str(), ucVariant, ucVariant2); if (pVehicle) { CElementGroup* pGroup = pResource->GetElementGroup();