From f1a649c2b246c717099b5764f92d2545f8e1f4ba Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Mon, 6 May 2019 12:29:24 -0700 Subject: [PATCH] Async Chunk placeholder Until we figure out Mojang's ticket system. diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index 0d4e38d0f4..74f7b046ac 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -18,6 +18,7 @@ import java.util.Objects; import java.util.Random; import java.util.Set; import java.util.UUID; +import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.objects.ObjectSortedSet; @@ -2243,6 +2244,40 @@ public class CraftWorld implements World { return (nearest == null) ? null : new Location(this, nearest.getX(), nearest.getY(), nearest.getZ()); } + // Paper start + private Chunk getChunkAtGen(int x, int z, boolean gen) { + // copied from loadChunk() + // this function is identical except we do not add a plugin ticket + IChunkAccess chunk = world.getChunkProvider().getChunkAt(x, z, gen || isChunkGenerated(x, z) ? ChunkStatus.FULL : ChunkStatus.EMPTY, true); + + // If generate = false, but the chunk already exists, we will get this back. + if (chunk instanceof ProtoChunkExtension) { + // We then cycle through again to get the full chunk immediately, rather than after the ticket addition + chunk = world.getChunkProvider().getChunkAt(x, z, ChunkStatus.FULL, true); + } + + if (chunk instanceof net.minecraft.server.Chunk) { + return ((net.minecraft.server.Chunk)chunk).bukkitChunk; + } + + return null; + } + + @Override + public CompletableFuture getChunkAtAsync(int x, int z, boolean gen) { + // TODO placeholder + if (Bukkit.isPrimaryThread()) { + return CompletableFuture.completedFuture(getChunkAtGen(x, z, gen)); + } else { + CompletableFuture ret = new CompletableFuture<>(); + net.minecraft.server.MinecraftServer.getServer().scheduleOnMain(() -> { + ret.complete(getChunkAtGen(x, z, gen)); + }); + return ret; + } + } + // Paper end + // Spigot start private final Spigot spigot = new Spigot() { -- 2.22.0