Skip to content

Add nitro vehicle functions server side #3951

New issue

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

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

Already on GitHub? Sign in 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