From 49df06fbdea77295f7be43b14720574fd9eac04b Mon Sep 17 00:00:00 2001 From: "Natanael [Root]" Date: Tue, 23 Jun 2026 16:41:31 +0200 Subject: [PATCH] player/player.go: Only deal fall damage on an actual vertical collision The on-ground check used for fall damage extends the player bounding box along the movement of the tick, reporting a landing as soon as it intersects any block. While falling next to a block at the side, that intersection registered a landing in mid-air, dealing premature fall damage and clearing the accumulated fall distance. Also require a vertical collision on the tick before applying the damage. A real landing always truncates the downward movement, whereas brushing a block sideways does not, so the fall distance keeps accumulating until the player actually reaches the ground. Fixes #1003. Co-Authored-By: Claude Opus 4.8 --- server/player/player.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/player/player.go b/server/player/player.go index 728494a69..599983ed5 100644 --- a/server/player/player.go +++ b/server/player/player.go @@ -538,7 +538,9 @@ func (p *Player) Heal(health float64, source world.HealingSource) { // updateFallState is called to update the entities falling state. func (p *Player) updateFallState(distanceThisTick float64) { switch { - case p.OnGround(): + // Require a vertical collision so brushing a block sideways mid-fall does + // not register as landing and deal premature fall damage. + case p.OnGround() && p.collidedVertically: if p.fallDistance > 0 { p.fall(p.fallDistance) p.ResetFallDistance()