mirror of
https://github.com/BentoBoxWorld/Level.git
synced 2024-11-23 18:45:17 +01:00
Merge branch 'develop' of https://github.com/BentoBoxWorld/Level.git into develop
This commit is contained in:
commit
67535ddec8
@ -1,13 +1,6 @@
|
|||||||
package world.bentobox.level.calculators;
|
package world.bentobox.level.calculators;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
|
||||||
@ -49,10 +42,11 @@ public class CalcIslandLevel {
|
|||||||
private final List<World> worlds;
|
private final List<World> worlds;
|
||||||
private final World world;
|
private final World world;
|
||||||
|
|
||||||
private int count;
|
private AtomicInteger count;
|
||||||
|
|
||||||
private int total;
|
private int total;
|
||||||
|
private Queue<Chunk> q;
|
||||||
|
private int queueid;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate the island's level
|
* Calculate the island's level
|
||||||
@ -69,7 +63,7 @@ public class CalcIslandLevel {
|
|||||||
this.onExit = onExit;
|
this.onExit = onExit;
|
||||||
this.worlds = new ArrayList<>();
|
this.worlds = new ArrayList<>();
|
||||||
this.worlds.add(world);
|
this.worlds.add(world);
|
||||||
|
q = new LinkedList<>();
|
||||||
|
|
||||||
// Results go here
|
// Results go here
|
||||||
result = new Results();
|
result = new Results();
|
||||||
@ -79,7 +73,7 @@ public class CalcIslandLevel {
|
|||||||
|
|
||||||
// Get chunks to scan
|
// Get chunks to scan
|
||||||
chunksToScan = getChunksToScan(island);
|
chunksToScan = getChunksToScan(island);
|
||||||
count = 0;
|
count = new AtomicInteger();
|
||||||
// Total number of chunks to scan
|
// Total number of chunks to scan
|
||||||
total = chunksToScan.size();
|
total = chunksToScan.size();
|
||||||
// Add nether world scanning
|
// Add nether world scanning
|
||||||
@ -98,17 +92,33 @@ public class CalcIslandLevel {
|
|||||||
total += chunksToScan.size();
|
total += chunksToScan.size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
queueid = Bukkit.getScheduler().scheduleSyncRepeatingTask(addon.getPlugin(), new Runnable() {
|
||||||
chunksToScan.forEach(c -> worlds.forEach(w -> Util.getChunkAtAsync(w, c.x, c.z).thenAccept(this::getChunk)));
|
public void run() {
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
if (q.size() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Chunk c = q.remove();
|
||||||
|
getChunk(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 1L, 1L);
|
||||||
|
chunksToScan.forEach(c -> worlds.forEach(w -> Util.getChunkAtAsync(w, c.x, c.z).thenAccept(this::addChunkQueue)));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void getChunk(Chunk ch) {
|
private void addChunkQueue(Chunk ch) {
|
||||||
|
q.add(ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getChunk(Chunk ch) {
|
||||||
ChunkSnapshot snapShot = ch.getChunkSnapshot();
|
ChunkSnapshot snapShot = ch.getChunkSnapshot();
|
||||||
|
|
||||||
Bukkit.getScheduler().runTaskAsynchronously(addon.getPlugin(), () -> {
|
Bukkit.getScheduler().runTaskAsynchronously(addon.getPlugin(), () -> {
|
||||||
this.scanChunk(snapShot);
|
this.scanChunk(snapShot);
|
||||||
count++;
|
count.getAndIncrement();
|
||||||
if (count == total) {
|
if (count.get() == total) {
|
||||||
|
Bukkit.getScheduler().cancelTask(queueid);
|
||||||
this.tidyUp();
|
this.tidyUp();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user