diff --git a/Client/mods/deathmatch/logic/CPedSync.cpp b/Client/mods/deathmatch/logic/CPedSync.cpp index 25ee0b51422..a30897277ec 100644 --- a/Client/mods/deathmatch/logic/CPedSync.cpp +++ b/Client/mods/deathmatch/logic/CPedSync.cpp @@ -239,6 +239,18 @@ void CPedSync::Packet_PedSync(NetBitStreamInterface& BitStream) if (BitStream.Version() >= 0x55 && ucFlags & 0x40) BitStream.ReadBit(bIsInWater); + // New flags + std::uint8_t ucFlags2 = 0; + + if (BitStream.Can(eBitStreamVersion::PedSyncFlags)) + BitStream.Read(ucFlags2); + + // New values + bool isReloadingWeapon; + + if (ucFlags2 & 0x1 && BitStream.Can(eBitStreamVersion::IsPedReloadingWeapon)) + BitStream.ReadBit(isReloadingWeapon); + // Grab the ped. Only update the sync if this packet is from the same context. CClientPed* pPed = m_pPedManager->Get(ID); if (pPed && pPed->CanUpdateSync(ucSyncTimeContext)) @@ -293,6 +305,8 @@ void CPedSync::WritePedInformation(NetBitStreamInterface* pBitStream, CClientPed pPed->GetMoveSpeed(vecVelocity); unsigned char ucFlags = 0; + std::uint8_t ucFlags2 = 0; + if (vecPosition != pPed->m_LastSyncedData->vPosition) ucFlags |= 0x01; if (pPed->GetCurrentRotation() != pPed->m_LastSyncedData->fRotation) @@ -307,13 +321,14 @@ void CPedSync::WritePedInformation(NetBitStreamInterface* pBitStream, CClientPed ucFlags |= 0x20; if (pPed->IsInWater() != pPed->m_LastSyncedData->bIsInWater) ucFlags |= 0x40; - if (pPed->IsReloadingWeapon() != pPed->m_LastSyncedData->isReloadingWeapon && pBitStream->Can(eBitStreamVersion::IsPedReloadingWeapon)) - ucFlags |= 0x60; if (pPed->HasSyncedAnim() && (!pPed->IsRunningAnimation() || pPed->m_animationOverridedByClient)) ucFlags |= 0x80; + if (pPed->IsReloadingWeapon() != pPed->m_LastSyncedData->isReloadingWeapon && pBitStream->Can(eBitStreamVersion::IsPedReloadingWeapon)) + ucFlags2 |= 0x1; + // Do we really have to sync this ped? - if (ucFlags == 0) + if (ucFlags == 0 && ucFlags2 == 0) return; // Write the ped id @@ -401,18 +416,23 @@ void CPedSync::WritePedInformation(NetBitStreamInterface* pBitStream, CClientPed pPed->m_LastSyncedData->bIsInWater = pPed->IsInWater(); } - if (ucFlags & 0x60 && pBitStream->Can(eBitStreamVersion::IsPedReloadingWeapon)) - { - bool isReloadingWeapon = pPed->IsReloadingWeapon(); - - pBitStream->WriteBit(isReloadingWeapon); - pPed->m_LastSyncedData->isReloadingWeapon = isReloadingWeapon; - } - // The animation has been overwritten or interrupted by the client if (ucFlags & 0x80 && pBitStream->Can(eBitStreamVersion::AnimationsSync)) { pPed->SetHasSyncedAnim(false); pPed->m_animationOverridedByClient = false; } + + // New flags + if (!pBitStream->Can(eBitStreamVersion::PedSyncFlags)) + return; + + pBitStream->Write(ucFlags2); + + if (ucFlags2 & 0x1 && pBitStream->Can(eBitStreamVersion::IsPedReloadingWeapon)) + { + const auto isReloadingWeapon = pPed->IsReloadingWeapon(); + pBitStream->WriteBit(isReloadingWeapon); + pPed->m_LastSyncedData->isReloadingWeapon = isReloadingWeapon; + } } diff --git a/Server/mods/deathmatch/logic/CPedSync.cpp b/Server/mods/deathmatch/logic/CPedSync.cpp index 1880ea6dff5..a9f78f1e377 100644 --- a/Server/mods/deathmatch/logic/CPedSync.cpp +++ b/Server/mods/deathmatch/logic/CPedSync.cpp @@ -283,14 +283,13 @@ void CPedSync::Packet_PedSync(CPedSyncPacket& Packet) if (Data.ucFlags & 0x40) pPed->SetInWater(Data.bIsInWater); - if (Data.ucFlags & 0x60) - { - pPed->SetReloadingWeapon(Data.isReloadingWeapon); - } - if (Data.ucFlags & 0x80) pPed->SetAnimationData({}); + // New flags + if (Data.ucFlags2 & 0x1) + pPed->SetReloadingWeapon(Data.isReloadingWeapon); + // Is it time to sync to everyone bool bDoFarSync = llTickCountNow - pPed->GetLastFarSyncTick() >= g_TickRateSettings.iPedFarSync; diff --git a/Server/mods/deathmatch/logic/packets/CPedSyncPacket.cpp b/Server/mods/deathmatch/logic/packets/CPedSyncPacket.cpp index 32e2d84272c..899d72d0159 100644 --- a/Server/mods/deathmatch/logic/packets/CPedSyncPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CPedSyncPacket.cpp @@ -64,16 +64,24 @@ bool CPedSyncPacket::Read(NetBitStreamInterface& BitStream) return false; } - if (ucFlags & 0x60 && BitStream.Can(eBitStreamVersion::IsPedReloadingWeapon)) + // In Water + if (ucFlags & 0x40) { - if (!BitStream.ReadBit(Data.isReloadingWeapon)) + if (!BitStream.ReadBit(Data.bIsInWater)) return false; } - // In Water - if (ucFlags & 0x40) + // New flags + std::uint8_t ucFlags2 = 0; + + if (BitStream.Can(eBitStreamVersion::PedSyncFlags) && !BitStream.Read(ucFlags2)) + return false; + + Data.ucFlags2 = ucFlags2; + + if (ucFlags2 & 0x1 && BitStream.Can(eBitStreamVersion::IsPedReloadingWeapon)) { - if (!BitStream.ReadBit(Data.bIsInWater)) + if (!BitStream.ReadBit(Data.isReloadingWeapon)) return false; } @@ -142,11 +150,18 @@ bool CPedSyncPacket::Write(NetBitStreamInterface& BitStream) const BitStream.Write(Data.fArmor); if (Data.ucFlags & 0x20) BitStream.WriteBit(Data.bOnFire); - if (Data.ucFlags & 0x60 && BitStream.Can(eBitStreamVersion::IsPedReloadingWeapon)) - BitStream.Write(Data.isReloadingWeapon); if (Data.ucFlags & 0x40) BitStream.Write(Data.bIsInWater); + // New flags + if (!BitStream.Can(eBitStreamVersion::PedSyncFlags)) + return true; + + BitStream.Write(Data.ucFlags2); + + if (Data.ucFlags2 & 0x1 && BitStream.Can(eBitStreamVersion::IsPedReloadingWeapon)) + BitStream.Write(Data.isReloadingWeapon); + return true; } diff --git a/Server/mods/deathmatch/logic/packets/CPedSyncPacket.h b/Server/mods/deathmatch/logic/packets/CPedSyncPacket.h index ae18d288bb8..99cac72bfac 100644 --- a/Server/mods/deathmatch/logic/packets/CPedSyncPacket.h +++ b/Server/mods/deathmatch/logic/packets/CPedSyncPacket.h @@ -31,6 +31,7 @@ class CPedSyncPacket final : public CPacket float fArmor; bool bOnFire; bool bIsInWater; + std::uint8_t ucFlags2; bool isReloadingWeapon; bool ReadSpatialData(NetBitStreamInterface& BitStream); diff --git a/Shared/sdk/net/bitstream.h b/Shared/sdk/net/bitstream.h index f69c7cc0f76..fbe58b98d79 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 new ped sync flags + // 2025-01-18 + PedSyncFlags, + // 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,