summaryrefslogblamecommitdiffstats
path: root/source/packets/cPacket_Player.cpp
blob: d0acc17d0d4044e669a8c6087982e13331bfa40e (plain) (tree)























                                                                                                                       
                                                          
 





                                                                 





 














                                                                                                                       
                                                         

                           


                                                                          






                          




                                                                                                                       



                                               





 
                                                     

                           


                                                                  






                          


                                                                                                                       
                                                                        
 
                                        






                                                                                                                          





 
                                                         
 

                                                                    
                           






                                                                   
                                                                                                                                  






                          


                                                                                                                       
                                                                        


                                 




                                             





 
                                                         

                           




                                                                   
                                                                                                                                      





                          

// 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;
}