diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/entity/player/BedrockMovePlayerTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/entity/player/BedrockMovePlayerTranslator.java index 37875665..f5a492d8 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/entity/player/BedrockMovePlayerTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/entity/player/BedrockMovePlayerTranslator.java @@ -100,11 +100,31 @@ public class BedrockMovePlayerTranslator extends PacketTranslator= packet.getPosition().getY(); + entity.setPosition(packet.getPosition(), false); entity.setOnGround(packet.isOnGround()); // Send final movement changes session.sendDownstreamPacket(movePacket); + + if (notMovingUp) { + int floorY = position.getFloorY(); + if (floorY <= -38 && floorY >= -40) { + // Work around there being a floor at Y -40 and teleport the player below it + // Moving from below Y -40 to above the void floor works fine + //TODO: This will need to be changed for 1.17 + entity.setPosition(entity.getPosition().sub(0, 4f, 0)); + MovePlayerPacket movePlayerPacket = new MovePlayerPacket(); + movePlayerPacket.setRuntimeEntityId(entity.getGeyserId()); + movePlayerPacket.setPosition(entity.getPosition()); + movePlayerPacket.setRotation(entity.getBedrockRotation()); + movePlayerPacket.setMode(MovePlayerPacket.Mode.TELEPORT); + movePlayerPacket.setTeleportationCause(MovePlayerPacket.TeleportationCause.BEHAVIOR); + session.sendUpstreamPacket(movePlayerPacket); + } + } } else { // Not a valid move session.getConnector().getLogger().debug("Recalculating position...");