diff --git a/Client/mods/deathmatch/logic/CNetAPI.cpp b/Client/mods/deathmatch/logic/CNetAPI.cpp index 42e30f25c64..049b9e89089 100644 --- a/Client/mods/deathmatch/logic/CNetAPI.cpp +++ b/Client/mods/deathmatch/logic/CNetAPI.cpp @@ -1777,6 +1777,9 @@ void CNetAPI::WriteVehiclePuresync(CClientPed* pPlayerModel, CClientVehicle* pVe // Write the sent position to the interpolator AddInterpolation(vecPosition); + + if (BitStream.Can(eBitStreamVersion::IsVehicleNitroActivated_Serverside)) + BitStream.Write(pVehicle->GetNitroLevel()); } bool CNetAPI::ReadSmallKeysync(CControllerState& ControllerState, NetBitStreamInterface& BitStream) diff --git a/Server/mods/deathmatch/logic/CVehicle.cpp b/Server/mods/deathmatch/logic/CVehicle.cpp index 23c388b0208..f30742b5ec2 100644 --- a/Server/mods/deathmatch/logic/CVehicle.cpp +++ b/Server/mods/deathmatch/logic/CVehicle.cpp @@ -1013,3 +1013,16 @@ void CVehicle::SetRespawnEnabled(bool bEnabled) m_bRespawnEnabled = bEnabled; } } + +bool CVehicle::IsNitroInstalled() const noexcept +{ + return this->m_pUpgrades->GetSlotState(8) != 0; +} + +bool CVehicle::IsNitroActivated() const noexcept +{ + if (!IsNitroInstalled()) + return false; + + return m_nitroLevel < 0; +} diff --git a/Server/mods/deathmatch/logic/CVehicle.h b/Server/mods/deathmatch/logic/CVehicle.h index 01aa83d3b48..2e11b8b2b4c 100644 --- a/Server/mods/deathmatch/logic/CVehicle.h +++ b/Server/mods/deathmatch/logic/CVehicle.h @@ -400,6 +400,11 @@ class CVehicle final : public CElement bool IsOnFire() const noexcept override { return m_onFire; } void SetOnFire(bool onFire) noexcept override { m_onFire = onFire; } + void SetNitroLevel(float level) noexcept { m_nitroLevel = level; } + float GetNitroLevel() const noexcept { return m_nitroLevel; } + bool IsNitroActivated() const noexcept; + bool IsNitroInstalled() const noexcept; + void StopIdleTimer(); void RestartIdleTimer(); bool IsIdleTimerRunning(); @@ -495,6 +500,7 @@ class CVehicle final : public CElement unsigned char m_ucVariant2; bool m_onFire; + float m_nitroLevel {0.0f}; CTickCount m_LastPushedTime; CVector m_vecStationaryCheckPosition; diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp index b1352f2e9eb..f21dd919ca3 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp @@ -128,6 +128,8 @@ void CLuaVehicleDefs::LoadFunctions() {"getVehicleSirenParams", GetVehicleSirenParams}, {"setVehiclePlateText", SetVehiclePlateText}, {"setVehicleNitroActivated", ArgumentParser}, + {"isVehicleNitroActivated", ArgumentParser}, + {"getVehicleNitroLevel", ArgumentParser}, }; // Add functions @@ -3059,4 +3061,23 @@ bool CLuaVehicleDefs::SetVehicleNitroActivated(CVehicle* vehicle, bool state) no m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(vehicle, SET_VEHICLE_NITRO_ACTIVATED, *BitStream.pBitStream)); return true; -} \ No newline at end of file +} + + bool CLuaVehicleDefs::IsVehicleNitroActivated(CVehicle* vehicle) noexcept +{ + return vehicle->IsNitroActivated(); +} + +std::variant CLuaVehicleDefs::GetVehicleNitroLevel(CVehicle* vehicle) noexcept +{ + + if (!vehicle->IsNitroInstalled()) + return false; + + float level = vehicle->GetNitroLevel(); + + if (level < 0) + level = 1 + level; + + return level; +} diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.h b/Server/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.h index 11b23691dcb..0eb4513f599 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.h +++ b/Server/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.h @@ -128,4 +128,6 @@ class CLuaVehicleDefs : public CLuaDefs static bool SpawnVehicleFlyingComponent(CVehicle* const vehicle, std::uint8_t nodeIndex, std::optional componentCollisionType, std::optional removalTime); static bool SetVehicleNitroActivated(CVehicle* vehicle, bool state) noexcept; + static bool IsVehicleNitroActivated(CVehicle* vehicle) noexcept; + static std::variant GetVehicleNitroLevel(CVehicle* vehicle) noexcept; }; diff --git a/Server/mods/deathmatch/logic/net/CSimVehiclePuresyncPacket.cpp b/Server/mods/deathmatch/logic/net/CSimVehiclePuresyncPacket.cpp index dbfb098cf94..9d133d8b512 100644 --- a/Server/mods/deathmatch/logic/net/CSimVehiclePuresyncPacket.cpp +++ b/Server/mods/deathmatch/logic/net/CSimVehiclePuresyncPacket.cpp @@ -254,6 +254,16 @@ bool CSimVehiclePuresyncPacket::Read(NetBitStreamInterface& BitStream) if (BitStream.Can(eBitStreamVersion::SetElementOnFire)) m_Cache.isOnFire = BitStream.ReadBit(); + if (BitStream.Can(eBitStreamVersion::IsVehicleNitroActivated_Serverside)) + { + float vehicleNitro; + if (!BitStream.Read(vehicleNitro)) + return false; + + m_Cache.vehNitroLevel = vehicleNitro; + } + + // Success return true; } @@ -424,6 +434,10 @@ bool CSimVehiclePuresyncPacket::Write(NetBitStreamInterface& BitStream) const if (BitStream.Can(eBitStreamVersion::SetElementOnFire)) BitStream.WriteBit(m_Cache.isOnFire); + + if (BitStream.Can(eBitStreamVersion::IsVehicleNitroActivated_Serverside)) + BitStream.Write(m_Cache.vehNitroLevel); + // Success return true; } diff --git a/Server/mods/deathmatch/logic/net/CSimVehiclePuresyncPacket.h b/Server/mods/deathmatch/logic/net/CSimVehiclePuresyncPacket.h index 16ebe3eb907..23bbc170428 100644 --- a/Server/mods/deathmatch/logic/net/CSimVehiclePuresyncPacket.h +++ b/Server/mods/deathmatch/logic/net/CSimVehiclePuresyncPacket.h @@ -75,6 +75,7 @@ class CSimVehiclePuresyncPacket : public CSimPacket CVector VehTurnSpeed; float fVehHealth; + float vehNitroLevel {0.0f}; std::vector TrailerList; diff --git a/Server/mods/deathmatch/logic/packets/CVehiclePuresyncPacket.cpp b/Server/mods/deathmatch/logic/packets/CVehiclePuresyncPacket.cpp index bfab30f952e..b58992b4865 100644 --- a/Server/mods/deathmatch/logic/packets/CVehiclePuresyncPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CVehiclePuresyncPacket.cpp @@ -454,6 +454,15 @@ bool CVehiclePuresyncPacket::Read(NetBitStreamInterface& BitStream) if (BitStream.Can(eBitStreamVersion::SetElementOnFire)) pVehicle->SetOnFire(BitStream.ReadBit()); + if (BitStream.Can(eBitStreamVersion::IsVehicleNitroActivated_Serverside)) + { + float vehicleNitro; + if (!BitStream.Read(vehicleNitro)) + return false; + + pVehicle->SetNitroLevel(vehicleNitro); + } + // Success return true; } @@ -682,6 +691,9 @@ bool CVehiclePuresyncPacket::Write(NetBitStreamInterface& BitStream) const if (BitStream.Can(eBitStreamVersion::SetElementOnFire)) BitStream.WriteBit(pVehicle->IsOnFire()); + if (BitStream.Can(eBitStreamVersion::IsVehicleNitroActivated_Serverside)) + BitStream.Write(pVehicle->GetNitroLevel()); + // Success return true; } diff --git a/Shared/sdk/net/bitstream.h b/Shared/sdk/net/bitstream.h index f0a61b66667..99a6ae05375 100644 --- a/Shared/sdk/net/bitstream.h +++ b/Shared/sdk/net/bitstream.h @@ -608,6 +608,10 @@ enum class eBitStreamVersion : unsigned short // 2025-01-10 WorldSpecialProperty_FlyingComponents, + // Add isVehicleNitroActivated and getVehicleNitroLevel Server side + // 2025-01-16 + IsVehicleNitroActivated_Serverside, + // Ped's camera synchronization // 2025-01-29 PedSync_CameraRotation,