package emu.grasscutter.server.scheduler; import emu.grasscutter.Grasscutter; import lombok.*; /** * This class works the same as a runnable, except with more information. */ public final class ServerTask implements Runnable { /* The runnable to run. */ private final Runnable runnable; /* This ID is assigned by the scheduler. */ @Getter private final int taskId; /* The period at which the task should be run. */ /* The delay between the first execute. */ private final int period, delay; public ServerTask(Runnable runnable, int taskId, int period, int delay) { this.runnable = runnable; this.taskId = taskId; this.period = period; this.delay = delay; } /* The amount of times the task has been run. */ @Getter private int ticks = 0; /* Should the check consider delay? */ private boolean considerDelay = true; /** * Cancels the task from running the next time. */ public void cancel() { Grasscutter.getGameServer().getScheduler().cancelTask(this.taskId); } /** * Checks if the task should run at the current tick. * @return True if the task should run, false otherwise. */ public boolean shouldRun() { if(this.delay != -1 && this.considerDelay) { this.considerDelay = false; return this.ticks == this.delay; } else if(this.period != -1) return this.ticks % this.period == 0; else return true; } /** * Checks if the task should be canceled. * @return True if the task should be canceled, false otherwise. */ public boolean shouldCancel() { return this.period == -1; } /** * Runs the task. */ @Override public void run() { // Run the runnable. this.runnable.run(); // Increase tick count. this.ticks++; } }