2021-03-09 08:47:33 +11:00

130 lines
3.1 KiB
Java

package org.bukkit.craftbukkit.scheduler;
import java.util.function.Consumer;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitTask;
class CraftTask implements BukkitTask, Runnable {
private volatile CraftTask next = null;
public static final int ERROR = 0;
public static final int NO_REPEATING = -1;
public static final int CANCEL = -2;
public static final int PROCESS_FOR_FUTURE = -3;
public static final int DONE_FOR_FUTURE = -4;
/**
* -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;
private final Runnable rTask;
private final Consumer<BukkitTask> cTask;
private final Plugin plugin;
private final int id;
CraftTask() {
this(null, null, CraftTask.NO_REPEATING, CraftTask.NO_REPEATING);
}
CraftTask(final Object task) {
this(null, task, CraftTask.NO_REPEATING, CraftTask.NO_REPEATING);
}
CraftTask(final Plugin plugin, final Object task, final int id, final long period) {
this.plugin = plugin;
if (task instanceof Runnable) {
this.rTask = (Runnable) task;
this.cTask = null;
} else if (task instanceof Consumer) {
this.cTask = (Consumer<BukkitTask>) task;
this.rTask = null;
} else if (task == null) {
// Head or Future task
this.rTask = null;
this.cTask = null;
} else {
throw new AssertionError("Illegal task class " + task);
}
this.id = id;
this.period = period;
}
@Override
public final int getTaskId() {
return id;
}
@Override
public final Plugin getOwner() {
return plugin;
}
@Override
public boolean isSync() {
return true;
}
@Override
public void run() {
if (rTask != null) {
rTask.run();
} else {
cTask.accept(this);
}
}
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<?> getTaskClass() {
return (rTask != null) ? rTask.getClass() : ((cTask != null) ? cTask.getClass() : null);
}
@Override
public boolean isCancelled() {
return (period == CraftTask.CANCEL);
}
@Override
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(CraftTask.CANCEL);
return true;
}
}