diff --git a/api/src/main/java/ru/dragonestia/msb3/api/Bootstrap.java b/api/src/main/java/ru/dragonestia/msb3/api/Bootstrap.java index 0252e10..d941071 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/Bootstrap.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/Bootstrap.java @@ -1,8 +1,10 @@ package ru.dragonestia.msb3.api; +import lombok.extern.log4j.Log4j2; import net.minestom.server.entity.GameMode; import ru.dragonestia.msb3.api.module.FlatWorldModule; +@Log4j2 public class Bootstrap { public static void main(String[] args) { diff --git a/api/src/main/java/ru/dragonestia/msb3/api/scheduler/Scheduler.java b/api/src/main/java/ru/dragonestia/msb3/api/scheduler/Scheduler.java new file mode 100644 index 0000000..dee99e8 --- /dev/null +++ b/api/src/main/java/ru/dragonestia/msb3/api/scheduler/Scheduler.java @@ -0,0 +1,36 @@ +package ru.dragonestia.msb3.api.scheduler; + +import net.minestom.server.MinecraftServer; +import net.minestom.server.entity.Player; +import net.minestom.server.instance.Instance; +import net.minestom.server.timer.Task; +import ru.dragonestia.msb3.api.util.UncheckedRunnable; + +import java.time.Duration; + +public interface Scheduler { + + static Scheduler ofPlayer(Player player) { + return new SchedulerImpl(player.scheduler()); + } + + static Scheduler ofInstance(Instance instance) { + return new SchedulerImpl(instance.scheduler()); + } + + static Scheduler global() { + return new SchedulerImpl(MinecraftServer.getSchedulerManager()); + } + + static Scheduler create() { + return new SchedulerImpl(net.minestom.server.timer.Scheduler.newScheduler()); + } + + Task delayedTask(UncheckedRunnable task, Duration delay); + + Task repeatingTask(UncheckedRunnable task, Duration period, Duration delay); + + default Task repeatingTask(UncheckedRunnable task, Duration period) { + return repeatingTask(task, period, Duration.ZERO); + } +} diff --git a/api/src/main/java/ru/dragonestia/msb3/api/scheduler/SchedulerImpl.java b/api/src/main/java/ru/dragonestia/msb3/api/scheduler/SchedulerImpl.java new file mode 100644 index 0000000..2d56a3c --- /dev/null +++ b/api/src/main/java/ru/dragonestia/msb3/api/scheduler/SchedulerImpl.java @@ -0,0 +1,27 @@ +package ru.dragonestia.msb3.api.scheduler; + +import net.minestom.server.timer.Scheduler; +import net.minestom.server.timer.Task; +import net.minestom.server.timer.TaskSchedule; +import ru.dragonestia.msb3.api.util.UncheckedRunnable; + +import java.time.Duration; + +class SchedulerImpl implements ru.dragonestia.msb3.api.scheduler.Scheduler { + + private final Scheduler scheduler; + + SchedulerImpl(Scheduler scheduler) { + this.scheduler = scheduler; + } + + @Override + public Task delayedTask(UncheckedRunnable task, Duration delay) { + return scheduler.buildTask(task).delay(delay).schedule(); + } + + @Override + public Task repeatingTask(UncheckedRunnable task, Duration period, Duration delay) { + return scheduler.scheduleTask(task, TaskSchedule.duration(delay), TaskSchedule.duration(period)); + } +} diff --git a/api/src/main/java/ru/dragonestia/msb3/api/util/UncheckedRunnable.java b/api/src/main/java/ru/dragonestia/msb3/api/util/UncheckedRunnable.java new file mode 100644 index 0000000..f2a31a0 --- /dev/null +++ b/api/src/main/java/ru/dragonestia/msb3/api/util/UncheckedRunnable.java @@ -0,0 +1,17 @@ +package ru.dragonestia.msb3.api.util; + +import org.slf4j.LoggerFactory; + +public interface UncheckedRunnable extends Runnable { + + @Override + default void run() { + try { + runUnchecked(); + } catch (Exception ex) { + LoggerFactory.getLogger(UncheckedRunnable.class).error(ex.getMessage(), ex); + } + } + + void runUnchecked() throws Exception; +}