From 3d6cbd34098b963293eacda62a860cd59d03f1f0 Mon Sep 17 00:00:00 2001 From: oryxel1 Date: Thu, 4 Sep 2025 21:43:42 +0700 Subject: [PATCH] Fixed scaffolding collision. --- .../collision/fixes/ConduitCollision.java | 1 - .../collision/fixes/ScaffoldingCollision.java | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/ConduitCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/ConduitCollision.java index 92650d99e..3aa81a2e2 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/ConduitCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/ConduitCollision.java @@ -27,7 +27,6 @@ package org.geysermc.geyser.translator.collision.fixes; import lombok.EqualsAndHashCode; import org.geysermc.geyser.level.block.type.BlockState; -import org.geysermc.geyser.level.physics.Axis; import org.geysermc.geyser.level.physics.BoundingBox; import org.geysermc.geyser.level.physics.CollisionManager; import org.geysermc.geyser.level.physics.Direction; diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/ScaffoldingCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/ScaffoldingCollision.java index b9da0cc8a..526b9dd09 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/ScaffoldingCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/ScaffoldingCollision.java @@ -26,8 +26,11 @@ package org.geysermc.geyser.translator.collision.fixes; import lombok.EqualsAndHashCode; +import org.geysermc.geyser.level.block.property.Properties; import org.geysermc.geyser.level.block.type.BlockState; +import org.geysermc.geyser.level.physics.Axis; import org.geysermc.geyser.level.physics.BoundingBox; +import org.geysermc.geyser.level.physics.CollisionManager; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.collision.BlockCollision; import org.geysermc.geyser.translator.collision.CollisionRemapper; @@ -38,8 +41,12 @@ import org.geysermc.geyser.translator.collision.CollisionRemapper; @EqualsAndHashCode(callSuper = true) @CollisionRemapper(regex = "^scaffolding$", usesParams = true, passDefaultBoxes = true) public class ScaffoldingCollision extends BlockCollision { + private final boolean bottom; + public ScaffoldingCollision(BlockState state, BoundingBox[] defaultBoxes) { super(defaultBoxes); + + this.bottom = state.getValue(Properties.BOTTOM) && state.getValue(Properties.STABILITY_DISTANCE) != 0; } @Override @@ -53,6 +60,17 @@ public class ScaffoldingCollision extends BlockCollision { playerCollision.setSizeY(playerCollision.getSizeY() + 0.001); playerCollision.setMiddleY(playerCollision.getMiddleY() - 0.002); + boolean canStandOn = playerCollision.getMin(Axis.Y) >= y + 1 && !session.isSneaking(); + + // If these condition are met, then the scaffolding will have a bottom collision that is 0.125 block height. + // However, this is not the case in Bedrock, so we push the player up by 0.125 blocks so player won't get setback. + if (!canStandOn && this.bottom && playerCollision.getMin(Axis.Y) >= y) { + double distance = y + 0.125 - (playerCollision.getMin(Axis.Y)) ; + if (Math.abs(distance) < 0.125F + CollisionManager.COLLISION_TOLERANCE * 1.01F) { + playerCollision.translate(0, distance, 0); + } + } + if (intersected) { session.getCollisionManager().setTouchingScaffolding(true); session.getCollisionManager().setOnScaffolding(true);