Example #1
0
  public static boolean getTrimRegions(
      final ArrayList<ChunkLoc> empty, final String world, final Runnable whenDone) {
    if (Trim.TASK) {
      return false;
    }
    System.currentTimeMillis();
    sendMessage("Collecting region data...");
    final ArrayList<Plot> plots = new ArrayList<>();
    plots.addAll(PS.get().getPlotsInWorld(world));
    final HashSet<ChunkLoc> chunks = new HashSet<>(ChunkManager.manager.getChunkChunks(world));
    sendMessage(" - MCA #: " + chunks.size());
    sendMessage(" - CHUNKS: " + (chunks.size() * 1024) + " (max)");
    sendMessage(" - TIME ESTIMATE: " + (chunks.size() / 1200) + " minutes");
    Trim.TASK_ID =
        TaskManager.runTaskRepeat(
            new Runnable() {
              @Override
              public void run() {
                final long start = System.currentTimeMillis();
                while ((System.currentTimeMillis() - start) < 50) {
                  if (plots.size() == 0) {
                    empty.addAll(chunks);
                    Trim.TASK = false;
                    TaskManager.runTaskAsync(whenDone);
                    PS.get().TASK.cancelTask(Trim.TASK_ID);
                    return;
                  }
                  final Plot plot = plots.remove(0);

                  final Location pos1 = MainUtil.getPlotBottomLoc(world, plot.id);
                  final Location pos2 = MainUtil.getPlotTopLoc(world, plot.id);

                  final int ccx1 = (pos1.getX() >> 9);
                  final int ccz1 = (pos1.getZ() >> 9);
                  final int ccx2 = (pos2.getX() >> 9);
                  final int ccz2 = (pos2.getZ() >> 9);

                  for (int x = ccx1; x <= ccx2; x++) {
                    for (int z = ccz1; z <= ccz2; z++) {
                      chunks.remove(new ChunkLoc(x, z));
                    }
                  }
                }
              }
            },
            20);
    Trim.TASK = true;
    return true;
  }
  @Override
  public void runEntityTask() {
    log(C.PREFIX.s() + "KillAllEntities started.");
    TaskManager.runTaskRepeat(
        new Runnable() {
          long ticked = 0l;
          long error = 0l;

          @Override
          public void run() {
            if (this.ticked > 36_000L) {
              this.ticked = 0l;
              if (this.error > 0) {
                log(
                    C.PREFIX.s()
                        + "KillAllEntities has been running for 6 hours. Errors: "
                        + this.error);
              }
              this.error = 0l;
            }
            World world;
            for (final String w : PS.get().getPlotWorlds()) {
              world = Bukkit.getWorld(w);
              try {
                if (world.getLoadedChunks().length < 1) {
                  continue;
                }
                for (final Chunk chunk : world.getLoadedChunks()) {
                  final Entity[] entities = chunk.getEntities();
                  Entity entity;
                  for (int i = entities.length - 1; i >= 0; i--) {
                    if (!((entity = entities[i]) instanceof Player)
                        && (MainUtil.getPlot(BukkitUtil.getLocation(entity)) == null)) {
                      entity.remove();
                    }
                  }
                }
              } catch (final Throwable e) {
                ++this.error;
              } finally {
                ++this.ticked;
              }
            }
          }
        },
        20);
  }