Recount will count Nether and End blocks.

Fixes https://github.com/BentoBoxWorld/Limits/issues/80
This commit is contained in:
tastybento 2020-05-05 16:56:22 -07:00
parent eb065d321e
commit 3d0e1b0922

View File

@ -38,9 +38,20 @@ public class LimitsCalc {
private final User sender; private final User sender;
private final Set<Pair<Integer, Integer>> chunksToScan; private final Set<Pair<Integer, Integer>> chunksToScan;
private int count; private int count;
private int chunksToScanCount;
private BentoBox plugin;
/**
* Perform a count of all limited blocks or entities on an island
* @param world - game world to scan
* @param instance - BentoBox
* @param targetPlayer - target player's island
* @param addon - addon instance
* @param sender - requester of the count
*/
LimitsCalc(World world, BentoBox instance, UUID targetPlayer, Limits addon, User sender) { LimitsCalc(World world, BentoBox instance, UUID targetPlayer, Limits addon, User sender) {
this.plugin = instance;
this.addon = addon; this.addon = addon;
this.island = instance.getIslands().getIsland(world, targetPlayer); this.island = instance.getIslands().getIsland(world, targetPlayer);
this.bll = addon.getBlockLimitListener(); this.bll = addon.getBlockLimitListener();
@ -52,19 +63,36 @@ public class LimitsCalc {
// Get chunks to scan // Get chunks to scan
chunksToScan = getChunksToScan(island); chunksToScan = getChunksToScan(island);
count = 0; count = 0;
chunksToScan.forEach(c -> Util.getChunkAtAsync(world, c.x, c.z).thenAccept(ch -> {
boolean isNether = plugin.getIWM().isNetherGenerate(world) && plugin.getIWM().isNetherIslands(world);
boolean isEnd = plugin.getIWM().isEndGenerate(world) && plugin.getIWM().isEndIslands(world);
// Calculate how many chunks need to be scanned
chunksToScanCount = chunksToScan.size() + (isNether ? chunksToScan.size():0) + (isEnd ? chunksToScan.size():0);
chunksToScan.forEach(c -> {
asyncScan(world, c);
if (isNether) asyncScan(plugin.getIWM().getNetherWorld(world), c);
if (isEnd) asyncScan(plugin.getIWM().getEndWorld(world), c);
});
}
private void asyncScan(World world2, Pair<Integer, Integer> c) {
Util.getChunkAtAsync(world2, c.x, c.z).thenAccept(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++;
if (count == chunksToScan.size()) { if (count == chunksToScanCount) {
this.tidyUp(); this.tidyUp();
} }
}); });
})); });
} }
private void scanChunk(ChunkSnapshot chunk) { private void scanChunk(ChunkSnapshot chunk) {
for (int x = 0; x < 16; x++) { for (int x = 0; x < 16; x++) {
// Check if the block coordinate is inside the protection zone and if not, don't count it // Check if the block coordinate is inside the protection zone and if not, don't count it