6
6
import net .minecraft .world .level .biome .BiomeFog ;
7
7
import net .minecraft .world .level .chunk .Chunk ;
8
8
import net .minecraft .world .level .chunk .storage .SerializableChunkData ;
9
+ import org .bukkit .Bukkit ;
9
10
import org .bukkit .World ;
11
+ import org .bukkit .craftbukkit .v1_21_R2 .CraftServer ;
10
12
import org .bukkit .craftbukkit .v1_21_R2 .CraftWorld ;
11
13
import org .dynmap .DynmapChunk ;
12
14
import org .dynmap .bukkit .helper .BukkitWorld ;
17
19
18
20
import java .util .List ;
19
21
import java .util .NoSuchElementException ;
22
+ import java .util .Optional ;
20
23
import java .util .concurrent .CancellationException ;
24
+ import java .util .concurrent .CompletableFuture ;
25
+ import java .util .function .Supplier ;
21
26
22
27
/**
23
28
* Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread
@@ -31,6 +36,19 @@ public MapChunkCache121_3(GenericChunkCache cc) {
31
36
super (cc );
32
37
}
33
38
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
+
34
52
protected GenericChunk getLoadedChunk (DynmapChunk chunk ) {
35
53
CraftWorld cw = (CraftWorld ) w ;
36
54
if (!cw .isChunkLoaded (chunk .x , chunk .z )) return null ;
@@ -41,6 +59,13 @@ protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
41
59
return nbt != null ? parseChunkFromNBT (new NBT .NBTCompound (nbt )) : null ;
42
60
}
43
61
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
+
44
69
protected GenericChunk loadChunk (DynmapChunk chunk ) {
45
70
CraftWorld cw = (CraftWorld ) w ;
46
71
NBTTagCompound nbt = null ;
0 commit comments