diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java index 208c27dd0..d858d80f4 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java @@ -27,7 +27,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Random; -import java.util.concurrent.Callable; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -52,11 +52,10 @@ public abstract class Regenerator chunkStati = new LinkedHashMap<>(); - protected boolean generateConcurrent = true; - protected long seed; - private final Long2ObjectLinkedOpenHashMap protoChunks = new Long2ObjectLinkedOpenHashMap<>(); private final Long2ObjectOpenHashMap chunks = new Long2ObjectOpenHashMap<>(); + protected boolean generateConcurrent = true; + protected long seed; private ExecutorService executor; private SingleThreadQueueExtent source; @@ -75,6 +74,15 @@ public abstract class Regenerator entry : chunkStati.entrySet()) { ChunkStatus chunkStatus = entry.getKey(); int radius = chunkStatus.requiredNeigborChunkRadius0(); @@ -194,18 +203,18 @@ public abstract class Regenerator>> tasks = getChunkStatusTaskRows(coords, radius); for (ConcurrentTasks> para : tasks) { - List scheduled = new ArrayList<>(tasks.size()); + List scheduled = new ArrayList<>(tasks.size()); for (SequentialTasks row : para) { - scheduled.add((Callable) () -> { + scheduled.add(() -> { for (Long xz : row) { chunkStatus.processChunkSave(xz, worldlimits.get(radius).get(xz)); } - return null; }); } try { - List futures = executor.invokeAll(scheduled); - for (Future future : futures) { + List> futures = new ArrayList<>(); + scheduled.forEach(task -> futures.add(executor.submit(task))); + for (Future future : futures) { future.get(); } } catch (Exception e) { @@ -214,16 +223,16 @@ public abstract class Regenerator scheduled = new ArrayList<>(coords.size()); for (long xz : coords) { - scheduled.add((Callable) () -> { + scheduled.add(() -> { chunkStatus.processChunkSave(xz, worldlimits.get(radius).get(xz)); - return null; }); } try { - List futures = executor.invokeAll(scheduled); - for (Future future : futures) { + List> futures = new ArrayList<>(); + scheduled.forEach(task -> futures.add(executor.submit(task))); + for (Future future : futures) { future.get(); } } catch (Exception e) { @@ -318,13 +327,13 @@ public abstract class Regenerator BlockVector2.at(c.getX(), c.getZ())) .sorted(Comparator - .comparingInt(c -> c.getZ()) - .thenComparingInt(c -> c.getX())) //needed for RegionLimitedWorldAccess + .comparingInt(BlockVector2::getZ) + .thenComparingInt(BlockVector2::getX)) //needed for RegionLimitedWorldAccess .map(c -> MathMan.pairInt(c.getX(), c.getZ())) .collect(Collectors.toList()); } @@ -401,7 +410,8 @@ public abstract class Regenerator>> getChunkStatusTaskRows( @@ -470,17 +480,14 @@ public abstract class Regenerator accessibleChunks); + public abstract CompletableFuture processChunk(Long xz, List accessibleChunks); void processChunkSave(Long xz, List accessibleChunks) { try { - processChunk(xz, accessibleChunks); + processChunk(xz, accessibleChunks).get(); } catch (Exception e) { LOGGER.error( "Error while running " + name() + " on chunk " + MathMan.unpairIntX(xz) + "/" + MathMan.unpairIntY(xz), @@ -528,12 +535,6 @@ public abstract class Regenerator extends Tasks { public SequentialTasks(int expectedsize) { diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java index 06a62d70a..27a119cf5 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java @@ -21,6 +21,7 @@ package com.sk89q.worldedit.bukkit; import com.fastasyncworldedit.bukkit.util.WorldUnloadedException; import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.internal.exception.FaweException; import com.fastasyncworldedit.core.queue.IChunkGet; import com.fastasyncworldedit.core.queue.implementation.packet.ChunkPacket; import com.fastasyncworldedit.core.util.TaskManager; @@ -235,6 +236,8 @@ public class BukkitWorld extends AbstractWorld { } else { throw new UnsupportedOperationException("Missing BukkitImplAdapter for this version."); } + } catch (FaweException e) { + throw e; } catch (Exception e) { LOGGER.warn("Regeneration via adapter failed.", e); return false; diff --git a/worldedit-bukkit/src/main/resources/worldedit-adapters.jar b/worldedit-bukkit/src/main/resources/worldedit-adapters.jar index 37f6e92a8..345438115 100644 Binary files a/worldedit-bukkit/src/main/resources/worldedit-adapters.jar and b/worldedit-bukkit/src/main/resources/worldedit-adapters.jar differ