/FileExtraction/Java_unseen/Wind-Development_WindSpigot/WindSpigot-Server/src/main/java/org/bukkit/craftbukkit/scheduler/CraftTask.java
package org.bukkit.craftbukkit.scheduler;

import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitTask;

import co.aikar.timings.SpigotTimings; // Spigot
import co.aikar.timings.Timing; // Spigot

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; // Spigot
	public Timing timings; // Spigot
	private final Plugin plugin;
	private final int id;

	CraftTask() {
		this(null, null, -1, -1);
	}

	CraftTask(final Runnable task) {
		this(null, task, -1, -1);
	}

	// Spigot start
	CraftTask(final Plugin plugin, final Runnable task, final int id, final long period) {
		this.plugin = plugin;
		this.task = task;
		this.id = id;
		this.period = period;
		timings = task != null ? SpigotTimings.getPluginTaskTimings(this, period) : null; // Spigot
	}

	@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 (timings != null && isSync()) {
			timings.startTiming(); // Spigot
		}
		task.run();
		if (timings != null && isSync()) {
			timings.stopTiming(); // Spigot
		}
	}

	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();
	}

	@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(-2l);
		return true;
	}

}
