Skip to content

Commit 10e6739

Browse files
authored
Merge pull request #4188 from ZockiRR/v3.0
Async chunk loading for spigot/paper 1.21.3/1.21.4
2 parents 003cad5 + c785bd7 commit 10e6739

File tree

4 files changed

+52
-2
lines changed

4 files changed

+52
-2
lines changed

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

+1-1
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

+25
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,19 @@ public MapChunkCache121_3(GenericChunkCache cc) {
3136
super(cc);
3237
}
3338

39+
@Override
40+
protected Supplier<GenericChunk> getLoadedChunkAsync(DynmapChunk chunk) {
41+
CompletableFuture<Optional<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 Optional.empty();
46+
}
47+
return Optional.of(SerializableChunkData.a(cw.getHandle(), c)); // SerializableChunkData.copyOf
48+
}, ((CraftServer) Bukkit.getServer()).getServer());
49+
return () -> chunkData.join().map(SerializableChunkData::a).map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null); // SerializableChunkData::write
50+
}
51+
3452
protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
3553
CraftWorld cw = (CraftWorld) w;
3654
if (!cw.isChunkLoaded(chunk.x, chunk.z)) return null;
@@ -41,6 +59,13 @@ protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
4159
return nbt != null ? parseChunkFromNBT(new NBT.NBTCompound(nbt)) : null;
4260
}
4361

62+
@Override
63+
protected Supplier<GenericChunk> loadChunkAsync(DynmapChunk chunk) {
64+
CraftWorld cw = (CraftWorld) w;
65+
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))
66+
return () -> genericChunk.join().map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null);
67+
}
68+
4469
protected GenericChunk loadChunk(DynmapChunk chunk) {
4570
CraftWorld cw = (CraftWorld) w;
4671
NBTTagCompound nbt = null;

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

+1-1
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

+25
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,19 @@ public MapChunkCache121_4(GenericChunkCache cc) {
3136
super(cc);
3237
}
3338

39+
@Override
40+
protected Supplier<GenericChunk> getLoadedChunkAsync(DynmapChunk chunk) {
41+
CompletableFuture<Optional<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 Optional.empty();
46+
}
47+
return Optional.of(SerializableChunkData.a(cw.getHandle(), c)); // SerializableChunkData.copyOf
48+
}, ((CraftServer) Bukkit.getServer()).getServer());
49+
return () -> chunkData.join().map(SerializableChunkData::a).map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null); // SerializableChunkData::write
50+
}
51+
3452
protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
3553
CraftWorld cw = (CraftWorld) w;
3654
if (!cw.isChunkLoaded(chunk.x, chunk.z)) return null;
@@ -41,6 +59,13 @@ protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
4159
return nbt != null ? parseChunkFromNBT(new NBT.NBTCompound(nbt)) : null;
4260
}
4361

62+
@Override
63+
protected Supplier<GenericChunk> loadChunkAsync(DynmapChunk chunk) {
64+
CraftWorld cw = (CraftWorld) w;
65+
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))
66+
return () -> genericChunk.join().map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null);
67+
}
68+
4469
protected GenericChunk loadChunk(DynmapChunk chunk) {
4570
CraftWorld cw = (CraftWorld) w;
4671
NBTTagCompound nbt = null;

0 commit comments

Comments
 (0)