mirror of
https://github.com/Minestom/Minestom.git
synced 2025-02-16 04:11:39 +01:00
Add a Scheduler::scheduleTask with period supplier AND delay (#2082)
This commit is contained in:
parent
877e2bb4f2
commit
2442f14b3d
@ -68,6 +68,10 @@ public sealed interface Scheduler extends Executor permits SchedulerImpl, Schedu
|
||||
return scheduleTask(task, delay, repeat, ExecutionType.TICK_START);
|
||||
}
|
||||
|
||||
default @NotNull Task scheduleTask(@NotNull Supplier<TaskSchedule> task, @NotNull TaskSchedule delay) {
|
||||
return new Task.Builder(this, task).delay(delay).schedule();
|
||||
}
|
||||
|
||||
default @NotNull Task scheduleNextTick(@NotNull Runnable task, @NotNull ExecutionType executionType) {
|
||||
return buildTask(task).delay(TaskSchedule.nextTick()).executionType(executionType).schedule();
|
||||
}
|
||||
|
@ -26,14 +26,23 @@ public sealed interface Task permits TaskImpl {
|
||||
|
||||
final class Builder {
|
||||
private final Scheduler scheduler;
|
||||
private final Runnable runnable;
|
||||
private final Supplier<TaskSchedule> innerTask;
|
||||
private ExecutionType executionType = ExecutionType.TICK_START;
|
||||
private TaskSchedule delay = TaskSchedule.immediate();
|
||||
private TaskSchedule repeat = TaskSchedule.stop();
|
||||
private boolean repeatOverride;
|
||||
|
||||
Builder(Scheduler scheduler, Supplier<TaskSchedule> innerTask) {
|
||||
this.scheduler = scheduler;
|
||||
this.innerTask = innerTask;
|
||||
}
|
||||
|
||||
Builder(Scheduler scheduler, Runnable runnable) {
|
||||
this.scheduler = scheduler;
|
||||
this.runnable = runnable;
|
||||
this.innerTask = () -> {
|
||||
runnable.run();
|
||||
return TaskSchedule.stop();
|
||||
};
|
||||
}
|
||||
|
||||
public @NotNull Builder executionType(@NotNull ExecutionType executionType) {
|
||||
@ -48,13 +57,15 @@ public sealed interface Task permits TaskImpl {
|
||||
|
||||
public @NotNull Builder repeat(@NotNull TaskSchedule schedule) {
|
||||
this.repeat = schedule;
|
||||
this.repeatOverride = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public @NotNull Task schedule() {
|
||||
var runnable = this.runnable;
|
||||
var innerTask = this.innerTask;
|
||||
var delay = this.delay;
|
||||
var repeat = this.repeat;
|
||||
var repeatOverride = this.repeatOverride;
|
||||
var executionType = this.executionType;
|
||||
return scheduler.submitTask(new Supplier<>() {
|
||||
boolean first = true;
|
||||
@ -65,8 +76,11 @@ public sealed interface Task permits TaskImpl {
|
||||
first = false;
|
||||
return delay;
|
||||
}
|
||||
runnable.run();
|
||||
return repeat;
|
||||
TaskSchedule schedule = innerTask.get();
|
||||
if (repeatOverride) {
|
||||
return repeat;
|
||||
}
|
||||
return schedule;
|
||||
}
|
||||
}, executionType);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user