diff --git a/src/main/java/net/minestom/server/listener/BlockPlacementListener.java b/src/main/java/net/minestom/server/listener/BlockPlacementListener.java index f2a1f8edf..bc34bb020 100644 --- a/src/main/java/net/minestom/server/listener/BlockPlacementListener.java +++ b/src/main/java/net/minestom/server/listener/BlockPlacementListener.java @@ -115,7 +115,7 @@ public class BlockPlacementListener { } if (placementPosition.y() >= instance.getDimensionType().getMaxY() - || placementPosition.y() <= instance.getDimensionType().getMinY()) return; + || placementPosition.y() < instance.getDimensionType().getMinY()) return; // Ensure that the final placement position is inside the world border. if (!instance.getWorldBorder().isInside(placementPosition)) { diff --git a/src/test/java/net/minestom/server/instance/BlockPlaceIntegrationTest.java b/src/test/java/net/minestom/server/instance/BlockPlaceIntegrationTest.java index 9a64a0eda..423a2a4ec 100644 --- a/src/test/java/net/minestom/server/instance/BlockPlaceIntegrationTest.java +++ b/src/test/java/net/minestom/server/instance/BlockPlaceIntegrationTest.java @@ -40,4 +40,21 @@ public class BlockPlaceIntegrationTest { var placedBlock = instance.getBlock(3, 40, 0); assertEquals(Block.AIR, placedBlock); } + + @Test + void testPlacementAtMinus64(Env env) { + Instance instance = env.createFlatInstance(); + var player = env.createPlayer(instance, new Pos(0, -64, 0)); + player.setItemInHand(Player.Hand.MAIN, ItemStack.of(Material.STONE, 5)); + env.tick(); // World border tick to update distance + + // Should be air, then we place + assertEquals(Block.AIR, instance.getBlock(3, -64, 0)); + var placePacket = new ClientPlayerBlockPlacementPacket(Player.Hand.MAIN, new Pos(3, -64, 0), BlockFace.TOP, 0.5f, 0.5f, 0.5f, false, 1); + BlockPlacementListener.listener(placePacket, player); + + // Should be stone. + var placedBlock = instance.getBlock(3, -64, 0); + assertEquals(Block.STONE, placedBlock); + } }