package me.hammerle.supersnuvi.snuviscript; import java.util.ArrayList; import me.hammerle.snuviscript.code.ISnuviScheduler; import me.hammerle.supersnuvi.gamelogic.Level; public class SnuviScheduler implements ISnuviScheduler { private static class Task { private final Runnable r; private long ticks; private final Level owner; private Task(Runnable r, long ticks, Level owner) { this.r = r; this.ticks = ticks; this.owner = owner; } private boolean tick(Level current) { if(current != owner && owner != null) { return false; } ticks--; if(ticks <= 0) { r.run(); return true; } return false; } } private int id = 0; private final ArrayList queue = new ArrayList<>(); private Level currentLevel = null; public void setActiveLevel(Level l) { currentLevel = l; } @Override public int scheduleTask(Runnable r, long delay) { queue.add(new Task(r, Math.max(delay, 2), currentLevel)); return id++; } @Override public int scheduleTask(Runnable r) { return scheduleTask(r, 2); } public void tick(Level current) { int i = 0; while(i < queue.size()) { if(queue.get(i).tick(current)) { if(i + 1 == queue.size()) { // last element queue.remove(i); } else { // swap last queue.set(i, queue.get(queue.size() - 1)); queue.remove(queue.size() - 1); // current element is a new one, skip i++ continue; } } i++; } } }