diff --git a/source/Chunk.cpp b/source/Chunk.cpp index c33ba360..60ec273b 100644 --- a/source/Chunk.cpp +++ b/source/Chunk.cpp @@ -2592,7 +2592,7 @@ void cChunk::BroadcastEntityStatus(const cEntity & a_Entity, char a_Status, cons -void cChunk::BroadcastMetadata(const cPawn & a_Pawn, const cClientHandle * a_Exclude) +void cChunk::BroadcastMetadata(const cEntity & a_Entity, const cClientHandle * a_Exclude) { for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr ) { @@ -2600,7 +2600,7 @@ void cChunk::BroadcastMetadata(const cPawn & a_Pawn, const cClientHandle * a_Exc { continue; } - (*itr)->SendMetadata(a_Pawn); + (*itr)->SendMetadata(a_Entity); } // for itr - LoadedByClient[] } diff --git a/source/Chunk.h b/source/Chunk.h index a1a6bc1d..a96d96ef 100644 --- a/source/Chunk.h +++ b/source/Chunk.h @@ -241,7 +241,7 @@ public: void BroadcastBlockAction (int a_BlockX, int a_BlockY, int a_BlockZ, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType, const cClientHandle * a_Exclude = NULL); void BroadcastDestroyEntity (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL); void BroadcastEntityStatus (const cEntity & a_Entity, char a_Status, const cClientHandle * a_Exclude = NULL); - void BroadcastMetadata (const cPawn & a_Pawn, const cClientHandle * a_Exclude = NULL); + void BroadcastMetadata (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL); void BroadcastSpawn (cEntity & a_Entity, const cClientHandle * a_Exclude = NULL); void BroadcastBlockEntity (int a_BlockX, int a_BlockY, int a_BlockZ, const cClientHandle * a_Exclude = NULL); void BroadcastCollectPickup (const cPickup & a_Pickup, const cPlayer & a_Player, const cClientHandle * a_Exclude = NULL); diff --git a/source/ClientHandle.cpp b/source/ClientHandle.cpp index a57e7137..0eb24e9e 100644 --- a/source/ClientHandle.cpp +++ b/source/ClientHandle.cpp @@ -1170,9 +1170,23 @@ void cClientHandle::HandleEntityAction(int a_EntityID, char a_ActionID) return; } - if( a_ActionID == 3 ) // Leave bed + switch (a_ActionID) { - m_Player->GetWorld()->BroadcastPlayerAnimation( *m_Player, 3 ); + case 1: // crouch + { + m_Player->SetCrouch(true); + break; + } + case 2: // uncrouch + { + m_Player->SetCrouch(false); + break; + } + case 3: // Leave bed + { + m_Player->GetWorld()->BroadcastPlayerAnimation(*m_Player, 3); + break; + } } } @@ -1560,9 +1574,9 @@ void cClientHandle::SendExplosion(double a_BlockX, double a_BlockY, double a_Blo -void cClientHandle::SendMetadata(const cPawn & a_Pawn) +void cClientHandle::SendMetadata(const cEntity & a_Entity) { - m_Protocol->SendMetadata(a_Pawn); + m_Protocol->SendMetadata(a_Entity); } diff --git a/source/ClientHandle.h b/source/ClientHandle.h index 50389584..69c0fddf 100644 --- a/source/ClientHandle.h +++ b/source/ClientHandle.h @@ -103,7 +103,7 @@ public: void SendHealth (void); void SendInventoryProgress (char a_WindowID, short a_Progressbar, short a_Value); void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item); - void SendMetadata (const cPawn & a_Entity); + void SendMetadata (const cEntity & a_Entity); void SendPickupSpawn (const cPickup & a_Pickup); void SendPlayerAnimation (const cPlayer & a_Player, char a_Animation); void SendPlayerListItem (const cPlayer & a_Player, bool a_IsOnline); diff --git a/source/Player.cpp b/source/Player.cpp index dd71ca83..16255c00 100644 --- a/source/Player.cpp +++ b/source/Player.cpp @@ -50,6 +50,7 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName) , m_ClientHandle( a_Client ) , m_FoodExhaustionLevel(0.f) , m_FoodTickTimer(0) + , m_IsCrouched(false) { LOGD("Created a player object for \"%s\" @ \"%s\" at %p, ID %d", a_PlayerName.c_str(), a_Client->GetIPString().c_str(), @@ -355,6 +356,23 @@ const cSlotNums & cPlayer::GetInventoryPaintSlots(void) const +void cPlayer::SetCrouch(bool a_IsCrouched) +{ + // Set the crouch status, broadcast to all visible players + + if (a_IsCrouched == m_IsCrouched) + { + // No change + return; + } + m_IsCrouched = a_IsCrouched; + m_World->BroadcastMetadata(*this); +} + + + + + void cPlayer::DoTakeDamage(TakeDamageInfo & a_TDI) { if (m_GameMode == eGameMode_Creative) diff --git a/source/Player.h b/source/Player.h index c582c180..f2eb2320 100644 --- a/source/Player.h +++ b/source/Player.h @@ -170,6 +170,12 @@ public: /// Returns the list of slots currently stored for inventory painting. To be used by cWindow only const cSlotNums & GetInventoryPaintSlots(void) const; + + /// Sets the crouch status, broadcasts to all visible players + void SetCrouch(bool a_IsCrouched); + + // cEntity overrides: + virtual bool IsCrouched(void) const { return m_IsCrouched; } protected: typedef std::map< std::string, bool > PermissionMap; @@ -219,6 +225,8 @@ protected: cClientHandle * m_ClientHandle; cSlotNums m_InventoryPaintSlots; + + bool m_IsCrouched; virtual void Destroyed(void);