// 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(const char * a_Data, int a_Size) { if (a_Size < 4) { return PACKET_INCOMPLETE; } m_Invulnerable = (a_Data[0] != 0); m_IsFlying = (a_Data[1] != 0); m_CanFly = (a_Data[2] != 0); m_InstaMine = (a_Data[3] != 0); return 4; } void cPacket_PlayerAbilities::Serialize(AString & a_Data) const { char Data[5]; Data[0] = m_PacketID; Data[1] = (char)m_Invulnerable; Data[2] = (char)m_IsFlying; Data[3] = (char)m_CanFly; Data[4] = (char)m_InstaMine; a_Data.append(Data, 5); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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(const char * a_Data, int a_Size) { int TotalBytes = 0; HANDLE_PACKET_READ(ReadString16, m_PlayerName, TotalBytes); HANDLE_PACKET_READ(ReadBool, m_Online, TotalBytes); HANDLE_PACKET_READ(ReadShort, m_Ping, TotalBytes); return TotalBytes; } void cPacket_PlayerListItem::Serialize(AString & a_Data) const { AString PlayerName(m_PlayerName); if (PlayerName.length() > 16) { PlayerName.erase(16); } else if (PlayerName.length() <= 14) { PlayerName += cChatColor::White; } AppendByte (a_Data, m_PacketID); AppendString16(a_Data, PlayerName); AppendBool (a_Data, m_Online); AppendShort (a_Data, m_Ping); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cPacket_PlayerLook: cPacket_PlayerLook::cPacket_PlayerLook( cPlayer* a_Player ) { m_PacketID = E_PLAYERLOOK; m_Rotation = a_Player->GetRotation(); m_Pitch = a_Player->GetPitch(); m_bFlying = a_Player->GetFlying(); } int cPacket_PlayerLook::Parse(const char * a_Data, int a_Size) { int TotalBytes = 0; HANDLE_PACKET_READ(ReadFloat, m_Rotation, TotalBytes); HANDLE_PACKET_READ(ReadFloat, m_Pitch, TotalBytes); HANDLE_PACKET_READ(ReadBool, m_bFlying, TotalBytes); return TotalBytes; } void cPacket_PlayerLook::Serialize(AString & a_Data) const { AppendByte (a_Data, m_PacketID); AppendFloat (a_Data, m_Rotation); AppendFloat (a_Data, m_Pitch); AppendBool (a_Data, m_bFlying); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cPacket_PlayerMoveLook: cPacket_PlayerMoveLook::cPacket_PlayerMoveLook( cPlayer* a_Player ) { m_PacketID = E_PLAYERMOVELOOK; m_PosX = a_Player->GetPosX(); m_PosY = a_Player->GetPosY() + 1.65; m_PosZ = a_Player->GetPosZ(); m_Stance = a_Player->GetStance(); m_Rotation = a_Player->GetRotation(); m_Pitch = a_Player->GetPitch(); m_bFlying = a_Player->GetFlying(); } int cPacket_PlayerMoveLook::Parse(const char * a_Data, int a_Size) { int TotalBytes = 0; HANDLE_PACKET_READ(ReadDouble, m_PosX, TotalBytes); HANDLE_PACKET_READ(ReadDouble, m_PosY, TotalBytes); HANDLE_PACKET_READ(ReadDouble, m_Stance, TotalBytes); HANDLE_PACKET_READ(ReadDouble, m_PosZ, TotalBytes); HANDLE_PACKET_READ(ReadFloat, m_Rotation, TotalBytes); HANDLE_PACKET_READ(ReadFloat, m_Pitch, TotalBytes); HANDLE_PACKET_READ(ReadBool, m_bFlying, TotalBytes); return TotalBytes; } void cPacket_PlayerMoveLook::Serialize(AString & a_Data) const { AppendByte (a_Data, m_PacketID); AppendDouble(a_Data, m_PosX); AppendDouble(a_Data, m_PosY); AppendDouble(a_Data, m_Stance); AppendDouble(a_Data, m_PosZ); AppendFloat (a_Data, m_Rotation); AppendFloat (a_Data, m_Pitch); AppendBool (a_Data, m_bFlying); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cPacket_PlayerPosition: cPacket_PlayerPosition::cPacket_PlayerPosition( cPlayer* a_Player ) { m_PacketID = E_PLAYERPOS; m_PosX = a_Player->GetPosX(); m_PosY = a_Player->GetPosY() + 1.65; m_PosZ = a_Player->GetPosZ(); m_Stance = a_Player->GetStance(); m_bFlying = a_Player->GetFlying(); } int cPacket_PlayerPosition::Parse(const char * a_Data, int a_Size) { int TotalBytes = 0; HANDLE_PACKET_READ(ReadDouble, m_PosX, TotalBytes); HANDLE_PACKET_READ(ReadDouble, m_PosY, TotalBytes); HANDLE_PACKET_READ(ReadDouble, m_Stance, TotalBytes); HANDLE_PACKET_READ(ReadDouble, m_PosZ, TotalBytes); HANDLE_PACKET_READ(ReadBool, m_bFlying, TotalBytes); return TotalBytes; } void cPacket_PlayerPosition::Serialize(AString & a_Data) const { AppendByte (a_Data, m_PacketID); AppendDouble (a_Data, m_PosX); AppendDouble (a_Data, m_PosY); AppendDouble (a_Data, m_Stance); AppendDouble (a_Data, m_PosZ); AppendBool (a_Data, m_bFlying); }