1
0
mirror of https://github.com/GeyserMC/Geyser.git synced 2026-01-04 15:31:36 +00:00

Fixed scaffolding collision.

This commit is contained in:
oryxel1
2025-09-04 21:43:42 +07:00
parent 6c289eebd5
commit 3d6cbd3409
2 changed files with 18 additions and 1 deletions

View File

@@ -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;

View File

@@ -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);