I was intrigued by this. Adding to @Avoma's analysis, the problem is that there is a discrepancy between the onGround
argument, which is true when the boat has landed, and this.status
. The status is updated every tick, to either IN_AIR
or ON_LAND
(for the relevant problem; other values are possible otherwise).
So most of the time, we're entering checkFallDamage
with onGround
true, and the boat's status says it is in the air, so we reset the fall distance and do nothing else. But due to timing, in some situations the tick update has managed to set our status
to ON_LAND
, and we go on to do the "deal damage to passengers, replace boat with planks and sticks".
The correlation with heights is therefore more incidental; the real cause of when this happens is how the call to checkFallDamage
correlates to how the last tick has set the status to ON_LAND
.
The solution though, seems simple enough. The replacement of the boat with planks and sticks is a remnant from a very old behavior. There is no need to check anything else apart from the
onGround
argument, and then always reset the fall distance, regardless of the value ofthis.status
.One could hope that a Minecraft engineer gets to spend a few minutes on fixing this.