From 4023739406c9038e5cf4546429837754946756ec Mon Sep 17 00:00:00 2001 From: Tetrino Date: Sun, 7 Sep 2025 13:49:51 +0100 Subject: [PATCH] Force chunk load on elevation check When `BlockState` is called on a block that is within a chunk that has yet to be loaded, it will always return `nil`. This results in a situation wherein the height found by the elevation check will always return -63Y in these cases. This commmit attempts to fix this by forcing an asynchronous chunk load of the destination chunk before elevation is calculated. This is most apparent in ChunkyBorder, wherein a worldwrap teleport would attempt to position the player in a chunk that had yet to be loaded, or even exist, always teleporting them to -63Y See: https://github.com/pop4959/ChunkyBorder/issues/91 --- .../src/main/java/org/popcraft/chunky/platform/BukkitWorld.java | 1 + .../src/main/java/org/popcraft/chunky/platform/FabricWorld.java | 1 + forge/src/main/java/org/popcraft/chunky/platform/ForgeWorld.java | 1 + .../main/java/org/popcraft/chunky/platform/NeoForgeWorld.java | 1 + 4 files changed, 4 insertions(+) diff --git a/bukkit/src/main/java/org/popcraft/chunky/platform/BukkitWorld.java b/bukkit/src/main/java/org/popcraft/chunky/platform/BukkitWorld.java index ccec8e5f..4c5eab74 100644 --- a/bukkit/src/main/java/org/popcraft/chunky/platform/BukkitWorld.java +++ b/bukkit/src/main/java/org/popcraft/chunky/platform/BukkitWorld.java @@ -148,6 +148,7 @@ public CompletableFuture getElevationAtAsync(final int x, final int z) private int getElevationForLocation(final int x, final int z) { final int height = world.getHighestBlockYAt(x, z) + 1; final int logicalHeight = world.getLogicalHeight(); + final CompletableFuture loadedChunk = getChunkAtAsync(x >> 4, y >> 4); if (height >= logicalHeight) { Block block = world.getBlockAt(x, logicalHeight, z); int air = 0; diff --git a/fabric/src/main/java/org/popcraft/chunky/platform/FabricWorld.java b/fabric/src/main/java/org/popcraft/chunky/platform/FabricWorld.java index 74f9d877..526ca068 100644 --- a/fabric/src/main/java/org/popcraft/chunky/platform/FabricWorld.java +++ b/fabric/src/main/java/org/popcraft/chunky/platform/FabricWorld.java @@ -137,6 +137,7 @@ public Border getWorldBorder() { public int getElevation(final int x, final int z) { final int height = world.getHeight(Heightmap.Types.MOTION_BLOCKING, x, z) + 1; final int logicalHeight = world.getLogicalHeight(); + final CompletableFuture loadedChunk = getChunkAtAsync(x >> 4, y >> 4); if (height >= logicalHeight) { BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(x, logicalHeight, z); int air = 0; diff --git a/forge/src/main/java/org/popcraft/chunky/platform/ForgeWorld.java b/forge/src/main/java/org/popcraft/chunky/platform/ForgeWorld.java index 0ae60477..72a7b894 100644 --- a/forge/src/main/java/org/popcraft/chunky/platform/ForgeWorld.java +++ b/forge/src/main/java/org/popcraft/chunky/platform/ForgeWorld.java @@ -140,6 +140,7 @@ public Border getWorldBorder() { public int getElevation(final int x, final int z) { final int height = world.getHeight(Heightmap.Types.MOTION_BLOCKING, x, z) + 1; final int logicalHeight = world.getLogicalHeight(); + final CompletableFuture loadedChunk = getChunkAtAsync(x >> 4, y >> 4); if (height >= logicalHeight) { BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(x, logicalHeight, z); int air = 0; diff --git a/neoforge/src/main/java/org/popcraft/chunky/platform/NeoForgeWorld.java b/neoforge/src/main/java/org/popcraft/chunky/platform/NeoForgeWorld.java index d472f9a3..d4dacfdd 100644 --- a/neoforge/src/main/java/org/popcraft/chunky/platform/NeoForgeWorld.java +++ b/neoforge/src/main/java/org/popcraft/chunky/platform/NeoForgeWorld.java @@ -134,6 +134,7 @@ public Border getWorldBorder() { public int getElevation(final int x, final int z) { final int height = world.getHeight(Heightmap.Types.MOTION_BLOCKING, x, z) + 1; final int logicalHeight = world.getLogicalHeight(); + final CompletableFuture loadedChunk = getChunkAtAsync(x >> 4, y >> 4); if (height >= logicalHeight) { BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(x, logicalHeight, z); int air = 0;