package ru.lovar.gradientnick.util; import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import org.bukkit.plugin.Plugin; import java.util.concurrent.TimeUnit; /** * Утилита для работы с Folia и Paper 1.21.8+ * Обеспечивает потокобезопасность при работе с игроками */ public final class FoliaUtil { private static final boolean IS_FOLIA; static { IS_FOLIA = checkFolia(); } private FoliaUtil() {} private static boolean checkFolia() { try { Class.forName("io.papermc.paper.threadedregions.RegionizedServer"); return true; } catch (ClassNotFoundException e) { return false; } } public static boolean isFolia() { return IS_FOLIA; } /** * Выполняет задачу в контексте сущности (потокобезопасно для Folia) */ public static void runEntityTask(Plugin plugin, Entity entity, Runnable task) { if (IS_FOLIA) { entity.getScheduler().run(plugin, scheduledTask -> task.run(), null); } else { Bukkit.getScheduler().runTask(plugin, task); } } /** * Выполняет задачу в контексте сущности с задержкой */ public static void runEntityTaskLater(Plugin plugin, Entity entity, Runnable task, long delayTicks) { if (IS_FOLIA) { entity.getScheduler().runDelayed(plugin, scheduledTask -> task.run(), null, delayTicks); } else { Bukkit.getScheduler().runTaskLater(plugin, task, delayTicks); } } /** * Выполняет задачу асинхронно */ public static void runAsync(Plugin plugin, Runnable task) { if (IS_FOLIA) { Bukkit.getAsyncScheduler().runNow(plugin, scheduledTask -> task.run()); } else { Bukkit.getScheduler().runTaskAsynchronously(plugin, task); } } /** * Выполняет задачу асинхронно с задержкой */ public static void runAsyncLater(Plugin plugin, Runnable task, long delayMs) { if (IS_FOLIA) { Bukkit.getAsyncScheduler().runDelayed(plugin, scheduledTask -> task.run(), delayMs, TimeUnit.MILLISECONDS); } else { Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, task, delayMs / 50); } } /** * Выполняет глобальную задачу (для Folia — на глобальном регионе) */ public static void runGlobalTask(Plugin plugin, Runnable task) { if (IS_FOLIA) { Bukkit.getGlobalRegionScheduler().run(plugin, scheduledTask -> task.run()); } else { Bukkit.getScheduler().runTask(plugin, task); } } /** * Выполняет глобальную задачу с задержкой */ public static void runGlobalTaskLater(Plugin plugin, Runnable task, long delayTicks) { if (IS_FOLIA) { Bukkit.getGlobalRegionScheduler().runDelayed(plugin, scheduledTask -> task.run(), delayTicks); } else { Bukkit.getScheduler().runTaskLater(plugin, task, delayTicks); } } }