package org.bukkit.craftbukkit.scheduler; import org.bukkit.Bukkit; import co.aikar.timings.MinecraftTimings; // Paper import co.aikar.timings.Timing; // Paper import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitTask; public class CraftTask implements BukkitTask, Runnable { // Spigot private volatile CraftTask next = null; /** * -1 means no repeating <br> * -2 means cancel <br> * -3 means processing for Future <br> * -4 means done for Future <br> * Never 0 <br> * >0 means number of ticks to wait between each execution */ private volatile long period; private long nextRun; public final Runnable task; // Paper public Timing timings; // Paper private final Plugin plugin; private final int id; CraftTask() { this(null, null, -1, -1); } CraftTask(final Runnable task) { this(null, task, -1, -1); } CraftTask(final Plugin plugin, final Runnable task, final int id, final long period) { // Paper this.plugin = plugin; this.task = task; this.id = id; this.period = period; timings = task != null ? MinecraftTimings.getPluginTaskTimings(this, period) : null; // Paper } public final int getTaskId() { return id; } public final Plugin getOwner() { return plugin; } public boolean isSync() { return true; } public void run() { if (timings != null && isSync()) timings.startTiming(); // Paper task.run(); if (timings != null && isSync()) timings.stopTiming(); // Paper } long getPeriod() { return period; } void setPeriod(long period) { this.period = period; } long getNextRun() { return nextRun; } void setNextRun(long nextRun) { this.nextRun = nextRun; } CraftTask getNext() { return next; } void setNext(CraftTask next) { this.next = next; } Class<? extends Runnable> getTaskClass() { return task.getClass(); } public void cancel() { Bukkit.getScheduler().cancelTask(id); } /** * This method properly sets the status to cancelled, synchronizing when required. * * @return false if it is a craft future task that has already begun execution, true otherwise */ boolean cancel0() { setPeriod(-2l); return true; } }