// cPacket_Player.cpp
/* Implements the player-related packets:
- PlayerAbilities (0xca)
- PlayerListItem (0xc9)
- PlayerLook (0x0c)
- PlayerMoveLook (0x0d)
- PlayerPosition (0x0b)
*/
#include "Globals.h"
#include "cPacket_Player.h"
#include "../cPlayer.h"
#include "../cChatColor.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// cPacket_PlayerAbilities:
int cPacket_PlayerAbilities::Parse(cByteBuffer & a_Buffer)
{
int TotalBytes = 0;
HANDLE_PACKET_READ(ReadBool, m_Invulnerable, TotalBytes);
HANDLE_PACKET_READ(ReadBool, m_IsFlying, TotalBytes);
HANDLE_PACKET_READ(ReadBool, m_CanFly, TotalBytes);
HANDLE_PACKET_READ(ReadBool, m_InstaMine, TotalBytes);
return TotalBytes;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// cPacket_PlayerListItem:
cPacket_PlayerListItem::cPacket_PlayerListItem(const AString & a_PlayerName, bool a_Online, short a_Ping)
{
m_PacketID = E_PLAYER_LIST_ITEM;
m_PlayerName = a_PlayerName;
m_Online = a_Online;
m_Ping = a_Ping;
}
int cPacket_PlayerListItem::Parse(cByteBuffer & a_Buffer)
{
int TotalBytes = 0;
HANDLE_PACKET_READ(ReadBEUTF16String16, m_PlayerName, TotalBytes);
HANDLE_PACKET_READ(ReadBool, m_Online, TotalBytes);
HANDLE_PACKET_READ(ReadBEShort, m_Ping, TotalBytes);
return TotalBytes;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// cPacket_PlayerLook:
cPacket_PlayerLook::cPacket_PlayerLook( cPlayer* a_Player )
{
m_PacketID = E_PLAYERLOOK;
m_Rotation = a_Player->GetRotation();
m_Pitch = a_Player->GetPitch();
m_IsOnGround = a_Player->IsOnGround();
}
int cPacket_PlayerLook::Parse(cByteBuffer & a_Buffer)
{
int TotalBytes = 0;
HANDLE_PACKET_READ(ReadBEFloat, m_Rotation, TotalBytes);
HANDLE_PACKET_READ(ReadBEFloat, m_Pitch, TotalBytes);
HANDLE_PACKET_READ(ReadBool, m_IsOnGround, TotalBytes);
return TotalBytes;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// cPacket_PlayerMoveLook:
cPacket_PlayerMoveLook::cPacket_PlayerMoveLook(const cPlayer & a_Player)
{
m_PacketID = E_PLAYERMOVELOOK;
m_PosX = a_Player.GetPosX();
m_PosY = a_Player.GetPosY() + 0.03; // Add a small amount so that the player doesn't start inside a block
m_PosZ = a_Player.GetPosZ();
m_Stance = a_Player.GetStance() + 0.03; // Add a small amount so that the player doesn't start inside a block
m_Rotation = a_Player.GetRotation();
m_Pitch = a_Player.GetPitch();
m_IsOnGround = a_Player.IsOnGround();
}
int cPacket_PlayerMoveLook::Parse(cByteBuffer & a_Buffer)
{
// NOTE that Stance and Y are swapped when sent C->S vs S->C
// This is the C->S case:
int TotalBytes = 0;
HANDLE_PACKET_READ(ReadBEDouble, m_PosX, TotalBytes);
HANDLE_PACKET_READ(ReadBEDouble, m_PosY, TotalBytes);
HANDLE_PACKET_READ(ReadBEDouble, m_Stance, TotalBytes);
HANDLE_PACKET_READ(ReadBEDouble, m_PosZ, TotalBytes);
HANDLE_PACKET_READ(ReadBEFloat, m_Rotation, TotalBytes);
HANDLE_PACKET_READ(ReadBEFloat, m_Pitch, TotalBytes);
HANDLE_PACKET_READ(ReadBool, m_IsOnGround, TotalBytes);
// LOGD("Recv PML: {%0.2f, %0.2f, %0.2f}, Stance %0.2f, Gnd: %d", m_PosX, m_PosY, m_PosZ, m_Stance, m_IsOnGround ? 1 : 0);
return TotalBytes;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// cPacket_PlayerPosition:
cPacket_PlayerPosition::cPacket_PlayerPosition(const cPlayer & a_Player)
{
m_PacketID = E_PLAYERPOS;
m_PosX = a_Player.GetPosX();
m_PosY = a_Player.GetPosY();
m_PosZ = a_Player.GetPosZ();
m_Stance = a_Player.GetStance();
m_IsOnGround = a_Player.IsOnGround();
}
int cPacket_PlayerPosition::Parse(cByteBuffer & a_Buffer)
{
int TotalBytes = 0;
HANDLE_PACKET_READ(ReadBEDouble, m_PosX, TotalBytes);
HANDLE_PACKET_READ(ReadBEDouble, m_PosY, TotalBytes);
HANDLE_PACKET_READ(ReadBEDouble, m_Stance, TotalBytes);
HANDLE_PACKET_READ(ReadBEDouble, m_PosZ, TotalBytes);
HANDLE_PACKET_READ(ReadBool, m_IsOnGround, TotalBytes);
// LOGD("Recv PlayerPos: {%0.2f %0.2f %0.2f}, Stance %0.2f, Gnd: %d", m_PosX, m_PosY, m_PosZ, m_Stance, m_IsOnGround ? 1 : 0);
return TotalBytes;
}