Paper/Spigot-Server-Patches/0386-Async-Chunk-placeholder.patch
Spottedleaf 2f782a6652 Updated Upstream (CraftBukkit)
Upstream has released updates that appears to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

CraftBukkit Changes:
17543ecf SPIGOT-5035: Error Using Virtual Merchant GUI
0fc6922b SPIGOT-5028: Villager#setVillagerExperience() doesn't work
bdbdbe44 SPIGOT-5024: Fox error - Unknown target reason
2019-06-06 16:56:51 +01:00

64 lines
2.5 KiB
Diff

From 2efa59acece191836a29be8d5b9160ba1e34723e 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 fa4142c824..0328eadf27 100644
--- 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;
@@ -2117,6 +2118,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.21.0