From 756f395158e133852853b5e472af2eed183db2e9 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 05:41:19 -0400 Subject: [PATCH] Method api & impl changes --- .../core/pregenerator/PregeneratorMethod.java | 3 +- .../methods/DummyPregenMethod.java | 2 +- .../methods/HeadlessPregenMethod.java | 2 +- .../methods/HybridPregenMethod.java | 4 +-- .../methods/MedievalPregenMethod.java | 36 ++++++++++++++++--- .../methods/PaperAsyncPregenMethod.java | 16 ++++++--- .../methods/PaperOrMedievalPregenMethod.java | 4 +-- 7 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java index 9bad0e05a..a5c698ba8 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java @@ -67,6 +67,7 @@ public interface PregeneratorMethod { * Called to generate a chunk. You can go async so long as save will wait on the threads to finish * @param x the x * @param z the z + * @param listener */ - void generateChunk(int x, int z); + void generateChunk(int x, int z, PregenListener listener); } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java index 08c108431..0147a0441 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java @@ -53,7 +53,7 @@ public class DummyPregenMethod implements PregeneratorMethod { } @Override - public void generateChunk(int x, int z) { + public void generateChunk(int x, int z, PregenListener listener) { } } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java index c42155da0..bac3fe69c 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java @@ -64,7 +64,7 @@ public class HeadlessPregenMethod implements PregeneratorMethod { } @Override - public void generateChunk(int x, int z) { + public void generateChunk(int x, int z, PregenListener listener) { throw new UnsupportedOperationException(); } } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java index b6efb1c25..a50538405 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java @@ -81,7 +81,7 @@ public class HybridPregenMethod implements PregeneratorMethod { } @Override - public void generateChunk(int x, int z) { - inWorld.generateChunk(x, z); + public void generateChunk(int x, int z, PregenListener listener) { + inWorld.generateChunk(x, z, listener); } } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java index 51ec8086c..49d2ed28a 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java @@ -20,24 +20,45 @@ package com.volmit.iris.core.pregenerator.methods; import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.core.pregenerator.PregeneratorMethod; +import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.scheduling.J; import org.bukkit.Chunk; import org.bukkit.World; +import java.util.concurrent.CompletableFuture; + public class MedievalPregenMethod implements PregeneratorMethod { private final World world; + private final KList> futures; public MedievalPregenMethod(World world) { this.world = world; + futures = new KList<>(); + } + + private void waitForChunks() + { + for(CompletableFuture i : futures) + { + try { + i.get(); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + futures.clear(); } private void unloadAndSaveAllChunks() { + waitForChunks(); J.s(() -> { for(Chunk i : world.getLoadedChunks()) { i.unload(true); } + world.save(); }); } @@ -49,13 +70,11 @@ public class MedievalPregenMethod implements PregeneratorMethod { @Override public void close() { unloadAndSaveAllChunks(); - world.save(); } @Override public void save() { unloadAndSaveAllChunks(); - world.save(); } @Override @@ -74,7 +93,16 @@ public class MedievalPregenMethod implements PregeneratorMethod { } @Override - public void generateChunk(int x, int z) { - world.getChunkAt(x, z); + public void generateChunk(int x, int z, PregenListener listener) { + if(futures.size() > 32) + { + waitForChunks(); + } + + listener.onChunkGenerating(x, z); + futures.add(J.sfut(() -> { + world.getChunkAt(x, z); + listener.onChunkGenerated(x, z); + })); } } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java index f38046a23..7bb41c3c1 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java @@ -52,12 +52,14 @@ public class PaperAsyncPregenMethod implements PregeneratorMethod { { i.unload(true); } + world.save(); }); } - private void completeChunk(int x, int z) { + private void completeChunk(int x, int z, PregenListener listener) { try { PaperLib.getChunkAtAsync(world, x, z, true).get(); + listener.onChunkGenerated(x, z); } catch (Throwable e) { e.printStackTrace(); } @@ -92,14 +94,12 @@ public class PaperAsyncPregenMethod implements PregeneratorMethod { waitForChunks(); burst.shutdownAndAwait(); unloadAndSaveAllChunks(); - world.save(); } @Override public void save() { waitForChunks(); unloadAndSaveAllChunks(); - world.save(); } @Override @@ -113,7 +113,13 @@ public class PaperAsyncPregenMethod implements PregeneratorMethod { } @Override - public void generateChunk(int x, int z) { - future.add(burst.complete(() -> completeChunk(x, z))); + public void generateChunk(int x, int z, PregenListener listener) { + if(future.size() > 32) + { + waitForChunks(); + } + + listener.onChunkGenerating(x, z); + future.add(burst.complete(() -> completeChunk(x, z, listener))); } } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java index 4608b68e6..6df75a9b7 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java @@ -62,7 +62,7 @@ public class PaperOrMedievalPregenMethod implements PregeneratorMethod { } @Override - public void generateChunk(int x, int z) { - method.generateChunk(x, z); + public void generateChunk(int x, int z, PregenListener listener) { + method.generateChunk(x, z, listener); } }