Skip to content

Commit 0bf6ab4

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

File tree

4 files changed

+96
-2
lines changed

4 files changed

+96
-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: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.bukkit.World;
1010
import org.bukkit.craftbukkit.v1_21_R2.CraftWorld;
1111
import org.dynmap.DynmapChunk;
12+
import org.dynmap.Log;
1213
import org.dynmap.bukkit.helper.BukkitWorld;
1314
import org.dynmap.common.BiomeMap;
1415
import org.dynmap.common.chunk.GenericChunk;
@@ -18,6 +19,9 @@
1819
import java.util.List;
1920
import java.util.NoSuchElementException;
2021
import java.util.concurrent.CancellationException;
22+
import java.util.concurrent.CompletableFuture;
23+
import java.util.concurrent.ExecutionException;
24+
import java.util.function.Supplier;
2125

2226
/**
2327
* Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread
@@ -31,6 +35,31 @@ public MapChunkCache121_3(GenericChunkCache cc) {
3135
super(cc);
3236
}
3337

38+
@Override
39+
protected Supplier<GenericChunk> getLoadedChunkAsync(DynmapChunk chunk) {
40+
CompletableFuture<GenericChunk> genericChunk = CompletableFuture.supplyAsync(() -> {
41+
CraftWorld cw = (CraftWorld) w;
42+
Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z);
43+
if (c == null || !c.q) { //!c.loaded
44+
return null;
45+
}
46+
SerializableChunkData chunkData = SerializableChunkData.a(cw.getHandle(), c); //SerializableChunkData.copyOf
47+
NBTTagCompound nbt = chunkData.a(); // SerializableChunkData.write
48+
return parseChunkFromNBT(new NBT.NBTCompound(nbt));
49+
});
50+
return () -> {
51+
try {
52+
return genericChunk.get();
53+
} catch (InterruptedException e) {
54+
Log.severe("Error loading cached chunk async", e);
55+
Thread.currentThread().interrupt();
56+
} catch (ExecutionException e) {
57+
Log.severe("Error loading cached chunk async", e);
58+
}
59+
return null;
60+
};
61+
}
62+
3463
protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
3564
CraftWorld cw = (CraftWorld) w;
3665
if (!cw.isChunkLoaded(chunk.x, chunk.z)) return null;
@@ -41,6 +70,24 @@ protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
4170
return nbt != null ? parseChunkFromNBT(new NBT.NBTCompound(nbt)) : null;
4271
}
4372

73+
@Override
74+
protected Supplier<GenericChunk> loadChunkAsync(DynmapChunk chunk){
75+
CraftWorld cw = (CraftWorld) w;
76+
CompletableFuture<GenericChunk> genericChunk = cw.getHandle().m().a.d(new ChunkCoordIntPair(chunk.x, chunk.z)) // WorldServer.getChunkSource().chunkMap.read(new ChunkCoordIntPair(chunk.x, chunk.z))
77+
.thenApply(opt -> opt.map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null));
78+
return () -> {
79+
try {
80+
return genericChunk.get();
81+
} catch (InterruptedException e) {
82+
Log.severe("Error loading chunk async", e);
83+
Thread.currentThread().interrupt();
84+
} catch (ExecutionException e) {
85+
Log.severe("Error loading chunk async", e);
86+
}
87+
return null;
88+
};
89+
}
90+
4491
protected GenericChunk loadChunk(DynmapChunk chunk) {
4592
CraftWorld cw = (CraftWorld) w;
4693
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: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.bukkit.World;
1010
import org.bukkit.craftbukkit.v1_21_R3.CraftWorld;
1111
import org.dynmap.DynmapChunk;
12+
import org.dynmap.Log;
1213
import org.dynmap.bukkit.helper.BukkitWorld;
1314
import org.dynmap.common.BiomeMap;
1415
import org.dynmap.common.chunk.GenericChunk;
@@ -18,6 +19,9 @@
1819
import java.util.List;
1920
import java.util.NoSuchElementException;
2021
import java.util.concurrent.CancellationException;
22+
import java.util.concurrent.CompletableFuture;
23+
import java.util.concurrent.ExecutionException;
24+
import java.util.function.Supplier;
2125

2226
/**
2327
* Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread
@@ -31,6 +35,31 @@ public MapChunkCache121_4(GenericChunkCache cc) {
3135
super(cc);
3236
}
3337

38+
@Override
39+
protected Supplier<GenericChunk> getLoadedChunkAsync(DynmapChunk chunk) {
40+
CompletableFuture<GenericChunk> genericChunk = CompletableFuture.supplyAsync(() -> {
41+
CraftWorld cw = (CraftWorld) w;
42+
Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z);
43+
if (c == null || !c.q) { //!c.loaded
44+
return null;
45+
}
46+
SerializableChunkData chunkData = SerializableChunkData.a(cw.getHandle(), c); //SerializableChunkData.copyOf
47+
NBTTagCompound nbt = chunkData.a(); // SerializableChunkData.write
48+
return parseChunkFromNBT(new NBT.NBTCompound(nbt));
49+
});
50+
return () -> {
51+
try {
52+
return genericChunk.get();
53+
} catch (InterruptedException e) {
54+
Log.severe("Error loading cached chunk async", e);
55+
Thread.currentThread().interrupt();
56+
} catch (ExecutionException e) {
57+
Log.severe("Error loading cached chunk async", e);
58+
}
59+
return null;
60+
};
61+
}
62+
3463
protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
3564
CraftWorld cw = (CraftWorld) w;
3665
if (!cw.isChunkLoaded(chunk.x, chunk.z)) return null;
@@ -41,6 +70,24 @@ protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
4170
return nbt != null ? parseChunkFromNBT(new NBT.NBTCompound(nbt)) : null;
4271
}
4372

73+
@Override
74+
protected Supplier<GenericChunk> loadChunkAsync(DynmapChunk chunk){
75+
CraftWorld cw = (CraftWorld) w;
76+
CompletableFuture<GenericChunk> genericChunk = cw.getHandle().m().a.d(new ChunkCoordIntPair(chunk.x, chunk.z)) // WorldServer.getChunkSource().chunkMap.read(new ChunkCoordIntPair(chunk.x, chunk.z))
77+
.thenApply(opt -> opt.map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null));
78+
return () -> {
79+
try {
80+
return genericChunk.get();
81+
} catch (InterruptedException e) {
82+
Log.severe("Error loading chunk async", e);
83+
Thread.currentThread().interrupt();
84+
} catch (ExecutionException e) {
85+
Log.severe("Error loading chunk async", e);
86+
}
87+
return null;
88+
};
89+
}
90+
4491
protected GenericChunk loadChunk(DynmapChunk chunk) {
4592
CraftWorld cw = (CraftWorld) w;
4693
NBTTagCompound nbt = null;

0 commit comments

Comments
 (0)