All source projects

MrUltimateLibrary Source

Standalone source project / 68 files

MrUltimateLibrary is the backbone of all my plugins; it offers features that facilitate plugin creation, maintenance, and updates.

java

MrUltimateLibrary/src/main/java/eu/mrneznamy/mrultimatelibrary/scheduler/MrLibScheduler.java

JAVA · Read-only source

package eu.mrneznamy.mrultimatelibrary.scheduler;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitTask;

import java.util.concurrent.TimeUnit;

public class MrLibScheduler {

    private static final boolean IS_FOLIA = isFolia();

    private static boolean isFolia() {
        try {
            Class.forName("io.papermc.paper.threadedregions.RegionizedServer");
            return true;
        } catch (ClassNotFoundException e) {
            return false;
        }
    }

    public interface MrLibTask {
        void cancel();
        boolean isCancelled();
        int getTaskId(); 
    }

    private static class BukkitMrLibTask implements MrLibTask {
        private final BukkitTask task;
        public BukkitMrLibTask(BukkitTask task) { this.task = task; }
        @Override public void cancel() { task.cancel(); }
        @Override public boolean isCancelled() { return task.isCancelled(); }
        @Override public int getTaskId() { return task.getTaskId(); }
    }

    private static class FoliaMrLibTask implements MrLibTask {
        private final io.papermc.paper.threadedregions.scheduler.ScheduledTask task;
        public FoliaMrLibTask(io.papermc.paper.threadedregions.scheduler.ScheduledTask task) { this.task = task; }
        @Override public void cancel() { task.cancel(); }
        @Override public boolean isCancelled() { return task.isCancelled(); }
        @Override public int getTaskId() { return -1; }
    }

    public static MrLibTask runTask(Plugin plugin, Runnable runnable) {
        if (IS_FOLIA) {
            return new FoliaMrLibTask(Bukkit.getGlobalRegionScheduler().run(plugin, task -> runnable.run()));
        } else {
            return new BukkitMrLibTask(Bukkit.getScheduler().runTask(plugin, runnable));
        }
    }

    public static MrLibTask runTaskAsynchronously(Plugin plugin, Runnable runnable) {
        if (IS_FOLIA) {
            return new FoliaMrLibTask(Bukkit.getAsyncScheduler().runNow(plugin, task -> runnable.run()));
        } else {
            return new BukkitMrLibTask(Bukkit.getScheduler().runTaskAsynchronously(plugin, runnable));
        }
    }

    public static MrLibTask runTaskLater(Plugin plugin, Runnable runnable, long delayTicks) {
        if (IS_FOLIA) {
            return new FoliaMrLibTask(Bukkit.getGlobalRegionScheduler().runDelayed(plugin, task -> runnable.run(), delayTicks));
        } else {
            return new BukkitMrLibTask(Bukkit.getScheduler().runTaskLater(plugin, runnable, delayTicks));
        }
    }

    public static MrLibTask runTaskLaterAsynchronously(Plugin plugin, Runnable runnable, long delayTicks) {
        if (IS_FOLIA) {
            return new FoliaMrLibTask(Bukkit.getAsyncScheduler().runDelayed(plugin, task -> runnable.run(), delayTicks * 50, TimeUnit.MILLISECONDS));
        } else {
            return new BukkitMrLibTask(Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, runnable, delayTicks));
        }
    }

    public static MrLibTask runTaskTimer(Plugin plugin, Runnable runnable, long delayTicks, long periodTicks) {
        if (IS_FOLIA) {
            return new FoliaMrLibTask(Bukkit.getGlobalRegionScheduler().runAtFixedRate(plugin, task -> runnable.run(), delayTicks < 1 ? 1 : delayTicks, periodTicks));
        } else {
            return new BukkitMrLibTask(Bukkit.getScheduler().runTaskTimer(plugin, runnable, delayTicks, periodTicks));
        }
    }

    public static MrLibTask runTaskTimerAsynchronously(Plugin plugin, Runnable runnable, long delayTicks, long periodTicks) {
        if (IS_FOLIA) {
            return new FoliaMrLibTask(Bukkit.getAsyncScheduler().runAtFixedRate(plugin, task -> runnable.run(), delayTicks * 50, periodTicks * 50, TimeUnit.MILLISECONDS));
        } else {
            return new BukkitMrLibTask(Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, runnable, delayTicks, periodTicks));
        }
    }

    public static MrLibTask runTaskForRegion(Plugin plugin, Location location, Runnable runnable) {
        if (IS_FOLIA) {
            return new FoliaMrLibTask(Bukkit.getRegionScheduler().run(plugin, location, task -> runnable.run()));
        } else {
            return new BukkitMrLibTask(Bukkit.getScheduler().runTask(plugin, runnable));
        }
    }
    
    public static MrLibTask runTaskLaterForRegion(Plugin plugin, Location location, Runnable runnable, long delayTicks) {
        if (IS_FOLIA) {
            return new FoliaMrLibTask(Bukkit.getRegionScheduler().runDelayed(plugin, location, task -> runnable.run(), delayTicks));
        } else {
            return new BukkitMrLibTask(Bukkit.getScheduler().runTaskLater(plugin, runnable, delayTicks));
        }
    }

    public static MrLibTask runTaskTimerForRegion(Plugin plugin, Location location, Runnable runnable, long delayTicks, long periodTicks) {
        if (IS_FOLIA) {
            return new FoliaMrLibTask(Bukkit.getRegionScheduler().runAtFixedRate(plugin, location, task -> runnable.run(), delayTicks < 1 ? 1 : delayTicks, periodTicks));
        } else {
            return new BukkitMrLibTask(Bukkit.getScheduler().runTaskTimer(plugin, runnable, delayTicks, periodTicks));
        }
    }

    public static MrLibTask runTaskForEntity(Plugin plugin, Entity entity, Runnable runnable, Runnable retired) {
        if (IS_FOLIA) {
            return new FoliaMrLibTask(entity.getScheduler().run(plugin, task -> runnable.run(), retired));
        } else {
            return new BukkitMrLibTask(Bukkit.getScheduler().runTask(plugin, runnable));
        }
    }
}
126 linesGNU GENERAL PUBLIC LICENSE · Version 3, 29 June 2007 · UTF-8 · Read only