Skip to content

Commit 9e5e65b

Browse files
committed
Add async chunk loading for spigot/paper 1.21.3/1.21.4
1 parent 003cad5 commit 9e5e65b

File tree

4 files changed

+58
-2
lines changed

4 files changed

+58
-2
lines changed

bukkit-helper-121-3/src/main/java/org/dynmap/bukkit/helper/v121_3/BukkitVersionHelperSpigot121_3.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public class BukkitVersionHelperSpigot121_3 extends BukkitVersionHelper {
6767

6868
@Override
6969
public boolean isUnsafeAsync() {
70-
return true;
70+
return false;
7171
}
7272

7373
/**

bukkit-helper-121-3/src/main/java/org/dynmap/bukkit/helper/v121_3/MapChunkCache121_3.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
import net.minecraft.world.level.biome.BiomeFog;
77
import net.minecraft.world.level.chunk.Chunk;
88
import net.minecraft.world.level.chunk.storage.SerializableChunkData;
9+
import org.bukkit.Bukkit;
910
import org.bukkit.World;
11+
import org.bukkit.craftbukkit.v1_21_R2.CraftServer;
1012
import org.bukkit.craftbukkit.v1_21_R2.CraftWorld;
1113
import org.dynmap.DynmapChunk;
1214
import org.dynmap.bukkit.helper.BukkitWorld;
@@ -17,7 +19,10 @@
1719

1820
import java.util.List;
1921
import java.util.NoSuchElementException;
22+
import java.util.Optional;
2023
import java.util.concurrent.CancellationException;
24+
import java.util.concurrent.CompletableFuture;
25+
import java.util.function.Supplier;
2126

2227
/**
2328
* Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread
@@ -31,6 +36,22 @@ public MapChunkCache121_3(GenericChunkCache cc) {
3136
super(cc);
3237
}
3338

39+
@Override
40+
protected Supplier<GenericChunk> getLoadedChunkAsync(DynmapChunk chunk) {
41+
CompletableFuture<SerializableChunkData> chunkData = CompletableFuture.supplyAsync(() -> {
42+
CraftWorld cw = (CraftWorld) w;
43+
Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z);
44+
if (c == null || !c.q) { //!c.loaded
45+
return null;
46+
}
47+
return SerializableChunkData.a(cw.getHandle(), c); //SerializableChunkData.copyOf
48+
}, ((CraftServer) Bukkit.getServer()).getServer());
49+
return () -> {
50+
NBTTagCompound nbt = chunkData.join().a(); // SerializableChunkData.write
51+
return parseChunkFromNBT(new NBT.NBTCompound(nbt));
52+
};
53+
}
54+
3455
protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
3556
CraftWorld cw = (CraftWorld) w;
3657
if (!cw.isChunkLoaded(chunk.x, chunk.z)) return null;
@@ -41,6 +62,13 @@ protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
4162
return nbt != null ? parseChunkFromNBT(new NBT.NBTCompound(nbt)) : null;
4263
}
4364

65+
@Override
66+
protected Supplier<GenericChunk> loadChunkAsync(DynmapChunk chunk) {
67+
CraftWorld cw = (CraftWorld) w;
68+
CompletableFuture<Optional<NBTTagCompound>> genericChunk = cw.getHandle().m().a.d(new ChunkCoordIntPair(chunk.x, chunk.z)); // WorldServer.getChunkSource().chunkMap.read(new ChunkCoordIntPair(chunk.x, chunk.z))
69+
return () -> genericChunk.join().map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null);
70+
}
71+
4472
protected GenericChunk loadChunk(DynmapChunk chunk) {
4573
CraftWorld cw = (CraftWorld) w;
4674
NBTTagCompound nbt = null;

bukkit-helper-121-4/src/main/java/org/dynmap/bukkit/helper/v121_4/BukkitVersionHelperSpigot121_4.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public class BukkitVersionHelperSpigot121_4 extends BukkitVersionHelper {
6767

6868
@Override
6969
public boolean isUnsafeAsync() {
70-
return true;
70+
return false;
7171
}
7272

7373
/**

bukkit-helper-121-4/src/main/java/org/dynmap/bukkit/helper/v121_4/MapChunkCache121_4.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
import net.minecraft.world.level.biome.BiomeFog;
77
import net.minecraft.world.level.chunk.Chunk;
88
import net.minecraft.world.level.chunk.storage.SerializableChunkData;
9+
import org.bukkit.Bukkit;
910
import org.bukkit.World;
11+
import org.bukkit.craftbukkit.v1_21_R3.CraftServer;
1012
import org.bukkit.craftbukkit.v1_21_R3.CraftWorld;
1113
import org.dynmap.DynmapChunk;
1214
import org.dynmap.bukkit.helper.BukkitWorld;
@@ -17,7 +19,10 @@
1719

1820
import java.util.List;
1921
import java.util.NoSuchElementException;
22+
import java.util.Optional;
2023
import java.util.concurrent.CancellationException;
24+
import java.util.concurrent.CompletableFuture;
25+
import java.util.function.Supplier;
2126

2227
/**
2328
* Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread
@@ -31,6 +36,22 @@ public MapChunkCache121_4(GenericChunkCache cc) {
3136
super(cc);
3237
}
3338

39+
@Override
40+
protected Supplier<GenericChunk> getLoadedChunkAsync(DynmapChunk chunk) {
41+
CompletableFuture<SerializableChunkData> chunkData = CompletableFuture.supplyAsync(() -> {
42+
CraftWorld cw = (CraftWorld) w;
43+
Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z);
44+
if (c == null || !c.q) { //!c.loaded
45+
return null;
46+
}
47+
return SerializableChunkData.a(cw.getHandle(), c); //SerializableChunkData.copyOf
48+
}, ((CraftServer) Bukkit.getServer()).getServer());
49+
return () -> {
50+
NBTTagCompound nbt = chunkData.join().a(); // SerializableChunkData.write
51+
return parseChunkFromNBT(new NBT.NBTCompound(nbt));
52+
};
53+
}
54+
3455
protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
3556
CraftWorld cw = (CraftWorld) w;
3657
if (!cw.isChunkLoaded(chunk.x, chunk.z)) return null;
@@ -41,6 +62,13 @@ protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
4162
return nbt != null ? parseChunkFromNBT(new NBT.NBTCompound(nbt)) : null;
4263
}
4364

65+
@Override
66+
protected Supplier<GenericChunk> loadChunkAsync(DynmapChunk chunk) {
67+
CraftWorld cw = (CraftWorld) w;
68+
CompletableFuture<Optional<NBTTagCompound>> genericChunk = cw.getHandle().m().a.d(new ChunkCoordIntPair(chunk.x, chunk.z)); // WorldServer.getChunkSource().chunkMap.read(new ChunkCoordIntPair(chunk.x, chunk.z))
69+
return () -> genericChunk.join().map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null);
70+
}
71+
4472
protected GenericChunk loadChunk(DynmapChunk chunk) {
4573
CraftWorld cw = (CraftWorld) w;
4674
NBTTagCompound nbt = null;

0 commit comments

Comments
 (0)