Skip to content

Add nitro vehicle functions server side #3951

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
3 changes: 3 additions & 0 deletions Client/mods/deathmatch/logic/CNetAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
13 changes: 13 additions & 0 deletions Server/mods/deathmatch/logic/CVehicle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
6 changes: 6 additions & 0 deletions Server/mods/deathmatch/logic/CVehicle.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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;
Expand Down
23 changes: 22 additions & 1 deletion Server/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ void CLuaVehicleDefs::LoadFunctions()
{"getVehicleSirenParams", GetVehicleSirenParams},
{"setVehiclePlateText", SetVehiclePlateText},
{"setVehicleNitroActivated", ArgumentParser<SetVehicleNitroActivated>},
{"isVehicleNitroActivated", ArgumentParser<IsVehicleNitroActivated>},
{"getVehicleNitroLevel", ArgumentParser<GetVehicleNitroLevel>},
};

// Add functions
Expand Down Expand Up @@ -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;
}
}

bool CLuaVehicleDefs::IsVehicleNitroActivated(CVehicle* vehicle) noexcept
{
return vehicle->IsNitroActivated();
}

std::variant<float, bool> CLuaVehicleDefs::GetVehicleNitroLevel(CVehicle* vehicle) noexcept
{

if (!vehicle->IsNitroInstalled())
return false;

float level = vehicle->GetNitroLevel();

if (level < 0)
level = 1 + level;

return level;
}
2 changes: 2 additions & 0 deletions Server/mods/deathmatch/logic/luadefs/CLuaVehicleDefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,4 +128,6 @@ class CLuaVehicleDefs : public CLuaDefs

static bool SpawnVehicleFlyingComponent(CVehicle* const vehicle, std::uint8_t nodeIndex, std::optional<std::uint8_t> componentCollisionType, std::optional<std::uint32_t> removalTime);
static bool SetVehicleNitroActivated(CVehicle* vehicle, bool state) noexcept;
static bool IsVehicleNitroActivated(CVehicle* vehicle) noexcept;
static std::variant<float, bool> GetVehicleNitroLevel(CVehicle* vehicle) noexcept;
};
14 changes: 14 additions & 0 deletions Server/mods/deathmatch/logic/net/CSimVehiclePuresyncPacket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ class CSimVehiclePuresyncPacket : public CSimPacket
CVector VehTurnSpeed;

float fVehHealth;
float vehNitroLevel {0.0f};

std::vector<STrailerInfo> TrailerList;

Expand Down
12 changes: 12 additions & 0 deletions Server/mods/deathmatch/logic/packets/CVehiclePuresyncPacket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand Down
4 changes: 4 additions & 0 deletions Shared/sdk/net/bitstream.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Loading