From b57bdee4cac26ed63201b6e13b7b0a16c8bbdd3e Mon Sep 17 00:00:00 2001 From: oryxel1 Date: Thu, 4 Sep 2025 19:49:58 +0700 Subject: [PATCH 01/10] Revert last change, move everything to a different package, added end portal fix. --- .../level/physics/CollisionManager.java | 2 +- .../loader/CollisionRegistryLoader.java | 6 +- .../translator/collision/BlockCollision.java | 9 +++ .../collision/{ => fixes}/ChestCollision.java | 4 +- .../collision/{ => fixes}/DoorCollision.java | 6 +- .../collision/fixes/EndPortalCollision.java | 70 +++++++++++++++++++ .../GlassPaneAndIronBarsCollision.java | 6 +- .../{ => fixes}/ScaffoldingCollision.java | 6 +- .../{ => fixes}/TrapdoorCollision.java | 6 +- 9 files changed, 102 insertions(+), 13 deletions(-) rename core/src/main/java/org/geysermc/geyser/translator/collision/{ => fixes}/ChestCollision.java (95%) rename core/src/main/java/org/geysermc/geyser/translator/collision/{ => fixes}/DoorCollision.java (93%) create mode 100644 core/src/main/java/org/geysermc/geyser/translator/collision/fixes/EndPortalCollision.java rename core/src/main/java/org/geysermc/geyser/translator/collision/{ => fixes}/GlassPaneAndIronBarsCollision.java (94%) rename core/src/main/java/org/geysermc/geyser/translator/collision/{ => fixes}/ScaffoldingCollision.java (92%) rename core/src/main/java/org/geysermc/geyser/translator/collision/{ => fixes}/TrapdoorCollision.java (92%) diff --git a/core/src/main/java/org/geysermc/geyser/level/physics/CollisionManager.java b/core/src/main/java/org/geysermc/geyser/level/physics/CollisionManager.java index 54d8e3813..e5c37757f 100644 --- a/core/src/main/java/org/geysermc/geyser/level/physics/CollisionManager.java +++ b/core/src/main/java/org/geysermc/geyser/level/physics/CollisionManager.java @@ -48,8 +48,8 @@ import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.PistonCache; import org.geysermc.geyser.translator.collision.BlockCollision; import org.geysermc.geyser.translator.collision.OtherCollision; -import org.geysermc.geyser.translator.collision.ScaffoldingCollision; import org.geysermc.geyser.translator.collision.SolidCollision; +import org.geysermc.geyser.translator.collision.fixes.ScaffoldingCollision; import org.geysermc.geyser.util.BlockUtils; import java.text.DecimalFormat; diff --git a/core/src/main/java/org/geysermc/geyser/registry/loader/CollisionRegistryLoader.java b/core/src/main/java/org/geysermc/geyser/registry/loader/CollisionRegistryLoader.java index bd98ae0a5..73cc68a48 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/loader/CollisionRegistryLoader.java +++ b/core/src/main/java/org/geysermc/geyser/registry/loader/CollisionRegistryLoader.java @@ -41,7 +41,7 @@ import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.translator.collision.BlockCollision; import org.geysermc.geyser.translator.collision.CollisionRemapper; import org.geysermc.geyser.translator.collision.OtherCollision; -import org.geysermc.geyser.translator.collision.SolidCollision; +import org.geysermc.geyser.translator.collision.fixes.ShulkerBoxCollision; import org.geysermc.geyser.util.FileUtils; import java.io.InputStream; @@ -136,7 +136,7 @@ public class CollisionRegistryLoader extends MultiResourceRegistryLoader Date: Thu, 4 Sep 2025 19:51:45 +0700 Subject: [PATCH 02/10] Oops. --- .../geyser/registry/loader/CollisionRegistryLoader.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/registry/loader/CollisionRegistryLoader.java b/core/src/main/java/org/geysermc/geyser/registry/loader/CollisionRegistryLoader.java index 73cc68a48..fee86b130 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/loader/CollisionRegistryLoader.java +++ b/core/src/main/java/org/geysermc/geyser/registry/loader/CollisionRegistryLoader.java @@ -41,7 +41,7 @@ import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.translator.collision.BlockCollision; import org.geysermc.geyser.translator.collision.CollisionRemapper; import org.geysermc.geyser.translator.collision.OtherCollision; -import org.geysermc.geyser.translator.collision.fixes.ShulkerBoxCollision; +import org.geysermc.geyser.translator.collision.SolidCollision; import org.geysermc.geyser.util.FileUtils; import java.io.InputStream; @@ -136,7 +136,7 @@ public class CollisionRegistryLoader extends MultiResourceRegistryLoader Date: Thu, 4 Sep 2025 20:14:16 +0700 Subject: [PATCH 03/10] Fixed lantern collision. --- .../collision/fixes/LanternCollision.java | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 core/src/main/java/org/geysermc/geyser/translator/collision/fixes/LanternCollision.java diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/LanternCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/LanternCollision.java new file mode 100644 index 000000000..f089353ea --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/LanternCollision.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +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.level.physics.Direction; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.collision.BlockCollision; +import org.geysermc.geyser.translator.collision.CollisionRemapper; + +@EqualsAndHashCode(callSuper = true) +@CollisionRemapper(regex = "^lantern$|^soul_lantern$", usesParams = true, passDefaultBoxes = true) +public class LanternCollision extends BlockCollision { + private final boolean hanging; + + public LanternCollision(BlockState state, BoundingBox[] boxes) { + super(boxes); + + this.hanging = state.getValue(Properties.HANGING); + } + + @Override + public void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { + super.correctPosition(session, x, y, z, playerCollision); + + final double maxPushDistance = 0.0625 + CollisionManager.COLLISION_TOLERANCE * 1.01F; + for (BoundingBox boundingBox : this.boundingBoxes) { + if (!boundingBox.checkIntersection(x, y, z, playerCollision)) { + continue; + } + + boundingBox = boundingBox.clone(); + boundingBox.translate(x, y, z); + + if (this.hanging) { + boundingBox.pushOutOfBoundingBox(playerCollision, Direction.DOWN, maxPushDistance); + } else { + boundingBox.pushOutOfBoundingBox(playerCollision, Direction.UP, maxPushDistance); + } + } + } +} From 6c289eebd50be8f6f81edade15d30c570d541eed Mon Sep 17 00:00:00 2001 From: oryxel1 Date: Thu, 4 Sep 2025 20:57:29 +0700 Subject: [PATCH 04/10] Fixed conduit collision. --- .../collision/fixes/ConduitCollision.java | 63 +++++++++++++++++++ .../collision/fixes/LanternCollision.java | 2 +- 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/org/geysermc/geyser/translator/collision/fixes/ConduitCollision.java 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 new file mode 100644 index 000000000..92650d99e --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/ConduitCollision.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +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; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.collision.BlockCollision; +import org.geysermc.geyser.translator.collision.CollisionRemapper; + +@EqualsAndHashCode(callSuper = true) +@CollisionRemapper(regex = "^conduit$", passDefaultBoxes = true) +public class ConduitCollision extends BlockCollision { + public ConduitCollision(BlockState state, BoundingBox[] boxes) { + super(boxes); + } + + @Override + public void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { + super.correctPosition(session, x, y, z, playerCollision); + + final double maxPushDistance = 0.1875F + CollisionManager.COLLISION_TOLERANCE * 1.01F; + + // Check for conduit bug (conduit is lifted from the ground on Java unlike Bedrock where conduit is placed on the ground) + for (BoundingBox boundingBox : this.boundingBoxes) { + if (!boundingBox.checkIntersection(x, y, z, playerCollision)) { + continue; + } + + boundingBox = boundingBox.clone(); + boundingBox.translate(x, y, z); + + boundingBox.pushOutOfBoundingBox(playerCollision, Direction.UP, maxPushDistance); + } + } +} diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/LanternCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/LanternCollision.java index f089353ea..195e72331 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/LanternCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/LanternCollision.java @@ -28,7 +28,6 @@ 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.level.physics.Direction; @@ -51,6 +50,7 @@ public class LanternCollision extends BlockCollision { public void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { super.correctPosition(session, x, y, z, playerCollision); + // Check for lantern collision (lantern is 0.0625 block higher on Java) final double maxPushDistance = 0.0625 + CollisionManager.COLLISION_TOLERANCE * 1.01F; for (BoundingBox boundingBox : this.boundingBoxes) { if (!boundingBox.checkIntersection(x, y, z, playerCollision)) { From 3d6cbd34098b963293eacda62a860cd59d03f1f0 Mon Sep 17 00:00:00 2001 From: oryxel1 Date: Thu, 4 Sep 2025 21:43:42 +0700 Subject: [PATCH 05/10] 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); From ccc4faeb59da4baa10e6a54c45c6df6273497bc8 Mon Sep 17 00:00:00 2001 From: oryxel1 Date: Thu, 4 Sep 2025 22:45:13 +0700 Subject: [PATCH 06/10] Fixed bell collision and sea pickle collision. --- .../collision/fixes/BellCollision.java | 70 +++++++++++++++++++ .../collision/fixes/SeaPickleCollision.java | 63 +++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 core/src/main/java/org/geysermc/geyser/translator/collision/fixes/BellCollision.java create mode 100644 core/src/main/java/org/geysermc/geyser/translator/collision/fixes/SeaPickleCollision.java diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/BellCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/BellCollision.java new file mode 100644 index 000000000..830bf2b41 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/BellCollision.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +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.BoundingBox; +import org.geysermc.geyser.level.physics.CollisionManager; +import org.geysermc.geyser.level.physics.Direction; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.collision.BlockCollision; +import org.geysermc.geyser.translator.collision.CollisionRemapper; + +@EqualsAndHashCode(callSuper = true) +@CollisionRemapper(regex = "^bell$", passDefaultBoxes = true) +public class BellCollision extends BlockCollision { + private final boolean standing; + + public BellCollision(BlockState state, BoundingBox[] boxes) { + super(boxes); + + this.standing = state.getValue(Properties.BELL_ATTACHMENT).equals("floor"); + } + + @Override + public void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { + super.correctPosition(session, x, y, z, playerCollision); + if (!this.standing) { + return; + } + + final double maxPushDistance = 0.1875F + CollisionManager.COLLISION_TOLERANCE * 1.01F; + + // Check for bell collision bug (bell on Java is 0.1875 block higher than Bedrock) + for (BoundingBox boundingBox : this.boundingBoxes) { + if (!boundingBox.checkIntersection(x, y, z, playerCollision)) { + continue; + } + + boundingBox = boundingBox.clone(); + boundingBox.translate(x, y, z); + + boundingBox.pushOutOfBoundingBox(playerCollision, Direction.UP, maxPushDistance); + } + } +} diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/SeaPickleCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/SeaPickleCollision.java new file mode 100644 index 000000000..1e8db5951 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/SeaPickleCollision.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +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; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.collision.BlockCollision; +import org.geysermc.geyser.translator.collision.CollisionRemapper; + +@EqualsAndHashCode(callSuper = true) +@CollisionRemapper(regex = "^sea_pickle$", passDefaultBoxes = true) +public class SeaPickleCollision extends BlockCollision { + public SeaPickleCollision(BlockState state, BoundingBox[] boxes) { + super(boxes); + } + + @Override + public void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { + super.correctPosition(session, x, y, z, playerCollision); + + for (BoundingBox boundingBox : this.boundingBoxes) { + if (!boundingBox.checkIntersection(x, y, z, playerCollision)) { + continue; + } + + final double maxY = boundingBox.getMax(Axis.Y); + + boundingBox = boundingBox.clone(); + boundingBox.translate(x, y, z); + + // Check for sea pickle bug (sea pickle have no collision on Bedrock but does on Java). + boundingBox.pushOutOfBoundingBox(playerCollision, Direction.UP, maxY + CollisionManager.COLLISION_TOLERANCE * 1.01F); + } + } +} From 141461b3429b0569d8fbda423c3f3fe6eec9e0d8 Mon Sep 17 00:00:00 2001 From: oryxel1 Date: Fri, 5 Sep 2025 21:49:04 +0700 Subject: [PATCH 07/10] Avoid loop. --- .../translator/collision/BlockCollision.java | 5 +++ .../collision/fixes/BellCollision.java | 18 ++------ .../collision/fixes/ConduitCollision.java | 19 ++------- .../collision/fixes/DoorCollision.java | 26 ++++-------- .../collision/fixes/EndPortalCollision.java | 18 ++------ .../fixes/GlassPaneAndIronBarsCollision.java | 41 +++++++------------ .../collision/fixes/LanternCollision.java | 18 +++++--- .../collision/fixes/SeaPickleCollision.java | 9 +++- .../collision/fixes/TrapdoorCollision.java | 18 ++------ 9 files changed, 65 insertions(+), 107 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/BlockCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/BlockCollision.java index 2c9226497..813fa6796 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/BlockCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/BlockCollision.java @@ -83,11 +83,16 @@ public class BlockCollision { boundingBox.pushOutOfBoundingBox(playerCollision, Direction.UP, pushAwayTolerance); boundingBox.pushOutOfBoundingBox(playerCollision, Direction.DOWN, pushAwayTolerance); + correctPosition(session, x, y, z, boundingBox, playerCollision); + // Revert back to the old collision size. playerCollision.expand(-collisionExpansion, 0, -collisionExpansion); } } + protected void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox blockCollision, BoundingBox playerCollision) { + } + public boolean checkIntersection(double x, double y, double z, BoundingBox playerCollision) { for (BoundingBox b : boundingBoxes) { if (b.checkIntersection(x, y, z, playerCollision)) { diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/BellCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/BellCollision.java index 830bf2b41..954689c0a 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/BellCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/BellCollision.java @@ -38,6 +38,8 @@ import org.geysermc.geyser.translator.collision.CollisionRemapper; @EqualsAndHashCode(callSuper = true) @CollisionRemapper(regex = "^bell$", passDefaultBoxes = true) public class BellCollision extends BlockCollision { + private final static double MAX_PUSH_DISTANCE = 0.1875 + CollisionManager.COLLISION_TOLERANCE * 1.01; + private final boolean standing; public BellCollision(BlockState state, BoundingBox[] boxes) { @@ -47,24 +49,12 @@ public class BellCollision extends BlockCollision { } @Override - public void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { - super.correctPosition(session, x, y, z, playerCollision); + protected void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox blockCollision, BoundingBox playerCollision) { if (!this.standing) { return; } - final double maxPushDistance = 0.1875F + CollisionManager.COLLISION_TOLERANCE * 1.01F; - // Check for bell collision bug (bell on Java is 0.1875 block higher than Bedrock) - for (BoundingBox boundingBox : this.boundingBoxes) { - if (!boundingBox.checkIntersection(x, y, z, playerCollision)) { - continue; - } - - boundingBox = boundingBox.clone(); - boundingBox.translate(x, y, z); - - boundingBox.pushOutOfBoundingBox(playerCollision, Direction.UP, maxPushDistance); - } + blockCollision.pushOutOfBoundingBox(playerCollision, Direction.UP, MAX_PUSH_DISTANCE); } } 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 3aa81a2e2..273a8f054 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 @@ -37,26 +37,15 @@ import org.geysermc.geyser.translator.collision.CollisionRemapper; @EqualsAndHashCode(callSuper = true) @CollisionRemapper(regex = "^conduit$", passDefaultBoxes = true) public class ConduitCollision extends BlockCollision { + private final static double MAX_PUSH_DISTANCE = 0.1875 + CollisionManager.COLLISION_TOLERANCE * 1.01; + public ConduitCollision(BlockState state, BoundingBox[] boxes) { super(boxes); } @Override - public void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { - super.correctPosition(session, x, y, z, playerCollision); - - final double maxPushDistance = 0.1875F + CollisionManager.COLLISION_TOLERANCE * 1.01F; - + protected void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox blockCollision, BoundingBox playerCollision) { // Check for conduit bug (conduit is lifted from the ground on Java unlike Bedrock where conduit is placed on the ground) - for (BoundingBox boundingBox : this.boundingBoxes) { - if (!boundingBox.checkIntersection(x, y, z, playerCollision)) { - continue; - } - - boundingBox = boundingBox.clone(); - boundingBox.translate(x, y, z); - - boundingBox.pushOutOfBoundingBox(playerCollision, Direction.UP, maxPushDistance); - } + blockCollision.pushOutOfBoundingBox(playerCollision, Direction.UP, MAX_PUSH_DISTANCE); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/DoorCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/DoorCollision.java index 515de7206..1e52ebe87 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/DoorCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/DoorCollision.java @@ -38,6 +38,8 @@ import org.geysermc.geyser.translator.collision.CollisionRemapper; @EqualsAndHashCode(callSuper = true) @CollisionRemapper(regex = "_door$", usesParams = true, passDefaultBoxes = true) public class DoorCollision extends BlockCollision { + private final static double MAX_PUSH_DISTANCE = 0.005 + CollisionManager.COLLISION_TOLERANCE * 1.01; + /** * 1 = north * 2 = east @@ -63,25 +65,13 @@ public class DoorCollision extends BlockCollision { } @Override - public void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { - super.correctPosition(session, x, y, z, playerCollision); - final double maxPushDistance = 0.005 + CollisionManager.COLLISION_TOLERANCE * 1.01F; - + protected void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox blockCollision, BoundingBox playerCollision) { // Check for door bug (doors are 0.1875 blocks thick on Java but 0.1825 blocks thick on Bedrock) - for (BoundingBox boundingBox : this.boundingBoxes) { - if (!boundingBox.checkIntersection(x, y, z, playerCollision)) { - continue; - } - - boundingBox = boundingBox.clone(); - boundingBox.translate(x, y, z); - - switch (this.facing) { - case 1 -> boundingBox.pushOutOfBoundingBox(playerCollision, Direction.NORTH, maxPushDistance); - case 2 -> boundingBox.pushOutOfBoundingBox(playerCollision, Direction.EAST, maxPushDistance); - case 3 -> boundingBox.pushOutOfBoundingBox(playerCollision, Direction.SOUTH, maxPushDistance); - case 4 -> boundingBox.pushOutOfBoundingBox(playerCollision, Direction.WEST, maxPushDistance); - } + switch (this.facing) { + case 1 -> blockCollision.pushOutOfBoundingBox(playerCollision, Direction.NORTH, MAX_PUSH_DISTANCE); + case 2 -> blockCollision.pushOutOfBoundingBox(playerCollision, Direction.EAST, MAX_PUSH_DISTANCE); + case 3 -> blockCollision.pushOutOfBoundingBox(playerCollision, Direction.SOUTH, MAX_PUSH_DISTANCE); + case 4 -> blockCollision.pushOutOfBoundingBox(playerCollision, Direction.WEST, MAX_PUSH_DISTANCE); } } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/EndPortalCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/EndPortalCollision.java index 32970e881..53c26721e 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/EndPortalCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/EndPortalCollision.java @@ -38,6 +38,8 @@ import org.geysermc.geyser.translator.collision.CollisionRemapper; @EqualsAndHashCode(callSuper = true) @CollisionRemapper(regex = "^end_portal_frame$", passDefaultBoxes = true) public class EndPortalCollision extends BlockCollision { + private final static double MAX_PUSH_DISTANCE = 0.1875 + CollisionManager.COLLISION_TOLERANCE * 1.01; + private final boolean eye; public EndPortalCollision(BlockState state, BoundingBox[] boxes) { @@ -47,24 +49,12 @@ public class EndPortalCollision extends BlockCollision { } @Override - public void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { - super.correctPosition(session, x, y, z, playerCollision); + protected void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox blockCollision, BoundingBox playerCollision) { if (!this.eye) { return; } - final double maxPushDistance = 0.1875F + CollisionManager.COLLISION_TOLERANCE * 1.01F; - // Check for end portal frame bug (BE don't have the eye collision when the end portal frame contain an eye unlike JE) - for (BoundingBox boundingBox : this.boundingBoxes) { - if (!boundingBox.checkIntersection(x, y, z, playerCollision)) { - continue; - } - - boundingBox = boundingBox.clone(); - boundingBox.translate(x, y, z); - - boundingBox.pushOutOfBoundingBox(playerCollision, Direction.UP, maxPushDistance); - } + blockCollision.pushOutOfBoundingBox(playerCollision, Direction.UP, MAX_PUSH_DISTANCE); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/GlassPaneAndIronBarsCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/GlassPaneAndIronBarsCollision.java index 5b18ed186..7fff89e67 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/GlassPaneAndIronBarsCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/GlassPaneAndIronBarsCollision.java @@ -38,6 +38,8 @@ import org.geysermc.geyser.translator.collision.CollisionRemapper; @EqualsAndHashCode(callSuper = true) @CollisionRemapper(regex = "glass_pane$|iron_bars$", usesParams = true, passDefaultBoxes = true) public class GlassPaneAndIronBarsCollision extends BlockCollision { + private final static double MAX_PUSH_DISTANCE = 0.0625 + CollisionManager.COLLISION_TOLERANCE * 1.01; + /** * 1 = north * 2 = east @@ -72,36 +74,23 @@ public class GlassPaneAndIronBarsCollision extends BlockCollision { } @Override - public void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { - super.correctPosition(session, x, y, z, playerCollision); - - final double maxPushDistance = 0.0625 + CollisionManager.COLLISION_TOLERANCE * 1.01F; - + protected void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox blockCollision, BoundingBox playerCollision) { // Check for glass pane/iron bars bug (pane/iron bars is 0.5 blocks thick on Bedrock but 0.5625 on Java when only 1 side is connected). - for (BoundingBox boundingBox : this.boundingBoxes) { - if (!boundingBox.checkIntersection(x, y, z, playerCollision)) { - continue; - } + // Also, we want to flip the direction since the direction here is indicating the block side the glass is connected to. + if (this.facing == 2 || this.facing == 6 || this.facing == 5) { // East + blockCollision.pushOutOfBoundingBox(playerCollision, Direction.WEST, MAX_PUSH_DISTANCE); + } - boundingBox = boundingBox.clone(); - boundingBox.translate(x, y, z); + if (this.facing == 1 || this.facing == 5 || this.facing == 8) { // North. + blockCollision.pushOutOfBoundingBox(playerCollision, Direction.SOUTH, MAX_PUSH_DISTANCE); + } - // Also we want to flip the direction since the direction here is indicating the block side the glass is connected to. - if (this.facing == 2 || this.facing == 6 || this.facing == 5) { // East - boundingBox.pushOutOfBoundingBox(playerCollision, Direction.WEST, maxPushDistance); - } + if (this.facing == 3 || this.facing == 6 || this.facing == 7) { // South + blockCollision.pushOutOfBoundingBox(playerCollision, Direction.NORTH, MAX_PUSH_DISTANCE); + } - if (this.facing == 1 || this.facing == 5 || this.facing == 8) { // North. - boundingBox.pushOutOfBoundingBox(playerCollision, Direction.SOUTH, maxPushDistance); - } - - if (this.facing == 3 || this.facing == 6 || this.facing == 7) { // South - boundingBox.pushOutOfBoundingBox(playerCollision, Direction.NORTH, maxPushDistance); - } - - if (this.facing == 4 || this.facing == 7 || this.facing == 8) { // West - boundingBox.pushOutOfBoundingBox(playerCollision, Direction.EAST, maxPushDistance); - } + if (this.facing == 4 || this.facing == 7 || this.facing == 8) { // West + blockCollision.pushOutOfBoundingBox(playerCollision, Direction.EAST, MAX_PUSH_DISTANCE); } } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/LanternCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/LanternCollision.java index 195e72331..6c0b7ad41 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/LanternCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/LanternCollision.java @@ -38,6 +38,8 @@ import org.geysermc.geyser.translator.collision.CollisionRemapper; @EqualsAndHashCode(callSuper = true) @CollisionRemapper(regex = "^lantern$|^soul_lantern$", usesParams = true, passDefaultBoxes = true) public class LanternCollision extends BlockCollision { + private final static double MAX_PUSH_DISTANCE = 0.0625 + CollisionManager.COLLISION_TOLERANCE * 1.01; + private final boolean hanging; public LanternCollision(BlockState state, BoundingBox[] boxes) { @@ -46,6 +48,16 @@ public class LanternCollision extends BlockCollision { this.hanging = state.getValue(Properties.HANGING); } + @Override + protected void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox blockCollision, BoundingBox playerCollision) { + // Check for lantern collision (lantern is 0.0625 block higher on Java) + if (this.hanging) { + blockCollision.pushOutOfBoundingBox(playerCollision, Direction.DOWN, MAX_PUSH_DISTANCE); + } else { + blockCollision.pushOutOfBoundingBox(playerCollision, Direction.UP, MAX_PUSH_DISTANCE); + } + } + @Override public void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { super.correctPosition(session, x, y, z, playerCollision); @@ -60,11 +72,7 @@ public class LanternCollision extends BlockCollision { boundingBox = boundingBox.clone(); boundingBox.translate(x, y, z); - if (this.hanging) { - boundingBox.pushOutOfBoundingBox(playerCollision, Direction.DOWN, maxPushDistance); - } else { - boundingBox.pushOutOfBoundingBox(playerCollision, Direction.UP, maxPushDistance); - } + } } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/SeaPickleCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/SeaPickleCollision.java index 1e8db5951..e46e7db3f 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/SeaPickleCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/SeaPickleCollision.java @@ -42,6 +42,14 @@ public class SeaPickleCollision extends BlockCollision { super(boxes); } + @Override + protected void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox blockCollision, BoundingBox playerCollision) { + // Check for sea pickle bug (sea pickle have no collision on Bedrock but does on Java). + double maxY = blockCollision.getMax(Axis.Y) - y; + System.out.println(maxY); + blockCollision.pushOutOfBoundingBox(playerCollision, Direction.UP, maxY + CollisionManager.COLLISION_TOLERANCE * 1.01F); + } + @Override public void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { super.correctPosition(session, x, y, z, playerCollision); @@ -56,7 +64,6 @@ public class SeaPickleCollision extends BlockCollision { boundingBox = boundingBox.clone(); boundingBox.translate(x, y, z); - // Check for sea pickle bug (sea pickle have no collision on Bedrock but does on Java). boundingBox.pushOutOfBoundingBox(playerCollision, Direction.UP, maxY + CollisionManager.COLLISION_TOLERANCE * 1.01F); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/TrapdoorCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/TrapdoorCollision.java index 23e0e4a14..67330c040 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/TrapdoorCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/TrapdoorCollision.java @@ -38,6 +38,8 @@ import org.geysermc.geyser.translator.collision.CollisionRemapper; @EqualsAndHashCode(callSuper = true) @CollisionRemapper(regex = "_trapdoor$", usesParams = true, passDefaultBoxes = true) public class TrapdoorCollision extends BlockCollision { + private final static double MAX_PUSH_DISTANCE = 0.005 + CollisionManager.COLLISION_TOLERANCE * 1.01; + private final Direction facing; public TrapdoorCollision(BlockState state, BoundingBox[] defaultBoxes) { @@ -54,20 +56,8 @@ public class TrapdoorCollision extends BlockCollision { } @Override - public void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { - super.correctPosition(session, x, y, z, playerCollision); - - final double maxPushDistance = 0.005 + CollisionManager.COLLISION_TOLERANCE * 1.01F; - + protected void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox blockCollision, BoundingBox playerCollision) { // Check for trapdoor bug (trapdoors are 0.1875 blocks thick on Java but 0.1825 blocks thick on Bedrock) - for (BoundingBox boundingBox : this.boundingBoxes) { - if (!boundingBox.checkIntersection(x, y, z, playerCollision)) { - continue; - } - - boundingBox = boundingBox.clone(); - boundingBox.translate(x, y, z); - boundingBox.pushOutOfBoundingBox(playerCollision, facing, maxPushDistance); - } + blockCollision.pushOutOfBoundingBox(playerCollision, facing, MAX_PUSH_DISTANCE); } } From b75ccc7b94e01332be86585b68cd0c7fd438f45b Mon Sep 17 00:00:00 2001 From: oryxel1 Date: Fri, 5 Sep 2025 21:50:57 +0700 Subject: [PATCH 08/10] oops. --- .../collision/fixes/SeaPickleCollision.java | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/SeaPickleCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/SeaPickleCollision.java index e46e7db3f..ab407a71e 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/SeaPickleCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/SeaPickleCollision.java @@ -46,25 +46,6 @@ public class SeaPickleCollision extends BlockCollision { protected void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox blockCollision, BoundingBox playerCollision) { // Check for sea pickle bug (sea pickle have no collision on Bedrock but does on Java). double maxY = blockCollision.getMax(Axis.Y) - y; - System.out.println(maxY); blockCollision.pushOutOfBoundingBox(playerCollision, Direction.UP, maxY + CollisionManager.COLLISION_TOLERANCE * 1.01F); } - - @Override - public void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { - super.correctPosition(session, x, y, z, playerCollision); - - for (BoundingBox boundingBox : this.boundingBoxes) { - if (!boundingBox.checkIntersection(x, y, z, playerCollision)) { - continue; - } - - final double maxY = boundingBox.getMax(Axis.Y); - - boundingBox = boundingBox.clone(); - boundingBox.translate(x, y, z); - - boundingBox.pushOutOfBoundingBox(playerCollision, Direction.UP, maxY + CollisionManager.COLLISION_TOLERANCE * 1.01F); - } - } } From 18a7bf0396e8197ad851374dfd6a0793a6bf89bd Mon Sep 17 00:00:00 2001 From: oryxel1 Date: Fri, 5 Sep 2025 21:51:48 +0700 Subject: [PATCH 09/10] oops x2. --- .../collision/fixes/LanternCollision.java | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/LanternCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/LanternCollision.java index 6c0b7ad41..2cc353fec 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/LanternCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/fixes/LanternCollision.java @@ -57,22 +57,4 @@ public class LanternCollision extends BlockCollision { blockCollision.pushOutOfBoundingBox(playerCollision, Direction.UP, MAX_PUSH_DISTANCE); } } - - @Override - public void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { - super.correctPosition(session, x, y, z, playerCollision); - - // Check for lantern collision (lantern is 0.0625 block higher on Java) - final double maxPushDistance = 0.0625 + CollisionManager.COLLISION_TOLERANCE * 1.01F; - for (BoundingBox boundingBox : this.boundingBoxes) { - if (!boundingBox.checkIntersection(x, y, z, playerCollision)) { - continue; - } - - boundingBox = boundingBox.clone(); - boundingBox.translate(x, y, z); - - - } - } } From 2531617cb9536040ccbb4a0e0688faa039e8be11 Mon Sep 17 00:00:00 2001 From: oryxel1 Date: Tue, 9 Sep 2025 18:51:06 +0700 Subject: [PATCH 10/10] Change comments. --- .../geysermc/geyser/translator/collision/BlockCollision.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/geysermc/geyser/translator/collision/BlockCollision.java b/core/src/main/java/org/geysermc/geyser/translator/collision/BlockCollision.java index 813fa6796..a178befab 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/collision/BlockCollision.java +++ b/core/src/main/java/org/geysermc/geyser/translator/collision/BlockCollision.java @@ -55,7 +55,7 @@ public class BlockCollision { public void correctPosition(GeyserSession session, int x, int y, int z, BoundingBox playerCollision) { final double collisionExpansion = CollisionManager.COLLISION_TOLERANCE * 2; - // Due to floating points errors, or possibly how collision is handled on Bedrock, player could be slightly clipping into the block. + // Due to floating points errors, or because of block collision difference, player could be slightly clipping into the block. // So we check if the player is intersecting the block, if they do then push them out. This fixes NoCheatPlus's Passable check and other anticheat checks. // This check doesn't allow players right up against the block, so they must be pushed slightly away. However, we should only do it if the // push distance is smaller than "pushAwayTolerance", we don't want to push player out when they're actually inside a block.