diff --git a/DynmapCore/src/main/java/org/dynmap/common/chunk/GenericMapChunkCache.java b/DynmapCore/src/main/java/org/dynmap/common/chunk/GenericMapChunkCache.java index 553a57bf..e44f7f14 100644 --- a/DynmapCore/src/main/java/org/dynmap/common/chunk/GenericMapChunkCache.java +++ b/DynmapCore/src/main/java/org/dynmap/common/chunk/GenericMapChunkCache.java @@ -700,13 +700,13 @@ public abstract class GenericMapChunkCache extends MapChunkCache { protected abstract GenericChunk getLoadedChunk(DynmapChunk ch); // Load generic chunk from unloaded chunk protected abstract GenericChunk loadChunk(DynmapChunk ch); - // Load generic chunk from existing and already loaded chunk + // Load generic chunk from existing and already loaded chunk async protected Supplier getLoadedChunkAsync(DynmapChunk ch) { - throw new RuntimeException("Not implemeted"); + throw new IllegalStateException("Not implemeted"); } // Load generic chunks from unloaded chunk async protected Supplier loadChunkAsync(DynmapChunk ch){ - throw new RuntimeException("Not implemeted"); + throw new IllegalStateException("Not implemeted"); } /** @@ -764,8 +764,13 @@ public abstract class GenericMapChunkCache extends MapChunkCache { } return cnt; } + + /** + * Read NBT data from loaded chunks - do not needs to be called from server/world + * Will throw {@link IllegalStateException} if not supporting + */ public void getLoadedChunksAsync() { - class SimplePair{ //simple pair of the supplier that finishes read async, and a consumer that also finish his work async + class SimplePair { //simple pair of the supplier that finishes read async, and a consumer that also finish his work async final Supplier supplier; final BiConsumer consumer; @@ -830,6 +835,9 @@ public abstract class GenericMapChunkCache extends MapChunkCache { return getLoadedChunks() + readChunks(max_to_load); } + /** + * Prepare the chunks async + */ public void loadChunksAsync() { getLoadedChunksAsync(); readChunksAsync(); @@ -916,6 +924,15 @@ public abstract class GenericMapChunkCache extends MapChunkCache { } public void readChunksAsync() { + class SimplePair { + private final Supplier supplier; + private final DynmapChunk chunk; + + SimplePair(DynmapChunk chunk) { + this.chunk = chunk; + this.supplier = loadChunkAsync(chunk); + } + } if (!dw.isLoaded()) { isempty = true; unloadChunks(); @@ -937,14 +954,14 @@ public abstract class GenericMapChunkCache extends MapChunkCache { try { List cached = new ArrayList<>(); - List, DynmapChunk>> notCached = new ArrayList<>(); + List notCached = new ArrayList<>(); iterator.forEachRemaining(chunks::add); chunks.stream() .filter(chunk -> snaparray[(chunk.x - x_min) + (chunk.z - z_min) * x_dim] == null) .forEach(chunk -> { if (cache.getSnapshot(dw.getName(), chunk.x, chunk.z) == null) { - notCached.add(new AbstractMap.SimpleEntry<>(loadChunkAsync(chunk), chunk)); + notCached.add(new SimplePair(chunk)); } else { cached.add(chunk); } @@ -957,8 +974,8 @@ public abstract class GenericMapChunkCache extends MapChunkCache { }); notCached.forEach(chunkSupplier -> { long startTime = System.nanoTime(); - GenericChunk chunk = chunkSupplier.getKey().get(); - DynmapChunk dynmapChunk = chunkSupplier.getValue(); + GenericChunk chunk = chunkSupplier.supplier.get(); + DynmapChunk dynmapChunk = chunkSupplier.chunk; if (chunk != null) { // If hidden if (isChunkVisible(dynmapChunk)) { diff --git a/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java b/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java index 1b16ffaa..9ac97138 100644 --- a/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java +++ b/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java @@ -563,7 +563,6 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { } } } else { -// synchronized (lock) { if (prev_tick != cur_tick) { prev_tick = cur_tick; cur_tick_starttime = System.nanoTime(); @@ -573,7 +572,6 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { } else { cc.loadChunks(Integer.MAX_VALUE); } -// } } } /* If cancelled due to world unload return nothing */