-
-
Notifications
You must be signed in to change notification settings - Fork 427
/
CExplosionSyncPacket.cpp
107 lines (90 loc) · 2.89 KB
/
CExplosionSyncPacket.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*****************************************************************************
*
* PROJECT: Multi Theft Auto v1.0
* LICENSE: See LICENSE in the top level directory
* FILE: mods/deathmatch/logic/packets/CExplosionSyncPacket.cpp
* PURPOSE: Explosion synchronization packet class
*
* Multi Theft Auto is available from http://www.multitheftauto.com/
*
*****************************************************************************/
#include "StdInc.h"
#include "CExplosionSyncPacket.h"
#include "CPlayer.h"
#include <net/SyncStructures.h>
CExplosionSyncPacket::CExplosionSyncPacket()
{
m_OriginID = INVALID_ELEMENT_ID;
m_ucType = EXPLOSION_SMALL;
}
CExplosionSyncPacket::CExplosionSyncPacket(const CVector& vecPosition, unsigned char ucType)
{
m_OriginID = INVALID_ELEMENT_ID;
m_vecPosition = vecPosition;
m_ucType = ucType;
}
bool CExplosionSyncPacket::Read(NetBitStreamInterface& BitStream)
{
bool bHasOrigin;
if (!BitStream.ReadBit(bHasOrigin))
return false;
m_OriginID = INVALID_ELEMENT_ID;
if (bHasOrigin && !BitStream.Read(m_OriginID))
return false;
if (bHasOrigin && BitStream.Can(eBitStreamVersion::VehicleBlowStateSupport))
{
if (!BitStream.ReadBit(m_isVehicleResponsible))
return false;
if (m_isVehicleResponsible && !BitStream.ReadBit(m_blowVehicleWithoutExplosion))
return false;
}
SPositionSync position(false);
if (BitStream.Read(&position))
{
SExplosionTypeSync explosionType;
if (BitStream.Read(&explosionType))
{
m_vecPosition = position.data.vecPosition;
m_ucType = explosionType.data.uiType;
return true;
}
}
return false;
}
bool CExplosionSyncPacket::Write(NetBitStreamInterface& BitStream) const
{
// Write the source player and latency if any. Otherwize 0
if (m_pSourceElement)
{
BitStream.WriteBit(true);
ElementID ID = m_pSourceElement->GetID();
BitStream.Write(ID);
unsigned short usLatency = static_cast<CPlayer*>(m_pSourceElement)->GetPing();
BitStream.WriteCompressed(usLatency);
}
else
{
BitStream.WriteBit(false);
}
if (m_OriginID != INVALID_ELEMENT_ID)
{
BitStream.WriteBit(true);
BitStream.Write(m_OriginID);
if (BitStream.Can(eBitStreamVersion::VehicleBlowStateSupport))
{
BitStream.WriteBit(m_isVehicleResponsible);
if (m_isVehicleResponsible)
BitStream.WriteBit(m_blowVehicleWithoutExplosion);
}
}
else
BitStream.WriteBit(false);
// Write position and type
SPositionSync position(false);
position.data.vecPosition = m_vecPosition;
BitStream.Write(&position);
SExplosionTypeSync explosionType;
explosionType.data.uiType = m_ucType;
BitStream.Write(&explosionType);
return true;
}