From 08cb5a39def5b04fa31ed866753623bdcba30c27 Mon Sep 17 00:00:00 2001 From: Xenius97 Date: Wed, 12 Nov 2025 22:32:16 +0100 Subject: [PATCH 1/5] Support getVehicleWheelFrictionState for bikes & monster truck & quadbike --- Client/game_sa/CVehicleSA.cpp | 22 ++++++++++++++-- .../logic/luadefs/CLuaVehicleDefs.cpp | 26 ++++++++++++++----- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/Client/game_sa/CVehicleSA.cpp b/Client/game_sa/CVehicleSA.cpp index e5620f01439..b0108b13b6f 100644 --- a/Client/game_sa/CVehicleSA.cpp +++ b/Client/game_sa/CVehicleSA.cpp @@ -1470,8 +1470,26 @@ bool CVehicleSA::IsWheelCollided(BYTE eWheelPosition) int CVehicleSA::GetWheelFrictionState(BYTE eWheelPosition) { - auto vehicle = static_cast(GetInterface()); - return vehicle->m_wheelFrictionState[eWheelPosition]; + switch (static_cast(GetVehicleInterface()->m_vehicleClass)) + { + case VehicleClass::BIKE: + { + auto* bikeInterface = static_cast(GetVehicleInterface()); + if (!bikeInterface) + return false; + + return bikeInterface->m_aiWheelState[eWheelPosition]; + } + default: + { + auto* vehicleInterface = static_cast(GetVehicleInterface()); + if (!vehicleInterface) + return false; + + return vehicleInterface->m_wheelFrictionState[eWheelPosition]; + } + } + return false; } void CVehicleSA::SetTaxiLightOn(bool bLightOn) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp index 94945f0fbc5..f8813980377 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp @@ -4205,13 +4205,27 @@ bool CLuaVehicleDefs::SetVehicleModelWheelSize(const unsigned short usModel, con int CLuaVehicleDefs::GetVehicleWheelFrictionState(CClientVehicle* pVehicle, unsigned char wheel) { - if (wheel < 0 || wheel > 3) - throw std::invalid_argument("Invalid wheel number"); + eClientVehicleType vehicleType = pVehicle->GetVehicleType(); - if (CClientVehicleManager::GetVehicleType(pVehicle->GetModel()) != CLIENTVEHICLE_CAR) - throw std::invalid_argument("Invalid vehicle type"); - - return pVehicle->GetWheelFrictionState(wheel); + switch (vehicleType) + { + case CLIENTVEHICLE_CAR: + case CLIENTVEHICLE_MONSTERTRUCK: + case CLIENTVEHICLE_QUADBIKE: + { + if (wheel < 0 || wheel > 3) + throw std::invalid_argument("Invalid wheel number"); + return pVehicle->GetWheelFrictionState(wheel); + } + case CLIENTVEHICLE_BIKE: + { + if (wheel < 0 || wheel > 1) + throw std::invalid_argument("Invalid wheel number"); + return pVehicle->GetWheelFrictionState(wheel); + } + default: + throw std::invalid_argument("Invalid vehicle type"); + } } std::variant> CLuaVehicleDefs::GetVehicleModelDummyDefaultPosition(unsigned short vehicleModel, From ca55da27d7baba2205734d18c447a5ab941c078d Mon Sep 17 00:00:00 2001 From: Xenius97 Date: Wed, 12 Nov 2025 22:43:10 +0100 Subject: [PATCH 2/5] Add support for bicycles --- Client/game_sa/CVehicleSA.cpp | 1 + Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/Client/game_sa/CVehicleSA.cpp b/Client/game_sa/CVehicleSA.cpp index b0108b13b6f..63ee0580b13 100644 --- a/Client/game_sa/CVehicleSA.cpp +++ b/Client/game_sa/CVehicleSA.cpp @@ -1473,6 +1473,7 @@ int CVehicleSA::GetWheelFrictionState(BYTE eWheelPosition) switch (static_cast(GetVehicleInterface()->m_vehicleClass)) { case VehicleClass::BIKE: + case VehicleClass::BMX: { auto* bikeInterface = static_cast(GetVehicleInterface()); if (!bikeInterface) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp index f8813980377..d3d8d3305c5 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp @@ -4218,6 +4218,7 @@ int CLuaVehicleDefs::GetVehicleWheelFrictionState(CClientVehicle* pVehicle, unsi return pVehicle->GetWheelFrictionState(wheel); } case CLIENTVEHICLE_BIKE: + case CLIENTVEHICLE_BMX: { if (wheel < 0 || wheel > 1) throw std::invalid_argument("Invalid wheel number"); From ff10df1fa774181ceaa677838132e45ada6de049 Mon Sep 17 00:00:00 2001 From: Xenius97 Date: Thu, 13 Nov 2025 12:15:36 +0100 Subject: [PATCH 3/5] Refactor vehicle wheel friction state retrieval for improved validation --- Client/game_sa/CVehicleSA.cpp | 7 ------- Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp | 9 +++------ 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/Client/game_sa/CVehicleSA.cpp b/Client/game_sa/CVehicleSA.cpp index 63ee0580b13..0f44673f50c 100644 --- a/Client/game_sa/CVehicleSA.cpp +++ b/Client/game_sa/CVehicleSA.cpp @@ -1476,21 +1476,14 @@ int CVehicleSA::GetWheelFrictionState(BYTE eWheelPosition) case VehicleClass::BMX: { auto* bikeInterface = static_cast(GetVehicleInterface()); - if (!bikeInterface) - return false; - return bikeInterface->m_aiWheelState[eWheelPosition]; } default: { auto* vehicleInterface = static_cast(GetVehicleInterface()); - if (!vehicleInterface) - return false; - return vehicleInterface->m_wheelFrictionState[eWheelPosition]; } } - return false; } void CVehicleSA::SetTaxiLightOn(bool bLightOn) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp index d3d8d3305c5..28c8bf93ad6 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp @@ -4205,23 +4205,20 @@ bool CLuaVehicleDefs::SetVehicleModelWheelSize(const unsigned short usModel, con int CLuaVehicleDefs::GetVehicleWheelFrictionState(CClientVehicle* pVehicle, unsigned char wheel) { - eClientVehicleType vehicleType = pVehicle->GetVehicleType(); + if (wheel >= MAX_WHEELS) + throw std::invalid_argument("Invalid wheel number"); - switch (vehicleType) + switch (pVehicle->GetVehicleType()) { case CLIENTVEHICLE_CAR: case CLIENTVEHICLE_MONSTERTRUCK: case CLIENTVEHICLE_QUADBIKE: { - if (wheel < 0 || wheel > 3) - throw std::invalid_argument("Invalid wheel number"); return pVehicle->GetWheelFrictionState(wheel); } case CLIENTVEHICLE_BIKE: case CLIENTVEHICLE_BMX: { - if (wheel < 0 || wheel > 1) - throw std::invalid_argument("Invalid wheel number"); return pVehicle->GetWheelFrictionState(wheel); } default: From bd7691a3614de6025857569db0093b806bf1c933 Mon Sep 17 00:00:00 2001 From: Xenius97 Date: Thu, 13 Nov 2025 12:17:59 +0100 Subject: [PATCH 4/5] Refactor GetVehicleWheelFrictionState to simplify vehicle type checks --- .../logic/luadefs/CLuaVehicleDefs.cpp | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp index 28c8bf93ad6..bc935791d06 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp @@ -4208,22 +4208,15 @@ int CLuaVehicleDefs::GetVehicleWheelFrictionState(CClientVehicle* pVehicle, unsi if (wheel >= MAX_WHEELS) throw std::invalid_argument("Invalid wheel number"); - switch (pVehicle->GetVehicleType()) + auto vehicleType = pVehicle->GetVehicleType(); + + if (vehicleType == CLIENTVEHICLE_CAR || vehicleType == CLIENTVEHICLE_MONSTERTRUCK || vehicleType == CLIENTVEHICLE_QUADBIKE || + vehicleType == CLIENTVEHICLE_BIKE || vehicleType == CLIENTVEHICLE_BMX) { - case CLIENTVEHICLE_CAR: - case CLIENTVEHICLE_MONSTERTRUCK: - case CLIENTVEHICLE_QUADBIKE: - { - return pVehicle->GetWheelFrictionState(wheel); - } - case CLIENTVEHICLE_BIKE: - case CLIENTVEHICLE_BMX: - { - return pVehicle->GetWheelFrictionState(wheel); - } - default: - throw std::invalid_argument("Invalid vehicle type"); + return pVehicle->GetWheelFrictionState(wheel); } + + throw std::invalid_argument("Invalid vehicle type"); } std::variant> CLuaVehicleDefs::GetVehicleModelDummyDefaultPosition(unsigned short vehicleModel, From c18d9f164c3b550548bb6b7af15da45712b66c0f Mon Sep 17 00:00:00 2001 From: Xenius97 Date: Thu, 13 Nov 2025 16:06:20 +0100 Subject: [PATCH 5/5] Allow trailers too --- Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp index bc935791d06..29dcc222f9c 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp @@ -4211,7 +4211,7 @@ int CLuaVehicleDefs::GetVehicleWheelFrictionState(CClientVehicle* pVehicle, unsi auto vehicleType = pVehicle->GetVehicleType(); if (vehicleType == CLIENTVEHICLE_CAR || vehicleType == CLIENTVEHICLE_MONSTERTRUCK || vehicleType == CLIENTVEHICLE_QUADBIKE || - vehicleType == CLIENTVEHICLE_BIKE || vehicleType == CLIENTVEHICLE_BMX) + vehicleType == CLIENTVEHICLE_BIKE || vehicleType == CLIENTVEHICLE_BMX || vehicleType == CLIENTVEHICLE_TRAILER) { return pVehicle->GetWheelFrictionState(wheel); }