From bf2cf6fce0635f9d5e7c70254df2d8e87d20bd2b Mon Sep 17 00:00:00 2001
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
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 02098b9cc2..af1f1c2d62 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -16,6 +16,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 net.minecraft.server.AxisAlignedBB;
 import net.minecraft.server.BiomeBase;
@@ -2155,6 +2156,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<Chunk> getChunkAtAsync(int x, int z, boolean gen) {
+        // TODO placeholder
+        if (Bukkit.isPrimaryThread()) {
+            return CompletableFuture.completedFuture(getChunkAtGen(x, z, gen));
+        } else {
+            CompletableFuture<Chunk> 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