package net.shockverse.survivalgames.extras;
import net.shockverse.survivalgames.interfaces.CancellableTask;
import net.shockverse.survivalgames.interfaces.DelayedTask;
import net.shockverse.survivalgames.interfaces.StubbornTask;
import net.shockverse.survivalgames.interfaces.Task;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
/**
*
* @author LegitModern, Tagette
*/
public abstract class GameTask implements Task, DelayedTask, CancellableTask, StubbornTask {
private JavaPlugin plugin;
private long delay;
private long repeat;
private boolean cancelled;
private boolean hasFinished;
private int timesRun;
public GameTask(JavaPlugin plugin) {
this(plugin, 0, 0);
}
public GameTask(JavaPlugin plugin, long delay) {
this(plugin, delay, 0);
}
public GameTask(JavaPlugin plugin, long delay, long repeat) {
this.plugin = plugin;
this.delay = delay;
this.repeat = repeat;
schedule(delay);
}
@Override
public abstract void run();
@Override
public void runAnyways() { } // Here to override optionally
@Override
public void onCancel() { } // Here to override optionally
@Override
public void onResume() { } // Here to override optionally
@Override
public void onFinish() { } // Here to override optionally
private void schedule(long delay) {
if((delay > 0 || timesRun == 0) && !isCancelled()) {
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable(){
@Override
public void run() {
if(!isCancelled()) GameTask.this.run();
runAnyways();
timesRun++;
schedule(repeat);
}
}, delay);
} else {
hasFinished = true;
}
}
@Override
public boolean hasFinished() {
return hasFinished;
}
@Override
public boolean hasRun() {
return timesRun > 0;
}
@Override
public int getTimesRun() {
return timesRun;
}
@Override
public long getDelay() {
return delay;
}
@Override
public long getRepeat() {
return repeat;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
if(cancelled)
onCancel();
else
onResume();
}
}