Skip to content

Commit 7da600e

Browse files
committed
Additional weapon/bsync handling improvements, and move check from ca22eda to CWeaponStatManager
1 parent ca22eda commit 7da600e

File tree

10 files changed

+64
-28
lines changed

10 files changed

+64
-28
lines changed

Client/mods/deathmatch/logic/CClientWeaponManager.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,9 @@ void CClientWeaponManager::DoPulse()
4343
{
4444
(*iter)->DoPulse();
4545
}
46-
}
46+
}
47+
48+
bool CClientWeaponManager::HasWeaponBulletSync(std::uint32_t weaponID) noexcept
49+
{
50+
return weaponID >= 22 && weaponID <= 34;
51+
}

Client/mods/deathmatch/logic/CClientWeaponManager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ class CClientWeaponManager
2323

2424
void DoPulse();
2525

26+
static bool HasWeaponBulletSync(std::uint32_t weaponID) noexcept;
27+
2628
private:
2729
void AddToList(CClientWeapon* pWeapon) { m_Weapons.push_back(pWeapon); }
2830
void RemoveFromList(CClientWeapon* pWeapon);

Client/mods/deathmatch/logic/CNetAPI.cpp

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2271,27 +2271,31 @@ void CNetAPI::ReadBulletsync(CClientPlayer* pPlayer, NetBitStreamInterface& BitS
22712271
{
22722272
// Read the bulletsync data
22732273
uchar ucWeapon = 0;
2274-
BitStream.Read(ucWeapon);
2275-
if (!CClientPickupManager::IsValidWeaponID(ucWeapon))
2274+
if (!BitStream.Read(ucWeapon) || !CClientWeaponManager::HasWeaponBulletSync(ucWeapon))
22762275
return;
2276+
22772277
eWeaponType weaponType = (eWeaponType)ucWeapon;
22782278

22792279
CVector vecStart, vecEnd;
2280-
BitStream.Read((char*)&vecStart, sizeof(CVector));
2281-
BitStream.Read((char*)&vecEnd, sizeof(CVector));
2280+
if (!BitStream.Read((char*)&vecStart, sizeof(CVector)) || !BitStream.Read((char*)&vecEnd, sizeof(CVector)))
2281+
return;
2282+
2283+
if (!vecStart.IsValid() || !vecEnd.IsValid())
2284+
return;
22822285

22832286
uchar ucOrderCounter = 0;
2284-
BitStream.Read(ucOrderCounter);
2287+
if (!BitStream.Read(ucOrderCounter))
2288+
return;
22852289

22862290
float fDamage = 0;
22872291
uchar ucHitZone = 0;
22882292
CClientPlayer* pDamagedPlayer = NULL;
22892293
if (BitStream.ReadBit())
22902294
{
22912295
ElementID DamagedPlayerID = INVALID_ELEMENT_ID;
2292-
BitStream.Read(fDamage);
2293-
BitStream.Read(ucHitZone);
2294-
BitStream.Read(DamagedPlayerID);
2296+
if (!BitStream.Read(fDamage) || !BitStream.Read(ucHitZone) || !BitStream.Read(DamagedPlayerID))
2297+
return;
2298+
22952299
pDamagedPlayer = DynamicCast<CClientPlayer>(CElementIDs::GetElement(DamagedPlayerID));
22962300
}
22972301

@@ -2328,15 +2332,20 @@ void CNetAPI::ReadWeaponBulletsync(CClientPlayer* pPlayer, NetBitStreamInterface
23282332
{
23292333
// Read the bulletsync data
23302334
ElementID elementID;
2331-
BitStream.Read(elementID);
2335+
if (!BitStream.Read(elementID))
2336+
return;
2337+
23322338
CClientWeapon* pWeapon = DynamicCast<CClientWeapon>(CElementIDs::GetElement(elementID));
2339+
if (!pWeapon || !CClientWeaponManager::HasWeaponBulletSync(pWeapon->GetWeaponType()))
2340+
return;
23332341

23342342
CVector vecStart, vecEnd;
2335-
BitStream.Read((char*)&vecStart, sizeof(CVector));
2336-
BitStream.Read((char*)&vecEnd, sizeof(CVector));
2343+
if (!BitStream.Read((char*)&vecStart, sizeof(CVector)) || !BitStream.Read((char*)&vecEnd, sizeof(CVector)))
2344+
return;
23372345

23382346
uchar ucOrderCounter = 0;
2339-
BitStream.Read(ucOrderCounter);
2347+
if (!BitStream.Read(ucOrderCounter))
2348+
return;
23402349

23412350
pWeapon->FireInstantHit(vecStart, vecEnd, false, true);
23422351
}

Server/mods/deathmatch/logic/CPickupManager.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,6 @@ bool CPickupManager::IsValidWeaponID(unsigned int uiWeaponID)
6868
return (uiWeaponID > 0 && uiWeaponID != 13 && uiWeaponID != 19 && uiWeaponID != 20 && uiWeaponID != 21 && uiWeaponID <= 46);
6969
}
7070

71-
bool CPickupManager::HasWeaponBulletSync(uint32_t weaponID)
72-
{
73-
return weaponID >= 22 && weaponID <= 34;
74-
}
75-
7671
unsigned short CPickupManager::GetWeaponModel(unsigned int uiWeaponID)
7772
{
7873
if (uiWeaponID <= 46)

Server/mods/deathmatch/logic/CPickupManager.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ class CPickupManager
3636
std::list<CPickup*>::const_iterator IterEnd() { return m_List.end(); };
3737

3838
static bool IsValidWeaponID(unsigned int uiWeaponID);
39-
static bool HasWeaponBulletSync(uint32_t weaponID);
4039
static unsigned short GetWeaponModel(unsigned int uiWeaponID);
4140
static unsigned short GetHealthModel() { return 1240; };
4241
static unsigned short GetArmorModel() { return 1242; };

Server/mods/deathmatch/logic/CWeaponStatManager.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1675,3 +1675,8 @@ float CWeaponStatManager::GetWeaponRangeFromSkillLevel(eWeaponType eWeapon, floa
16751675
}
16761676
return fWeaponRange;
16771677
}
1678+
1679+
bool CWeaponStatManager::HasWeaponBulletSync(uint32_t weaponID) noexcept
1680+
{
1681+
return weaponID >= 22 && weaponID <= 34;
1682+
}

Server/mods/deathmatch/logic/CWeaponStatManager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ class CWeaponStatManager
9191

9292
// Static Methods
9393
static unsigned short GetSkillStatIndex(eWeaponType eWeapon);
94+
static bool HasWeaponBulletSync(uint32_t weaponID) noexcept;
9495

9596
private:
9697
std::list<CWeaponStat*> m_OriginalWeaponData;

Server/mods/deathmatch/logic/net/CSimBulletsyncPacket.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "StdInc.h"
1111
#include "SimHeaders.h"
1212
#include "CPickupManager.h"
13+
#include "CWeaponStatManager.h"
1314

1415
CSimBulletsyncPacket::CSimBulletsyncPacket(ElementID PlayerID) : m_PlayerID(PlayerID)
1516
{
@@ -24,14 +25,16 @@ CSimBulletsyncPacket::CSimBulletsyncPacket(ElementID PlayerID) : m_PlayerID(Play
2425
//
2526
bool CSimBulletsyncPacket::Read(NetBitStreamInterface& BitStream)
2627
{
27-
char cWeaponType;
28-
BitStream.Read(cWeaponType);
29-
if (!CPickupManager::HasWeaponBulletSync(cWeaponType))
28+
char cWeaponType = 0;
29+
if (!BitStream.Read(cWeaponType) || !CWeaponStatManager::HasWeaponBulletSync(cWeaponType))
3030
return false;
3131
m_Cache.weaponType = (eWeaponType)cWeaponType;
3232

33-
BitStream.Read((char*)&m_Cache.vecStart, sizeof(CVector));
34-
BitStream.Read((char*)&m_Cache.vecEnd, sizeof(CVector));
33+
if (!BitStream.Read((char*)&m_Cache.vecStart, sizeof(CVector)) || !BitStream.Read((char*)&m_Cache.vecEnd, sizeof(CVector)))
34+
return false;
35+
36+
if (!m_Cache.vecStart.IsValid() || !m_Cache.vecEnd.IsValid())
37+
return false;
3538

3639
// Duplicate packet protection
3740
if (!BitStream.Read(m_Cache.ucOrderCounter))

Server/mods/deathmatch/logic/packets/CBulletsyncPacket.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "CBulletsyncPacket.h"
1313
#include "net/SyncStructures.h"
1414
#include "CPlayer.h"
15+
#include "CWeaponStatManager.h"
1516

1617
CBulletsyncPacket::CBulletsyncPacket(CPlayer* pPlayer)
1718
{
@@ -28,12 +29,16 @@ bool CBulletsyncPacket::Read(NetBitStreamInterface& BitStream)
2829
// Got a player?
2930
if (m_pSourceElement)
3031
{
31-
char cWeaponType;
32-
BitStream.Read(cWeaponType);
32+
char cWeaponType = 0;
33+
if (!BitStream.Read(cWeaponType) || !CWeaponStatManager::HasWeaponBulletSync(cWeaponType))
34+
return false;
3335
m_WeaponType = (eWeaponType)cWeaponType;
3436

35-
BitStream.Read((char*)&m_vecStart, sizeof(CVector));
36-
BitStream.Read((char*)&m_vecEnd, sizeof(CVector));
37+
if (!BitStream.Read((char*)&m_vecStart, sizeof(CVector)) || !BitStream.Read((char*)&m_vecEnd, sizeof(CVector)))
38+
return false;
39+
40+
if (!m_vecStart.IsValid() || !m_vecEnd.IsValid())
41+
return false;
3742

3843
// Duplicate packet protection
3944
if (!BitStream.Read(m_ucOrderCounter))

Shared/sdk/CVector.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,18 @@ class CVector
194194
return false;
195195
}
196196

197+
bool IsValid() const
198+
{
199+
const float values[3] = {fX, fY, fZ};
200+
for (std::size_t i = 0; i < 3; ++i)
201+
{
202+
if (std::isnan(values[i]) || std::isinf(values[i]))
203+
return false;
204+
}
205+
206+
return true;
207+
}
208+
197209
constexpr CVector operator+(const CVector& vecRight) const noexcept { return CVector(fX + vecRight.fX, fY + vecRight.fY, fZ + vecRight.fZ); }
198210

199211
constexpr CVector operator-(const CVector& vecRight) const noexcept { return CVector(fX - vecRight.fX, fY - vecRight.fY, fZ - vecRight.fZ); }

0 commit comments

Comments
 (0)