From 2786ad306abe7487e3fc6bed1123ca8ebc2c3198 Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Mon, 19 Mar 2012 17:15:35 +0000 Subject: [PATCH] Fixed player heads always pointing north (new EntityHeadLook packet) git-svn-id: http://mc-server.googlecode.com/svn/trunk@424 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/PacketID.h | 1 + source/cMonster.cpp | 2 +- source/cPlayer.cpp | 10 +++++-- source/cServer.cpp | 10 ++++--- source/packets/cPacket_EntityLook.cpp | 37 +++++++++++++++++++++++--- source/packets/cPacket_EntityLook.h | 38 ++++++++++++++++++++++----- 6 files changed, 82 insertions(+), 16 deletions(-) diff --git a/source/PacketID.h b/source/PacketID.h index 374947b22..b10bc54be 100644 --- a/source/PacketID.h +++ b/source/PacketID.h @@ -33,6 +33,7 @@ enum ENUM_PACKET_ID E_ENT_LOOK = 0x20, E_REL_ENT_MOVE_LOOK = 0x21, E_ENT_TELEPORT = 0x22, + E_ENT_HEAD_LOOK = 0x23, E_ENT_STATUS = 0x26, E_METADATA = 0x28, E_PRE_CHUNK = 0x32, diff --git a/source/cMonster.cpp b/source/cMonster.cpp index 15fb16fc3..1820bae4d 100644 --- a/source/cMonster.cpp +++ b/source/cMonster.cpp @@ -207,7 +207,7 @@ void cMonster::ReplicateMovement() { if(m_bDirtyOrientation && !m_bDirtyPosition) { - cPacket_EntityLook EntityLook( this ); + cPacket_EntityLook EntityLook(*this); m_World->BroadcastToChunk(m_ChunkX, m_ChunkY, m_ChunkZ, EntityLook ); m_bDirtyOrientation = false; } diff --git a/source/cPlayer.cpp b/source/cPlayer.cpp index 9d1fe7ea4..cf007bb98 100644 --- a/source/cPlayer.cpp +++ b/source/cPlayer.cpp @@ -69,6 +69,10 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName) , m_Color('-') , m_ClientHandle( a_Client ) { + LOGD("Created a player object for \"%s\" @ \"%s\" at %p, ID %d", + a_PlayerName.c_str(), a_Client->GetSocket().GetIPString().c_str(), + this, GetUniqueID() + ); m_EntityType = eEntityType_Player; SetMaxHealth(20); SetMaxFoodLevel(125); @@ -113,7 +117,7 @@ void cPlayer::Initialize( cWorld* a_World ) cPlayer::~cPlayer(void) { - LOG("Deleting cPlayer \"%s\" @ %p", m_PlayerName.c_str(), this); + LOG("Deleting cPlayer \"%s\" at %p, ID %d", m_PlayerName.c_str(), this, GetUniqueID()); SaveToDisk(); @@ -183,8 +187,10 @@ void cPlayer::Tick(float a_Dt) if (m_bDirtyOrientation && !m_bDirtyPosition) { - cPacket_EntityLook EntityLook( this ); + cPacket_EntityLook EntityLook(*this); m_World->BroadcastToChunk(m_ChunkX, m_ChunkY, m_ChunkZ, EntityLook, m_ClientHandle ); + cPacket_EntityHeadLook EntityHeadLook(*this); + m_World->BroadcastToChunk(m_ChunkX, m_ChunkY, m_ChunkZ, EntityHeadLook, m_ClientHandle); m_bDirtyOrientation = false; } else if (m_bDirtyPosition ) diff --git a/source/cServer.cpp b/source/cServer.cpp index 39b74464d..ceee46fa0 100644 --- a/source/cServer.cpp +++ b/source/cServer.cpp @@ -269,13 +269,17 @@ cServer::cServer() cServer::~cServer() { - if( m_pState->SListenClient ) m_pState->SListenClient.CloseSocket(); + // TODO: Shut down the server gracefully + if ( m_pState->SListenClient ) + { + m_pState->SListenClient.CloseSocket(); + } m_pState->SListenClient = 0; m_pState->bStopListenThread = true; - delete m_pState->pListenThread; m_pState->pListenThread = 0; + delete m_pState->pListenThread; m_pState->pListenThread = NULL; m_pState->bStopTickThread = true; - delete m_pState->pTickThread; m_pState->pTickThread = 0; + delete m_pState->pTickThread; m_pState->pTickThread = NULL; delete m_pState; } diff --git a/source/packets/cPacket_EntityLook.cpp b/source/packets/cPacket_EntityLook.cpp index 3e0f2bd65..d25f788c0 100644 --- a/source/packets/cPacket_EntityLook.cpp +++ b/source/packets/cPacket_EntityLook.cpp @@ -9,13 +9,16 @@ -cPacket_EntityLook::cPacket_EntityLook(cEntity* a_Entity) +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// cPacket_EntityLook: + +cPacket_EntityLook::cPacket_EntityLook(const cEntity & a_Entity) { m_PacketID = E_ENT_LOOK; - m_UniqueID = a_Entity->GetUniqueID(); - m_Rotation = (char)((a_Entity->GetRotation() / 360.f) * 256); - m_Pitch = (char)((a_Entity->GetPitch() / 360.f) * 256); + m_UniqueID = a_Entity.GetUniqueID(); + m_Rotation = (char)((a_Entity.GetRotation() / 360.f) * 256); + m_Pitch = (char)((a_Entity.GetPitch() / 360.f) * 256); } @@ -33,3 +36,29 @@ void cPacket_EntityLook::Serialize(AString & a_Data) const + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// cPacket_EntityHeadLook: + +cPacket_EntityHeadLook::cPacket_EntityHeadLook(const cEntity & a_Entity) +{ + m_PacketID = E_ENT_HEAD_LOOK; + + m_UniqueID = a_Entity.GetUniqueID(); + m_HeadYaw = (char)((a_Entity.GetRotation() / 360.f) * 256); +} + + + + + +void cPacket_EntityHeadLook::Serialize(AString & a_Data) const +{ + AppendByte (a_Data, m_PacketID); + AppendInteger(a_Data, m_UniqueID); + AppendByte (a_Data, m_HeadYaw); +} + + + + diff --git a/source/packets/cPacket_EntityLook.h b/source/packets/cPacket_EntityLook.h index 407f9c1da..e4aac18e3 100644 --- a/source/packets/cPacket_EntityLook.h +++ b/source/packets/cPacket_EntityLook.h @@ -8,24 +8,50 @@ class cEntity; -class cPacket_EntityLook : public cPacket + + + + + +class cPacket_EntityLook : + public cPacket { public: - cPacket_EntityLook() + cPacket_EntityLook(void) : m_UniqueID( 0 ) , m_Rotation( 0 ) , m_Pitch( 0 ) { m_PacketID = E_ENT_LOOK; } - cPacket_EntityLook(cEntity* a_Entity); - virtual cPacket* Clone() const { return new cPacket_EntityLook(*this); } + cPacket_EntityLook(const cEntity & a_Entity); + virtual cPacket* Clone(void) const { return new cPacket_EntityLook(*this); } virtual void Serialize(AString & a_Data) const override; int m_UniqueID; char m_Rotation; char m_Pitch; - - static const unsigned int c_Size = 1 + 4 + 1 + 1; +}; + + + + + +class cPacket_EntityHeadLook : + public cPacket +{ +public: + cPacket_EntityHeadLook(void) + : m_UniqueID( 0 ) + , m_HeadYaw( 0 ) + { m_PacketID = E_ENT_LOOK; } + cPacket_EntityHeadLook(const cEntity & a_Entity); + + virtual cPacket * Clone(void) const { return new cPacket_EntityHeadLook(*this); } + + virtual void Serialize(AString & a_Data) const override; + + int m_UniqueID; + char m_HeadYaw; };