From cc584ba377965067ea12f19b0d1f57e6622f4904 Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Sat, 31 Aug 2024 16:01:25 +0200 Subject: [PATCH] add progressbar to object saving --- .../com/volmit/iris/core/service/WandSVC.java | 76 ++++++++++++++----- 1 file changed, 57 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/service/WandSVC.java b/core/src/main/java/com/volmit/iris/core/service/WandSVC.java index d5a57d77d..8cf63af47 100644 --- a/core/src/main/java/com/volmit/iris/core/service/WandSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/WandSVC.java @@ -36,6 +36,7 @@ import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.S; import com.volmit.iris.util.scheduling.SR; +import com.volmit.iris.util.scheduling.jobs.Job; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.enchantments.Enchantment; @@ -55,11 +56,12 @@ import java.awt.Color; import java.util.ArrayList; import java.util.Objects; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicInteger; public class WandSVC implements IrisService { private static final Particle CRIT_MAGIC = E.getOrDefault(Particle.class, "CRIT_MAGIC", "CRIT"); private static final Particle REDSTONE = E.getOrDefault(Particle.class, "REDSTONE", "DUST"); - private static final int BLOCKS_PER_TICK = Integer.parseInt(System.getProperty("iris.blocks_per_tick", "1000")); + private static final int MS_PER_TICK = Integer.parseInt(System.getProperty("iris.ms_per_tick", "30")); private static ItemStack dust; private static ItemStack wand; @@ -85,27 +87,63 @@ public class WandSVC implements IrisService { IrisObject s = new IrisObject(c.getSizeX(), c.getSizeY(), c.getSizeZ()); var it = c.iterator(); + + int total = c.getSizeX() * c.getSizeY() * c.getSizeZ(); + AtomicInteger i = new AtomicInteger(0); var latch = new CountDownLatch(1); - new SR() { + new Job() { @Override - public void run() { - for (int i = 0; i < BLOCKS_PER_TICK; i++) { - if (!it.hasNext()) { - cancel(); - latch.countDown(); - return; - } - - var b = it.next(); - if (b.getType().equals(Material.AIR)) - continue; - - BlockVector bv = b.getLocation().subtract(c.getLowerNE().toVector()).toVector().toBlockVector(); - s.setUnsigned(bv.getBlockX(), bv.getBlockY(), bv.getBlockZ(), b); - } + public String getName() { + return "Scanning Selection"; } - }; - latch.await(); + + @Override + public void execute() { + new SR() { + @Override + public void run() { + var time = M.ms() + MS_PER_TICK; + while (time > M.ms()) { + if (!it.hasNext()) { + cancel(); + latch.countDown(); + return; + } + + try { + var b = it.next(); + if (b.getType().equals(Material.AIR)) + continue; + + BlockVector bv = b.getLocation().subtract(c.getLowerNE().toVector()).toVector().toBlockVector(); + s.setUnsigned(bv.getBlockX(), bv.getBlockY(), bv.getBlockZ(), b); + } finally { + i.incrementAndGet(); + } + } + } + }; + try { + latch.await(); + } catch (InterruptedException ignored) {} + } + + @Override + public void completeWork() {} + + @Override + public int getTotalWork() { + return total; + } + + @Override + public int getWorkCompleted() { + return i.get(); + } + }.execute(new VolmitSender(p), true, () -> {}); + try { + latch.await(); + } catch (InterruptedException ignored) {} return s; } catch (Throwable e) {