From 08fc24add5d11bcc5cc75f872e55410e55e14e18 Mon Sep 17 00:00:00 2001 From: FileEX Date: Thu, 21 Aug 2025 00:00:09 +0200 Subject: [PATCH 1/7] The end of synchronization for blowVehicle and a few other functions --- .../logic/CStaticFunctionDefinitions.cpp | 44 +++++-------------- .../logic/luadefs/CLuaVehicleDefs.cpp | 6 +++ 2 files changed, 17 insertions(+), 33 deletions(-) diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 544d0ad26aa..9796bbf21ab 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -1076,6 +1076,9 @@ bool CStaticFunctionDefinitions::SetElementPosition(CClientEntity& Entity, const { RUN_CHILDREN(SetElementPosition(**iter, vecPosition)) + if (!Entity.IsLocalEntity()) + return false; + if (bWarp) Entity.Teleport(vecPosition); else @@ -1491,6 +1494,9 @@ bool CStaticFunctionDefinitions::SetElementHealth(CClientEntity& Entity, float f { RUN_CHILDREN(SetElementHealth(**iter, fHealth)) + if (!Entity.IsLocalEntity()) + return false; + switch (Entity.GetType()) { case CCLIENTPED: @@ -2907,41 +2913,13 @@ bool CStaticFunctionDefinitions::BlowVehicle(CClientEntity& Entity, std::optiona return false; CClientVehicle& vehicle = static_cast(Entity); - VehicleBlowFlags blow; + if (!vehicle.IsLocalEntity()) + return false; + VehicleBlowFlags blow; + blow.withExplosion = withExplosion.value_or(true); - - if (vehicle.IsLocalEntity()) - { - vehicle.Blow(blow); - } - else - { - CVector position; - vehicle.GetPosition(position); - - const auto type = vehicle.GetType(); - const auto state = (blow.withExplosion ? VehicleBlowState::AWAITING_EXPLOSION_SYNC : VehicleBlowState::BLOWN); - eExplosionType explosion; - - switch (type) - { - case CLIENTVEHICLE_CAR: - explosion = EXP_TYPE_CAR; - break; - case CLIENTVEHICLE_HELI: - explosion = EXP_TYPE_HELI; - break; - case CLIENTVEHICLE_BOAT: - explosion = EXP_TYPE_BOAT; - break; - default: - explosion = EXP_TYPE_CAR; - } - - g_pClientGame->SendExplosionSync(position, explosion, &Entity, state); - } - + vehicle.Blow(blow); return true; } diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp index 219c8cb6a46..0cdd608a4b5 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp @@ -2518,6 +2518,12 @@ int CLuaVehicleDefs::SetVehicleHandling(lua_State* luaVM) if (!argStream.HasErrors()) { + if (!pVehicle->IsLocalEntity()) + { + lua_pushboolean(luaVM, false); + return 1; + } + if (argStream.NextIsString()) { SString strProperty; From f4cdc453d0137d3c9baf6acdad5ce77678854a04 Mon Sep 17 00:00:00 2001 From: FileEX Date: Thu, 21 Aug 2025 11:20:14 +0200 Subject: [PATCH 2/7] Changes --- .../mods/deathmatch/logic/CStaticFunctionDefinitions.cpp | 7 +++++-- Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp | 6 ------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 9796bbf21ab..47678f272d1 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -1076,8 +1076,11 @@ bool CStaticFunctionDefinitions::SetElementPosition(CClientEntity& Entity, const { RUN_CHILDREN(SetElementPosition(**iter, vecPosition)) - if (!Entity.IsLocalEntity()) - return false; + if (Entity.GetType() == CCLIENTVEHICLE) + { + if (!Entity.IsLocalEntity() && !static_cast(Entity).IsSyncing()) + return false; + } if (bWarp) Entity.Teleport(vecPosition); diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp index 0cdd608a4b5..219c8cb6a46 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp @@ -2518,12 +2518,6 @@ int CLuaVehicleDefs::SetVehicleHandling(lua_State* luaVM) if (!argStream.HasErrors()) { - if (!pVehicle->IsLocalEntity()) - { - lua_pushboolean(luaVM, false); - return 1; - } - if (argStream.NextIsString()) { SString strProperty; From 3a75606eaaf86ae3698e64062a6c648ac45fcf19 Mon Sep 17 00:00:00 2001 From: FileEX Date: Thu, 21 Aug 2025 11:33:59 +0200 Subject: [PATCH 3/7] Update CStaticFunctionDefinitions.cpp --- Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 47678f272d1..dd2a10047f7 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -1078,7 +1078,8 @@ bool CStaticFunctionDefinitions::SetElementPosition(CClientEntity& Entity, const if (Entity.GetType() == CCLIENTVEHICLE) { - if (!Entity.IsLocalEntity() && !static_cast(Entity).IsSyncing()) + CClientPed* driver = static_cast(Entity).GetOccupant(0); + if (!Entity.IsLocalEntity() && !static_cast(Entity).IsSyncing() && (driver && !driver->IsLocalPlayer())) return false; } From 443d745e1018aab1f84f6cee4380caf8dd1b5175 Mon Sep 17 00:00:00 2001 From: FileEX Date: Thu, 21 Aug 2025 11:50:30 +0200 Subject: [PATCH 4/7] Review --- Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index dd2a10047f7..821594a28ea 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -1079,7 +1079,7 @@ bool CStaticFunctionDefinitions::SetElementPosition(CClientEntity& Entity, const if (Entity.GetType() == CCLIENTVEHICLE) { CClientPed* driver = static_cast(Entity).GetOccupant(0); - if (!Entity.IsLocalEntity() && !static_cast(Entity).IsSyncing() && (driver && !driver->IsLocalPlayer())) + if (!Entity.IsLocalEntity() && !static_cast(Entity).IsSyncing() && (!driver || !driver->IsLocalPlayer())) return false; } From 9f29b2a5e8b921efc91e4d01b114764bc12f12d6 Mon Sep 17 00:00:00 2001 From: FileEX Date: Thu, 21 Aug 2025 23:11:44 +0200 Subject: [PATCH 5/7] Update CStaticFunctionDefinitions.cpp --- Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 821594a28ea..a06ca37b24e 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -1498,9 +1498,6 @@ bool CStaticFunctionDefinitions::SetElementHealth(CClientEntity& Entity, float f { RUN_CHILDREN(SetElementHealth(**iter, fHealth)) - if (!Entity.IsLocalEntity()) - return false; - switch (Entity.GetType()) { case CCLIENTPED: @@ -1508,6 +1505,8 @@ bool CStaticFunctionDefinitions::SetElementHealth(CClientEntity& Entity, float f { // Grab the model CClientPed& Ped = static_cast(Entity); + if (Ped.IsLocalPlayer()) + return false; // Set the new health Ped.SetHealth(Clamp(0.0f, fHealth, Ped.GetMaxHealth())); From 58484bed3ec56b7edc71e51f312b4faea30ce360 Mon Sep 17 00:00:00 2001 From: FileEX Date: Sun, 24 Aug 2025 12:47:26 +0200 Subject: [PATCH 6/7] Changes --- .../logic/CStaticFunctionDefinitions.cpp | 41 ++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index a06ca37b24e..c7525036280 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -2916,13 +2916,44 @@ bool CStaticFunctionDefinitions::BlowVehicle(CClientEntity& Entity, std::optiona return false; CClientVehicle& vehicle = static_cast(Entity); - if (!vehicle.IsLocalEntity()) - return false; - VehicleBlowFlags blow; - blow.withExplosion = withExplosion.value_or(true); - vehicle.Blow(blow); + + if (vehicle.IsLocalEntity()) + { + vehicle.Blow(blow); + } + else + { + CClientPed* driver = vehicle.GetOccupant(0); + if (!static_cast(vehicle).IsSyncing() && (!driver || !driver->IsLocalPlayer())) + return false; + + CVector position; + vehicle.GetPosition(position); + + const auto type = vehicle.GetType(); + const auto state = (blow.withExplosion ? VehicleBlowState::AWAITING_EXPLOSION_SYNC : VehicleBlowState::BLOWN); + eExplosionType explosion; + + switch (type) + { + case CLIENTVEHICLE_CAR: + explosion = EXP_TYPE_CAR; + break; + case CLIENTVEHICLE_HELI: + explosion = EXP_TYPE_HELI; + break; + case CLIENTVEHICLE_BOAT: + explosion = EXP_TYPE_BOAT; + break; + default: + explosion = EXP_TYPE_CAR; + } + + g_pClientGame->SendExplosionSync(position, explosion, &Entity, state); + } + return true; } From 83635b8666f8f85b832b301b435c5e8cf7253517 Mon Sep 17 00:00:00 2001 From: FileEX Date: Thu, 9 Oct 2025 16:28:14 +0200 Subject: [PATCH 7/7] setPedArmor & warnings --- .../mods/deathmatch/logic/CStaticFunctionDefinitions.cpp | 7 +++++-- Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h | 2 +- Client/mods/deathmatch/logic/luadefs/CLuaElementDefs.cpp | 2 +- Client/mods/deathmatch/logic/luadefs/CLuaPedDefs.cpp | 3 +++ 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index ba021cbdc2c..f387de9451a 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -1486,9 +1486,9 @@ bool CStaticFunctionDefinitions::SetElementAlpha(CClientEntity& Entity, unsigned return true; } -bool CStaticFunctionDefinitions::SetElementHealth(CClientEntity& Entity, float fHealth) +bool CStaticFunctionDefinitions::SetElementHealth(lua_State* luaState, CClientEntity& Entity, float fHealth) { - RUN_CHILDREN(SetElementHealth(**iter, fHealth)) + RUN_CHILDREN(SetElementHealth(luaState, **iter, fHealth)) switch (Entity.GetType()) { @@ -1498,7 +1498,10 @@ bool CStaticFunctionDefinitions::SetElementHealth(CClientEntity& Entity, float f // Grab the model CClientPed& Ped = static_cast(Entity); if (Ped.IsLocalPlayer()) + { + g_pClientGame->GetScriptDebugging()->LogWarning(luaState, "The client-side setElementHealth function for localPlayer is deprecated. Use the corresponding server-side function instead"); return false; + } // If setting health to 0 for local player, clear stale damage data // and set proper scripted death parameters for DoWastedCheck diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h index e1f05f1d108..5ef3845cb39 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h @@ -99,7 +99,7 @@ class CStaticFunctionDefinitions static bool DetachElements(CClientEntity& Entity, CClientEntity* pAttachedToEntity = NULL); static bool SetElementAttachedOffsets(CClientEntity& Entity, CVector& vecPosition, CVector& vecRotation); static bool SetElementAlpha(CClientEntity& Entity, unsigned char ucAlpha); - static bool SetElementHealth(CClientEntity& Entity, float fHealth); + static bool SetElementHealth(lua_State* luaState, CClientEntity& Entity, float fHealth); static bool SetElementModel(CClientEntity& Entity, unsigned short usModel); static bool SetElementCollisionsEnabled(CClientEntity& Entity, bool bEnabled); static bool SetElementCollidableWith(CClientEntity& Entity, CClientEntity& ThisEntity, bool bCanCollide); diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaElementDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaElementDefs.cpp index c763e1d3f4a..cb0f12ce3fa 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaElementDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaElementDefs.cpp @@ -2401,7 +2401,7 @@ int CLuaElementDefs::SetElementHealth(lua_State* luaVM) // Verify the arguments if (!argStream.HasErrors()) { - if (CStaticFunctionDefinitions::SetElementHealth(*pEntity, fHealth)) + if (CStaticFunctionDefinitions::SetElementHealth(luaVM, *pEntity, fHealth)) { lua_pushboolean(luaVM, true); return 1; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaPedDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaPedDefs.cpp index 68b707d14b3..16d96118d00 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaPedDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaPedDefs.cpp @@ -2433,6 +2433,9 @@ bool CLuaPedDefs::SetPedArmor(CClientPed* const ped, const float armor) if (armor > 100.0f) throw std::invalid_argument("Armor must be less than or equal to 100"); + if (ped->IsLocalPlayer()) + throw LuaFunctionError("The client-side setPedArmor function for localPlayer is deprecated. Use the corresponding server-side function instead", true); + ped->SetArmor(armor); return true; }