diff --git a/build.gradle.kts b/build.gradle.kts index bb061f2bc..d4cd82c4f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,6 +2,7 @@ import com.volmit.nmstools.NMSToolsExtension import com.volmit.nmstools.NMSToolsPlugin import de.undercouch.gradle.tasks.download.Download import xyz.jpenilla.runpaper.task.RunServer +import xyz.jpenilla.runtask.service.DownloadsAPIService import kotlin.system.exitProcess /* @@ -104,6 +105,20 @@ nmsBindings.forEach { key, value -> systemProperty("net.kyori.ansi.colorLevel", color) systemProperty("com.mojang.eula.agree", true) } + + tasks.register("runFolia-$key") { + group = "servers" + downloadsApiService = DownloadsAPIService.folia(project) + minecraftVersion(value.split("-")[0]) + minHeapSize = serverMinHeap + maxHeapSize = serverMaxHeap + pluginJars(tasks.jar.flatMap { it.archiveFile }) + javaLauncher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(jvmVersion.getOrDefault(key, 21))} + runDirectory.convention(layout.buildDirectory.dir("run/$key")) + systemProperty("disable.watchdog", "") + systemProperty("net.kyori.ansi.colorLevel", color) + systemProperty("com.mojang.eula.agree", true) + } } tasks { diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index 3192a2a61..87cb2cd0a 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -63,6 +63,7 @@ import com.volmit.iris.util.plugin.VolmitPlugin; import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.reflect.ShadeFix; import com.volmit.iris.util.scheduling.J; +import com.volmit.iris.util.scheduling.Platform; import com.volmit.iris.util.scheduling.Queue; import com.volmit.iris.util.scheduling.ShurikenQueue; import com.volmit.iris.util.sentry.Attachments; @@ -98,6 +99,7 @@ import java.math.RoundingMode; import java.net.URL; import java.text.NumberFormat; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -115,6 +117,7 @@ public class Iris extends VolmitPlugin implements Listener { public static MythicMobsLink linkMythicMobs; public static IrisCompat compat; public static FileWatcher configWatcher; + public static Platform scheduler; private static VolmitSender sender; static { @@ -333,15 +336,14 @@ public class Iris extends VolmitPlugin implements Listener { @SuppressWarnings("deprecation") public static void later(NastyRunnable object) { try { - Bukkit.getScheduler().scheduleAsyncDelayedTask(instance, () -> - { + scheduler.async().runDelayed(task -> { try { object.run(); } catch (Throwable e) { e.printStackTrace(); Iris.reportError(e); } - }, RNG.r.i(100, 1200)); + }, RNG.r.i(5, 60), TimeUnit.SECONDS); } catch (IllegalPluginAccessException ignored) { } @@ -459,6 +461,7 @@ public class Iris extends VolmitPlugin implements Listener { } private void enable() { instance = this; + scheduler = Platform.create(this); services = new KMap<>(); setupAudience(); setupSentry(); @@ -580,7 +583,6 @@ public class Iris extends VolmitPlugin implements Listener { public void onDisable() { services.values().forEach(IrisService::onDisable); - Bukkit.getScheduler().cancelTasks(this); HandlerList.unregisterAll((Plugin) this); postShutdown.forEach(Runnable::run); super.onDisable(); diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java b/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java index 4723ed3e1..06c61e4c2 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java @@ -49,7 +49,6 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.generator.ChunkGenerator; -import org.bukkit.scheduler.BukkitRunnable; import java.io.File; import java.io.IOException; @@ -157,13 +156,8 @@ public class CommandIris implements DecreeExecutor { return; } - new BukkitRunnable() { - @Override - public void run() { - target.teleport(world.getSpawnLocation()); - new VolmitSender(target).sendMessage(C.GREEN + "You have been teleported to " + world.getName() + "."); - } - }.runTask(Iris.instance); + Iris.scheduler.teleportAsync(target, world.getSpawnLocation()).thenRun(() -> + new VolmitSender(target).sendMessage(C.GREEN + "You have been teleported to " + world.getName() + ".")); } @Decree(description = "Print version information") diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java b/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java index 0abb77a15..06fd6c36d 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java @@ -55,11 +55,11 @@ import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.scheduling.J; -import com.volmit.iris.util.scheduling.O; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import com.volmit.iris.util.scheduling.jobs.QueueJob; import io.papermc.lib.PaperLib; import org.bukkit.*; +import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.util.BlockVector; @@ -309,27 +309,25 @@ public class CommandStudio implements DecreeExecutor { return; } + Player player = player(); + var scheduler = Iris.scheduler.entity(player); + scheduler.run(() -> { + sender().sendMessage(C.GREEN + "Opening inventory now!"); + player.openInventory(inv); - O ta = new O<>(); - ta.set(-1); + scheduler.runAtFixedRate(refresh -> { + if (!player.getOpenInventory().getType().equals(InventoryType.CHEST)) { + refresh.cancel(); + return; + } - ta.set(Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, () -> - { - if (!player().getOpenInventory().getType().equals(InventoryType.CHEST)) { - Bukkit.getScheduler().cancelTask(ta.get()); - sender().sendMessage(C.GREEN + "Opened inventory!"); - return; - } + if (!add) { + inv.clear(); + } - if (!add) { - inv.clear(); - } - - engine().addItems(true, inv, new RNG(RNG.r.imax()), tables, InventorySlotType.STORAGE, player().getWorld(), player().getLocation().getBlockX(), player().getLocation().getBlockY(), player().getLocation().getBlockZ(), 1); - }, 0, fast ? 5 : 35)); - - sender().sendMessage(C.GREEN + "Opening inventory now!"); - player().openInventory(inv); + engine().addItems(true, inv, new RNG(RNG.r.imax()), tables, InventorySlotType.STORAGE, player.getWorld(), player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ(), 1); + }, null, 1, fast ? 5 : 35); + }, null); } @@ -350,9 +348,7 @@ public class CommandStudio implements DecreeExecutor { var loc = player().getLocation(); int totalTasks = d * d; AtomicInteger completedTasks = new AtomicInteger(0); - int c = J.ar(() -> { - sender.sendProgress((double) completedTasks.get() / totalTasks, "Finding structures"); - }, 0); + var c = J.ar(() -> sender.sendProgress((double) completedTasks.get() / totalTasks, "Finding structures"), 0); new Spiraler(d, d, (x, z) -> executor.queue(() -> { var struct = engine.getStructureAt(x, z); @@ -364,7 +360,7 @@ public class CommandStudio implements DecreeExecutor { executor.complete(); multiBurst.close(); - J.car(c); + if (c != null) c.cancel(); for (var key : data.keySet()) { var list = data.get(key); diff --git a/core/src/main/java/com/volmit/iris/core/edit/BlockSignal.java b/core/src/main/java/com/volmit/iris/core/edit/BlockSignal.java index 65526cd87..d6c302893 100644 --- a/core/src/main/java/com/volmit/iris/core/edit/BlockSignal.java +++ b/core/src/main/java/com/volmit/iris/core/edit/BlockSignal.java @@ -18,7 +18,9 @@ package com.volmit.iris.core.edit; +import com.volmit.iris.Iris; import com.volmit.iris.util.parallel.MultiBurst; +import com.volmit.iris.util.scheduling.AR; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.SR; import org.bukkit.Location; @@ -79,7 +81,7 @@ public class BlockSignal { e.setTicksLived(1); e.setVelocity(new Vector(0, 0, 0)); - new SR(20) { + new AR(20) { @Override public void run() { if (e.isDead()) { @@ -87,9 +89,10 @@ public class BlockSignal { return; } - e.setTicksLived(1); - e.teleport(tg.clone()); - e.setVelocity(new Vector(0, 0, 0)); + Iris.scheduler.teleportAsync(e, tg.clone()).thenAccept(b -> { + e.setTicksLived(1); + e.setVelocity(new Vector(0, 0, 0)); + }).join(); } }; diff --git a/core/src/main/java/com/volmit/iris/core/edit/JigsawEditor.java b/core/src/main/java/com/volmit/iris/core/edit/JigsawEditor.java index 2b20693be..808a46844 100644 --- a/core/src/main/java/com/volmit/iris/core/edit/JigsawEditor.java +++ b/core/src/main/java/com/volmit/iris/core/edit/JigsawEditor.java @@ -30,6 +30,7 @@ import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; +import com.volmit.iris.util.scheduling.Task; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Particle; @@ -55,7 +56,7 @@ public class JigsawEditor implements Listener { private final IrisJigsawPiece piece; private final Location origin; private final Cuboid cuboid; - private final int ticker; + private final Task ticker; private final KMap falling = new KMap<>(); private final ChronoLatch cl = new ChronoLatch(100); private Location target; @@ -197,7 +198,7 @@ public class JigsawEditor implements Listener { } public void exit() { - J.car(ticker); + if (ticker != null) ticker.cancel(); Iris.instance.unregisterListener(this); try { J.sfut(() -> { diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/DeepSearchPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/DeepSearchPregenerator.java index e9d2b8f74..685898c65 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/DeepSearchPregenerator.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/DeepSearchPregenerator.java @@ -22,7 +22,6 @@ import org.bukkit.World; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.WorldUnloadEvent; -import org.bukkit.scheduler.BukkitRunnable; import java.io.File; import java.io.FileWriter; @@ -235,16 +234,13 @@ public class DeepSearchPregenerator extends Thread implements Listener { } save(); jobs.remove(world.getName()); - new BukkitRunnable() { - @Override - public void run() { - while (deepFile.exists()){ - deepFile.delete(); - J.sleep(1000); - } - Iris.info("DeepSearch: " + C.IRIS + world.getName() + C.BLUE + " File deleted and instance closed."); + J.a(() -> { + while (deepFile.exists()) { + deepFile.delete(); + J.sleep(1000); } - }.runTaskLater(Iris.instance, 20L); + Iris.info("DeepSearch: " + C.IRIS + world.getName() + C.BLUE + " File deleted and instance closed."); + }, 10); } catch (Exception e) { Iris.error("Failed to shutdown DeepSearch for " + world.getName()); e.printStackTrace(); diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java index dc58f2ed5..ebfbf81de 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java @@ -19,7 +19,6 @@ import org.bukkit.World; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.WorldUnloadEvent; -import org.bukkit.scheduler.BukkitRunnable; import java.io.File; import java.io.IOException; @@ -238,16 +237,13 @@ public class LazyPregenerator extends Thread implements Listener { } save(); jobs.remove(world.getName()); - new BukkitRunnable() { - @Override - public void run() { - while (lazyFile.exists()){ - lazyFile.delete(); - J.sleep(1000); - } - Iris.info("LazyGen: " + C.IRIS + world.getName() + C.BLUE + " File deleted and instance closed."); + J.a(() -> { + while (lazyFile.exists()){ + lazyFile.delete(); + J.sleep(1000); } - }.runTaskLater(Iris.instance, 20L); + Iris.info("LazyGen: " + C.IRIS + world.getName() + C.BLUE + " File deleted and instance closed."); + }, 20); } catch (Exception e) { Iris.error("Failed to shutdown Lazygen for " + world.getName()); e.printStackTrace(); diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/TurboPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/TurboPregenerator.java index 4588597c3..5a8312307 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/TurboPregenerator.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/TurboPregenerator.java @@ -26,7 +26,6 @@ import org.bukkit.World; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.WorldUnloadEvent; -import org.bukkit.scheduler.BukkitRunnable; import org.checkerframework.checker.units.qual.N; import java.io.File; @@ -302,16 +301,13 @@ public class TurboPregenerator extends Thread implements Listener { } save(); jobs.remove(world.getName()); - new BukkitRunnable() { - @Override - public void run() { - while (turboFile.exists()) { - turboFile.delete(); - J.sleep(1000); - } - Iris.info("turboGen: " + C.IRIS + world.getName() + C.BLUE + " File deleted and instance closed."); + J.a(() -> { + while (turboFile.exists()) { + turboFile.delete(); + J.sleep(1000); } - }.runTaskLater(Iris.instance, 20L); + Iris.info("turboGen: " + C.IRIS + world.getName() + C.BLUE + " File deleted and instance closed."); + }, 20); } catch (Exception e) { Iris.error("Failed to shutdown turbogen for " + world.getName()); e.printStackTrace(); diff --git a/core/src/main/java/com/volmit/iris/core/service/EditSVC.java b/core/src/main/java/com/volmit/iris/core/service/EditSVC.java index dc944f1f2..f8aa2ca92 100644 --- a/core/src/main/java/com/volmit/iris/core/service/EditSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/EditSVC.java @@ -38,7 +38,7 @@ public class EditSVC implements IrisService { @Override public void onEnable() { this.editors = new KMap<>(); - Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, this::update, 1000, 1000); + Iris.scheduler.global().runAtFixedRate(this::update, 1000, 1000); } @Override diff --git a/core/src/main/java/com/volmit/iris/core/service/ObjectSVC.java b/core/src/main/java/com/volmit/iris/core/service/ObjectSVC.java index 5fadf8b4a..08311871f 100644 --- a/core/src/main/java/com/volmit/iris/core/service/ObjectSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/ObjectSVC.java @@ -71,21 +71,18 @@ public class ObjectSVC implements IrisService { */ private void revert(Map blocks) { Iterator> it = blocks.entrySet().iterator(); - Bukkit.getScheduler().runTask(Iris.instance, () -> { - int amount = 0; - while (it.hasNext()) { - Map.Entry entry = it.next(); - BlockData data = entry.getValue(); - entry.getKey().setBlockData(data, false); + var scheduler = Iris.scheduler.region(); + for (int i = 0; i < 200 && it.hasNext(); i++) { + Map.Entry entry = it.next(); + Block block = entry.getKey(); + BlockData data = entry.getValue(); + it.remove(); - it.remove(); + scheduler.run(block.getLocation(), () -> block.setBlockData(data, false)); + } - amount++; - - if (amount > 200) { - J.s(() -> revert(blocks), 1); - } - } - }); + if (it.hasNext()) { + J.s(() -> revert(blocks), 1); + } } } \ No newline at end of file diff --git a/core/src/main/java/com/volmit/iris/core/tools/IrisConverter.java b/core/src/main/java/com/volmit/iris/core/tools/IrisConverter.java index f58cc5c69..a355d14b5 100644 --- a/core/src/main/java/com/volmit/iris/core/tools/IrisConverter.java +++ b/core/src/main/java/com/volmit/iris/core/tools/IrisConverter.java @@ -11,6 +11,7 @@ import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.reflect.V; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.PrecisionStopwatch; +import com.volmit.iris.util.scheduling.Task; import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import org.apache.commons.io.FileUtils; import org.bukkit.Bukkit; @@ -58,7 +59,7 @@ public class IrisConverter { int objW = ((ShortTag) compound.get("Width")).getValue(); int objH = ((ShortTag) compound.get("Height")).getValue(); int objD = ((ShortTag) compound.get("Length")).getValue(); - int i = -1; + Task i = null; int mv = objW * objH * objD; AtomicInteger v = new AtomicInteger(0); if (mv > 500_000) { @@ -66,9 +67,7 @@ public class IrisConverter { Iris.info(C.GRAY + "Converting.. "+ schem.getName() + " -> " + schem.getName().replace(".schem", ".iob")); Iris.info(C.GRAY + "- It may take a while"); if (sender.isPlayer()) { - i = J.ar(() -> { - sender.sendProgress((double) v.get() / mv, "Converting"); - }, 0); + i = J.ar(() -> sender.sendProgress((double) v.get() / mv, "Converting"), 0); } } @@ -97,7 +96,7 @@ public class IrisConverter { } } } - if (i != -1) J.car(i); + if (i != null) i.cancel(); try { object.shrinkwrap(); object.write(new File(folder, schem.getName().replace(".schem", ".iob"))); diff --git a/core/src/main/java/com/volmit/iris/engine/IrisEngine.java b/core/src/main/java/com/volmit/iris/engine/IrisEngine.java index 2f9bd5a88..47845161d 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -50,6 +50,7 @@ import com.volmit.iris.util.matter.MatterStructurePOI; import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.PrecisionStopwatch; +import com.volmit.iris.util.scheduling.Task; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; @@ -85,7 +86,7 @@ public class IrisEngine implements Engine { private final EngineMetrics metrics; private final boolean studio; private final AtomicRollingSequence wallClock; - private final int art; + private final Task art; private final AtomicCache engineData = new AtomicCache<>(); private final AtomicBoolean cleaning; private final ChronoLatch cleanLatch; @@ -418,7 +419,7 @@ public class IrisEngine implements Engine { public void close() { PregeneratorJob.shutdownInstance(); closed = true; - J.car(art); + art.cancel(); getWorldManager().close(); getTarget().close(); saveEngineData(); diff --git a/core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedWorldManager.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedWorldManager.java index e53b35e5c..0dc0c49d0 100644 --- a/core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedWorldManager.java +++ b/core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedWorldManager.java @@ -24,6 +24,7 @@ import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.format.C; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.plugin.VolmitSender; +import com.volmit.iris.util.scheduling.Task; import org.bukkit.*; import org.bukkit.entity.EnderSignal; import org.bukkit.entity.Player; @@ -41,18 +42,18 @@ import org.bukkit.inventory.EquipmentSlot; import java.util.concurrent.atomic.AtomicBoolean; public abstract class EngineAssignedWorldManager extends EngineAssignedComponent implements EngineWorldManager, Listener { - private final int taskId; + private final Task task; protected AtomicBoolean ignoreTP = new AtomicBoolean(false); public EngineAssignedWorldManager() { super(null, null); - taskId = -1; + task = null; } public EngineAssignedWorldManager(Engine engine) { super(engine, "World"); Iris.instance.registerListener(this); - taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, this::onTick, 0, 0); + task = Iris.scheduler.global().runAtFixedRate(this::onTick, 1, 1); } @EventHandler @@ -129,6 +130,6 @@ public abstract class EngineAssignedWorldManager extends EngineAssignedComponent public void close() { super.close(); Iris.instance.unregisterListener(this); - Bukkit.getScheduler().cancelTask(taskId); + if (task != null) task.cancel(); } } diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisCommand.java b/core/src/main/java/com/volmit/iris/engine/object/IrisCommand.java index 36f47fb44..2c151534f 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisCommand.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisCommand.java @@ -65,6 +65,7 @@ public class IrisCommand { return; } + var scheduler = Iris.scheduler.global(); for (String command : commands) { command = (command.startsWith("/") ? command.replaceFirst("/", "") : command) .replaceAll("\\Q{x}\\E", String.valueOf(at.getBlockX())) @@ -72,9 +73,9 @@ public class IrisCommand { .replaceAll("\\Q{z}\\E", String.valueOf(at.getBlockZ())); final String finalCommand = command; if (repeat) { - Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, () -> Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), finalCommand), delay, repeatDelay); + scheduler.runAtFixedRate(() -> Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), finalCommand), Math.max(delay, 1), Math.max(repeatDelay, 1)); } else { - Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), finalCommand), delay); + scheduler.runDelayed(() -> Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), finalCommand), Math.max(delay, 1)); } } } diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisEntity.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEntity.java index dfb2508d0..109d9a9c1 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisEntity.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisEntity.java @@ -337,9 +337,7 @@ public class IrisEntity extends IrisRegistrant { if (e instanceof Villager) { Villager villager = (Villager) e; villager.setRemoveWhenFarAway(false); - Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> { - villager.setPersistent(true); - }, 1); + Iris.scheduler.entity(villager).run(() -> villager.setPersistent(true), null); } if (e instanceof Mob) { @@ -377,10 +375,9 @@ public class IrisEntity extends IrisRegistrant { ((LivingEntity) e).setCollidable(false); ((LivingEntity) e).setNoDamageTicks(100000); AtomicInteger t = new AtomicInteger(0); - AtomicInteger v = new AtomicInteger(0); - v.set(J.sr(() -> { + Iris.scheduler.global().runAtFixedRate(task -> { if (t.get() > 100) { - J.csr(v.get()); + task.cancel(); return; } @@ -393,13 +390,13 @@ public class IrisEntity extends IrisRegistrant { e.getWorld().playSound(e.getLocation(), Sound.BLOCK_CHORUS_FLOWER_GROW, 0.8f, 0.1f); } } else { - J.csr(v.get()); + task.cancel(); ((LivingEntity) e).setNoDamageTicks(0); ((LivingEntity) e).setCollidable(true); ((LivingEntity) e).setAI(true); e.setInvulnerable(false); } - }, 0)); + }, 1, 1); } }); diff --git a/core/src/main/java/com/volmit/iris/util/board/BoardManager.java b/core/src/main/java/com/volmit/iris/util/board/BoardManager.java index fe61666de..d4813df7f 100644 --- a/core/src/main/java/com/volmit/iris/util/board/BoardManager.java +++ b/core/src/main/java/com/volmit/iris/util/board/BoardManager.java @@ -18,10 +18,11 @@ package com.volmit.iris.util.board; +import com.volmit.iris.Iris; +import com.volmit.iris.util.scheduling.Task; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitTask; import java.util.Collections; import java.util.Map; @@ -34,7 +35,7 @@ public class BoardManager { private final JavaPlugin plugin; private final Map scoreboards; - private final BukkitTask updateTask; + private final Task updateTask; private BoardSettings boardSettings; @@ -42,7 +43,7 @@ public class BoardManager { this.plugin = plugin; this.boardSettings = boardSettings; this.scoreboards = new ConcurrentHashMap<>(); - this.updateTask = new BoardUpdateTask(this).runTaskTimer(plugin, 2L, 20L); + this.updateTask = Iris.scheduler.global().runAtFixedRate(new BoardUpdateTask(this), 2L, 20L); plugin.getServer().getOnlinePlayers().forEach(this::setup); } diff --git a/core/src/main/java/com/volmit/iris/util/board/BoardUpdateTask.java b/core/src/main/java/com/volmit/iris/util/board/BoardUpdateTask.java index ce7ded229..9ae24d7d1 100644 --- a/core/src/main/java/com/volmit/iris/util/board/BoardUpdateTask.java +++ b/core/src/main/java/com/volmit/iris/util/board/BoardUpdateTask.java @@ -20,7 +20,6 @@ package com.volmit.iris.util.board; import lombok.RequiredArgsConstructor; import org.bukkit.Bukkit; -import org.bukkit.scheduler.BukkitRunnable; import java.util.UUID; import java.util.function.Predicate; @@ -30,7 +29,7 @@ import java.util.function.Predicate; * @since 5/31/2018 */ @RequiredArgsConstructor -public class BoardUpdateTask extends BukkitRunnable { +public class BoardUpdateTask implements Runnable { private static final Predicate PLAYER_IS_ONLINE = uuid -> Bukkit.getPlayer(uuid) != null; diff --git a/core/src/main/java/com/volmit/iris/util/plugin/VolmitPlugin.java b/core/src/main/java/com/volmit/iris/util/plugin/VolmitPlugin.java index 130f8b686..0174b06fb 100644 --- a/core/src/main/java/com/volmit/iris/util/plugin/VolmitPlugin.java +++ b/core/src/main/java/com/volmit/iris/util/plugin/VolmitPlugin.java @@ -245,7 +245,6 @@ public abstract class VolmitPlugin extends JavaPlugin implements Listener { @Override public void onDisable() { stop(); - Bukkit.getScheduler().cancelTasks(this); unregisterListener(this); unregisterAll(); } diff --git a/core/src/main/java/com/volmit/iris/util/plugin/VolmitSender.java b/core/src/main/java/com/volmit/iris/util/plugin/VolmitSender.java index dccb95ce7..efe7ae481 100644 --- a/core/src/main/java/com/volmit/iris/util/plugin/VolmitSender.java +++ b/core/src/main/java/com/volmit/iris/util/plugin/VolmitSender.java @@ -48,6 +48,7 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; @@ -298,17 +299,16 @@ public class VolmitSender implements CommandSender { } public void showWaiting(String passive, CompletableFuture f) { - AtomicInteger v = new AtomicInteger(); AtomicReference g = new AtomicReference<>(); - v.set(J.ar(() -> { + Iris.scheduler.async().runAtFixedRate(task -> { if (f.isDone() && g.get() != null) { - J.car(v.get()); + task.cancel(); sendAction(" "); return; } sendProgress(-1, passive); - }, 0)); + }, 0, 50, TimeUnit.MILLISECONDS); J.a(() -> { try { g.set(f.get()); diff --git a/core/src/main/java/com/volmit/iris/util/profile/MsptTimings.java b/core/src/main/java/com/volmit/iris/util/profile/MsptTimings.java index 2d098e1e7..8ce433285 100644 --- a/core/src/main/java/com/volmit/iris/util/profile/MsptTimings.java +++ b/core/src/main/java/com/volmit/iris/util/profile/MsptTimings.java @@ -1,8 +1,10 @@ package com.volmit.iris.util.profile; +import com.volmit.iris.Iris; import com.volmit.iris.util.math.M; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.Looper; +import com.volmit.iris.util.scheduling.Task; import org.bukkit.Bukkit; import java.util.concurrent.atomic.AtomicInteger; @@ -12,7 +14,7 @@ public abstract class MsptTimings extends Looper { private final AtomicInteger currentTick = new AtomicInteger(0); private int lastTick, lastMspt; private long lastTime; - private int taskId = -1; + private Task task = null; public MsptTimings() { setName("MsptTimings"); @@ -52,18 +54,18 @@ public abstract class MsptTimings extends Looper { protected abstract void update(int mspt); private boolean startTickTask() { - if (taskId != -1 && (Bukkit.getScheduler().isQueued(taskId) || Bukkit.getScheduler().isCurrentlyRunning(taskId))) + if (task != null && !task.cancelled()) return false; - taskId = J.sr(() -> { + task = Iris.scheduler.global().runAtFixedRate(t -> { if (isInterrupted()) { - J.csr(taskId); + t.cancel(); return; } currentTick.incrementAndGet(); - }, 1); - return taskId != -1; + }, 1, 1); + return true; } private static class Simple extends MsptTimings { diff --git a/core/src/main/java/com/volmit/iris/util/scheduling/AR.java b/core/src/main/java/com/volmit/iris/util/scheduling/AR.java index b5fda2c52..244781e21 100644 --- a/core/src/main/java/com/volmit/iris/util/scheduling/AR.java +++ b/core/src/main/java/com/volmit/iris/util/scheduling/AR.java @@ -21,22 +21,18 @@ package com.volmit.iris.util.scheduling; import com.volmit.iris.util.plugin.CancellableTask; public abstract class AR implements Runnable, CancellableTask { - private int id = 0; + private final Task task; public AR() { - this(0); + this(1); } public AR(int interval) { - id = J.ar(this, interval); + task = J.ar(this, interval); } @Override public void cancel() { - J.car(id); - } - - public int getId() { - return id; + task.cancel(); } } diff --git a/core/src/main/java/com/volmit/iris/util/scheduling/J.java b/core/src/main/java/com/volmit/iris/util/scheduling/J.java index a669317df..264865d2c 100644 --- a/core/src/main/java/com/volmit/iris/util/scheduling/J.java +++ b/core/src/main/java/com/volmit/iris/util/scheduling/J.java @@ -31,6 +31,7 @@ import org.bukkit.Bukkit; import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; @@ -91,7 +92,7 @@ public class J { if (!Bukkit.getPluginManager().isPluginEnabled(Iris.instance)) { return; } - Bukkit.getScheduler().scheduleAsyncDelayedTask(Iris.instance, a); + Iris.scheduler.async().run(a); } public static Future a(Callable a) { @@ -224,33 +225,29 @@ public class J { if (!Bukkit.getPluginManager().isPluginEnabled(Iris.instance)) { return; } - Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, r); + Iris.scheduler.global().run(r); } public static CompletableFuture sfut(Runnable r) { - CompletableFuture f = new CompletableFuture(); - if (!Bukkit.getPluginManager().isPluginEnabled(Iris.instance)) { return null; } - Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> { + + return Iris.scheduler.global().run(() -> { r.run(); - f.complete(null); - }); - return f; + return null; + }).result(); } public static CompletableFuture sfut(Runnable r, int delay) { - CompletableFuture f = new CompletableFuture(); - if (!Bukkit.getPluginManager().isPluginEnabled(Iris.instance)) { return null; } - Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> { + + return Iris.scheduler.global().runDelayed(() -> { r.run(); - f.complete(null); - }, delay); - return f; + return null; + }, delay).result(); } public static CompletableFuture afut(Runnable r) { @@ -273,21 +270,12 @@ public class J { if (!Bukkit.getPluginManager().isPluginEnabled(Iris.instance)) { return; } - Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, r, delay); + Iris.scheduler.global().runDelayed(r, delay); } catch (Throwable e) { Iris.reportError(e); } } - /** - * Cancel a sync repeating task - * - * @param id the task id - */ - public static void csr(int id) { - Bukkit.getScheduler().cancelTask(id); - } - /** * Start a sync repeating task * @@ -295,34 +283,11 @@ public class J { * @param interval the interval * @return the task id */ - public static int sr(Runnable r, int interval) { + public static Task sr(Runnable r, int interval) { if (!Bukkit.getPluginManager().isPluginEnabled(Iris.instance)) { - return -1; + return null; } - return Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, r, 0, interval); - } - - /** - * Start a sync repeating task for a limited amount of ticks - * - * @param r the runnable - * @param interval the interval in ticks - * @param intervals the maximum amount of intervals to run - */ - public static void sr(Runnable r, int interval, int intervals) { - FinalInteger fi = new FinalInteger(0); - - new SR() { - @Override - public void run() { - fi.add(1); - r.run(); - - if (fi.get() >= intervals) { - cancel(); - } - } - }; + return Iris.scheduler.global().runAtFixedRate(r, 1, Math.max(interval, 1)); } /** @@ -331,22 +296,12 @@ public class J { * @param r the runnable * @param delay the delay to wait before running */ - @SuppressWarnings("deprecation") public static void a(Runnable r, int delay) { if (Bukkit.getPluginManager().isPluginEnabled(Iris.instance)) { - Bukkit.getScheduler().scheduleAsyncDelayedTask(Iris.instance, r, delay); + Iris.scheduler.async().runDelayed(r, Math.max(delay * 50, 0), TimeUnit.MILLISECONDS); } } - /** - * Cancel an async repeat task - * - * @param id the id - */ - public static void car(int id) { - Bukkit.getScheduler().cancelTask(id); - } - /** * Start an async repeat task * @@ -354,12 +309,11 @@ public class J { * @param interval the interval in ticks * @return the task id */ - @SuppressWarnings("deprecation") - public static int ar(Runnable r, int interval) { + public static Task ar(Runnable r, int interval) { if (!Bukkit.getPluginManager().isPluginEnabled(Iris.instance)) { - return -1; + return null; } - return Bukkit.getScheduler().scheduleAsyncRepeatingTask(Iris.instance, r, 0, interval); + return Iris.scheduler.async().runAtFixedRate(r, 0, Math.max(interval, 1) * 50, TimeUnit.MILLISECONDS); } /** diff --git a/core/src/main/java/com/volmit/iris/util/scheduling/SR.java b/core/src/main/java/com/volmit/iris/util/scheduling/SR.java index bbb41cd85..50c882e36 100644 --- a/core/src/main/java/com/volmit/iris/util/scheduling/SR.java +++ b/core/src/main/java/com/volmit/iris/util/scheduling/SR.java @@ -21,22 +21,20 @@ package com.volmit.iris.util.scheduling; import com.volmit.iris.util.plugin.CancellableTask; public abstract class SR implements Runnable, CancellableTask { - private int id = 0; + private final Task id; public SR() { this(0); } public SR(int interval) { - id = J.sr(this, interval); + this.id = J.sr(this, interval); } @Override public void cancel() { - J.csr(id); - } - - public int getId() { - return id; + if (id != null) { + id.cancel(); + } } } diff --git a/core/src/main/java/com/volmit/iris/util/scheduling/jobs/Job.java b/core/src/main/java/com/volmit/iris/util/scheduling/jobs/Job.java index a378770b5..1b2408bba 100644 --- a/core/src/main/java/com/volmit/iris/util/scheduling/jobs/Job.java +++ b/core/src/main/java/com/volmit/iris/util/scheduling/jobs/Job.java @@ -63,7 +63,7 @@ public interface Job { default void execute(VolmitSender sender, boolean silentMsg, Runnable whenComplete) { PrecisionStopwatch p = PrecisionStopwatch.start(); CompletableFuture f = J.afut(this::execute); - int c = J.ar(() -> { + var c = J.ar(() -> { if (sender.isPlayer()) { sender.sendProgress(getProgress(), getName()); } else { @@ -71,7 +71,7 @@ public interface Job { } }, sender.isPlayer() ? 0 : 20); f.whenComplete((fs, ff) -> { - J.car(c); + if (c != null) c.cancel(); if (!silentMsg) { sender.sendMessage(C.AQUA + "Completed " + getName() + " in " + Form.duration(p.getMilliseconds(), 1)); } diff --git a/core/src/main/resources/plugin.yml b/core/src/main/resources/plugin.yml index 0a58f5d00..e36460207 100644 --- a/core/src/main/resources/plugin.yml +++ b/core/src/main/resources/plugin.yml @@ -24,4 +24,5 @@ commands: iris: aliases: [ ir, irs ] api-version: '${apiVersion}' -hotload-dependencies: false \ No newline at end of file +hotload-dependencies: false +folia-supported: true \ No newline at end of file