Packets now parse themselves from a cByteBuffer object (1st part of packeting rewrite, http://forum.mc-server.org/showthread.php?tid=524 )
git-svn-id: http://mc-server.googlecode.com/svn/trunk@744 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
parent
33ca4d5003
commit
70a4ca5bc1
@ -285,6 +285,14 @@
|
|||||||
RelativePath="..\source\BlockID.h"
|
RelativePath="..\source\BlockID.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\ByteBuffer.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\source\ByteBuffer.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\source\cAuthenticator.cpp"
|
RelativePath="..\source\cAuthenticator.cpp"
|
||||||
>
|
>
|
||||||
|
324
source/ByteBuffer.cpp
Normal file
324
source/ByteBuffer.cpp
Normal file
@ -0,0 +1,324 @@
|
|||||||
|
|
||||||
|
// ByteBuffer.cpp
|
||||||
|
|
||||||
|
// Implements the cByteBuffer class representing a ringbuffer of bytes
|
||||||
|
|
||||||
|
#include "Globals.h"
|
||||||
|
|
||||||
|
#include "ByteBuffer.h"
|
||||||
|
#include "Endianness.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define NEEDBYTES(Num) if (!CanReadBytes(Num)) return false;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// cByteBuffer:
|
||||||
|
|
||||||
|
cByteBuffer::cByteBuffer(int a_BufferSize) :
|
||||||
|
m_Buffer(new char[a_BufferSize + 1]),
|
||||||
|
m_BufferSize(a_BufferSize + 1),
|
||||||
|
m_DataStart(0),
|
||||||
|
m_WritePos(0),
|
||||||
|
m_ReadPos(0)
|
||||||
|
{
|
||||||
|
// Allocating one byte more than the buffer size requested, so that we can distinguish between
|
||||||
|
// completely-full and completely-empty states
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cByteBuffer::~cByteBuffer()
|
||||||
|
{
|
||||||
|
delete m_Buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cByteBuffer::Write(const char * a_Bytes, int a_Count)
|
||||||
|
{
|
||||||
|
if (GetFreeSpace() < a_Count)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int TillEnd = m_BufferSize - m_WritePos;
|
||||||
|
if (TillEnd < a_Count)
|
||||||
|
{
|
||||||
|
// Need to wrap around the ringbuffer end
|
||||||
|
memcpy(m_Buffer + m_WritePos, a_Bytes, TillEnd);
|
||||||
|
m_WritePos = 0;
|
||||||
|
a_Bytes += TillEnd;
|
||||||
|
a_Count -= TillEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We're guaranteed that we'll fit in a single write op
|
||||||
|
memcpy(m_Buffer + m_WritePos, a_Bytes, a_Count);
|
||||||
|
m_WritePos += a_Count;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int cByteBuffer::GetFreeSpace(void) const
|
||||||
|
{
|
||||||
|
if (m_WritePos >= m_DataStart)
|
||||||
|
{
|
||||||
|
// Wrap around the buffer end:
|
||||||
|
return m_BufferSize - m_WritePos + m_DataStart - 1;
|
||||||
|
}
|
||||||
|
// Single free space partition:
|
||||||
|
return m_DataStart - m_WritePos - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// Returns the number of bytes that are currently in the ringbuffer. Note GetReadableBytes()
|
||||||
|
int cByteBuffer::GetUsedSpace(void) const
|
||||||
|
{
|
||||||
|
return m_BufferSize - GetFreeSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// Returns the number of bytes that are currently available for reading (may be less than UsedSpace due to some data having been read already)
|
||||||
|
int cByteBuffer::GetReadableSpace(void) const
|
||||||
|
{
|
||||||
|
if (m_ReadPos > m_WritePos)
|
||||||
|
{
|
||||||
|
// Wrap around the buffer end:
|
||||||
|
return m_BufferSize - m_ReadPos + m_WritePos;
|
||||||
|
}
|
||||||
|
// Single readable space partition:
|
||||||
|
return m_WritePos - m_ReadPos ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cByteBuffer::CanReadBytes(int a_Count) const
|
||||||
|
{
|
||||||
|
return (a_Count <= GetReadableSpace());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cByteBuffer::ReadChar(char & a_Value)
|
||||||
|
{
|
||||||
|
NEEDBYTES(1);
|
||||||
|
a_Value = m_Buffer[m_ReadPos++];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cByteBuffer::ReadByte(unsigned char & a_Value)
|
||||||
|
{
|
||||||
|
NEEDBYTES(1);
|
||||||
|
a_Value = (unsigned char)(m_Buffer[m_ReadPos++]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cByteBuffer::ReadBEShort(short & a_Value)
|
||||||
|
{
|
||||||
|
NEEDBYTES(2);
|
||||||
|
ReadBuf(&a_Value, 2);
|
||||||
|
a_Value = ntohs(a_Value);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cByteBuffer::ReadBEInt(int & a_Value)
|
||||||
|
{
|
||||||
|
NEEDBYTES(4);
|
||||||
|
ReadBuf(&a_Value, 4);
|
||||||
|
a_Value = ntohl(a_Value);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cByteBuffer::ReadBEInt64(Int64 & a_Value)
|
||||||
|
{
|
||||||
|
NEEDBYTES(8);
|
||||||
|
ReadBuf(&a_Value, 8);
|
||||||
|
a_Value = NetworkToHostLong8(&a_Value);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cByteBuffer::ReadBEFloat(float & a_Value)
|
||||||
|
{
|
||||||
|
NEEDBYTES(4);
|
||||||
|
ReadBuf(&a_Value, 4);
|
||||||
|
a_Value = NetworkToHostFloat4(&a_Value);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cByteBuffer::ReadBEDouble(double & a_Value)
|
||||||
|
{
|
||||||
|
NEEDBYTES(8);
|
||||||
|
ReadBuf(&a_Value, 8);
|
||||||
|
a_Value = NetworkToHostDouble8(&a_Value);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cByteBuffer::ReadBool(bool & a_Value)
|
||||||
|
{
|
||||||
|
NEEDBYTES(1);
|
||||||
|
a_Value = (m_Buffer[m_ReadPos++] != 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cByteBuffer::ReadBEUTF16String16(AString & a_Value)
|
||||||
|
{
|
||||||
|
short Length;
|
||||||
|
if (!ReadBEShort(Length))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return ReadUTF16String(a_Value, Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cByteBuffer::ReadBuf(void * a_Buffer, int a_Count)
|
||||||
|
{
|
||||||
|
NEEDBYTES(a_Count);
|
||||||
|
char * Dst = (char *)a_Buffer; // So that we can do byte math
|
||||||
|
int BytesToEndOfBuffer = m_BufferSize - m_ReadPos;
|
||||||
|
if (BytesToEndOfBuffer < a_Count)
|
||||||
|
{
|
||||||
|
// Reading across the ringbuffer end, read the first part and adjust parameters:
|
||||||
|
memcpy(Dst, m_Buffer + m_ReadPos, BytesToEndOfBuffer);
|
||||||
|
Dst += BytesToEndOfBuffer;
|
||||||
|
a_Count -= BytesToEndOfBuffer;
|
||||||
|
m_ReadPos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read the rest of the bytes in a single read (guaranteed to fit):
|
||||||
|
memcpy(Dst, m_Buffer + m_ReadPos, a_Count);
|
||||||
|
m_ReadPos += a_Count;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cByteBuffer::ReadString(AString & a_String, int a_Count)
|
||||||
|
{
|
||||||
|
NEEDBYTES(a_Count);
|
||||||
|
a_String.clear();
|
||||||
|
a_String.reserve(a_Count);
|
||||||
|
int BytesToEndOfBuffer = m_BufferSize - m_ReadPos;
|
||||||
|
if (BytesToEndOfBuffer < a_Count)
|
||||||
|
{
|
||||||
|
// Reading across the ringbuffer end, read the first part and adjust parameters:
|
||||||
|
a_String.assign(m_Buffer + m_ReadPos, BytesToEndOfBuffer);
|
||||||
|
a_Count -= BytesToEndOfBuffer;
|
||||||
|
m_ReadPos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read the rest of the bytes in a single read (guaranteed to fit):
|
||||||
|
a_String.append(m_Buffer + m_ReadPos, a_Count);
|
||||||
|
m_ReadPos += a_Count;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cByteBuffer::ReadUTF16String(AString & a_String, int a_NumChars)
|
||||||
|
{
|
||||||
|
// Reads 2 * a_NumChars bytes and interprets it as a UTF16 string, converting it into UTF8 string a_String
|
||||||
|
AString RawData;
|
||||||
|
if (!ReadString(RawData, a_NumChars * 2))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
RawBEToUTF8((short *)(RawData.data()), a_NumChars, a_String);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cByteBuffer::CommitRead(void)
|
||||||
|
{
|
||||||
|
m_DataStart = m_ReadPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cByteBuffer::ResetRead(void)
|
||||||
|
{
|
||||||
|
m_ReadPos = m_DataStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cByteBuffer::AdvanceReadPos(int a_Count)
|
||||||
|
{
|
||||||
|
m_ReadPos += a_Count;
|
||||||
|
if (m_ReadPos > m_BufferSize)
|
||||||
|
{
|
||||||
|
m_ReadPos -= m_BufferSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
90
source/ByteBuffer.h
Normal file
90
source/ByteBuffer.h
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
|
||||||
|
// ByteStream.h
|
||||||
|
|
||||||
|
// Interfaces to the cByteBuffer class representing a ringbuffer of bytes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** An object that can store incoming bytes and lets its clients read the bytes sequentially
|
||||||
|
The bytes are stored in a ringbuffer of constant size; if more than that size
|
||||||
|
is requested, the write operation fails.
|
||||||
|
The bytes stored can be retrieved using various ReadXXX functions; these assume that the needed
|
||||||
|
number of bytes are present in the buffer (ASSERT; for performance reasons).
|
||||||
|
The reading doesn't actually remove the bytes, it only moves the internal read ptr.
|
||||||
|
To remove the bytes, call CommitRead().
|
||||||
|
To re-start reading from the beginning, call ResetRead().
|
||||||
|
This class doesn't implement thread safety, the clients of this class need to provide
|
||||||
|
their own synchronization.
|
||||||
|
*/
|
||||||
|
class cByteBuffer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cByteBuffer(int a_BufferSize);
|
||||||
|
~cByteBuffer();
|
||||||
|
|
||||||
|
/// Writes the bytes specified to the ringbuffer. Returns true if successful, false if not
|
||||||
|
bool Write(const char * a_Bytes, int a_Count);
|
||||||
|
|
||||||
|
/// Returns the number of bytes that can be successfully written to the ringbuffer
|
||||||
|
int GetFreeSpace(void) const;
|
||||||
|
|
||||||
|
/// Returns the number of bytes that are currently in the ringbuffer. Note GetReadableBytes()
|
||||||
|
int GetUsedSpace(void) const;
|
||||||
|
|
||||||
|
/// Returns the number of bytes that are currently available for reading (may be less than UsedSpace due to some data having been read already)
|
||||||
|
int GetReadableSpace(void) const;
|
||||||
|
|
||||||
|
/// Returns true if the specified amount of bytes are available for reading
|
||||||
|
bool CanReadBytes(int a_Count) const;
|
||||||
|
|
||||||
|
// Read the specified datatype and advance the read pointer; return true if successfully read:
|
||||||
|
bool ReadChar (char & a_Value);
|
||||||
|
bool ReadByte (unsigned char & a_Value);
|
||||||
|
bool ReadBEShort (short & a_Value);
|
||||||
|
bool ReadBEInt (int & a_Value);
|
||||||
|
bool ReadBEInt64 (Int64 & a_Value);
|
||||||
|
bool ReadBEFloat (float & a_Value);
|
||||||
|
bool ReadBEDouble (double & a_Value);
|
||||||
|
bool ReadBool (bool & a_Value);
|
||||||
|
bool ReadBEUTF16String16(AString & a_Value);
|
||||||
|
|
||||||
|
/// Reads a_Count bytes into a_Buffer; return true if successful
|
||||||
|
bool ReadBuf(void * a_Buffer, int a_Count);
|
||||||
|
|
||||||
|
/// Reads a_Count bytes into a_String; return true if successful
|
||||||
|
bool ReadString(AString & a_String, int a_Count);
|
||||||
|
|
||||||
|
/// Reads 2 * a_NumChars bytes and interprets it as a UTF16 string, converting it into UTF8 string a_String
|
||||||
|
bool ReadUTF16String(AString & a_String, int a_NumChars);
|
||||||
|
|
||||||
|
/// Skips reading by a_Count bytes
|
||||||
|
void SkipRead(int a_Count);
|
||||||
|
|
||||||
|
/// Removes the bytes that have been read from the ringbuffer
|
||||||
|
void CommitRead(void);
|
||||||
|
|
||||||
|
/// Restarts next reading operation at the start of the ringbuffer
|
||||||
|
void ResetRead(void);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
char * m_Buffer;
|
||||||
|
int m_BufferSize; // Total size of the ringbuffer
|
||||||
|
int m_DataStart; // Where the data starts in the ringbuffer
|
||||||
|
int m_WritePos; // Where the data ends in the ringbuffer
|
||||||
|
int m_ReadPos; // Where the next read will start in the ringbuffer
|
||||||
|
|
||||||
|
/// Advances the m_ReadPos by a_Count bytes
|
||||||
|
void AdvanceReadPos(int a_Count);
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -95,6 +95,11 @@ typedef short Int16;
|
|||||||
// Windows SDK defines min and max macros, messing up with our std::min and std::max usage
|
// Windows SDK defines min and max macros, messing up with our std::min and std::max usage
|
||||||
#undef min
|
#undef min
|
||||||
#undef max
|
#undef max
|
||||||
|
|
||||||
|
// Windows SDK defines GetFreeSpace as a constant, probably a Win16 API remnant
|
||||||
|
#ifdef GetFreeSpace
|
||||||
|
#undef GetFreeSpace
|
||||||
|
#endif // GetFreeSpace
|
||||||
#else
|
#else
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h> // for mkdir
|
#include <sys/stat.h> // for mkdir
|
||||||
|
@ -233,3 +233,49 @@ AStringList GetDirectoryContents(const char * a_Directory)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Converts a stream of BE shorts into UTF-8 string; returns a ref to a_UTF8
|
||||||
|
AString & RawBEToUTF8(short * a_RawData, int a_NumShorts, AString & a_UTF8)
|
||||||
|
{
|
||||||
|
a_UTF8.clear();
|
||||||
|
a_UTF8.reserve(3 * a_NumShorts / 2); // a quick guess of the resulting size
|
||||||
|
for (int i = 0; i < a_NumShorts; i++)
|
||||||
|
{
|
||||||
|
int c = ntohs(*(a_RawData + i));
|
||||||
|
if (c < 0x80)
|
||||||
|
{
|
||||||
|
a_UTF8.push_back((char)c);
|
||||||
|
}
|
||||||
|
else if (c < 0x800)
|
||||||
|
{
|
||||||
|
a_UTF8.push_back((char)(192 + c / 64));
|
||||||
|
a_UTF8.push_back((char)(128 + c % 64));
|
||||||
|
}
|
||||||
|
else if (c - 0xd800u < 0x800)
|
||||||
|
{
|
||||||
|
// Error, silently drop
|
||||||
|
}
|
||||||
|
else if (c < 0x10000)
|
||||||
|
{
|
||||||
|
a_UTF8.push_back((char)(224 + c / 4096));
|
||||||
|
a_UTF8.push_back((char)(128 + c / 64 % 64));
|
||||||
|
a_UTF8.push_back((char)(128 + c % 64));
|
||||||
|
}
|
||||||
|
else if (c < 0x110000)
|
||||||
|
{
|
||||||
|
a_UTF8.push_back((char)(240 + c / 262144));
|
||||||
|
a_UTF8.push_back((char)(128 + c / 4096 % 64));
|
||||||
|
a_UTF8.push_back((char)(128 + c / 64 % 64));
|
||||||
|
a_UTF8.push_back((char)(128 + c % 64));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Error, silently drop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return a_UTF8;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,6 +48,9 @@ extern void ReplaceString(AString & iHayStack, const AString & iNeedle, const AS
|
|||||||
/// Returns the list of all items in the specified directory (files, folders, nix pipes, whatever's there)
|
/// Returns the list of all items in the specified directory (files, folders, nix pipes, whatever's there)
|
||||||
extern AStringList GetDirectoryContents(const char * a_Directory);
|
extern AStringList GetDirectoryContents(const char * a_Directory);
|
||||||
|
|
||||||
|
/// Converts a stream of BE shorts into UTF-8 string; returns a ref to a_UTF8
|
||||||
|
extern AString & RawBEToUTF8(short * a_RawData, int a_NumShorts, AString & a_UTF8);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// If you have any other string helper functions, declare them here
|
// If you have any other string helper functions, declare them here
|
||||||
|
@ -112,6 +112,7 @@ int cClientHandle::s_ClientCount = 0;
|
|||||||
cClientHandle::cClientHandle(const cSocket & a_Socket, int a_ViewDistance)
|
cClientHandle::cClientHandle(const cSocket & a_Socket, int a_ViewDistance)
|
||||||
: m_ViewDistance(a_ViewDistance)
|
: m_ViewDistance(a_ViewDistance)
|
||||||
, m_ProtocolVersion(MCS_PROTOCOL_VERSION)
|
, m_ProtocolVersion(MCS_PROTOCOL_VERSION)
|
||||||
|
, m_ReceivedData(64 KiB)
|
||||||
, m_Socket(a_Socket)
|
, m_Socket(a_Socket)
|
||||||
, m_bDestroyed(false)
|
, m_bDestroyed(false)
|
||||||
, m_Player(NULL)
|
, m_Player(NULL)
|
||||||
@ -1357,6 +1358,16 @@ void cClientHandle::Send(const cPacket & a_Packet, ENUM_PRIORITY a_Priority /* =
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cClientHandle::SendDisconnect(const AString & a_Reason)
|
||||||
|
{
|
||||||
|
cPacket_Disconnect DC(a_Reason);
|
||||||
|
m_Socket.Send(&DC);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cClientHandle::CheckIfWorldDownloaded(void)
|
void cClientHandle::CheckIfWorldDownloaded(void)
|
||||||
{
|
{
|
||||||
if (m_State != csDownloadingWorld)
|
if (m_State != csDownloadingWorld)
|
||||||
@ -1454,31 +1465,42 @@ void cClientHandle::DataReceived(const char * a_Data, int a_Size)
|
|||||||
{
|
{
|
||||||
// Data is received from the client
|
// Data is received from the client
|
||||||
|
|
||||||
m_ReceivedData.append(a_Data, a_Size);
|
if (!m_ReceivedData.Write(a_Data, a_Size))
|
||||||
|
|
||||||
// Parse and handle all complete packets in m_ReceivedData:
|
|
||||||
while (!m_ReceivedData.empty())
|
|
||||||
{
|
{
|
||||||
cPacket* pPacket = m_PacketMap[(unsigned char)m_ReceivedData[0]];
|
// Too much data in the incoming queue, the server is probably too busy, kick the client:
|
||||||
if (pPacket == NULL)
|
LOGERROR("Too much data in queue for client \"%s\" @ %s, kicking them.", m_Username.c_str(), m_Socket.GetIPString().c_str());
|
||||||
{
|
SendDisconnect("Server busy");
|
||||||
LOGERROR("Unknown packet type 0x%02x from client \"%s\"", (unsigned char)m_ReceivedData[0], m_Username.c_str());
|
// TODO: QueueDestroy();
|
||||||
|
|
||||||
AString Reason;
|
|
||||||
Printf(Reason, "[C->S] Unknown PacketID: 0x%02x", (unsigned char)m_ReceivedData[0]);
|
|
||||||
cPacket_Disconnect DC(Reason);
|
|
||||||
m_Socket.Send(&DC);
|
|
||||||
cSleep::MilliSleep(1000); // Give packet some time to be received
|
cSleep::MilliSleep(1000); // Give packet some time to be received
|
||||||
Destroy();
|
Destroy();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int NumBytes = pPacket->Parse(m_ReceivedData.data() + 1, m_ReceivedData.size() - 1);
|
// Parse and handle all complete packets in m_ReceivedData:
|
||||||
|
while (m_ReceivedData.CanReadBytes(1))
|
||||||
|
{
|
||||||
|
unsigned char PacketType;
|
||||||
|
m_ReceivedData.ReadByte(PacketType);
|
||||||
|
cPacket* pPacket = m_PacketMap[PacketType];
|
||||||
|
if (pPacket == NULL)
|
||||||
|
{
|
||||||
|
LOGERROR("Unknown packet type 0x%02x from client \"%s\" @ %s", PacketType, m_Username.c_str(), m_Socket.GetIPString().c_str());
|
||||||
|
|
||||||
|
AString Reason;
|
||||||
|
Printf(Reason, "[C->S] Unknown PacketID: 0x%02x", PacketType);
|
||||||
|
SendDisconnect(Reason);
|
||||||
|
// TODO: QueueDestroy();
|
||||||
|
cSleep::MilliSleep(1000); // Give packet some time to be received
|
||||||
|
Destroy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int NumBytes = pPacket->Parse(m_ReceivedData);
|
||||||
if (NumBytes == PACKET_ERROR)
|
if (NumBytes == PACKET_ERROR)
|
||||||
{
|
{
|
||||||
LOGERROR("Protocol error while parsing packet type 0x%02x; disconnecting client \"%s\"", (unsigned char)m_ReceivedData[0], m_Username.c_str());
|
LOGERROR("Protocol error while parsing packet type 0x%02x; disconnecting client \"%s\"", PacketType, m_Username.c_str());
|
||||||
cPacket_Disconnect DC("Protocol error");
|
SendDisconnect("Protocol error");
|
||||||
m_Socket.Send(&DC);
|
// TODO: QueueDestroy();
|
||||||
cSleep::MilliSleep(1000); // Give packet some time to be received
|
cSleep::MilliSleep(1000); // Give packet some time to be received
|
||||||
Destroy();
|
Destroy();
|
||||||
return;
|
return;
|
||||||
@ -1486,6 +1508,7 @@ void cClientHandle::DataReceived(const char * a_Data, int a_Size)
|
|||||||
else if (NumBytes == PACKET_INCOMPLETE)
|
else if (NumBytes == PACKET_INCOMPLETE)
|
||||||
{
|
{
|
||||||
// Not a complete packet
|
// Not a complete packet
|
||||||
|
m_ReceivedData.ResetRead();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1493,10 +1516,9 @@ void cClientHandle::DataReceived(const char * a_Data, int a_Size)
|
|||||||
// Packet parsed successfully, add it to internal queue:
|
// Packet parsed successfully, add it to internal queue:
|
||||||
HandlePacket(pPacket);
|
HandlePacket(pPacket);
|
||||||
// Erase the packet from the buffer:
|
// Erase the packet from the buffer:
|
||||||
ASSERT(m_ReceivedData.size() > (size_t)NumBytes);
|
m_ReceivedData.CommitRead();
|
||||||
m_ReceivedData.erase(0, NumBytes + 1);
|
|
||||||
}
|
}
|
||||||
} // while (!Received.empty())
|
} // while (!Received.CanReadBytes(1))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include "packets/cPacket_WindowClose.h"
|
#include "packets/cPacket_WindowClose.h"
|
||||||
#include "packets/cPacket_UpdateSign.h"
|
#include "packets/cPacket_UpdateSign.h"
|
||||||
#include "packets/cPacket_Ping.h"
|
#include "packets/cPacket_Ping.h"
|
||||||
|
#include "ByteBuffer.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -101,6 +102,8 @@ public:
|
|||||||
|
|
||||||
void Send(const cPacket & a_Packet, ENUM_PRIORITY a_Priority = E_PRIORITY_NORMAL);
|
void Send(const cPacket & a_Packet, ENUM_PRIORITY a_Priority = E_PRIORITY_NORMAL);
|
||||||
|
|
||||||
|
void SendDisconnect(const AString & a_Reason);
|
||||||
|
|
||||||
const AString & GetUsername(void) const; //tolua_export
|
const AString & GetUsername(void) const; //tolua_export
|
||||||
|
|
||||||
inline short GetPing() const { return m_Ping; } //tolua_export
|
inline short GetPing() const { return m_Ping; } //tolua_export
|
||||||
@ -126,7 +129,7 @@ private:
|
|||||||
AString m_Username;
|
AString m_Username;
|
||||||
AString m_Password;
|
AString m_Password;
|
||||||
|
|
||||||
AString m_ReceivedData; // Accumulator for the data received from the socket, waiting to be parsed; accessed from the cSocketThreads' thread only!
|
cByteBuffer m_ReceivedData; // Accumulator for the data received from the socket, waiting to be parsed; accessed from the cSocketThreads' thread only!
|
||||||
|
|
||||||
cCriticalSection m_CSPackets;
|
cCriticalSection m_CSPackets;
|
||||||
PacketList m_PendingNrmSendPackets;
|
PacketList m_PendingNrmSendPackets;
|
||||||
|
@ -28,160 +28,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket::ReadString16(const char * a_Data, int a_Size, AString & a_OutString )
|
|
||||||
{
|
|
||||||
int TotalBytes = 0;
|
|
||||||
short StrLen;
|
|
||||||
HANDLE_PACKET_READ(ReadShort, StrLen, TotalBytes);
|
|
||||||
|
|
||||||
if (2 * StrLen > a_Size - TotalBytes)
|
|
||||||
{
|
|
||||||
// The string is not yet complete in the buffer
|
|
||||||
return PACKET_INCOMPLETE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Simple UTF-16 to UTF-8 conversion - discard higher bits, ignore multishort sequences:
|
|
||||||
a_OutString.clear();
|
|
||||||
a_OutString.reserve(StrLen);
|
|
||||||
short * UTF16 = (short *)(a_Data + TotalBytes);
|
|
||||||
for ( int i = 0; i < StrLen; ++i )
|
|
||||||
{
|
|
||||||
a_OutString.push_back( (char)ntohs(UTF16[i]) );
|
|
||||||
}
|
|
||||||
|
|
||||||
return TotalBytes + StrLen * sizeof(short);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket::ReadShort(const char * a_Data, int a_Size, short & a_OutShort )
|
|
||||||
{
|
|
||||||
if (a_Size < 2)
|
|
||||||
{
|
|
||||||
return PACKET_INCOMPLETE;
|
|
||||||
}
|
|
||||||
a_OutShort = ntohs(*((short *)a_Data));
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket::ReadInteger(const char * a_Data, int a_Size, int & a_OutInteger )
|
|
||||||
{
|
|
||||||
if (a_Size < 4)
|
|
||||||
{
|
|
||||||
return PACKET_INCOMPLETE;
|
|
||||||
}
|
|
||||||
a_OutInteger = ntohl(*((int *)a_Data));
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket::ReadInteger(const char * a_Data, int a_Size, unsigned int & a_OutInteger )
|
|
||||||
{
|
|
||||||
if (a_Size < 4)
|
|
||||||
{
|
|
||||||
return PACKET_INCOMPLETE;
|
|
||||||
}
|
|
||||||
a_OutInteger = ntohl(*((unsigned int *)a_Data));
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket::ReadFloat(const char * a_Data, int a_Size, float & a_OutFloat )
|
|
||||||
{
|
|
||||||
if (a_Size < sizeof(float))
|
|
||||||
{
|
|
||||||
return PACKET_INCOMPLETE;
|
|
||||||
}
|
|
||||||
a_OutFloat = NetworkToHostFloat4(a_Data);
|
|
||||||
return sizeof(float);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket::ReadDouble(const char * a_Data, int a_Size, double & a_OutDouble )
|
|
||||||
{
|
|
||||||
if (a_Size < sizeof(double))
|
|
||||||
{
|
|
||||||
return PACKET_INCOMPLETE;
|
|
||||||
}
|
|
||||||
a_OutDouble = NetworkToHostDouble8(a_Data);
|
|
||||||
return sizeof(double);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket::ReadByte(const char * a_Data, int a_Size, char & a_OutByte )
|
|
||||||
{
|
|
||||||
if (a_Size < 1)
|
|
||||||
{
|
|
||||||
return PACKET_INCOMPLETE;
|
|
||||||
}
|
|
||||||
a_OutByte = *a_Data;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket::ReadByte(const char * a_Data, int a_Size, unsigned char & a_OutByte )
|
|
||||||
{
|
|
||||||
if (a_Size < 1)
|
|
||||||
{
|
|
||||||
return PACKET_INCOMPLETE;
|
|
||||||
}
|
|
||||||
a_OutByte = *((unsigned char *)a_Data);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket::ReadLong(const char * a_Data, int a_Size, long long & a_OutLong )
|
|
||||||
{
|
|
||||||
if (a_Size < sizeof(a_OutLong))
|
|
||||||
{
|
|
||||||
return PACKET_INCOMPLETE;
|
|
||||||
}
|
|
||||||
a_OutLong = NetworkToHostLong8(a_Data);
|
|
||||||
return sizeof(a_OutLong);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket::ReadBool(const char * a_Data, int a_Size, bool & a_OutBool )
|
|
||||||
{
|
|
||||||
if (a_Size < sizeof(bool))
|
|
||||||
{
|
|
||||||
return PACKET_INCOMPLETE;
|
|
||||||
}
|
|
||||||
a_OutBool = (*a_Data != 0);
|
|
||||||
return sizeof(bool);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cPacket::AppendString(AString & a_Dst, const AString & a_String)
|
void cPacket::AppendString(AString & a_Dst, const AString & a_String)
|
||||||
{
|
{
|
||||||
AppendShort(a_Dst, (unsigned short)a_String.size());
|
AppendShort(a_Dst, (unsigned short)a_String.size());
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include "../cSocket.h"
|
#include "../cSocket.h"
|
||||||
#include "../PacketID.h"
|
#include "../PacketID.h"
|
||||||
|
#include "../ByteBuffer.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -10,6 +11,7 @@
|
|||||||
|
|
||||||
#define PACKET_INCOMPLETE -2
|
#define PACKET_INCOMPLETE -2
|
||||||
#define PACKET_ERROR -1
|
#define PACKET_ERROR -1
|
||||||
|
#define PACKET_OK 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -18,12 +20,11 @@
|
|||||||
// Use this macro to simplify handling several ReadXXX in a row. It assumes that you want [a_Data, a_Size] parsed (which is true for all Parse() functions)
|
// Use this macro to simplify handling several ReadXXX in a row. It assumes that you want [a_Data, a_Size] parsed (which is true for all Parse() functions)
|
||||||
#define HANDLE_PACKET_READ(Proc, Var, TotalBytes) \
|
#define HANDLE_PACKET_READ(Proc, Var, TotalBytes) \
|
||||||
{ \
|
{ \
|
||||||
int res = Proc(a_Data + TotalBytes, a_Size - TotalBytes, Var); \
|
if (!a_Buffer.Proc(Var)) \
|
||||||
if (res < 0) \
|
|
||||||
{ \
|
{ \
|
||||||
return res; \
|
return PACKET_INCOMPLETE; \
|
||||||
} \
|
} \
|
||||||
TotalBytes += res; \
|
TotalBytes = PACKET_OK; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -38,22 +39,23 @@ public:
|
|||||||
{}
|
{}
|
||||||
virtual ~cPacket() {}
|
virtual ~cPacket() {}
|
||||||
|
|
||||||
/// Called to parse the packet. Packet type has already been read and the correct packet type created. Return the number of characters processed, PACKET_INCOMPLETE for incomplete data, PACKET_ERROR for error
|
/// Called to parse the packet. Packet type has already been read and the correct packet type created. Return PACKET_INCOMPLETE for incomplete data, PACKET_ERROR for error, any positive number for success
|
||||||
virtual int Parse(const char * a_Data, int a_Size)
|
virtual int Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
UNUSED(a_Data);
|
// There are packets that are sent S->C only, those don't have a parsing function
|
||||||
UNUSED(a_Size);
|
UNUSED(a_Buffer);
|
||||||
LOGERROR("Undefined Parse function for packet type 0x%x\n", m_PacketID );
|
LOGERROR("Packet type 0x%02x has no parser defined!", m_PacketID);
|
||||||
ASSERT(!"Undefined Parse function");
|
ASSERT(!"Unparsed packet type!");
|
||||||
return -1;
|
return PACKET_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Called to serialize the packet into a string. Append all packet data to a_Data, including the packet type!
|
/// Called to serialize the packet into a string. Append all packet data to a_Data, including the packet type!
|
||||||
virtual void Serialize(AString & a_Data) const
|
virtual void Serialize(AString & a_Data) const
|
||||||
{
|
{
|
||||||
|
// There are packets that are sent C->S only, those don't have a serializing function
|
||||||
UNUSED(a_Data);
|
UNUSED(a_Data);
|
||||||
LOGERROR("Undefined Serialize function for packet type 0x%x\n", m_PacketID );
|
LOGERROR("Packet type 0x%02x has no serializer defined!", m_PacketID);
|
||||||
ASSERT(!"Undefined Serialize function");
|
ASSERT(!"Unserialized packet");
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual cPacket * Clone() const = 0;
|
virtual cPacket * Clone() const = 0;
|
||||||
@ -61,19 +63,6 @@ public:
|
|||||||
unsigned char m_PacketID;
|
unsigned char m_PacketID;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
// These return the number of characters processed, PACKET_INCOMPLETE for incomplete data, PACKET_ERROR for error:
|
|
||||||
static int ReadString16(const char * a_Data, int a_Size, AString & a_OutString );
|
|
||||||
static int ReadShort (const char * a_Data, int a_Size, short & a_Short );
|
|
||||||
static int ReadInteger (const char * a_Data, int a_Size, int & a_OutInteger );
|
|
||||||
static int ReadInteger (const char * a_Data, int a_Size, unsigned int & a_OutInteger );
|
|
||||||
static int ReadFloat (const char * a_Data, int a_Size, float & a_OutFloat );
|
|
||||||
static int ReadDouble (const char * a_Data, int a_Size, double & a_OutDouble );
|
|
||||||
static int ReadByte (const char * a_Data, int a_Size, char & a_OutByte );
|
|
||||||
static int ReadByte (const char * a_Data, int a_Size, unsigned char & a_OutByte );
|
|
||||||
static int ReadLong (const char * a_Data, int a_Size, long long & a_OutLong );
|
|
||||||
static int ReadBool (const char * a_Data, int a_Size, bool & a_OutBool );
|
|
||||||
|
|
||||||
// These append the data into the a_Dst string:
|
// These append the data into the a_Dst string:
|
||||||
static void AppendString ( AString & a_Dst, const AString & a_String);
|
static void AppendString ( AString & a_Dst, const AString & a_String);
|
||||||
static void AppendString16( AString & a_Dst, const AString & a_String);
|
static void AppendString16( AString & a_Dst, const AString & a_String);
|
||||||
|
@ -7,11 +7,11 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_13::Parse(const char * a_Data, int a_Size)
|
int cPacket_13::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_EntityID, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_EntityID, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte , m_ActionID, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_ActionID, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ public:
|
|||||||
{ m_PacketID = E_PACKET_13; }
|
{ m_PacketID = E_PACKET_13; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_13( *this ); }
|
virtual cPacket* Clone() const { return new cPacket_13( *this ); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
|
|
||||||
int m_EntityID;
|
int m_EntityID;
|
||||||
char m_ActionID;
|
char m_ActionID;
|
||||||
|
@ -7,11 +7,11 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_ArmAnim::Parse(const char * a_Data, int a_Size)
|
int cPacket_ArmAnim::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_EntityID, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_EntityID, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte , m_Animation, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_Animation, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ public:
|
|||||||
{ m_PacketID = E_ANIMATION; }
|
{ m_PacketID = E_ANIMATION; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_ArmAnim(*this); }
|
virtual cPacket* Clone() const { return new cPacket_ArmAnim(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
int m_EntityID;
|
int m_EntityID;
|
||||||
|
@ -20,14 +20,14 @@ void cPacket_BlockDig::Serialize(AString & a_Data) const
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_BlockDig::Parse(const char * a_Data, int a_Size)
|
int cPacket_BlockDig::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadByte, m_Status, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_Status, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_PosX, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_PosX, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte, m_PosY, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_PosY, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_PosZ, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_PosZ, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte, m_Direction, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_Direction, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ public:
|
|||||||
{ m_PacketID = E_BLOCK_DIG; } //tolua_export
|
{ m_PacketID = E_BLOCK_DIG; } //tolua_export
|
||||||
virtual cPacket* Clone() const { return new cPacket_BlockDig(*this); } //tolua_export
|
virtual cPacket* Clone() const { return new cPacket_BlockDig(*this); } //tolua_export
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
char m_Status; // tolua_export
|
char m_Status; // tolua_export
|
||||||
|
@ -8,16 +8,16 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_BlockPlace::Parse(const char * a_Data, int a_Size)
|
int cPacket_BlockPlace::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_PosX, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_PosX, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte, m_PosY, TotalBytes);
|
HANDLE_PACKET_READ(ReadByte, m_PosY, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_PosZ, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_PosZ, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte, m_Direction, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_Direction, TotalBytes);
|
||||||
|
|
||||||
cPacket_ItemData Item;
|
cPacket_ItemData Item;
|
||||||
int res = Item.Parse(a_Data + TotalBytes, a_Size - TotalBytes);
|
int res = Item.Parse(a_Buffer);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
{
|
{
|
||||||
return res;
|
return res;
|
||||||
|
@ -21,7 +21,7 @@ public:
|
|||||||
{ m_PacketID = E_BLOCK_PLACE; }
|
{ m_PacketID = E_BLOCK_PLACE; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_BlockPlace(*this); }
|
virtual cPacket* Clone() const { return new cPacket_BlockPlace(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
|
|
||||||
int m_PosX; //tolua_export
|
int m_PosX; //tolua_export
|
||||||
unsigned char m_PosY; //tolua_export
|
unsigned char m_PosY; //tolua_export
|
||||||
|
@ -7,10 +7,10 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_Chat::Parse(const char * a_Data, int a_Size)
|
int cPacket_Chat::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadString16, m_Message, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEUTF16String16, m_Message, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ public:
|
|||||||
cPacket_Chat( const std::string & a_Message ) : m_Message( a_Message) { m_PacketID = E_CHAT; }
|
cPacket_Chat( const std::string & a_Message ) : m_Message( a_Message) { m_PacketID = E_CHAT; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_Chat(*this); }
|
virtual cPacket* Clone() const { return new cPacket_Chat(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
AString m_Message;
|
AString m_Message;
|
||||||
|
@ -21,13 +21,13 @@ cPacket_CreativeInventoryAction::cPacket_CreativeInventoryAction( const cPacket_
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_CreativeInventoryAction::Parse(const char * a_Data, int a_Size)
|
int cPacket_CreativeInventoryAction::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadShort, m_Slot, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEShort, m_Slot, TotalBytes);
|
||||||
|
|
||||||
cPacket_ItemData Item;
|
cPacket_ItemData Item;
|
||||||
int res = Item.Parse(a_Data + TotalBytes, a_Size - TotalBytes);
|
int res = Item.Parse(a_Buffer);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
{
|
{
|
||||||
return res;
|
return res;
|
||||||
|
@ -21,7 +21,7 @@ public:
|
|||||||
cPacket_CreativeInventoryAction( const cPacket_CreativeInventoryAction & a_Copy );
|
cPacket_CreativeInventoryAction( const cPacket_CreativeInventoryAction & a_Copy );
|
||||||
virtual cPacket* Clone() const { return new cPacket_CreativeInventoryAction(*this); }
|
virtual cPacket* Clone() const { return new cPacket_CreativeInventoryAction(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
short m_Slot; // 0 = hold 1-4 = armor
|
short m_Slot; // 0 = hold 1-4 = armor
|
||||||
|
@ -7,10 +7,10 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_Disconnect::Parse(const char * a_Data, int a_Size)
|
int cPacket_Disconnect::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadString16, m_Reason, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEUTF16String16, m_Reason, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ public:
|
|||||||
cPacket_Disconnect(const AString & a_Reason) { m_PacketID = E_DISCONNECT; m_Reason = a_Reason; }
|
cPacket_Disconnect(const AString & a_Reason) { m_PacketID = E_DISCONNECT; m_Reason = a_Reason; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_Disconnect(*this); }
|
virtual cPacket* Clone() const { return new cPacket_Disconnect(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
AString m_Reason;
|
AString m_Reason;
|
||||||
|
@ -20,13 +20,13 @@ cPacket_EntityEquipment::cPacket_EntityEquipment( const cPacket_EntityEquipment
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_EntityEquipment::Parse(const char * a_Data, int a_Size)
|
int cPacket_EntityEquipment::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_UniqueID, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_UniqueID, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadShort, m_Slot, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEShort, m_Slot, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadShort, m_ItemID, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEShort, m_ItemID, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadShort, m_Short, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEShort, m_Short, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ public:
|
|||||||
cPacket_EntityEquipment( const cPacket_EntityEquipment & a_Copy );
|
cPacket_EntityEquipment( const cPacket_EntityEquipment & a_Copy );
|
||||||
virtual cPacket* Clone() const { return new cPacket_EntityEquipment(*this); }
|
virtual cPacket* Clone() const { return new cPacket_EntityEquipment(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
int m_UniqueID;
|
int m_UniqueID;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_Flying::Parse(const char * a_Data, int a_Size)
|
int cPacket_Flying::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes= 0;
|
int TotalBytes= 0;
|
||||||
HANDLE_PACKET_READ(ReadBool, m_bFlying, TotalBytes);
|
HANDLE_PACKET_READ(ReadBool, m_bFlying, TotalBytes);
|
||||||
|
@ -16,7 +16,7 @@ public:
|
|||||||
{ m_PacketID = E_FLYING; }
|
{ m_PacketID = E_FLYING; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_Flying(*this); }
|
virtual cPacket* Clone() const { return new cPacket_Flying(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
|
|
||||||
bool m_bFlying;
|
bool m_bFlying;
|
||||||
static const unsigned int c_Size = 2;
|
static const unsigned int c_Size = 2;
|
||||||
|
@ -7,10 +7,10 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_Handshake::Parse(const char * a_Data, int a_Size)
|
int cPacket_Handshake::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadString16, m_Username, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEUTF16String16, m_Username, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ public:
|
|||||||
cPacket_Handshake() { m_PacketID = E_HANDSHAKE; }
|
cPacket_Handshake() { m_PacketID = E_HANDSHAKE; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_Handshake(*this); }
|
virtual cPacket* Clone() const { return new cPacket_Handshake(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
std::string m_Username;
|
std::string m_Username;
|
||||||
|
@ -7,10 +7,10 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_ItemData::Parse(const char * a_Data, int a_Size)
|
int cPacket_ItemData::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadShort, m_ItemID, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEShort, m_ItemID, TotalBytes);
|
||||||
|
|
||||||
if (m_ItemID <= -1)
|
if (m_ItemID <= -1)
|
||||||
{
|
{
|
||||||
@ -19,12 +19,12 @@ int cPacket_ItemData::Parse(const char * a_Data, int a_Size)
|
|||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE_PACKET_READ(ReadByte , m_ItemCount, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_ItemCount, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadShort, m_ItemUses, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEShort, m_ItemUses, TotalBytes);
|
||||||
|
|
||||||
if (cItem::IsEnchantable((ENUM_ITEM_ID) m_ItemID))
|
if (cItem::IsEnchantable((ENUM_ITEM_ID) m_ItemID))
|
||||||
{
|
{
|
||||||
HANDLE_PACKET_READ(ReadShort, m_EnchantNums, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEShort, m_EnchantNums, TotalBytes);
|
||||||
|
|
||||||
if ( m_EnchantNums > -1 )
|
if ( m_EnchantNums > -1 )
|
||||||
{
|
{
|
||||||
|
@ -17,7 +17,7 @@ public:
|
|||||||
|
|
||||||
virtual cPacket* Clone() const { return new cPacket_ItemData(*this); }
|
virtual cPacket* Clone() const { return new cPacket_ItemData(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
|
|
||||||
static void AppendItem(AString & a_Data, short a_ItemID, char a_Quantity, short a_Damage);
|
static void AppendItem(AString & a_Data, short a_ItemID, char a_Quantity, short a_Damage);
|
||||||
static void AppendItem(AString & a_Data, const cItem * a_Item);
|
static void AppendItem(AString & a_Data, const cItem * a_Item);
|
||||||
|
@ -7,10 +7,10 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_ItemSwitch::Parse(const char * a_Data, int a_Size)
|
int cPacket_ItemSwitch::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadShort, m_SlotNum, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEShort, m_SlotNum, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ public:
|
|||||||
{ m_PacketID = E_ITEM_SWITCH; }
|
{ m_PacketID = E_ITEM_SWITCH; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_ItemSwitch(*this); }
|
virtual cPacket* Clone() const { return new cPacket_ItemSwitch(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
short m_SlotNum;
|
short m_SlotNum;
|
||||||
|
@ -17,10 +17,10 @@ void cPacket_KeepAlive::Serialize(AString & a_Data) const
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_KeepAlive::Parse(const char * a_Data, int a_Size)
|
int cPacket_KeepAlive::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_KeepAliveID, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_KeepAliveID, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ public:
|
|||||||
cPacket_KeepAlive(int a_PingID) { m_KeepAliveID = a_PingID; }
|
cPacket_KeepAlive(int a_PingID) { m_KeepAliveID = a_PingID; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_KeepAlive(*this); }
|
virtual cPacket* Clone() const { return new cPacket_KeepAlive(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
int m_KeepAliveID;
|
int m_KeepAliveID;
|
||||||
|
@ -14,17 +14,17 @@ const std::string cPacket_Login::LEVEL_TYPE_SUPERFLAT = "SUPERFLAT";
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_Login::Parse(const char * a_Data, int a_Size)
|
int cPacket_Login::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
//printf("Parse: NEW Login\n");
|
//printf("Parse: NEW Login\n");
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
m_Username.clear();
|
m_Username.clear();
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_ProtocolVersion, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_ProtocolVersion, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadString16, m_Username, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEUTF16String16, m_Username, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadString16, m_LevelType, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEUTF16String16, m_LevelType, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_ServerMode, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_ServerMode, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_Dimension, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_Dimension, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte, m_Difficulty, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_Difficulty, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte, m_WorldHeight, TotalBytes);
|
HANDLE_PACKET_READ(ReadByte, m_WorldHeight, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte, m_MaxPlayers, TotalBytes);
|
HANDLE_PACKET_READ(ReadByte, m_MaxPlayers, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
|
@ -21,7 +21,7 @@ public:
|
|||||||
{ m_PacketID = E_LOGIN; }
|
{ m_PacketID = E_LOGIN; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_Login(*this); }
|
virtual cPacket* Clone() const { return new cPacket_Login(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
int m_ProtocolVersion; //tolua_export
|
int m_ProtocolVersion; //tolua_export
|
||||||
|
@ -18,11 +18,11 @@ cPacket_NewInvalidState::cPacket_NewInvalidState( const cPacket_NewInvalidState
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_NewInvalidState::Parse(const char * a_Data, int a_Size)
|
int cPacket_NewInvalidState::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadByte, m_Reason, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_Reason, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte, m_GameMode, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_GameMode, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ public:
|
|||||||
cPacket_NewInvalidState( const cPacket_NewInvalidState & a_Copy );
|
cPacket_NewInvalidState( const cPacket_NewInvalidState & a_Copy );
|
||||||
virtual cPacket* Clone() const { return new cPacket_NewInvalidState(*this); }
|
virtual cPacket* Clone() const { return new cPacket_NewInvalidState(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
char m_Reason; // 0 = Invalid Bed, 1 = Begin Raining, 2 End Raining, 3 = Change Gamemode
|
char m_Reason; // 0 = Invalid Bed, 1 = Begin Raining, 2 End Raining, 3 = Change Gamemode
|
||||||
|
@ -7,19 +7,19 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_PickupSpawn::Parse(const char * a_Data, int a_Size)
|
int cPacket_PickupSpawn::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_UniqueID, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_UniqueID, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadShort, m_Item, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEShort, m_Item, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte, m_Count, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_Count, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadShort, m_Health, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEShort, m_Health, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_PosX, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_PosX, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_PosY, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_PosY, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_PosZ, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_PosZ, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte, m_Rotation, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_Rotation, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte, m_Pitch, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_Pitch, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte, m_Roll, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_Roll, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ public:
|
|||||||
{ m_PacketID = E_PICKUP_SPAWN; }
|
{ m_PacketID = E_PICKUP_SPAWN; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_PickupSpawn(*this); }
|
virtual cPacket* Clone() const { return new cPacket_PickupSpawn(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
int m_UniqueID;
|
int m_UniqueID;
|
||||||
|
@ -14,7 +14,7 @@ public:
|
|||||||
{ m_PacketID = E_PING; }
|
{ m_PacketID = E_PING; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_Ping(*this); }
|
virtual cPacket* Clone() const { return new cPacket_Ping(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override {return 0; }
|
virtual int Parse(cByteBuffer & a_Buffer) override {return 0; }
|
||||||
|
|
||||||
static const unsigned int c_Size = 1;
|
static const unsigned int c_Size = 1;
|
||||||
};
|
};
|
||||||
|
@ -22,17 +22,14 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// cPacket_PlayerAbilities:
|
// cPacket_PlayerAbilities:
|
||||||
|
|
||||||
int cPacket_PlayerAbilities::Parse(const char * a_Data, int a_Size)
|
int cPacket_PlayerAbilities::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
if (a_Size < 4)
|
int TotalBytes = 0;
|
||||||
{
|
HANDLE_PACKET_READ(ReadBool, m_Invulnerable, TotalBytes);
|
||||||
return PACKET_INCOMPLETE;
|
HANDLE_PACKET_READ(ReadBool, m_IsFlying, TotalBytes);
|
||||||
}
|
HANDLE_PACKET_READ(ReadBool, m_CanFly, TotalBytes);
|
||||||
m_Invulnerable = (a_Data[0] != 0);
|
HANDLE_PACKET_READ(ReadBool, m_InstaMine, TotalBytes);
|
||||||
m_IsFlying = (a_Data[1] != 0);
|
return TotalBytes;
|
||||||
m_CanFly = (a_Data[2] != 0);
|
|
||||||
m_InstaMine = (a_Data[3] != 0);
|
|
||||||
return 4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -69,12 +66,12 @@ cPacket_PlayerListItem::cPacket_PlayerListItem(const AString & a_PlayerName, boo
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_PlayerListItem::Parse(const char * a_Data, int a_Size)
|
int cPacket_PlayerListItem::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadString16, m_PlayerName, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEUTF16String16, m_PlayerName, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadBool, m_Online, TotalBytes);
|
HANDLE_PACKET_READ(ReadBool, m_Online, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadShort, m_Ping, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEShort, m_Ping, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,11 +116,11 @@ cPacket_PlayerLook::cPacket_PlayerLook( cPlayer* a_Player )
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_PlayerLook::Parse(const char * a_Data, int a_Size)
|
int cPacket_PlayerLook::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadFloat, m_Rotation, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEFloat, m_Rotation, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadFloat, m_Pitch, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEFloat, m_Pitch, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadBool, m_bFlying, TotalBytes);
|
HANDLE_PACKET_READ(ReadBool, m_bFlying, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
@ -162,15 +159,15 @@ cPacket_PlayerMoveLook::cPacket_PlayerMoveLook( cPlayer* a_Player )
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_PlayerMoveLook::Parse(const char * a_Data, int a_Size)
|
int cPacket_PlayerMoveLook::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadDouble, m_PosX, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEDouble, m_PosX, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadDouble, m_PosY, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEDouble, m_PosY, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadDouble, m_Stance, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEDouble, m_Stance, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadDouble, m_PosZ, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEDouble, m_PosZ, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadFloat, m_Rotation, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEFloat, m_Rotation, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadFloat, m_Pitch, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEFloat, m_Pitch, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadBool, m_bFlying, TotalBytes);
|
HANDLE_PACKET_READ(ReadBool, m_bFlying, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
@ -213,13 +210,13 @@ cPacket_PlayerPosition::cPacket_PlayerPosition( cPlayer* a_Player )
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_PlayerPosition::Parse(const char * a_Data, int a_Size)
|
int cPacket_PlayerPosition::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadDouble, m_PosX, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEDouble, m_PosX, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadDouble, m_PosY, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEDouble, m_PosY, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadDouble, m_Stance, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEDouble, m_Stance, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadDouble, m_PosZ, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEDouble, m_PosZ, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadBool, m_bFlying, TotalBytes);
|
HANDLE_PACKET_READ(ReadBool, m_bFlying, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,7 @@ class cPacket_PlayerAbilities : public cPacket
|
|||||||
public:
|
public:
|
||||||
cPacket_PlayerAbilities(void) { m_PacketID = E_PLAYER_LIST_ITEM; }
|
cPacket_PlayerAbilities(void) { m_PacketID = E_PLAYER_LIST_ITEM; }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
virtual cPacket * Clone() const { return new cPacket_PlayerAbilities(*this); }
|
virtual cPacket * Clone() const { return new cPacket_PlayerAbilities(*this); }
|
||||||
@ -54,7 +54,7 @@ public:
|
|||||||
cPacket_PlayerListItem() { m_PacketID = E_PLAYER_LIST_ITEM; }
|
cPacket_PlayerListItem() { m_PacketID = E_PLAYER_LIST_ITEM; }
|
||||||
cPacket_PlayerListItem(const AString & a_PlayerName, bool a_Online, short a_Ping);
|
cPacket_PlayerListItem(const AString & a_PlayerName, bool a_Online, short a_Ping);
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
virtual cPacket* Clone() const { return new cPacket_PlayerListItem(*this); }
|
virtual cPacket* Clone() const { return new cPacket_PlayerListItem(*this); }
|
||||||
@ -79,7 +79,7 @@ public:
|
|||||||
cPacket_PlayerLook( cPlayer* a_Player );
|
cPacket_PlayerLook( cPlayer* a_Player );
|
||||||
virtual cPacket* Clone() const { return new cPacket_PlayerLook(*this); }
|
virtual cPacket* Clone() const { return new cPacket_PlayerLook(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
float m_Rotation;
|
float m_Rotation;
|
||||||
@ -106,7 +106,7 @@ public:
|
|||||||
cPacket_PlayerMoveLook( cPlayer* a_Player );
|
cPacket_PlayerMoveLook( cPlayer* a_Player );
|
||||||
virtual cPacket* Clone() const { return new cPacket_PlayerMoveLook(*this); }
|
virtual cPacket* Clone() const { return new cPacket_PlayerMoveLook(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
double m_PosX;
|
double m_PosX;
|
||||||
@ -135,7 +135,7 @@ public:
|
|||||||
{ m_PacketID = E_PLAYERPOS; }
|
{ m_PacketID = E_PLAYERPOS; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_PlayerPosition(*this); }
|
virtual cPacket* Clone() const { return new cPacket_PlayerPosition(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
double m_PosX;
|
double m_PosX;
|
||||||
|
@ -22,15 +22,15 @@ void cPacket_Respawn::Serialize(AString & a_Data) const
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_Respawn::Parse(const char * a_Data, int a_Size)
|
int cPacket_Respawn::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
|
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_Dimension, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_Dimension, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte, m_Difficulty, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_Difficulty, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte, m_CreativeMode, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_CreativeMode, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadShort, m_WorldHeight, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEShort, m_WorldHeight, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadString16, m_LevelType, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEUTF16String16, m_LevelType, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ public:
|
|||||||
|
|
||||||
virtual cPacket* Clone() const { return new cPacket_Respawn( *this ); }
|
virtual cPacket* Clone() const { return new cPacket_Respawn( *this ); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
int m_Dimension;
|
int m_Dimension;
|
||||||
|
@ -7,10 +7,10 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_TimeUpdate::Parse(const char * a_Data, int a_Size)
|
int cPacket_TimeUpdate::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadLong, m_Time, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt64, m_Time, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ public:
|
|||||||
cPacket_TimeUpdate( long long a_Time ) { m_PacketID = E_UPDATE_TIME; m_Time = a_Time; }
|
cPacket_TimeUpdate( long long a_Time ) { m_PacketID = E_UPDATE_TIME; m_Time = a_Time; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_TimeUpdate(*this); }
|
virtual cPacket* Clone() const { return new cPacket_TimeUpdate(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
long long m_Time;
|
long long m_Time;
|
||||||
|
@ -7,16 +7,16 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_UpdateSign::Parse(const char * a_Data, int a_Size)
|
int cPacket_UpdateSign::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_PosX, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_PosX, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadShort, m_PosY, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEShort, m_PosY, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_PosZ, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_PosZ, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadString16, m_Line1, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEUTF16String16, m_Line1, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadString16, m_Line2, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEUTF16String16, m_Line2, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadString16, m_Line3, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEUTF16String16, m_Line3, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadString16, m_Line4, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEUTF16String16, m_Line4, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ public:
|
|||||||
{ m_PacketID = E_UPDATE_SIGN; }
|
{ m_PacketID = E_UPDATE_SIGN; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_UpdateSign( *this ); }
|
virtual cPacket* Clone() const { return new cPacket_UpdateSign( *this ); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
int m_PosX;
|
int m_PosX;
|
||||||
|
@ -7,11 +7,11 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_UseEntity::Parse(const char * a_Data, int a_Size)
|
int cPacket_UseEntity::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_UniqueID, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_UniqueID, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadInteger, m_TargetID, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEInt, m_TargetID, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadBool, m_bLeftClick, TotalBytes);
|
HANDLE_PACKET_READ(ReadBool, m_bLeftClick, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ public:
|
|||||||
{ m_PacketID = E_USE_ENTITY; }
|
{ m_PacketID = E_USE_ENTITY; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_UseEntity(*this); }
|
virtual cPacket* Clone() const { return new cPacket_UseEntity(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
|
|
||||||
int m_UniqueID;
|
int m_UniqueID;
|
||||||
int m_TargetID;
|
int m_TargetID;
|
||||||
|
@ -9,18 +9,17 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_WindowClick::Parse(const char * a_Data, int a_Size)
|
int cPacket_WindowClick::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadByte, m_WindowID, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_WindowID, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadShort, m_SlotNum, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEShort, m_SlotNum, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadByte, m_RightMouse, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_RightMouse, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadShort, m_NumClicks, TotalBytes);
|
HANDLE_PACKET_READ(ReadBEShort, m_NumClicks, TotalBytes);
|
||||||
HANDLE_PACKET_READ(ReadBool, m_IsShiftPressed, TotalBytes);
|
HANDLE_PACKET_READ(ReadBool, m_IsShiftPressed, TotalBytes);
|
||||||
|
|
||||||
cPacket_ItemData Item;
|
cPacket_ItemData Item;
|
||||||
|
int res = Item.Parse(a_Buffer);
|
||||||
int res = Item.Parse(a_Data + TotalBytes, a_Size - TotalBytes);
|
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
{
|
{
|
||||||
return res;
|
return res;
|
||||||
|
@ -23,7 +23,7 @@ public:
|
|||||||
{ m_PacketID = E_WINDOW_CLICK; }
|
{ m_PacketID = E_WINDOW_CLICK; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_WindowClick(*this); }
|
virtual cPacket* Clone() const { return new cPacket_WindowClick(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
|
|
||||||
char m_WindowID;
|
char m_WindowID;
|
||||||
short m_SlotNum; // Slot
|
short m_SlotNum; // Slot
|
||||||
|
@ -7,10 +7,10 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cPacket_WindowClose::Parse(const char * a_Data, int a_Size)
|
int cPacket_WindowClose::Parse(cByteBuffer & a_Buffer)
|
||||||
{
|
{
|
||||||
int TotalBytes = 0;
|
int TotalBytes = 0;
|
||||||
HANDLE_PACKET_READ(ReadByte, m_Close, TotalBytes);
|
HANDLE_PACKET_READ(ReadChar, m_Close, TotalBytes);
|
||||||
return TotalBytes;
|
return TotalBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ public:
|
|||||||
{ m_PacketID = E_WINDOW_CLOSE; }
|
{ m_PacketID = E_WINDOW_CLOSE; }
|
||||||
virtual cPacket* Clone() const { return new cPacket_WindowClose(*this); }
|
virtual cPacket* Clone() const { return new cPacket_WindowClose(*this); }
|
||||||
|
|
||||||
virtual int Parse(const char * a_Data, int a_Size) override;
|
virtual int Parse(cByteBuffer & a_Buffer) override;
|
||||||
virtual void Serialize(AString & a_Data) const override;
|
virtual void Serialize(AString & a_Data) const override;
|
||||||
|
|
||||||
char m_Close; // m_Close == cWindow WindowType number
|
char m_Close; // m_Close == cWindow WindowType number
|
||||||
|
Loading…
Reference in New Issue
Block a user