101 lines
3.3 KiB
Java
101 lines
3.3 KiB
Java
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);
|
||
}
|
||
}
|
||
}
|