diff --git a/pom.xml b/pom.xml index f5b2dfb..943512a 100644 --- a/pom.xml +++ b/pom.xml @@ -34,9 +34,9 @@ - io.papermc.paper - paper-api - 1.19.2-R0.1-SNAPSHOT + dev.folia + folia-api + 1.19.4-R0.1-SNAPSHOT provided diff --git a/src/main/java/de/fanta/challengesjoinentities/ChallengesGlobalDataHelper.java b/src/main/java/de/fanta/challengesjoinentities/ChallengesGlobalDataHelper.java index 434b2bb..79b5a94 100644 --- a/src/main/java/de/fanta/challengesjoinentities/ChallengesGlobalDataHelper.java +++ b/src/main/java/de/fanta/challengesjoinentities/ChallengesGlobalDataHelper.java @@ -95,7 +95,7 @@ @EventHandler public void onGlobalServerConnected(GlobalServerConnectedEvent event) { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + plugin.getScheduler().runGlobalDelayed(() -> { if (plugin.getEntityData(event.getServer().getName()) != null) { plugin.updateServerStatus(event.getServer().getName(), true); this.requestInitialData(event.getServer().getName()); diff --git a/src/main/java/de/fanta/challengesjoinentities/ChallengesJoinEntities.java b/src/main/java/de/fanta/challengesjoinentities/ChallengesJoinEntities.java index fb6697a..a4d4ace 100644 --- a/src/main/java/de/fanta/challengesjoinentities/ChallengesJoinEntities.java +++ b/src/main/java/de/fanta/challengesjoinentities/ChallengesJoinEntities.java @@ -28,6 +28,9 @@ import de.fanta.challengesjoinentities.listeners.ChallengesEventListener; import de.fanta.challengesjoinentities.listeners.EntityListener; import de.fanta.challengesjoinentities.listeners.PlayerListener; +import de.fanta.challengesjoinentities.schedular.BukkitScheduler; +import de.fanta.challengesjoinentities.schedular.FoliaScheduler; +import de.fanta.challengesjoinentities.schedular.Scheduler; import de.fanta.challengesjoinentities.utils.Statistics; import de.iani.cubesidestats.api.CubesideStatisticsAPI; import de.iani.cubesideutils.bukkit.commands.CommandRouter; @@ -83,6 +86,8 @@ private static SignManager signManager; private final List eventServerPlayerList; + private Scheduler scheduler; + public ChallengesJoinEntities() { this.entityData = new HashMap<>(); @@ -111,6 +116,14 @@ signManager.init(); } + try { + Class.forName("io.papermc.paper.threadedregions.scheduler.ScheduledTask"); + getLogger().log(Level.INFO, "Folia found. Use Folia Scheduler"); + scheduler = new FoliaScheduler(this); + } catch (Throwable ignored) { + getLogger().log(Level.INFO, "Bukkit found. Use Bukkit Scheduler"); + scheduler = new BukkitScheduler(this); + } this.globalDataHelper = new ChallengesGlobalDataHelper(this); this.config = new Config(this); @@ -411,4 +424,8 @@ public List getEventServerPlayerList() { return eventServerPlayerList; } + + public Scheduler getScheduler() { + return scheduler; + } } diff --git a/src/main/java/de/fanta/challengesjoinentities/Server.java b/src/main/java/de/fanta/challengesjoinentities/Server.java index 7577c1d..05c9f63 100644 --- a/src/main/java/de/fanta/challengesjoinentities/Server.java +++ b/src/main/java/de/fanta/challengesjoinentities/Server.java @@ -133,7 +133,7 @@ } public void load(Player p, String serverTypeDir, String targetDir, String ServerVersion) { - Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + plugin.getScheduler().runAsync(() -> { File serverFolder = new File("/home/minecraft/Server/" + this.dir); File configs = new File(serverFolder, "/plugins/Challenges"); File end = new File(serverFolder, "/world_the_end"); diff --git a/src/main/java/de/fanta/challengesjoinentities/commands/AdventureCommand/AdventureConvertMapCommand.java b/src/main/java/de/fanta/challengesjoinentities/commands/AdventureCommand/AdventureConvertMapCommand.java index 7274d39..5f70342 100644 --- a/src/main/java/de/fanta/challengesjoinentities/commands/AdventureCommand/AdventureConvertMapCommand.java +++ b/src/main/java/de/fanta/challengesjoinentities/commands/AdventureCommand/AdventureConvertMapCommand.java @@ -68,7 +68,7 @@ String finalUrlString = urlString; String finalVersioString = versioString; - Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> downloadMap(finalUrlString, finalVersioString, folder, player)); + plugin.getScheduler().runAsync(() -> downloadMap(finalUrlString, finalVersioString, folder, player)); } else { ChatUtil.sendErrorMessage(sender, "/convertmap "); return true; diff --git a/src/main/java/de/fanta/challengesjoinentities/listeners/PlayerListener.java b/src/main/java/de/fanta/challengesjoinentities/listeners/PlayerListener.java index c365464..d840940 100644 --- a/src/main/java/de/fanta/challengesjoinentities/listeners/PlayerListener.java +++ b/src/main/java/de/fanta/challengesjoinentities/listeners/PlayerListener.java @@ -62,7 +62,7 @@ e.getPlayer().getInventory().setItem(8, itemStack); - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + plugin.getScheduler().runDelayedOnEntity(e.getPlayer(), () -> { PlayerData data = UtilsApiBukkit.getInstance().getPlayerData(e.getPlayer()); if (data.getLastJoin() + (10 * 1000) > System.currentTimeMillis()) { String hosteName = CubesideUtilsBukkit.getInstance().getPlayerData(e.getPlayer()).getHostName().toLowerCase(); diff --git a/src/main/java/de/fanta/challengesjoinentities/schedular/BukkitScheduler.java b/src/main/java/de/fanta/challengesjoinentities/schedular/BukkitScheduler.java new file mode 100644 index 0000000..cad5ccf --- /dev/null +++ b/src/main/java/de/fanta/challengesjoinentities/schedular/BukkitScheduler.java @@ -0,0 +1,73 @@ +package de.fanta.challengesjoinentities.schedular; + +import de.fanta.challenges.Challenges; +import de.fanta.challengesjoinentities.ChallengesJoinEntities; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Entity; + +import java.util.function.Consumer; + +public class BukkitScheduler implements Scheduler { + + private final ChallengesJoinEntities plugin; + + public BukkitScheduler(ChallengesJoinEntities plugin) { + this.plugin = plugin; + } + + @Override + public void runAsync(Runnable task) { + Bukkit.getScheduler().runTaskAsynchronously(this.plugin, task); + } + + @Override + public void run(Runnable task) { + Bukkit.getScheduler().runTask(this.plugin, task); + } + + @Override + public CancellableTask runGlobalDelayed(Runnable task, long delay) { + return Bukkit.getScheduler().runTaskLater(this.plugin, task, delay)::cancel; + } + + @Override + public void runLocalDelayed(Location location, Runnable task, long delay) { + runGlobalDelayed(task, delay); + } + + @Override + public CancellableTask runLocalAtFixedRate(Location location, Runnable task, long delay, long period) { + return runGlobalAtFixedRate(task, delay, period); + } + + @Override + public void runLocalAtFixedRate(Location location, Consumer taskConsumer, long delay, long period) { + runGlobalAtFixedRate(taskConsumer, delay, period); + } + + @Override + public CancellableTask runGlobalAtFixedRate(Runnable task, long delay, long period) { + return Bukkit.getScheduler().runTaskTimer(this.plugin, task, delay, period)::cancel; + } + + @Override + public void runGlobalAtFixedRate(Consumer taskConsumer, long delay, long period) { + Bukkit.getScheduler().runTaskTimer(this.plugin, bukkitTask -> taskConsumer.accept(bukkitTask::cancel), delay, period); + } + + @Override + public CancellableTask runOnEntityAtFixedRate(Entity entity, Runnable task, long delay, long period) { + return runGlobalAtFixedRate(task, delay, period); + } + + @Override + public void runOnEntityAtFixedRate(Entity entity, Consumer taskConsumer, long delay, long period) { + runLocalAtFixedRate(null, taskConsumer, delay, period); + } + + @Override + public void runDelayedOnEntity(Entity entity, Runnable task, long delay) { + Bukkit.getScheduler().scheduleSyncDelayedTask(this.plugin, task, delay); + } +} diff --git a/src/main/java/de/fanta/challengesjoinentities/schedular/CancellableTask.java b/src/main/java/de/fanta/challengesjoinentities/schedular/CancellableTask.java new file mode 100644 index 0000000..0dc9169 --- /dev/null +++ b/src/main/java/de/fanta/challengesjoinentities/schedular/CancellableTask.java @@ -0,0 +1,5 @@ +package de.fanta.challengesjoinentities.schedular; + +public interface CancellableTask { + void cancel(); +} diff --git a/src/main/java/de/fanta/challengesjoinentities/schedular/FoliaScheduler.java b/src/main/java/de/fanta/challengesjoinentities/schedular/FoliaScheduler.java new file mode 100644 index 0000000..b1190dd --- /dev/null +++ b/src/main/java/de/fanta/challengesjoinentities/schedular/FoliaScheduler.java @@ -0,0 +1,75 @@ +package de.fanta.challengesjoinentities.schedular; + +import de.fanta.challenges.Challenges; +import de.fanta.challengesjoinentities.ChallengesJoinEntities; +import io.papermc.paper.threadedregions.scheduler.ScheduledTask; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Entity; + +import java.util.function.Consumer; + +public class FoliaScheduler implements Scheduler { + + private final ChallengesJoinEntities plugin; + + public FoliaScheduler(ChallengesJoinEntities plugin) { + this.plugin = plugin; + } + + @Override + public void runAsync(Runnable task) { + Bukkit.getServer().getAsyncScheduler().runNow(this.plugin, scheduledTask -> task.run()); + } + + @Override + public void run(Runnable task) { + Bukkit.getServer().getGlobalRegionScheduler().run(this.plugin, scheduledTask -> task.run()); + } + + @Override + public CancellableTask runGlobalDelayed(Runnable task, long delay) { + return Bukkit.getServer().getGlobalRegionScheduler().runDelayed(this.plugin, scheduledTask -> task.run(), delay)::cancel; + } + + @Override + public void runLocalDelayed(Location location, Runnable task, long delay) { + Bukkit.getServer().getRegionScheduler().runDelayed(this.plugin, location, scheduledTask -> task.run(), delay); + } + + @Override + public CancellableTask runLocalAtFixedRate(Location location, Runnable task, long delay, long period) { + return Bukkit.getServer().getRegionScheduler().runAtFixedRate(this.plugin, location, scheduledTask -> task.run(), delay, period)::cancel; + } + + @Override + public void runLocalAtFixedRate(Location location, Consumer taskConsumer, long delay, long period) { + Bukkit.getServer().getRegionScheduler().runAtFixedRate(this.plugin, location, scheduledTask -> taskConsumer.accept(scheduledTask::cancel), delay, period); + } + + @Override + public CancellableTask runGlobalAtFixedRate(Runnable task, long delay, long period) { + return Bukkit.getServer().getGlobalRegionScheduler().runAtFixedRate(this.plugin, scheduledTask -> task.run(), delay, period)::cancel; + } + + @Override + public void runGlobalAtFixedRate(Consumer taskConsumer, long delay, long period) { + Bukkit.getServer().getGlobalRegionScheduler().runAtFixedRate(this.plugin, scheduledTask -> taskConsumer.accept(scheduledTask::cancel), delay, period); + } + + @Override + public CancellableTask runOnEntityAtFixedRate(Entity entity, Runnable task, long delay, long period) { + ScheduledTask createdTask = entity.getScheduler().runAtFixedRate(this.plugin, scheduledTask -> task.run(), null, delay, period); + return createdTask == null ? null : createdTask::cancel; + } + + @Override + public void runOnEntityAtFixedRate(Entity entity, Consumer taskConsumer, long delay, long period) { + entity.getScheduler().runAtFixedRate(this.plugin, scheduledTask -> taskConsumer.accept(scheduledTask::cancel), null, delay, period); + } + + @Override + public void runDelayedOnEntity(Entity entity, Runnable task, long delay) { + entity.getScheduler().runDelayed(this.plugin, scheduledTask -> task.run(), null, delay); + } +} diff --git a/src/main/java/de/fanta/challengesjoinentities/schedular/Scheduler.java b/src/main/java/de/fanta/challengesjoinentities/schedular/Scheduler.java new file mode 100644 index 0000000..36883be --- /dev/null +++ b/src/main/java/de/fanta/challengesjoinentities/schedular/Scheduler.java @@ -0,0 +1,39 @@ +package de.fanta.challengesjoinentities.schedular; + +import org.bukkit.Location; +import org.bukkit.entity.Entity; + +import java.util.function.Consumer; + +public interface Scheduler { + + void runAsync(Runnable task); + + void run(Runnable task); + + CancellableTask runGlobalDelayed(Runnable task, long delay); + + default void runGlobalDelayed(Runnable task) { + runGlobalDelayed(task, 1); + } + + void runLocalDelayed(Location location, Runnable task, long delay); + + default void runLocalDelayed(Runnable task) { + runGlobalDelayed(task, 1); + } + + CancellableTask runLocalAtFixedRate(Location location, Runnable task, long delay, long period); + + void runLocalAtFixedRate(Location location, Consumer taskConsumer, long delay, long period); + + CancellableTask runGlobalAtFixedRate(Runnable task, long delay, long period); + + void runGlobalAtFixedRate(Consumer taskConsumer, long delay, long period); + + CancellableTask runOnEntityAtFixedRate(Entity entity, Runnable task, long delay, long period); + + void runOnEntityAtFixedRate(Entity entity, Consumer taskConsumer, long delay, long period); + + void runDelayedOnEntity(Entity entity, Runnable task, long delay); +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 1030cee..e38cc0c 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,6 +3,7 @@ version: ${project.version} author: ${project.author} api-version: 1.13 +folia-supported: true depend: [GlobalClient, CubesideUtils, GlobalPort, CubesideNMSUtils] softdepend: [Challenges, CubesideNPCs, SignGUI, ViaVersion, CubesideStatistics]