Skip to content

Commit

Permalink
Changed it so ChunksProvider#loadChunk will check first whether the c…
Browse files Browse the repository at this point in the history
…hunk is currently loaded before trying to load it again
  • Loading branch information
OmerBenGera committed Sep 2, 2023
1 parent 4aed7af commit 2535a94
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 7 deletions.
Expand Up @@ -9,6 +9,7 @@

import javax.annotation.Nullable;
import java.util.Objects;
import java.util.Optional;

public class ChunkPosition {

Expand Down Expand Up @@ -81,6 +82,12 @@ public boolean isInsideChunk(Location location) {
location.getBlockX() >> 4 == x && location.getBlockZ() >> 4 == z;
}

public int distanceSquared(ChunkPosition other) {
int deltaX = this.x - other.x;
int deltaZ = this.z - other.z;
return (deltaX * deltaX) + (deltaZ * deltaZ);
}

@Override
public int hashCode() {
return Objects.hash(worldInfo.getName(), x, z);
Expand All @@ -106,4 +113,10 @@ private ChunkPosition withBukkitWorld(World world) {
return this;
}

public static Optional<Chunk> getLoadedChunk(ChunkPosition chunkPosition) {
boolean isChunkLoaded = chunkPosition.getWorld().isChunkLoaded(chunkPosition.getX(), chunkPosition.getZ());
if (!isChunkLoaded) return Optional.empty();
return Optional.of(chunkPosition.getWorld().getChunkAt(chunkPosition.getX(), chunkPosition.getZ()));
}

}
Expand Up @@ -39,6 +39,14 @@ public static CompletableFuture<Chunk> loadChunk(ChunkPosition chunkPosition, Ch

Log.debug(Debug.LOAD_CHUNK, chunkPosition, chunkLoadReason);

Chunk loadedChunk = ChunkPosition.getLoadedChunk(chunkPosition).orElse(null);
if (loadedChunk != null) {
processPendingChunkLoadRequest(loadedChunk, chunkPosition);
if (onLoadConsumer != null)
onLoadConsumer.accept(loadedChunk);
return CompletableFuture.completedFuture(loadedChunk);
}

PendingChunkLoadRequest pendingRequest = pendingRequests.get(chunkPosition);

if (pendingRequest != null) {
Expand Down Expand Up @@ -108,19 +116,23 @@ public void work() {
}

private void finishLoad(Chunk chunk, long profiler) {
PendingChunkLoadRequest pendingRequest = pendingRequests.remove(chunkPosition);

Profiler.end(profiler);
Log.debug(Debug.LOAD_CHUNK, chunkPosition, chunkLoadReason);

if (pendingRequest != null) {
pendingRequest.callbacks.forEach(chunkConsumer -> chunkConsumer.accept(chunk));
pendingRequest.completableFuture.complete(chunk);
}
processPendingChunkLoadRequest(chunk, chunkPosition);
}

}

private static void processPendingChunkLoadRequest(Chunk chunk, ChunkPosition chunkPosition) {
PendingChunkLoadRequest pendingRequest = pendingRequests.remove(chunkPosition);

if (pendingRequest == null)
return;

pendingRequest.callbacks.forEach(chunkConsumer -> chunkConsumer.accept(chunk));
pendingRequest.completableFuture.complete(chunk);
}

private static class PendingChunkLoadRequest {

private final CompletableFuture<Chunk> completableFuture;
Expand Down

0 comments on commit 2535a94

Please sign in to comment.