Skip to content

Commit 48612ef

Browse files
Synchronize changes from 1.6 master branch [ci skip]
45d6996 Refactor bulletsync and add checks (#4381)
2 parents e3e077c + 45d6996 commit 48612ef

16 files changed

+640
-462
lines changed

Client/mods/deathmatch/logic/CNetAPI.cpp

Lines changed: 81 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -128,37 +128,29 @@ bool CNetAPI::ProcessPacket(unsigned char bytePacketID, NetBitStreamInterface& B
128128

129129
case PACKET_ID_PLAYER_BULLETSYNC:
130130
{
131-
// Read out the player ID
132-
ElementID PlayerID;
133-
if (BitStream.Read(PlayerID))
134-
{
135-
// Grab the player
136-
CClientPlayer* pPlayer = m_pPlayerManager->Get(PlayerID);
137-
if (pPlayer)
138-
{
139-
// Read out the bulletsync data
140-
ReadBulletsync(pPlayer, BitStream);
141-
}
142-
}
131+
ElementID id;
132+
if (!BitStream.Read(id))
133+
return true;
134+
135+
auto* player = m_pPlayerManager->Get(id);
136+
if (!player)
137+
return true;
143138

139+
ReadBulletsync(player, BitStream);
144140
return true;
145141
}
146142

147143
case PACKET_ID_WEAPON_BULLETSYNC:
148144
{
149-
// Read out the player ID
150-
ElementID PlayerID;
151-
if (BitStream.Read(PlayerID))
152-
{
153-
// Grab the player
154-
CClientPlayer* pPlayer = m_pPlayerManager->Get(PlayerID);
155-
if (pPlayer)
156-
{
157-
// Read out the bulletsync data
158-
ReadWeaponBulletsync(pPlayer, BitStream);
159-
}
160-
}
145+
ElementID id;
146+
if (!BitStream.Read(id))
147+
return true;
148+
149+
auto* player = m_pPlayerManager->Get(id);
150+
if (!player)
151+
return true;
161152

153+
ReadWeaponBulletsync(player, BitStream);
162154
return true;
163155
}
164156

@@ -2230,152 +2222,119 @@ void CNetAPI::ReadVehiclePartsState(CClientVehicle* pVehicle, NetBitStreamInterf
22302222
static_cast<CDeathmatchVehicle*>(pVehicle)->ResetDamageModelSync();
22312223
}
22322224

2233-
//
2234-
// Read bulletsync packet for a remote player
2235-
//
2236-
void CNetAPI::ReadBulletsync(CClientPlayer* pPlayer, NetBitStreamInterface& BitStream)
2225+
void CNetAPI::ReadBulletsync(CClientPlayer* player, NetBitStreamInterface& stream)
22372226
{
2238-
// Read the bulletsync data
2239-
uchar ucWeapon = 0;
2240-
if (!BitStream.Read(ucWeapon) || !CClientWeaponManager::HasWeaponBulletSync(ucWeapon))
2227+
std::uint8_t weapon = 0;
2228+
if (!stream.Read(weapon) || !CClientWeaponManager::HasWeaponBulletSync(weapon))
22412229
return;
22422230

2243-
eWeaponType weaponType = (eWeaponType)ucWeapon;
2231+
const auto type = static_cast<eWeaponType>(weapon);
22442232

2245-
CVector vecStart, vecEnd;
2246-
if (!BitStream.Read((char*)&vecStart, sizeof(CVector)) || !BitStream.Read((char*)&vecEnd, sizeof(CVector)))
2233+
CVector start;
2234+
CVector end;
2235+
if (!stream.Read(reinterpret_cast<char*>(&start), sizeof(CVector)) ||
2236+
!stream.Read(reinterpret_cast<char*>(&end), sizeof(CVector)) ||
2237+
!start.IsValid() || !end.IsValid())
22472238
return;
22482239

2249-
if (!vecStart.IsValid() || !vecEnd.IsValid())
2240+
std::uint8_t order = 0;
2241+
if (!stream.Read(order))
22502242
return;
22512243

2252-
uchar ucOrderCounter = 0;
2253-
if (!BitStream.Read(ucOrderCounter))
2254-
return;
2244+
float damage = 0.0f;
2245+
std::uint8_t zone = 0;
2246+
CClientPlayer* damaged = nullptr;
22552247

2256-
float fDamage = 0;
2257-
uchar ucHitZone = 0;
2258-
CClientPlayer* pDamagedPlayer = NULL;
2259-
if (BitStream.ReadBit())
2248+
if (stream.ReadBit())
22602249
{
2261-
ElementID DamagedPlayerID = INVALID_ELEMENT_ID;
2262-
if (!BitStream.Read(fDamage) || !BitStream.Read(ucHitZone) || !BitStream.Read(DamagedPlayerID))
2250+
ElementID id = INVALID_ELEMENT_ID;
2251+
if (!stream.Read(damage) || !stream.Read(zone) || !stream.Read(id))
22632252
return;
22642253

2265-
pDamagedPlayer = DynamicCast<CClientPlayer>(CElementIDs::GetElement(DamagedPlayerID));
2254+
damaged = DynamicCast<CClientPlayer>(CElementIDs::GetElement(id));
22662255
}
22672256

2268-
// Duplicate bullet check
2269-
{
2270-
bool bIsDuplicate = false;
2257+
bool duplicate = false;
22712258

2272-
// Check if duplicate by comparing with previously sent vectors
2273-
if (vecStart == pPlayer->m_vecPrevBulletSyncStart && vecEnd == pPlayer->m_vecPrevBulletSyncEnd)
2274-
{
2275-
bIsDuplicate = true;
2276-
}
2277-
pPlayer->m_vecPrevBulletSyncStart = vecStart;
2278-
pPlayer->m_vecPrevBulletSyncEnd = vecEnd;
2259+
if (start == player->m_vecPrevBulletSyncStart && end == player->m_vecPrevBulletSyncEnd)
2260+
duplicate = true;
22792261

2280-
// Verify if duplicate by comparing order counter
2281-
char cDif = ucOrderCounter - pPlayer->m_ucPrevBulletSyncOrderCounter;
2282-
if (cDif > 0)
2283-
bIsDuplicate = false;
2262+
player->m_vecPrevBulletSyncStart = start;
2263+
player->m_vecPrevBulletSyncEnd = end;
22842264

2285-
pPlayer->m_ucPrevBulletSyncOrderCounter = ucOrderCounter;
2265+
if (static_cast<char>(order - player->m_ucPrevBulletSyncOrderCounter) > 0)
2266+
duplicate = false;
22862267

2287-
if (bIsDuplicate)
2288-
return;
2289-
}
2268+
player->m_ucPrevBulletSyncOrderCounter = order;
22902269

2291-
pPlayer->DischargeWeapon(weaponType, vecStart, vecEnd, fDamage, ucHitZone, pDamagedPlayer);
2270+
if (duplicate)
2271+
return;
2272+
2273+
player->DischargeWeapon(type, start, end, damage, zone, damaged);
22922274
}
22932275

2294-
//
2295-
// Read bulletsync packet for a remote player
2296-
//
2297-
void CNetAPI::ReadWeaponBulletsync(CClientPlayer* pPlayer, NetBitStreamInterface& BitStream)
2276+
void CNetAPI::ReadWeaponBulletsync(CClientPlayer* player, NetBitStreamInterface& stream)
22982277
{
2299-
// Read the bulletsync data
2300-
ElementID elementID;
2301-
if (!BitStream.Read(elementID))
2302-
return;
2303-
2304-
CClientWeapon* pWeapon = DynamicCast<CClientWeapon>(CElementIDs::GetElement(elementID));
2305-
if (!pWeapon || !CClientWeaponManager::HasWeaponBulletSync(pWeapon->GetWeaponType()))
2278+
ElementID id;
2279+
if (!stream.Read(id))
23062280
return;
23072281

2308-
CVector vecStart, vecEnd;
2309-
if (!BitStream.Read((char*)&vecStart, sizeof(CVector)) || !BitStream.Read((char*)&vecEnd, sizeof(CVector)))
2282+
auto* weapon = DynamicCast<CClientWeapon>(CElementIDs::GetElement(id));
2283+
if (!weapon || !CClientWeaponManager::HasWeaponBulletSync(weapon->GetWeaponType()))
23102284
return;
23112285

2312-
if (!vecStart.IsValid() || !vecEnd.IsValid())
2286+
CVector start;
2287+
CVector end;
2288+
if (!stream.Read(reinterpret_cast<char*>(&start), sizeof(CVector)) || !stream.Read(reinterpret_cast<char*>(&end), sizeof(CVector)) || !start.IsValid() ||
2289+
!end.IsValid())
23132290
return;
23142291

2315-
uchar ucOrderCounter = 0;
2316-
if (!BitStream.Read(ucOrderCounter))
2292+
uint8_t order = 0;
2293+
if (!stream.Read(order))
23172294
return;
23182295

2319-
pWeapon->FireInstantHit(vecStart, vecEnd, false, true);
2296+
weapon->FireInstantHit(start, end, false, true);
23202297
}
23212298

2322-
//
2323-
// Send bulletsync fire button press packet to remote players
2324-
//
2325-
void CNetAPI::SendBulletSyncFire(eWeaponType weaponType, const CVector& vecStart, const CVector& vecEnd, float fDamage, uchar ucHitZone,
2326-
CClientPlayer* pRemoteDamagedPlayer)
2299+
void CNetAPI::SendBulletSyncFire(eWeaponType weapon, const CVector& start, const CVector& end, float damage, std::uint8_t zone, CClientPlayer* damaged)
23272300
{
2328-
// Send a bulletsync packet
2329-
NetBitStreamInterface* pBitStream = g_pNet->AllocateNetBitStream();
2330-
2331-
// Write the bulletsync data
2332-
pBitStream->Write((char)weaponType);
2301+
auto* stream = g_pNet->AllocateNetBitStream();
23332302

2334-
pBitStream->Write((const char*)&vecStart, sizeof(CVector));
2335-
pBitStream->Write((const char*)&vecEnd, sizeof(CVector));
2303+
stream->Write(static_cast<char>(weapon));
2304+
stream->Write(reinterpret_cast<const char*>(&start), sizeof(CVector));
2305+
stream->Write(reinterpret_cast<const char*>(&end), sizeof(CVector));
2306+
stream->Write(m_ucBulletSyncOrderCounter++);
23362307

2337-
pBitStream->Write(m_ucBulletSyncOrderCounter++);
2338-
2339-
if (fDamage > 0 && pRemoteDamagedPlayer)
2308+
if (damage > 0.0f && damaged)
23402309
{
2341-
pBitStream->WriteBit(true);
2342-
pBitStream->Write(fDamage);
2343-
pBitStream->Write(ucHitZone);
2344-
pBitStream->Write(pRemoteDamagedPlayer->GetID());
2310+
stream->WriteBit(true);
2311+
stream->Write(damage);
2312+
stream->Write(zone);
2313+
stream->Write(damaged->GetID());
23452314
}
23462315
else
23472316
{
2348-
pBitStream->WriteBit(false);
2317+
stream->WriteBit(false);
23492318
}
23502319

2351-
// Send the packet
2352-
g_pNet->SendPacket(PACKET_ID_PLAYER_BULLETSYNC, pBitStream, PACKET_PRIORITY_MEDIUM, PACKET_RELIABILITY_RELIABLE);
2353-
g_pNet->DeallocateNetBitStream(pBitStream);
2320+
g_pNet->SendPacket(PACKET_ID_PLAYER_BULLETSYNC, stream, PACKET_PRIORITY_MEDIUM, PACKET_RELIABILITY_RELIABLE);
2321+
g_pNet->DeallocateNetBitStream(stream);
23542322
}
23552323

2356-
//
2357-
// Send bulletsync fire button press packet to remote players
2358-
//
2359-
void CNetAPI::SendBulletSyncCustomWeaponFire(CClientWeapon* pWeapon, const CVector& vecStart, const CVector& vecEnd)
2324+
void CNetAPI::SendBulletSyncCustomWeaponFire(CClientWeapon* weapon, const CVector& start, const CVector& end)
23602325
{
2361-
// Ignore old bullet sync stuff
2362-
if (pWeapon->IsLocalEntity())
2326+
if (weapon->IsLocalEntity())
23632327
return;
23642328

2365-
// Send a bulletsync packet
2366-
NetBitStreamInterface* pBitStream = g_pNet->AllocateNetBitStream();
2367-
2368-
// Write the bulletsync data
2369-
pBitStream->Write(pWeapon->GetID());
2370-
2371-
pBitStream->Write((const char*)&vecStart, sizeof(CVector));
2372-
pBitStream->Write((const char*)&vecEnd, sizeof(CVector));
2329+
auto* stream = g_pNet->AllocateNetBitStream();
23732330

2374-
pBitStream->Write(m_ucCustomWeaponBulletSyncOrderCounter++);
2331+
stream->Write(weapon->GetID());
2332+
stream->Write(reinterpret_cast<const char*>(&start), sizeof(CVector));
2333+
stream->Write(reinterpret_cast<const char*>(&end), sizeof(CVector));
2334+
stream->Write(m_ucCustomWeaponBulletSyncOrderCounter++);
23752335

2376-
// Send the packet
2377-
g_pNet->SendPacket(PACKET_ID_WEAPON_BULLETSYNC, pBitStream, PACKET_PRIORITY_MEDIUM, PACKET_RELIABILITY_RELIABLE);
2378-
g_pNet->DeallocateNetBitStream(pBitStream);
2336+
g_pNet->SendPacket(PACKET_ID_WEAPON_BULLETSYNC, stream, PACKET_PRIORITY_MEDIUM, PACKET_RELIABILITY_RELIABLE);
2337+
g_pNet->DeallocateNetBitStream(stream);
23792338
}
23802339

23812340
//

Client/mods/deathmatch/logic/CNetAPI.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,8 @@ class CNetAPI
4949

5050
void AddInterpolation(const CVector& vecPosition);
5151
bool GetInterpolation(CVector& vecPosition, unsigned short usLatency);
52-
void SendBulletSyncFire(eWeaponType weaponType, const CVector& vecStart, const CVector& vecEnd, float fDamage, uchar ucHitZone,
53-
CClientPlayer* pRemoteDamagedPlayer);
54-
void SendBulletSyncCustomWeaponFire(CClientWeapon* pWeapon, const CVector& vecStart, const CVector& vecEnd);
52+
void SendBulletSyncFire(eWeaponType weapon, const CVector& start, const CVector& end, float damage, std::uint8_t zone, CClientPlayer* damaged);
53+
void SendBulletSyncCustomWeaponFire(CClientWeapon* weapon, const CVector& start, const CVector& end);
5554
bool IsNetworkTrouble() { return m_bIsNetworkTrouble; }
5655

5756
static bool IsWeaponIDAkimbo(unsigned char ucWeaponID);
@@ -64,8 +63,8 @@ class CNetAPI
6463
void ReadKeysync(CClientPlayer* pPlayer, NetBitStreamInterface& BitStream);
6564
void WriteKeysync(CClientPed* pPed, NetBitStreamInterface& BitStream);
6665

67-
void ReadBulletsync(CClientPlayer* pPlayer, NetBitStreamInterface& BitStream);
68-
void ReadWeaponBulletsync(CClientPlayer* pWeapon, NetBitStreamInterface& BitStream);
66+
void ReadBulletsync(CClientPlayer* player, NetBitStreamInterface& stream);
67+
void ReadWeaponBulletsync(CClientPlayer* player, NetBitStreamInterface& stream);
6968

7069
void ReadPlayerPuresync(CClientPlayer* pPlayer, NetBitStreamInterface& BitStream);
7170
void WritePlayerPuresync(CClientPlayer* pPed, NetBitStreamInterface& BitStream);

0 commit comments

Comments
 (0)