1
0

Merge pull request #2630 from Gargaj/shallowwater

Fix damage in shallow water (fixes #2622)
This commit is contained in:
Julian Laubstein 2015-11-10 01:10:34 +01:00
commit ec61c918db

View File

@ -461,8 +461,13 @@ void cPlayer::SetTouchGround(bool a_bTouchGround)
static const auto HalfWidth = GetWidth() / 2; static const auto HalfWidth = GetWidth() / 2;
static const auto EPS = 0.0001; static const auto EPS = 0.0001;
BLOCKTYPE BlockAtFoot = GetWorld()->GetBlock(POS_TOINT);
bool IsFootInWater = IsBlockWater(BlockAtFoot);
bool IsFootInLiquid = IsFootInWater || IsBlockLava(BlockAtFoot) || (BlockAtFoot == E_BLOCK_COBWEB); // okay so cobweb is not _technically_ a liquid...
if ( if (
!IsSwimming() && !IsFlying() && !IsFlying() &&
( (
( (
((GetPosY() >= 1) && (GetPosY() <= 255) && ((GetPosY() - POSY_TOINT) <= EPS)) && ((GetPosY() >= 1) && (GetPosY() <= 255) && ((GetPosY() - POSY_TOINT) <= EPS)) &&
@ -498,7 +503,7 @@ void cPlayer::SetTouchGround(bool a_bTouchGround)
) )
{ {
auto Damage = static_cast<int>(m_LastGroundHeight - GetPosY() - 3.0); auto Damage = static_cast<int>(m_LastGroundHeight - GetPosY() - 3.0);
if (Damage > 0) if ((Damage > 0) && !IsFootInWater)
{ {
// cPlayer makes sure damage isn't applied in creative, no need to check here // cPlayer makes sure damage isn't applied in creative, no need to check here
TakeDamage(dtFalling, nullptr, Damage, Damage, 0); TakeDamage(dtFalling, nullptr, Damage, Damage, 0);
@ -523,7 +528,10 @@ void cPlayer::SetTouchGround(bool a_bTouchGround)
m_bTouchGround = false; m_bTouchGround = false;
} }
if (IsFlying() || IsSwimming() || IsClimbing()) /* Note: it is currently possible to fall through lava and still die from fall damage
because of the client skipping an update about the lava block. This can only be resolved by
interpolating between positions. */
if (IsFlying() || IsFootInLiquid || IsClimbing())
{ {
m_LastGroundHeight = GetPosY(); m_LastGroundHeight = GetPosY();
} }