package choonster.testmod3.util;
import choonster.testmod3.Logger;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import java.util.ArrayDeque;
import java.util.Queue;
/**
* Allows tasks to be scheduled to run at the start of the next server tick. Must not be used from the logical client.
*
* @author Choonster
*/
@Mod.EventBusSubscriber
public class Scheduler {
private static final Queue<Runnable> tasks = new ArrayDeque<>();
/**
* Schedule a task to be run at the start of the next server tick. Must not be called from the logical client.
*
* @param task The task
*/
public static void scheduleTask(Runnable task) {
tasks.add(task);
}
/**
* Run all scheduled tasks at the start of the server tick.
*
* @param event The event
*/
@SubscribeEvent
public static void serverTick(TickEvent.ServerTickEvent event) {
if (event.phase != TickEvent.Phase.START) return;
while (!tasks.isEmpty()) {
try {
tasks.poll().run();
} catch (Throwable throwable) {
Logger.error(throwable, "Error running scheduled task");
}
}
}
}