From 5f8e28f58e8e558bed90d9b83163c009c86a2886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Barrios?= Date: Thu, 18 Mar 2021 00:57:48 -0300 Subject: [PATCH 1/3] Initial commit --- Client/game_sa/CDamageManagerSA.cpp | 2 +- Client/game_sa/CDamageManagerSA.h | 2 +- Client/game_sa/CVehicleSA.cpp | 16 +++++------ .../mods/deathmatch/logic/CClientVehicle.cpp | 27 ++++++++++++++++--- Client/mods/deathmatch/logic/CClientVehicle.h | 2 +- Client/mods/deathmatch/logic/CNetAPI.cpp | 2 +- .../mods/deathmatch/logic/CPacketHandler.cpp | 4 +-- .../logic/CStaticFunctionDefinitions.cpp | 12 ++++----- .../logic/CStaticFunctionDefinitions.h | 2 +- .../logic/luadefs/CLuaVehicleDefs.cpp | 4 ++- .../deathmatch/logic/rpc/CVehicleRPCs.cpp | 15 ++++++++--- Client/sdk/game/CDamageManager.h | 2 +- .../logic/CStaticFunctionDefinitions.cpp | 5 ++-- .../logic/CStaticFunctionDefinitions.h | 2 +- .../logic/luadefs/CLuaVehicleDefs.cpp | 4 ++- Shared/sdk/net/bitstream.h | 6 ++++- 16 files changed, 73 insertions(+), 34 deletions(-) diff --git a/Client/game_sa/CDamageManagerSA.cpp b/Client/game_sa/CDamageManagerSA.cpp index f50b5bfd0c1..a2beb50ec58 100644 --- a/Client/game_sa/CDamageManagerSA.cpp +++ b/Client/game_sa/CDamageManagerSA.cpp @@ -91,7 +91,7 @@ BYTE CDamageManagerSA::GetWheelStatus(eWheelPosition bWheel) return NULL; } -VOID CDamageManagerSA::SetWheelStatus(eWheelPosition bWheel, BYTE bTireStatus) +VOID CDamageManagerSA::SetWheelStatus(eWheelPosition bWheel, BYTE bTireStatus, bool spawnFlyingComponent) { DEBUG_TRACE("VOID CDamageManagerSA::SetWheelStatus ( eWheelPosition bWheel, BYTE bTireStatus )"); if (bWheel < MAX_WHEELS) diff --git a/Client/game_sa/CDamageManagerSA.h b/Client/game_sa/CDamageManagerSA.h index a54e82702e9..402eb7c0877 100644 --- a/Client/game_sa/CDamageManagerSA.h +++ b/Client/game_sa/CDamageManagerSA.h @@ -57,7 +57,7 @@ class CDamageManagerSA : public CDamageManager BYTE GetDoorStatus(eDoors bDoor); VOID SetDoorStatus(eDoors bDoor, BYTE bDoorStatus, bool spawnFlyingComponent); BYTE GetWheelStatus(eWheelPosition bWheel); - VOID SetWheelStatus(eWheelPosition bWheel, BYTE bTireStatus); + VOID SetWheelStatus(eWheelPosition bWheel, BYTE bTireStatus, bool spawnFlyingComponent); BYTE GetPanelStatus(BYTE bPanel); unsigned long GetPanelStatus(); VOID SetPanelStatus(BYTE bPanel, BYTE bPanelStatus); diff --git a/Client/game_sa/CVehicleSA.cpp b/Client/game_sa/CVehicleSA.cpp index 1c27d0fcfb9..e0050aa4e8c 100644 --- a/Client/game_sa/CVehicleSA.cpp +++ b/Client/game_sa/CVehicleSA.cpp @@ -2642,10 +2642,10 @@ void CVehicleSA::UpdateLandingGearPosition() fGearPosition = 0.0f; // Remove Wheels - m_pDamageManager->SetWheelStatus(FRONT_LEFT_WHEEL, 0); - m_pDamageManager->SetWheelStatus(FRONT_RIGHT_WHEEL, 0); - m_pDamageManager->SetWheelStatus(REAR_LEFT_WHEEL, 0); - m_pDamageManager->SetWheelStatus(REAR_RIGHT_WHEEL, 0); + m_pDamageManager->SetWheelStatus(FRONT_LEFT_WHEEL, 0, false); + m_pDamageManager->SetWheelStatus(FRONT_RIGHT_WHEEL, 0, false); + m_pDamageManager->SetWheelStatus(REAR_LEFT_WHEEL, 0, false); + m_pDamageManager->SetWheelStatus(REAR_RIGHT_WHEEL, 0, false); // Update Air Resistance float fDragCoeff = GetHandlingData()->GetDragCoeff(); @@ -2664,10 +2664,10 @@ void CVehicleSA::UpdateLandingGearPosition() // C++ Representaion of CPlane::SetLandingGearDown (006CAC20) // Recreate Wheels - m_pDamageManager->SetWheelStatus(FRONT_LEFT_WHEEL, 2); - m_pDamageManager->SetWheelStatus(FRONT_RIGHT_WHEEL, 2); - m_pDamageManager->SetWheelStatus(REAR_LEFT_WHEEL, 2); - m_pDamageManager->SetWheelStatus(REAR_RIGHT_WHEEL, 2); + m_pDamageManager->SetWheelStatus(FRONT_LEFT_WHEEL, 2, false); + m_pDamageManager->SetWheelStatus(FRONT_RIGHT_WHEEL, 2, false); + m_pDamageManager->SetWheelStatus(REAR_LEFT_WHEEL, 2, false); + m_pDamageManager->SetWheelStatus(REAR_RIGHT_WHEEL, 2, false); // Update Air Resistance float fDragCoeff = GetHandlingData()->GetDragCoeff(); diff --git a/Client/mods/deathmatch/logic/CClientVehicle.cpp b/Client/mods/deathmatch/logic/CClientVehicle.cpp index 81cae858c2f..8e1eb691119 100644 --- a/Client/mods/deathmatch/logic/CClientVehicle.cpp +++ b/Client/mods/deathmatch/logic/CClientVehicle.cpp @@ -865,7 +865,7 @@ void CClientVehicle::Fix() for (int i = 0; i < MAX_LIGHTS; i++) SetLightStatus(i, 0); for (int i = 0; i < MAX_WHEELS; i++) - SetWheelStatus(i, 0); + SetWheelStatus(i, 0, false); // These components get a funny rotation when calling Fix() (unknown reason) struct @@ -1563,7 +1563,7 @@ void CClientVehicle::SetDoorStatus(unsigned char ucDoor, unsigned char ucStatus, } } -void CClientVehicle::SetWheelStatus(unsigned char ucWheel, unsigned char ucStatus, bool bSilent) +void CClientVehicle::SetWheelStatus(unsigned char ucWheel, unsigned char ucStatus, bool bSilent, bool spawnFlyingComponent) { if (ucWheel < MAX_WHEELS) { @@ -1581,7 +1581,28 @@ void CClientVehicle::SetWheelStatus(unsigned char ucWheel, unsigned char ucStatu // Do we have a damage model? if (HasDamageModel()) { - m_pVehicle->GetDamageManager()->SetWheelStatus((eWheelPosition)(ucWheel), ucGTAStatus); + m_pVehicle->GetDamageManager()->SetWheelStatus((eWheelPosition)(ucWheel), ucGTAStatus, spawnFlyingComponent); + + if (spawnFlyingComponent && ucStatus == DT_WHEEL_MISSING) + { + switch (ucWheel) + { + case FRONT_LEFT_WHEEL: + m_pVehicle->SpawnFlyingComponent(5, 1); + break; + case REAR_LEFT_WHEEL: + m_pVehicle->SpawnFlyingComponent(7, 1); + break; + case FRONT_RIGHT_WHEEL: + m_pVehicle->SpawnFlyingComponent(2, 1); + break; + case REAR_RIGHT_WHEEL: + m_pVehicle->SpawnFlyingComponent(4, 1); + break; + default: + break; + } + } // Update the wheel's visibility m_pVehicle->SetWheelVisibility((eWheelPosition)ucWheel, (ucStatus != DT_WHEEL_MISSING)); diff --git a/Client/mods/deathmatch/logic/CClientVehicle.h b/Client/mods/deathmatch/logic/CClientVehicle.h index 47f41afa46d..4499287ba4c 100644 --- a/Client/mods/deathmatch/logic/CClientVehicle.h +++ b/Client/mods/deathmatch/logic/CClientVehicle.h @@ -266,7 +266,7 @@ class CClientVehicle : public CClientStreamElement bool AreLightsOn(); void SetDoorStatus(unsigned char ucDoor, unsigned char ucStatus, bool spawnFlyingComponent); - void SetWheelStatus(unsigned char ucWheel, unsigned char ucStatus, bool bSilent = true); + void SetWheelStatus(unsigned char ucWheel, unsigned char ucStatus, bool bSilent = true, bool spawnFlyingComponent = false); void SetPanelStatus(unsigned char ucPanel, unsigned char ucStatus); void SetLightStatus(unsigned char ucLight, unsigned char ucStatus); bool GetWheelMissing(unsigned char ucWheel, const SString& strWheelName = ""); diff --git a/Client/mods/deathmatch/logic/CNetAPI.cpp b/Client/mods/deathmatch/logic/CNetAPI.cpp index 0c12414b1c3..ed0254e63f0 100644 --- a/Client/mods/deathmatch/logic/CNetAPI.cpp +++ b/Client/mods/deathmatch/logic/CNetAPI.cpp @@ -2218,7 +2218,7 @@ void CNetAPI::ReadVehiclePartsState(CClientVehicle* pVehicle, NetBitStreamInterf if (damage.data.bSyncWheels) for (unsigned int i = 0; i < MAX_WHEELS; ++i) - pVehicle->SetWheelStatus(i, damage.data.wheels.data.ucStates[i]); + pVehicle->SetWheelStatus(i, damage.data.wheels.data.ucStates[i], false); if (damage.data.bSyncPanels) for (unsigned int i = 0; i < MAX_PANELS; ++i) diff --git a/Client/mods/deathmatch/logic/CPacketHandler.cpp b/Client/mods/deathmatch/logic/CPacketHandler.cpp index c2ed07917f7..3dafc537270 100644 --- a/Client/mods/deathmatch/logic/CPacketHandler.cpp +++ b/Client/mods/deathmatch/logic/CPacketHandler.cpp @@ -1595,7 +1595,7 @@ void CPacketHandler::Packet_VehicleDamageSync(NetBitStreamInterface& bitStream) for (unsigned int i = 0; i < MAX_WHEELS; ++i) { if (damage.data.bWheelStatesChanged[i]) - pVehicle->SetWheelStatus(i, damage.data.ucWheelStates[i]); + pVehicle->SetWheelStatus(i, damage.data.ucWheelStates[i], false); } for (unsigned int i = 0; i < MAX_PANELS; ++i) { @@ -3264,7 +3264,7 @@ void CPacketHandler::Packet_EntityAdd(NetBitStreamInterface& bitStream) for (int i = 0; i < MAX_DOORS; i++) pVehicle->SetDoorStatus(i, damage.data.ucDoorStates[i], true); for (int i = 0; i < MAX_WHEELS; i++) - pVehicle->SetWheelStatus(i, damage.data.ucWheelStates[i]); + pVehicle->SetWheelStatus(i, damage.data.ucWheelStates[i], false); for (int i = 0; i < MAX_PANELS; i++) pVehicle->SetPanelStatus(i, damage.data.ucPanelStates[i]); for (int i = 0; i < MAX_LIGHTS; i++) diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 477df829fc2..ac574fa574a 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -3042,9 +3042,9 @@ bool CStaticFunctionDefinitions::SetVehicleDoorState(CClientEntity& Entity, unsi return false; } -bool CStaticFunctionDefinitions::SetVehicleWheelStates(CClientEntity& Entity, int iFrontLeft, int iRearLeft, int iFrontRight, int iRearRight) +bool CStaticFunctionDefinitions::SetVehicleWheelStates(CClientEntity& Entity, int iFrontLeft, int iRearLeft, int iFrontRight, int iRearRight, bool spawnFlyingComponent) { - RUN_CHILDREN(SetVehicleWheelStates(**iter, iFrontLeft, iRearLeft, iFrontRight, iRearRight)) + RUN_CHILDREN(SetVehicleWheelStates(**iter, iFrontLeft, iRearLeft, iFrontRight, iRearRight, spawnFlyingComponent)) if (IS_VEHICLE(&Entity)) { @@ -3069,10 +3069,10 @@ bool CStaticFunctionDefinitions::SetVehicleWheelStates(CClientEntity& Entity, in // If atleast 1 wheel state is different if (ucNewFrontLeft != ucFrontLeft || ucNewRearLeft != ucRearLeft || ucNewFrontRight != ucFrontRight || ucNewRearRight != ucRearRight) { - Vehicle.SetWheelStatus(FRONT_LEFT_WHEEL, ucNewFrontLeft, false); - Vehicle.SetWheelStatus(REAR_LEFT_WHEEL, ucNewRearLeft, false); - Vehicle.SetWheelStatus(FRONT_RIGHT_WHEEL, ucNewFrontRight, false); - Vehicle.SetWheelStatus(REAR_RIGHT_WHEEL, ucNewRearRight, false); + Vehicle.SetWheelStatus(FRONT_LEFT_WHEEL, ucNewFrontLeft, false, spawnFlyingComponent); + Vehicle.SetWheelStatus(REAR_LEFT_WHEEL, ucNewRearLeft, false, spawnFlyingComponent); + Vehicle.SetWheelStatus(FRONT_RIGHT_WHEEL, ucNewFrontRight, false, spawnFlyingComponent); + Vehicle.SetWheelStatus(REAR_RIGHT_WHEEL, ucNewRearRight, false, spawnFlyingComponent); return true; } diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h index bc14d97bbc8..bc25fe5a1b1 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h @@ -240,7 +240,7 @@ class CStaticFunctionDefinitions static bool AddAllVehicleUpgrades(CClientEntity& Entity); static bool RemoveVehicleUpgrade(CClientEntity& Entity, unsigned short usUpgrade); static bool SetVehicleDoorState(CClientEntity& Entity, unsigned char ucDoor, unsigned char ucState, bool spawnFlyingComponent); - static bool SetVehicleWheelStates(CClientEntity& Entity, int iFrontLeft, int iRearLeft = -1, int iFrontRight = -1, int iRearRight = -1); + static bool SetVehicleWheelStates(CClientEntity& Entity, int iFrontLeft, int iRearLeft = -1, int iFrontRight = -1, int iRearRight = -1, bool spawnFlyingComponent = false); static bool SetVehicleLightState(CClientEntity& Entity, unsigned char ucLight, unsigned char ucState); static bool SetVehiclePanelState(CClientEntity& Entity, unsigned char ucPanel, unsigned char ucState); static bool SetVehicleOverrideLights(CClientEntity& Entity, unsigned char ucLights); diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp index db6113e0d47..22bb690479c 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp @@ -1894,16 +1894,18 @@ int CLuaVehicleDefs::SetVehicleWheelStates(lua_State* luaVM) CClientEntity* pEntity = NULL; int iFrontLeft = -1; int iRearLeft = -1, iFrontRight = -1, iRearRight = -1; + bool spawnFlyingComponent = false; CScriptArgReader argStream(luaVM); argStream.ReadUserData(pEntity); argStream.ReadNumber(iFrontLeft); argStream.ReadNumber(iRearLeft, -1); argStream.ReadNumber(iFrontRight, -1); argStream.ReadNumber(iRearRight, -1); + argStream.ReadBool(spawnFlyingComponent, false); if (!argStream.HasErrors()) { - if (CStaticFunctionDefinitions::SetVehicleWheelStates(*pEntity, iFrontLeft, iRearLeft, iFrontRight, iRearRight)) + if (CStaticFunctionDefinitions::SetVehicleWheelStates(*pEntity, iFrontLeft, iRearLeft, iFrontRight, iRearRight, spawnFlyingComponent)) { lua_pushboolean(luaVM, true); return 1; diff --git a/Client/mods/deathmatch/logic/rpc/CVehicleRPCs.cpp b/Client/mods/deathmatch/logic/rpc/CVehicleRPCs.cpp index 0be9bd3a9e5..0e8e536cab7 100644 --- a/Client/mods/deathmatch/logic/rpc/CVehicleRPCs.cpp +++ b/Client/mods/deathmatch/logic/rpc/CVehicleRPCs.cpp @@ -324,7 +324,15 @@ void CVehicleRPCs::SetVehicleDamageState(CClientEntity* pSource, NetBitStreamInt unsigned char ucWheel, ucState; if (bitStream.Read(ucWheel) && bitStream.Read(ucState)) { - pVehicle->SetWheelStatus(ucWheel, ucState, false); + bool spawnFlyingComponent = false; + + if (bitStream.Can(eBitStreamVersion::setVehicleWheelStates_SpawnFlyingComponent)) + { + if (!bitStream.ReadBit(spawnFlyingComponent)) + break; + } + + pVehicle->SetWheelStatus(ucWheel, ucState, false, spawnFlyingComponent); } break; } @@ -433,13 +441,14 @@ void CVehicleRPCs::SetVehicleFuelTankExplodable(CClientEntity* pSource, NetBitSt void CVehicleRPCs::SetVehicleWheelStates(CClientEntity* pSource, NetBitStreamInterface& bitStream) { unsigned char ucWheelStates[MAX_WHEELS]; - if (bitStream.Read((char*)ucWheelStates, MAX_WHEELS)) + bool spawnFlyingComponent = false; + if (bitStream.Read((char*)ucWheelStates, MAX_WHEELS) && (!bitStream.Can(eBitStreamVersion::setVehicleWheelStates_SpawnFlyingComponent) || bitStream.ReadBit(spawnFlyingComponent))) { CClientVehicle* pVehicle = m_pVehicleManager->Get(pSource->GetID()); if (pVehicle) { for (int i = 0; i < MAX_WHEELS; i++) - pVehicle->SetWheelStatus(i, ucWheelStates[i], false); + pVehicle->SetWheelStatus(i, ucWheelStates[i], false, spawnFlyingComponent); } } } diff --git a/Client/sdk/game/CDamageManager.h b/Client/sdk/game/CDamageManager.h index d1705dacfea..62fb2c9d64a 100644 --- a/Client/sdk/game/CDamageManager.h +++ b/Client/sdk/game/CDamageManager.h @@ -132,7 +132,7 @@ class CDamageManager virtual BYTE GetDoorStatus(eDoors bDoor) = 0; virtual VOID SetDoorStatus(eDoors bDoor, BYTE bDoorStatus, bool spawnFlyingComponent) = 0; virtual BYTE GetWheelStatus(eWheelPosition bTire) = 0; - virtual VOID SetWheelStatus(eWheelPosition bTire, BYTE bTireStatus) = 0; + virtual VOID SetWheelStatus(eWheelPosition bTire, BYTE bTireStatus, bool spawnFlyingComponent) = 0; virtual BYTE GetPanelStatus(BYTE bPanel) = 0; virtual unsigned long GetPanelStatus() = 0; virtual VOID SetPanelStatus(BYTE bPanel, BYTE bPanelStatus) = 0; diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index fe6ed2a7b9f..658ffaf27b6 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -6545,10 +6545,10 @@ bool CStaticFunctionDefinitions::SetVehicleDoorState(CElement* pElement, unsigne return false; } -bool CStaticFunctionDefinitions::SetVehicleWheelStates(CElement* pElement, int iFrontLeft, int iRearLeft, int iFrontRight, int iRearRight) +bool CStaticFunctionDefinitions::SetVehicleWheelStates(CElement* pElement, int iFrontLeft, int iRearLeft, int iFrontRight, int iRearRight, bool spawnFlyingComponent) { assert(pElement); - RUN_CHILDREN(SetVehicleWheelStates(*iter, iFrontLeft, iRearLeft, iFrontRight, iRearRight)) + RUN_CHILDREN(SetVehicleWheelStates(*iter, iFrontLeft, iRearLeft, iFrontRight, iRearRight, spawnFlyingComponent)) unsigned char a = -1; if (a == (unsigned char)-1) @@ -6577,6 +6577,7 @@ bool CStaticFunctionDefinitions::SetVehicleWheelStates(CElement* pElement, int i CBitStream BitStream; BitStream.pBitStream->Write((const char*)&pVehicle->m_ucWheelStates[0], MAX_WHEELS); + BitStream.pBitStream->WriteBit(spawnFlyingComponent); m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(pVehicle, SET_VEHICLE_WHEEL_STATES, *BitStream.pBitStream)); return true; diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h index 18428ffda04..574b0a1c9a6 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h @@ -302,7 +302,7 @@ class CStaticFunctionDefinitions static bool AddAllVehicleUpgrades(CElement* pElement); static bool RemoveVehicleUpgrade(CElement* pElement, unsigned short usUpgrade); static bool SetVehicleDoorState(CElement* pElement, unsigned char ucDoor, unsigned char ucState, bool spawnFlyingComponent); - static bool SetVehicleWheelStates(CElement* pElement, int iFrontLeft, int iRearLeft = -1, int iFrontRight = -1, int iRearRight = -1); + static bool SetVehicleWheelStates(CElement* pElement, int iFrontLeft, int iRearLeft = -1, int iFrontRight = -1, int iRearRight = -1, bool spawnFlyingComponent = false); static bool SetVehicleLightState(CElement* pElement, unsigned char ucLight, unsigned char ucState); static bool SetVehiclePanelState(CElement* pElement, unsigned char ucPanel, unsigned char ucState); static bool SetVehicleIdleRespawnDelay(CElement* pElement, unsigned long ulTime); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp index b4f7b23efb5..f05610e5747 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp @@ -2051,6 +2051,7 @@ int CLuaVehicleDefs::SetVehicleWheelStates(lua_State* luaVM) int iRearLeft; int iFrontRight; int iRearRight; + bool spawnFlyingComponent; CScriptArgReader argStream(luaVM); argStream.ReadUserData(pElement); @@ -2061,7 +2062,7 @@ int CLuaVehicleDefs::SetVehicleWheelStates(lua_State* luaVM) if (!argStream.HasErrors()) { - if (CStaticFunctionDefinitions::SetVehicleWheelStates(pElement, iFrontLeft, iRearLeft, iFrontRight, iRearRight)) + if (CStaticFunctionDefinitions::SetVehicleWheelStates(pElement, iFrontLeft, iRearLeft, iFrontRight, iRearRight, spawnFlyingComponent)) { lua_pushboolean(luaVM, true); return 1; @@ -2105,6 +2106,7 @@ int CLuaVehicleDefs::SetVehiclePanelState(lua_State* luaVM) CElement* pElement; unsigned char ucPanel; unsigned char ucState; + bool spawnFlyingComponent; CScriptArgReader argStream(luaVM); argStream.ReadUserData(pElement); diff --git a/Shared/sdk/net/bitstream.h b/Shared/sdk/net/bitstream.h index fd12475ad91..d87004fe7ff 100644 --- a/Shared/sdk/net/bitstream.h +++ b/Shared/sdk/net/bitstream.h @@ -456,10 +456,14 @@ enum class eBitStreamVersion : unsigned short // Implement entering/exiting/jacking for peds #1748 // 2020-11-10 0x71 PedEnterExit, - + // Add height for colpolygon (#1908) // 2021-01-16 0x72 SetColPolygonHeight, + + // Add argument to enable the spawn of a flying component when damaging a wheel + // 2021-03-17 0x73 + setVehicleWheelStates_SpawnFlyingComponent, // This allows us to automatically increment the BitStreamVersion when things are added to this enum. // Make sure you only add things above this comment. From 3f55ec40048404823365f4aa44137a3cd79255f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Barrios?= Date: Fri, 19 Mar 2021 19:41:49 -0300 Subject: [PATCH 2/3] Update CVehicleRPCs.cpp Reformated the if statment so it looks cleaner --- .../deathmatch/logic/rpc/CVehicleRPCs.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Client/mods/deathmatch/logic/rpc/CVehicleRPCs.cpp b/Client/mods/deathmatch/logic/rpc/CVehicleRPCs.cpp index 0e8e536cab7..a33f0c91a0f 100644 --- a/Client/mods/deathmatch/logic/rpc/CVehicleRPCs.cpp +++ b/Client/mods/deathmatch/logic/rpc/CVehicleRPCs.cpp @@ -442,14 +442,19 @@ void CVehicleRPCs::SetVehicleWheelStates(CClientEntity* pSource, NetBitStreamInt { unsigned char ucWheelStates[MAX_WHEELS]; bool spawnFlyingComponent = false; - if (bitStream.Read((char*)ucWheelStates, MAX_WHEELS) && (!bitStream.Can(eBitStreamVersion::setVehicleWheelStates_SpawnFlyingComponent) || bitStream.ReadBit(spawnFlyingComponent))) + + if (!bitStream.Read((char*)ucWheelStates, MAX_WHEELS)) + return; + + if (bitStream.Can(eBitStreamVersion::setVehicleWheelStates_SpawnFlyingComponent)) + if (!bitStream.ReadBit(spawnFlyingComponent)) + return; + + CClientVehicle* pVehicle = m_pVehicleManager->Get(pSource->GetID()); + if (pVehicle) { - CClientVehicle* pVehicle = m_pVehicleManager->Get(pSource->GetID()); - if (pVehicle) - { - for (int i = 0; i < MAX_WHEELS; i++) - pVehicle->SetWheelStatus(i, ucWheelStates[i], false, spawnFlyingComponent); - } + for (int i = 0; i < MAX_WHEELS; i++) + pVehicle->SetWheelStatus(i, ucWheelStates[i], false, spawnFlyingComponent); } } From 6323f628ad74eeb61f83ae5dbd98ae04b1f8beff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Barrios?= Date: Mon, 10 Apr 2023 03:58:38 -0300 Subject: [PATCH 3/3] Update bitstream.h Pushed to last, didn't test, for some reason custom builds crash on my PC now --- Shared/sdk/net/bitstream.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Shared/sdk/net/bitstream.h b/Shared/sdk/net/bitstream.h index 29174520641..26d1cedbaa1 100644 --- a/Shared/sdk/net/bitstream.h +++ b/Shared/sdk/net/bitstream.h @@ -460,10 +460,6 @@ enum class eBitStreamVersion : unsigned short // Add height for colpolygon (#1908) // 2021-01-16 0x72 SetColPolygonHeight, - - // Add argument to enable the spawn of a flying component when damaging a wheel - // 2021-03-17 0x73 - setVehicleWheelStates_SpawnFlyingComponent, // Support for vehicle blow without explosion and blow state synchronisation // 2021-02-26 0x73 @@ -488,7 +484,11 @@ enum class eBitStreamVersion : unsigned short // // 1.6.0 RELEASED - 2023-04-07 // - + + // Add argument to enable the spawn of a flying component when damaging a wheel (#2128) + // 2023-04-10 0x77 + setVehicleWheelStates_SpawnFlyingComponent, + // This allows us to automatically increment the BitStreamVersion when things are added to this enum. // Make sure you only add things above this comment. Next,