diff options
author | James Ravenscroft <ravenscroftj@gmail.com> | 2013-08-09 09:37:39 +0200 |
---|---|---|
committer | James Ravenscroft <ravenscroftj@gmail.com> | 2013-08-09 09:37:39 +0200 |
commit | dace1f7bd2e661b4c771322162e9e1b52551dd56 (patch) | |
tree | 9565683fe1b72633336954a49247d9fd6af9931f /source | |
parent | Fixed the jump food exhaustion being added when player is swimming (diff) | |
download | cuberite-dace1f7bd2e661b4c771322162e9e1b52551dd56.tar cuberite-dace1f7bd2e661b4c771322162e9e1b52551dd56.tar.gz cuberite-dace1f7bd2e661b4c771322162e9e1b52551dd56.tar.bz2 cuberite-dace1f7bd2e661b4c771322162e9e1b52551dd56.tar.lz cuberite-dace1f7bd2e661b4c771322162e9e1b52551dd56.tar.xz cuberite-dace1f7bd2e661b4c771322162e9e1b52551dd56.tar.zst cuberite-dace1f7bd2e661b4c771322162e9e1b52551dd56.zip |
Diffstat (limited to '')
-rw-r--r-- | source/ClientHandle.cpp | 6 | ||||
-rw-r--r-- | source/Player.cpp | 37 | ||||
-rw-r--r-- | source/Player.h | 14 |
3 files changed, 43 insertions, 14 deletions
diff --git a/source/ClientHandle.cpp b/source/ClientHandle.cpp index 328e7de70..6df0cfa48 100644 --- a/source/ClientHandle.cpp +++ b/source/ClientHandle.cpp @@ -32,7 +32,6 @@ #include "Protocol/ProtocolRecognizer.h" -#define float2int(x) ((x)<0 ? ((int)(x))-1 : (int)(x)) #define AddPistonDir(x, y, z, dir, amount) switch (dir) { case 0: (y)-=(amount); break; case 1: (y)+=(amount); break;\ @@ -505,9 +504,8 @@ void cClientHandle::HandlePlayerPos(double a_PosX, double a_PosY, double a_PosZ, if ((a_PosY > m_Player->GetPosY()) && !a_IsOnGround && m_Player->IsOnGround()) { // we only add this exhaustion if the player is not swimming - otherwise we end up with both jump + swim exhaustion - cWorld * World = m_Player->GetWorld(); - BLOCKTYPE BlockType = World->GetBlock( float2int(m_Player->GetPosX()), float2int(m_Player->GetPosY()), float2int(m_Player->GetPosZ()) ); - if(! IsBlockWater(BlockType) ) + + if(! m_Player->IsSwimming() ) { m_Player->AddFoodExhaustion(m_Player->IsSprinting() ? 0.8 : 0.2); } diff --git a/source/Player.cpp b/source/Player.cpp index 6219523cf..eab6e08e5 100644 --- a/source/Player.cpp +++ b/source/Player.cpp @@ -61,6 +61,8 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName) , m_SprintingMaxSpeed(0.13) , m_IsCrouched(false) , m_IsSprinting(false) + , m_IsSwimming(false) + , m_IsSubmerged(false) , m_EatingFinishTick(-1) { LOGD("Created a player object for \"%s\" @ \"%s\" at %p, ID %d", @@ -181,8 +183,11 @@ void cPlayer::Tick(float a_Dt, cChunk & a_Chunk) super::Tick(a_Dt, a_Chunk); - //handle air drowning stuff - HandleAir(a_Chunk); + // set player swimming state + SetSwimState( a_Chunk); + + // handle air drowning stuff + HandleAir(); if (m_bDirtyPosition) { @@ -1326,20 +1331,34 @@ void cPlayer::UseEquippedItem() GetInventory().DamageEquippedItem(); } - -void cPlayer::HandleAir(cChunk & a_Chunk) +void cPlayer::SetSwimState(cChunk & a_Chunk) { - // Ref.: http://www.minecraftwiki.net/wiki/Chunk_format - // see if the player is /submerged/ water (block above is water) - // Get the type of block the player's standing in: + BLOCKTYPE BlockIn; int RelX = (int)floor(m_LastPosX) - a_Chunk.GetPosX() * cChunkDef::Width; - int RelY = (int)floor(m_LastPosY + 1.1); + int RelY = (int)floor(m_LastPosY + 0.1); int RelZ = (int)floor(m_LastPosZ) - a_Chunk.GetPosZ() * cChunkDef::Width; + // first we check if the player is swimming + // Use Unbounded, because we're being called *after* processing super::Tick(), which could have changed our chunk VERIFY(a_Chunk.UnboundedRelGetBlockType(RelX, RelY, RelZ, BlockIn)); - if (IsBlockWater(BlockIn)) + m_IsSwimming = IsBlockWater(BlockIn); + + // now we check if the player is submerged + + VERIFY(a_Chunk.UnboundedRelGetBlockType(RelX, RelY+1, RelZ, BlockIn)); + + m_IsSubmerged = IsBlockWater(BlockIn); +} + +void cPlayer::HandleAir() +{ + // Ref.: http://www.minecraftwiki.net/wiki/Chunk_format + // see if the player is /submerged/ water (block above is water) + // Get the type of block the player's standing in: + + if (IsSubmerged()) { // either reduce air level or damage player if(m_AirLevel < 1) diff --git a/source/Player.h b/source/Player.h index 542656b5a..ab9a17cf2 100644 --- a/source/Player.h +++ b/source/Player.h @@ -260,6 +260,12 @@ public: virtual bool IsSprinting(void) const { return m_IsSprinting; } virtual bool IsRclking (void) const { return IsEating(); } + /// Returns whether the player is swimming or not + virtual bool IsSwimming(void) const{ return m_IsSwimming; } + + /// Return whether the player is under water or not + virtual bool IsSubmerged(void) const{ return m_IsSubmerged; } + protected: typedef std::map< std::string, bool > PermissionMap; PermissionMap m_ResolvedPermissions; @@ -335,6 +341,9 @@ protected: bool m_IsCrouched; bool m_IsSprinting; + bool m_IsSwimming; + bool m_IsSubmerged; + /// The world tick in which eating will be finished. -1 if not eating Int64 m_EatingFinishTick; @@ -347,7 +356,10 @@ protected: void HandleFood(void); /// Called in each tick to handle air-related processing i.e. drowning - void HandleAir(cChunk & a_Chunk); + void HandleAir(); + + /// Called once per tick to set IsSwimming and IsSubmerged + void SetSwimState(cChunk & a_Chunk); /// Adds food exhaustion based on the difference between Pos and LastPos, sprinting status and swimming (in water block) void ApplyFoodExhaustionFromMovement(cChunk & a_Chunk); |