24package com.dreamfirestudios.dreamcore.DreamTimer;
26import org.bukkit.Bukkit;
27import org.bukkit.plugin.Plugin;
29import java.util.Objects;
30import java.util.function.BiConsumer;
31import java.util.function.Consumer;
53 private final Plugin plugin;
54 private final long periodTicks;
55 private final Consumer<Integer> onTick;
56 private final BiConsumer<Integer, Boolean> onPause;
57 private final Consumer<Integer> onFinish;
59 private int taskId = -1;
60 private int remainingSeconds;
61 private boolean paused =
false;
62 private boolean finished =
false;
77 Consumer<Integer> onTick,
78 BiConsumer<Integer, Boolean> onPause,
79 Consumer<Integer> onFinish
81 this.plugin = Objects.requireNonNull(plugin,
"plugin");
82 this.remainingSeconds = Math.max(0, startingSeconds);
83 this.periodTicks = Math.max(1L, periodTicks);
84 this.onTick = onTick ==
null ? s -> {} : onTick;
85 this.onPause = onPause ==
null ? (s, p) -> {} : onPause;
86 this.onFinish = onFinish ==
null ? s -> {} : onFinish;
97 if (taskId != -1)
return;
100 taskId = Bukkit.getScheduler().runTaskTimer(plugin, () -> {
101 if (finished || paused)
return;
104 onTick.accept(remainingSeconds);
105 Bukkit.getPluginManager().callEvent(
new TimerTickEvent(
this, remainingSeconds));
109 if (remainingSeconds <= 0) {
112 }, 0L, periodTicks).getTaskId();
113 Bukkit.getPluginManager().callEvent(
new TimerStartedEvent(
this, remainingSeconds));
119 if (taskId == -1 || paused || finished)
return;
121 onPause.accept(remainingSeconds,
true);
122 Bukkit.getPluginManager().callEvent(
new TimerPausedEvent(
this, remainingSeconds));
128 if (taskId == -1 || !paused || finished)
return;
130 onPause.accept(remainingSeconds,
false);
131 Bukkit.getPluginManager().callEvent(
new TimerResumedEvent(
this, remainingSeconds));
138 if (taskId == -1 || finished)
return;
142 private void finish() {
145 onFinish.accept(Math.max(0, remainingSeconds));
146 Bukkit.getPluginManager().callEvent(
new TimerFinishedEvent(
this, Math.max(0, remainingSeconds)));
149 private void cancelTask() {
151 Bukkit.getScheduler().cancelTask(taskId);
163 public boolean isRunning() {
return taskId != -1 && !paused && !finished; }
177 int m = seconds / 60;
178 int s = seconds % 60;
179 return String.format(
"%02d:%02d", m, s);
A countdown timer (counts down to zero) with pause/resume and Bukkit events.
boolean isRunning()
True if the timer is currently running (started, not paused, not finished).
void start()
Starts the countdown.
void pause()
Pauses the timer.
static String formatHMS(int seconds)
Utility formatter: mm:ss (e.g., 03:07).
void cancel()
Cancels the timer early (fires finish events and callbacks).
boolean isFinished()
True if the timer has finished or was cancelled.
DreamTimer(Plugin plugin, int startingSeconds, long periodTicks, Consumer< Integer > onTick, BiConsumer< Integer, Boolean > onPause, Consumer< Integer > onFinish)
Constructs a countdown timer.
void resume()
Resumes a paused timer.
boolean isPaused()
True if the timer is paused.
int getRemainingSeconds()
Remaining seconds (never negative).
Fired when a DreamTimer finishes or is cancelled.
Fired when a DreamTimer is paused.
Fired when a paused DreamTimer is resumed.
Fired when a DreamTimer starts.
Fired each period while a running DreamTimer is active (before decrement).