2019-06-14 02:27:40 +00:00
|
|
|
From af9f9c29a1273780f01d748233d3f82c46fa76e2 Mon Sep 17 00:00:00 2001
|
2019-05-06 19:30:27 +00:00
|
|
|
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
|
2019-06-06 15:36:57 +00:00
|
|
|
index fa4142c824..0328eadf27 100644
|
2019-05-06 19:30:27 +00:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
|
|
@@ -14,6 +14,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;
|
2019-05-27 05:17:12 +00:00
|
|
|
@@ -2117,6 +2118,40 @@ public class CraftWorld implements World {
|
2019-05-06 19:30:27 +00:00
|
|
|
return (nearest == null) ? null : new Location(this, nearest.getX(), nearest.getY(), nearest.getZ());
|
|
|
|
}
|
|
|
|
|
|
|
|
+ // Paper start
|
2019-05-27 05:17:12 +00:00
|
|
|
+ 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;
|
|
|
|
+ }
|
2019-05-06 19:30:27 +00:00
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public CompletableFuture<Chunk> getChunkAtAsync(int x, int z, boolean gen) {
|
|
|
|
+ // TODO placeholder
|
2019-05-27 05:17:12 +00:00
|
|
|
+ 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;
|
|
|
|
+ }
|
2019-05-06 19:30:27 +00:00
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
+
|
|
|
|
// Spigot start
|
|
|
|
private final Spigot spigot = new Spigot()
|
|
|
|
{
|
|
|
|
--
|
|
|
|
2.21.0
|
|
|
|
|