SnuviScheduler.java 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package me.hammerle.supersnuvi.snuviscript;
  2. import java.util.ArrayList;
  3. import me.hammerle.snuviscript.code.ISnuviScheduler;
  4. import me.hammerle.supersnuvi.gamelogic.Level;
  5. public class SnuviScheduler implements ISnuviScheduler
  6. {
  7. private static class Task
  8. {
  9. private final Runnable r;
  10. private long ticks;
  11. private final Level owner;
  12. private Task(Runnable r, long ticks, Level owner)
  13. {
  14. this.r = r;
  15. this.ticks = ticks;
  16. this.owner = owner;
  17. }
  18. private boolean tick(Level current)
  19. {
  20. if(current != owner && owner != null)
  21. {
  22. return false;
  23. }
  24. ticks--;
  25. if(ticks <= 0)
  26. {
  27. r.run();
  28. return true;
  29. }
  30. return false;
  31. }
  32. }
  33. private int id = 0;
  34. private final ArrayList<Task> queue = new ArrayList<>();
  35. private Level currentLevel = null;
  36. public void setActiveLevel(Level l)
  37. {
  38. currentLevel = l;
  39. }
  40. @Override
  41. public int scheduleTask(Runnable r, long delay)
  42. {
  43. queue.add(new Task(r, Math.max(delay, 2), currentLevel));
  44. return id++;
  45. }
  46. @Override
  47. public int scheduleTask(Runnable r)
  48. {
  49. return scheduleTask(r, 2);
  50. }
  51. public void tick(Level current)
  52. {
  53. int i = 0;
  54. while(i < queue.size())
  55. {
  56. if(queue.get(i).tick(current))
  57. {
  58. if(i + 1 == queue.size())
  59. {
  60. // last element
  61. queue.remove(i);
  62. }
  63. else
  64. {
  65. // swap last
  66. queue.set(i, queue.get(queue.size() - 1));
  67. queue.remove(queue.size() - 1);
  68. // current element is a new one, skip i++
  69. continue;
  70. }
  71. }
  72. i++;
  73. }
  74. }
  75. }