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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user