diff --git a/SubServers.Bungee/common/pom.xml b/SubServers.Bungee/common/pom.xml index 72c595e9..02a9196d 100644 --- a/SubServers.Bungee/common/pom.xml +++ b/SubServers.Bungee/common/pom.xml @@ -28,7 +28,7 @@ net.ME1312.Galaxi GalaxiBase - 23w14a + 23w14b compile diff --git a/SubServers.Client/Bukkit/pom.xml b/SubServers.Client/Bukkit/pom.xml index 5eb89e55..c5d6f1ff 100644 --- a/SubServers.Client/Bukkit/pom.xml +++ b/SubServers.Client/Bukkit/pom.xml @@ -89,7 +89,7 @@ maven-antrun-plugin - process-resources + prepare-package run @@ -97,6 +97,9 @@ + + + diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/DefaultUIHandler.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/DefaultUIHandler.java index a3b186c3..522663cb 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/DefaultUIHandler.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/DefaultUIHandler.java @@ -8,6 +8,7 @@ import net.ME1312.Galaxi.Library.Try; import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Version.Version; import net.ME1312.SubData.Client.SubDataClient; +import net.ME1312.SubServers.Client.Bukkit.Library.Compatibility.AgnosticScheduler; import net.ME1312.SubServers.Client.Bukkit.Network.Packet.PacketInExRunEvent; import net.ME1312.SubServers.Client.Bukkit.SubPlugin; import net.ME1312.SubServers.Client.Common.Network.API.Host; @@ -30,6 +31,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import java.util.HashMap; import java.util.UUID; +import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import static net.ME1312.SubServers.Client.Bukkit.Library.ObjectPermission.permits; @@ -54,8 +56,7 @@ public class DefaultUIHandler implements UIHandler, Listener { } public DefaultUIRenderer getRenderer(Player player) { - if (!gui.containsKey(player.getUniqueId())) gui.put(player.getUniqueId(), new DefaultUIRenderer(plugin, player.getUniqueId())); - return gui.get(player.getUniqueId()); + return gui.computeIfAbsent(player.getUniqueId(), k -> new DefaultUIRenderer(plugin, player)); } public void disable() { @@ -132,7 +133,7 @@ public class DefaultUIHandler implements UIHandler, Listener { if (m.getString("message").contains(" ")) { if (!gui.sendTitle(plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Name.Invalid-Title"), 4 * 20)) player.sendMessage(plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Name.Invalid")); - Bukkit.getScheduler().runTaskLater(plugin, () -> gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]), 4 * 20); + AgnosticScheduler.async.runs(plugin, c -> gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]), 4, TimeUnit.SECONDS); } else { gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response")); plugin.api.getSubServer(m.getString("message"), server -> { @@ -140,7 +141,7 @@ public class DefaultUIHandler implements UIHandler, Listener { gui.setDownloading(null); if (!gui.sendTitle(plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Name.Exists-Title"), 4 * 20)) player.sendMessage(plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Name.Exists")); - Bukkit.getScheduler().runTaskLater(plugin, () -> gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]), 4 * 20); + AgnosticScheduler.async.runs(plugin, c -> gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]), 4, TimeUnit.SECONDS); } else { ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]).setName(m.getString("message")); gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]); @@ -172,7 +173,7 @@ public class DefaultUIHandler implements UIHandler, Listener { } else if (!Try.all.run(() -> Integer.parseInt(m.getString("message"))) || Integer.parseInt(m.getString("message")) <= 0 || Integer.parseInt(m.getString("message")) > 65535) { if (!gui.sendTitle(plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Port.Invalid-Title"), 4 * 20)) player.sendMessage(plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Port.Invalid")); - Bukkit.getScheduler().runTaskLater(plugin, () -> gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]), 4 * 20); + AgnosticScheduler.async.runs(plugin, c -> gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]), 4, TimeUnit.SECONDS); } else { ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]).setPort(Integer.valueOf(m.getString("message"))); gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]); @@ -347,7 +348,7 @@ public class DefaultUIHandler implements UIHandler, Listener { gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response")); ((SubServer) gui.lastVisitedObjects[0]).start(player.getUniqueId(), response -> { gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Server-Admin.Start.Title")); - Bukkit.getScheduler().runTaskLater(plugin, gui::reopen, 30); + AgnosticScheduler.async.runs(plugin, c -> gui.reopen(), 1500, TimeUnit.MILLISECONDS); }); } else gui.reopen(); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.Server-Admin.Stop"))) { @@ -362,7 +363,7 @@ public class DefaultUIHandler implements UIHandler, Listener { if (listening.value()) if (!json.getString("server").equalsIgnoreCase(((Server) gui.lastVisitedObjects[0]).getName())) { PacketInExRunEvent.callback("SubStoppedEvent", this); } else { - Bukkit.getScheduler().runTaskLater(plugin, gui::reopen, 5); + AgnosticScheduler.async.runs(plugin, c -> gui.reopen(), 250, TimeUnit.MILLISECONDS); } } catch (Exception e) {} } diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/DefaultUIRenderer.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/DefaultUIRenderer.java index 4e486c3c..f183ab24 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/DefaultUIRenderer.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/DefaultUIRenderer.java @@ -2,6 +2,7 @@ package net.ME1312.SubServers.Client.Bukkit.Graphic; import net.ME1312.Galaxi.Library.Container.Container; import net.ME1312.Galaxi.Library.Container.Value; +import net.ME1312.SubServers.Client.Bukkit.Library.Compatibility.AgnosticScheduler; import net.ME1312.SubServers.Client.Bukkit.SubPlugin; import net.ME1312.SubServers.Client.Common.Network.API.Host; import net.ME1312.SubServers.Client.Common.Network.API.Server; @@ -32,13 +33,9 @@ public class DefaultUIRenderer extends UIRenderer { int lastPage = 1; Runnable lastMenu = null; boolean open = false; - final UUID player; - private SubPlugin plugin; - DefaultUIRenderer(SubPlugin plugin, UUID player) { + DefaultUIRenderer(SubPlugin plugin, Player player) { super(plugin, player); - this.plugin = plugin; - this.player = player; } public void newUI() { @@ -102,7 +99,7 @@ public class DefaultUIRenderer extends UIRenderer { public void hostMenu(final int page) { setDownloading(ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.Host-Menu.Title"))); - plugin.api.getHosts(hosts -> plugin.api.getGroups(groups -> Bukkit.getScheduler().runTask(plugin, () -> { + plugin.api.getHosts(hosts -> plugin.api.getGroups(groups -> AgnosticScheduler.following(player).runs(plugin, c -> { setDownloading(null); lastVisitedObjects[0] = null; lastPage = page; @@ -227,14 +224,14 @@ public class DefaultUIRenderer extends UIRenderer { inv.setItem(i, block); } - Bukkit.getPlayer(player).openInventory(inv); + player.openInventory(inv); open = true; }))); } public void hostAdmin(final String name) { setDownloading(ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.Host-Admin.Title").replace("$str$", name))); - plugin.api.getHost(name, host -> Bukkit.getScheduler().runTask(plugin, () -> { + plugin.api.getHost(name, host -> AgnosticScheduler.following(player).runs(plugin, c -> { windowHistory.add(() -> hostAdmin(name)); if (host == null) { if (hasHistory()) back(); @@ -257,7 +254,7 @@ public class DefaultUIRenderer extends UIRenderer { i++; } - Player player = Bukkit.getPlayer(this.player); + Player player = this.player; if (!permits(name, player, "subservers.host.%.*", "subservers.host.%.create")) { block = color(7); blockMeta = block.getItemMeta(); @@ -339,7 +336,7 @@ public class DefaultUIRenderer extends UIRenderer { inv.setItem(35, block); } - Bukkit.getPlayer(this.player).openInventory(inv); + player.openInventory(inv); open = true; } })); @@ -350,7 +347,7 @@ public class DefaultUIRenderer extends UIRenderer { if (!options.init()) windowHistory.add(() -> hostCreator(options)); lastVisitedObjects[0] = options; - plugin.api.getHost(options.getHost(), host -> Bukkit.getScheduler().runTask(plugin, () -> { + plugin.api.getHost(options.getHost(), host -> AgnosticScheduler.following(player).runs(plugin, c -> { if (host == null || !host.isAvailable() || !host.isEnabled()) { lastVisitedObjects[0] = null; if (hasHistory()) back(); @@ -466,7 +463,7 @@ public class DefaultUIRenderer extends UIRenderer { inv.setItem(53, block); } - Bukkit.getPlayer(player).openInventory(inv); + player.openInventory(inv); open = true; } })); @@ -476,7 +473,7 @@ public class DefaultUIRenderer extends UIRenderer { setDownloading(ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Template.Title").replace("$str$", options.getHost()))); options.init(); lastVisitedObjects[0] = options; - plugin.api.getHost(options.getHost(), host -> Bukkit.getScheduler().runTask(plugin, () -> { + plugin.api.getHost(options.getHost(), host -> AgnosticScheduler.following(player).runs(plugin, c -> { if (host == null || !host.isAvailable() || !host.isEnabled()) { lastVisitedObjects[0] = null; if (hasHistory()) back(); @@ -579,7 +576,7 @@ public class DefaultUIRenderer extends UIRenderer { inv.setItem(i, block); } - Bukkit.getPlayer(player).openInventory(inv); + player.openInventory(inv); open = true; } })); @@ -587,7 +584,7 @@ public class DefaultUIRenderer extends UIRenderer { public void hostPlugin(final int page, final String name) { setDownloading(ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.Host-Plugin.Title").replace("$str$", name))); - plugin.api.getHost(name, host -> Bukkit.getScheduler().runTask(plugin, () -> { + plugin.api.getHost(name, host -> AgnosticScheduler.following(player).runs(plugin, c -> { windowHistory.add(() -> hostPlugin(page, name)); if (host == null) { if (hasHistory()) back(); @@ -687,7 +684,7 @@ public class DefaultUIRenderer extends UIRenderer { inv.setItem(i, block); } - Bukkit.getPlayer(player).openInventory(inv); + player.openInventory(inv); open = true; } })); @@ -695,7 +692,7 @@ public class DefaultUIRenderer extends UIRenderer { public void groupMenu(final int page) { setDownloading(ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.Group-Menu.Title"))); - plugin.api.getServers(servers -> Bukkit.getScheduler().runTask(plugin, () -> { + plugin.api.getServers(servers -> AgnosticScheduler.following(player).runs(plugin, c -> { setDownloading(null); lastVisitedObjects[0] = null; lastPage = page; @@ -820,7 +817,7 @@ public class DefaultUIRenderer extends UIRenderer { inv.setItem(i, block); } - Bukkit.getPlayer(player).openInventory(inv); + player.openInventory(inv); open = true; })); } @@ -829,7 +826,7 @@ public class DefaultUIRenderer extends UIRenderer { setDownloading(ChatColor.stripColor((host == null)?((group == null)?plugin.api.getLang("SubServers", "Interface.Server-Menu.Title"):((group.length() == 0)?plugin.api.getLang("SubServers", "Interface.Group-SubServer.Title-Ungrouped"):plugin.api.getLang("SubServers", "Interface.Group-SubServer.Title").replace("$str$", group))):plugin.api.getLang("SubServers", "Interface.Host-SubServer.Title").replace("$str$", host))); Value hostname = new Container(host); Value> servercontainer = new Container>(new LinkedList()); - Runnable renderer = () -> Bukkit.getScheduler().runTask(plugin, () -> { + Runnable renderer = () -> AgnosticScheduler.following(player).runs(plugin, c -> { setDownloading(null); lastPage = page; @@ -985,7 +982,7 @@ public class DefaultUIRenderer extends UIRenderer { inv.setItem(i, block); } - Bukkit.getPlayer(player).openInventory(inv); + player.openInventory(inv); open = true; }); @@ -1018,7 +1015,7 @@ public class DefaultUIRenderer extends UIRenderer { public void serverAdmin(final String name) { setDownloading(ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.Server-Admin.Title").replace("$str$", name))); - BiConsumer renderer = (server, host) -> Bukkit.getScheduler().runTask(plugin, () -> { + BiConsumer renderer = (server, host) -> AgnosticScheduler.following(player).runs(plugin, c -> { setDownloading(null); lastVisitedObjects[0] = server; ItemStack block; @@ -1038,7 +1035,7 @@ public class DefaultUIRenderer extends UIRenderer { } i = 0; - Player player = Bukkit.getPlayer(this.player); + Player player = this.player; if (host == null || ((SubServer) server).isRunning()) { if (host == null || !permits(server, player, "subservers.subserver.%.*", "subservers.subserver.%.terminate")) { block = color(7); @@ -1250,7 +1247,7 @@ public class DefaultUIRenderer extends UIRenderer { public void serverPlugin(final int page, final String name) { setDownloading(ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.SubServer-Plugin.Title").replace("$str$", name))); - plugin.api.getServer(name, server -> Bukkit.getScheduler().runTask(plugin, () -> { + plugin.api.getServer(name, server -> AgnosticScheduler.following(player).runs(plugin, c -> { windowHistory.add(() -> serverPlugin(page, name)); if (server == null) { if (hasHistory()) back(); @@ -1350,7 +1347,7 @@ public class DefaultUIRenderer extends UIRenderer { inv.setItem(i, block); } - Bukkit.getPlayer(player).openInventory(inv); + player.openInventory(inv); open = true; } })); diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/UIRenderer.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/UIRenderer.java index 487c65a0..d652d064 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/UIRenderer.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/UIRenderer.java @@ -5,6 +5,7 @@ import net.ME1312.Galaxi.Library.Container.Container; import net.ME1312.Galaxi.Library.Try; import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Version.Version; +import net.ME1312.SubServers.Client.Bukkit.Library.Compatibility.AgnosticScheduler; import net.ME1312.SubServers.Client.Bukkit.SubPlugin; import net.ME1312.SubServers.Client.Common.Network.API.Host; import net.ME1312.SubServers.Client.Common.Network.API.Server; @@ -14,13 +15,16 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitRunnable; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; -import java.util.*; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; import java.util.PrimitiveIterator.OfInt; +import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -37,9 +41,9 @@ public abstract class UIRenderer { static final HashMap> serverPlugins = new HashMap>(); private ContainedPair tdownload = null; private final String[] adownload; - private int download = -1; - private final UUID player; - private SubPlugin plugin; + private Runnable download = null; + final Player player; + SubPlugin plugin; /** * Creates a new UIRenderer @@ -47,7 +51,7 @@ public abstract class UIRenderer { * @param plugin SubPlugin * @param player Player */ - public UIRenderer(SubPlugin plugin, UUID player) { + public UIRenderer(SubPlugin plugin, Player player) { Util.nullpo(plugin, player); this.plugin = plugin; this.player = player; @@ -197,25 +201,22 @@ public abstract class UIRenderer { * @return Success Status */ public boolean sendTitle(String line1, String line2, int fadein, int stay, int fadeout) { - if (USE_TITLES) { + if (USE_TITLES && player.isOnline()) { try { - Player player = Bukkit.getPlayer(this.player); - if (player != null) { - if (TAPI_1_11) { - if (line1 == null) { - player.resetTitle(); - } else { - player.sendTitle(line1, line2, (fadein >= 0)?fadein:10, (stay >= 0)?stay:70, (fadeout >= 0)?fadeout:20); - } - return true; - } else if (TAPI_PLUGIN) { - if (line1 == null) { - com.connorlinfoot.titleapi.TitleAPI.clearTitle(player); - } else { - com.connorlinfoot.titleapi.TitleAPI.sendTitle(player, (fadein >= 0)?fadein:10, (stay >= 0)?stay:70, (fadeout >= 0)?fadeout:20, line1, line2); - } - return true; + if (TAPI_1_11) { + if (line1 == null) { + player.resetTitle(); + } else { + player.sendTitle(line1, line2, (fadein >= 0)?fadein:10, (stay >= 0)?stay:70, (fadeout >= 0)?fadeout:20); } + return true; + } else if (TAPI_PLUGIN) { + if (line1 == null) { + com.connorlinfoot.titleapi.TitleAPI.clearTitle(player); + } else { + com.connorlinfoot.titleapi.TitleAPI.sendTitle(player, (fadein >= 0)?fadein:10, (stay >= 0)?stay:70, (fadeout >= 0)?fadeout:20, line1, line2); + } + return true; } } catch (Throwable e) { return false; @@ -239,50 +240,49 @@ public abstract class UIRenderer { * @param subtitle Subtitle to display (or null to hide) */ public void setDownloading(String subtitle) { - if (subtitle != null) { - if (!canSendTitle()) { - final String text = subtitle; - if (download != -1) Bukkit.getScheduler().cancelTask(download); - download = Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { - if (tdownload != null) Bukkit.getPlayer(player).sendMessage(plugin.api.getLang("SubServers", "Interface.Generic.Downloading").replace("$str$", text)); - download = -1; - }, 50L); - return; - } + if (player.isOnline()) { + if (subtitle != null) { + if (!canSendTitle()) { + final String text = subtitle; + if (download != null) download.run(); + download = AgnosticScheduler.following(player).runs(plugin, cancel -> { + if (tdownload != null && player.isOnline()) player.sendMessage(plugin.api.getLang("SubServers", "Interface.Generic.Downloading").replace("$str$", text)); + download = null; + }, 2500, TimeUnit.MILLISECONDS); + return; + } - if (!subtitle.startsWith(Character.toString(ChatColor.COLOR_CHAR))) { - subtitle = plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Title-Color-Alt") + subtitle; - } - if (tdownload == null) { - tdownload = new ContainedPair(subtitle, 0); + if (!subtitle.startsWith(Character.toString(ChatColor.COLOR_CHAR))) { + subtitle = plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Title-Color-Alt") + subtitle; + } + if (tdownload == null) { + tdownload = new ContainedPair(subtitle, 0); - new BukkitRunnable() { - @Override - public void run() { + AgnosticScheduler.following(player).repeats(plugin, cancel -> { if (tdownload != null) { if (++tdownload.value >= adownload.length) { tdownload.value = 0; } if (!sendTitle(adownload[tdownload.value], tdownload.key, 0, 10, 5)) { - cancel(); + cancel.run(); } } else { sendTitle(null); - cancel(); + cancel.run(); } - } - }.runTaskTimer(plugin, 0, 1); + }, 0, 50, TimeUnit.MILLISECONDS); + } else { + tdownload.key = subtitle; + } } else { - tdownload.key = subtitle; - } - } else { - if (tdownload != null) { - tdownload = null; - } - if (download != -1) { - Bukkit.getScheduler().cancelTask(download); - download = -1; + if (tdownload != null) { + tdownload = null; + } + if (download != null) { + download.run(); + download = null; + } } } } diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/AgnosticScheduler.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/AgnosticScheduler.java new file mode 100644 index 00000000..509085d1 --- /dev/null +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/AgnosticScheduler.java @@ -0,0 +1,157 @@ +package net.ME1312.SubServers.Client.Bukkit.Library.Compatibility; + +import net.ME1312.Galaxi.Library.Try; + +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.entity.Entity; +import org.bukkit.plugin.Plugin; + +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; + +/** + * Folia Regional Scheduling Compatibility Class + */ +public abstract class AgnosticScheduler { + private static final boolean regional = Try.all.get(() -> Class.forName("io.papermc.paper.threadedregions.scheduler.RegionScheduler") != null); + + /** + * Provides an asynchronous thread scheduler (in both folia and bukkit) + */ + public static final AgnosticScheduler async = async(); + private static native AgnosticScheduler async(); + + /** + * Provides the folia global region scheduler / bukkit main thread scheduler + */ + public static final AgnosticScheduler global = global(); + private static native AgnosticScheduler global(); + + /** + * Provides a folia region scheduler / bukkit main thread scheduler + * + * @param block Block + * @return Platform-agnostic Scheduler + */ + public static native AgnosticScheduler at(Block block); + + /** + * Provides a folia region scheduler / bukkit main thread scheduler + * + * @param location Block location + * @return Platform-agnostic Scheduler + */ + public static native AgnosticScheduler at(Location location); + /** + * Provides a folia region scheduler / bukkit main thread scheduler + * + * @param world Block world + * @param x Block x coordinate + * @param z Block z coordinate + * @return Platform-agnostic Scheduler + */ + public static native AgnosticScheduler at(World world, int x, int z); + + /** + * Provides a folia region scheduler / bukkit main thread scheduler + * + * @param chunk Chunk + * @return Platform-agnostic Scheduler + */ + public static native AgnosticScheduler atChunk(Chunk chunk); + + /** + * Provides a folia region scheduler / bukkit main thread scheduler + * + * @param world Chunk world + * @param cx Chunk x coordinate + * @param cz Chunk z coordinate + * @return Platform-agnostic Scheduler + */ + public static native AgnosticScheduler atChunk(World world, int cx, int cz); + + /** + * Provides a folia entity scheduler / bukkit main thread scheduler + * + * @param entity Entity + * @return Platform-agnostic Scheduler + */ + public static native AgnosticScheduler following(Entity entity); + + /** + * Schedules a 1-time task that runs immediately + * + * @param plugin Plugin + * @param task Task (consumes a task cancellation runnable) + * @return A Runnable that can currently be used to cancel the task + */ + public abstract Runnable runs(Plugin plugin, Consumer task); + + /** + * Schedules a 1-time task that runs after a number of ticks + * + * @param plugin Plugin + * @param task Task (consumes a task cancellation runnable) + * @param delay Delay in ticks + * @return A Runnable that can currently be used to cancel the task + */ + public abstract Runnable runs(Plugin plugin, Consumer task, long delay); + + /** + * Schedules a 1-time task that runs after a number of timeunits + * + * @param plugin Plugin + * @param task Task (consumes a task cancellation runnable) + * @param delay Delay + * @param units Time units + * @return A Runnable that can currently be used to cancel the task + */ + public native Runnable runs(Plugin plugin, Consumer task, long delay, TimeUnit units); + + /** + * Schedules a repeating task that runs after a number of ticks + * + * @param plugin Plugin + * @param task Task (consumes a task cancellation runnable) + * @param repeat Repeat delay in ticks + * @return A Runnable that can currently be used to cancel the task + */ + public native Runnable repeats(Plugin plugin, Consumer task, long repeat); + + /** + * Schedules a repeating task that runs after a number of timeunits + * + * @param plugin Plugin + * @param task Task (consumes a task cancellation runnable) + * @param repeat Repeat delay + * @param units Time units + * @return A Runnable that can currently be used to cancel the task + */ + public native Runnable repeats(Plugin plugin, Consumer task, long repeat, TimeUnit units); + + /** + * Schedules a repeating task that runs after a number of ticks + * + * @param plugin Plugin + * @param task Task (consumes a task cancellation runnable) + * @param delay Initial delay in ticks + * @param repeat Repeat delay in ticks + * @return A Runnable that can currently be used to cancel the task + */ + public abstract Runnable repeats(Plugin plugin, Consumer task, long delay, long repeat); + + /** + * Schedules a repeating task that runs after a number of timeunits + * + * @param plugin Plugin + * @param task Task (consumes a task cancellation runnable) + * @param delay Initial delay + * @param repeat Repeat delay + * @param units Time units + * @return A Runnable that can currently be used to cancel the task + */ + public native Runnable repeats(Plugin plugin, Consumer task, long delay, long repeat, TimeUnit units); +} diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/OfflineBlock.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/OfflineBlock.java index 7ab89081..4f38c624 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/OfflineBlock.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/OfflineBlock.java @@ -5,7 +5,6 @@ import org.bukkit.Location; import org.bukkit.World; import java.util.Objects; -import java.util.Optional; import java.util.UUID; /** diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Metrics.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Metrics.java index f8743855..0fe23611 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Metrics.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Metrics.java @@ -1,5 +1,6 @@ package net.ME1312.SubServers.Client.Bukkit.Library; +import net.ME1312.SubServers.Client.Bukkit.Library.Compatibility.AgnosticScheduler; import net.ME1312.SubServers.Client.Bukkit.SubAPI; import org.bukkit.Bukkit; @@ -82,7 +83,7 @@ public class Metrics { enabled, this::appendPlatformData, this::appendServiceData, - submitDataTask -> Bukkit.getScheduler().runTask(plugin, submitDataTask), + submitDataTask -> AgnosticScheduler.global.runs(plugin, c -> submitDataTask.run()), plugin::isEnabled, (message, error) -> this.plugin.getLogger().log(Level.WARNING, message, error), (message) -> this.plugin.getLogger().log(Level.INFO, message), diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Placeholders.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Placeholders.java index dc74bfd5..4b80408f 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Placeholders.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Placeholders.java @@ -8,6 +8,7 @@ import net.ME1312.Galaxi.Library.Merger; import net.ME1312.Galaxi.Library.Try; import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubServers.Client.Bukkit.Event.*; +import net.ME1312.SubServers.Client.Bukkit.Library.Compatibility.AgnosticScheduler; import net.ME1312.SubServers.Client.Bukkit.SubAPI; import net.ME1312.SubServers.Client.Bukkit.SubPlugin; import net.ME1312.SubServers.Client.Common.Network.API.*; @@ -18,13 +19,14 @@ import org.bukkit.OfflinePlayer; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.scheduler.BukkitTask; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -36,7 +38,7 @@ public final class Placeholders { private final SubPlugin plugin; public final Cache cache; private MethodHandle papi; - private BukkitTask task; + private Runnable task; private boolean init; /** @@ -56,11 +58,11 @@ public final class Placeholders { init = true; papi = Try.all.get(() -> MethodHandles.publicLookup().findStatic(Class.forName("me.clip.placeholderapi.PlaceholderAPI"), "setPlaceholders", MethodType.methodType(String.class, new Class[]{ OfflinePlayer.class, String.class }))); Bukkit.getPluginManager().registerEvents(cache.events, plugin); - Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, () -> { + AgnosticScheduler.async.runs(plugin, c -> { if (task == null) { int interval = plugin.config.get().getMap("Settings").getInt("PlaceholderAPI-Cache-Interval", 30); int start = interval - new Random().nextInt(interval + 1); // Don't have all servers request at the same time - Runnable task = () -> cache.refresh(() -> { + Consumer task = c2 -> cache.refresh(() -> { for (Runnable listener : listeners) { try { listener.run(); @@ -69,17 +71,17 @@ public final class Placeholders { } } }); - this.task = Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, task, 20L * start, 20L * interval); - task.run(); + this.task = AgnosticScheduler.async.repeats(plugin, task, start, interval, TimeUnit.SECONDS); + task.accept(null); } - }, 120L); + }, 6, TimeUnit.SECONDS); } } public void stop() { if (task != null) { try { - task.cancel(); + task.run(); } catch (Throwable exception) {} task = null; } @@ -650,7 +652,7 @@ public final class Placeholders { } private final class Events implements Listener { - private HashMap edits = new HashMap(); + private HashMap edits = new HashMap(); @EventHandler(priority = EventPriority.LOWEST) public void add(SubAddProxyEvent e) { @@ -679,8 +681,8 @@ public final class Placeholders { @EventHandler(priority = EventPriority.LOWEST) public void edit(SubEditServerEvent e) { String s = e.getServer().toLowerCase(); - if (edits.containsKey(s)) edits.get(s).cancel(); - edits.put(s, Bukkit.getScheduler().runTaskLater(plugin, servers.containsKey(s)? servers.get(s)::refresh : () -> add(s), 120L)); + if (edits.containsKey(s)) edits.get(s).run(); + edits.put(s, AgnosticScheduler.async.runs(plugin, servers.containsKey(s)? (c -> servers.get(s).refresh()) : (c -> add(s)), 6, TimeUnit.SECONDS)); } @EventHandler(priority = EventPriority.LOWEST) diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketExControlPlayer.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketExControlPlayer.java index 4a17457f..df84c6ba 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketExControlPlayer.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketExControlPlayer.java @@ -5,10 +5,11 @@ import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubData.Client.Protocol.PacketObjectIn; import net.ME1312.SubData.Client.Protocol.PacketObjectOut; import net.ME1312.SubData.Client.SubDataSender; +import net.ME1312.SubServers.Client.Bukkit.Library.Compatibility.AgnosticScheduler; import net.ME1312.SubServers.Client.Bukkit.SubPlugin; import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import java.util.UUID; @@ -55,15 +56,18 @@ public class PacketExControlPlayer implements PacketObjectIn, PacketObj String command = data.getString(0x0001); UUID target = (data.contains(0x0002)?data.getUUID(0x0002):null); - Bukkit.getScheduler().runTask(plugin, () -> { - CommandSender sender = Bukkit.getConsoleSender(); - if (target != null && (sender = Bukkit.getPlayer(target)) == null) { + if (target != null) { + final Player player; + if ((player = Bukkit.getPlayer(target)) == null) { client.sendPacket(new PacketExControlPlayer(6, tracker)); + return; } else { - Bukkit.getServer().dispatchCommand(sender, command); - client.sendPacket(new PacketExControlPlayer(0, tracker)); + AgnosticScheduler.following(player).runs(plugin, c -> Bukkit.getServer().dispatchCommand(player, command)); } - }); + } else { + AgnosticScheduler.global.runs(plugin, c -> Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), command)); + } + client.sendPacket(new PacketExControlPlayer(0, tracker)); } catch (Throwable e) { client.sendPacket(new PacketExControlPlayer(2, tracker)); e.printStackTrace(); diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketInExReload.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketInExReload.java index 80e2baec..f4573620 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketInExReload.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketInExReload.java @@ -3,6 +3,7 @@ package net.ME1312.SubServers.Client.Bukkit.Network.Packet; import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.SubData.Client.Protocol.PacketObjectIn; import net.ME1312.SubData.Client.SubDataSender; +import net.ME1312.SubServers.Client.Bukkit.Library.Compatibility.AgnosticScheduler; import net.ME1312.SubServers.Client.Bukkit.SubPlugin; import org.bukkit.Bukkit; @@ -26,7 +27,7 @@ public class PacketInExReload implements PacketObjectIn { public void receive(SubDataSender client, ObjectMap data) { if (data != null && data.contains(0x0000)) Bukkit.getLogger().warning("SubData > Received request for a plugin reload: " + data.getString(0x0000)); // else Bukkit.getLogger().warning("SubData > Received request for a plugin reload"); - Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + AgnosticScheduler.async.runs(plugin, c -> { try { plugin.reload(true); } catch (Exception e) { diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketInExRunEvent.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketInExRunEvent.java index 0fc626fd..60ee12a1 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketInExRunEvent.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketInExRunEvent.java @@ -2,7 +2,6 @@ package net.ME1312.SubServers.Client.Bukkit.Network.Packet; import net.ME1312.Galaxi.Library.Container.ContainedPair; import net.ME1312.Galaxi.Library.Map.ObjectMap; -import net.ME1312.Galaxi.Library.Version.Version; import net.ME1312.SubData.Client.Protocol.PacketObjectIn; import net.ME1312.SubData.Client.SubDataSender; import net.ME1312.SubServers.Client.Bukkit.Event.*; diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubCommand.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubCommand.java index 8ea91e39..d1d2ceeb 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubCommand.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubCommand.java @@ -13,6 +13,7 @@ import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Version.Version; import net.ME1312.SubData.Client.SubDataClient; import net.ME1312.SubServers.Client.Bukkit.Graphic.UIRenderer; +import net.ME1312.SubServers.Client.Bukkit.Library.Compatibility.AgnosticScheduler; import net.ME1312.SubServers.Client.Bukkit.Network.Packet.PacketInExRunEvent; import net.ME1312.SubServers.Client.Common.Network.API.*; import net.ME1312.SubServers.Client.Common.Network.Packet.PacketCreateServer; @@ -32,6 +33,7 @@ import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.nio.charset.Charset; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import static net.ME1312.SubServers.Client.Bukkit.Library.ObjectPermission.permits; @@ -71,7 +73,7 @@ public final class SubCommand extends Command { sender.sendMessage(ChatColor.WHITE + " " + Bukkit.getName() + ' ' + Bukkit.getVersion() + ChatColor.RESET + ','); sender.sendMessage(ChatColor.WHITE + " SubServers.Client.Bukkit v" + plugin.version.toExtendedString() + ((plugin.api.getPluginBuild() != null)?" (" + plugin.api.getPluginBuild() + ')':"")); sender.sendMessage(""); - Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + AgnosticScheduler.async.runs(plugin, c -> { try { YAMLSection tags = new YAMLSection(plugin.parseJSON("{\"tags\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://api.github.com/repos/ME1312/SubServers-2/git/refs/tags").openStream(), Charset.forName("UTF-8")))) + '}')); List versions = new LinkedList(); @@ -436,10 +438,10 @@ public final class SubCommand extends Command { PacketInExRunEvent.callback("SubStoppedEvent", this); String name = json.getString("server").toLowerCase(); if (listening.containsKey(name)) { - Bukkit.getScheduler().runTaskLater(plugin, () -> { + AgnosticScheduler.async.runs(plugin, c -> { starter.accept(listening.get(name)); listening.remove(name); - }, 5); + }, 250, TimeUnit.MILLISECONDS); } } } catch (Exception e) {} diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubPlugin.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubPlugin.java index 56f0d196..320c81ec 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubPlugin.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubPlugin.java @@ -15,10 +15,11 @@ import net.ME1312.SubData.Client.Library.DisconnectReason; import net.ME1312.SubData.Client.SubDataClient; import net.ME1312.SubServers.Client.Bukkit.Graphic.DefaultUIHandler; import net.ME1312.SubServers.Client.Bukkit.Graphic.UIHandler; +import net.ME1312.SubServers.Client.Bukkit.Library.Compatibility.AgnosticScheduler; import net.ME1312.SubServers.Client.Bukkit.Library.Compatibility.PlaceholderImpl; -import net.ME1312.SubServers.Client.Bukkit.Library.Placeholders; import net.ME1312.SubServers.Client.Bukkit.Library.ConfigUpdater; import net.ME1312.SubServers.Client.Bukkit.Library.Metrics; +import net.ME1312.SubServers.Client.Bukkit.Library.Placeholders; import net.ME1312.SubServers.Client.Bukkit.Network.SubProtocol; import org.bukkit.Bukkit; @@ -150,7 +151,7 @@ public final class SubPlugin extends JavaPlugin { } new Metrics(this, 2334); - Bukkit.getScheduler().runTaskTimerAsynchronously(this, () -> { + AgnosticScheduler.async.repeats(this, c -> { try { YAMLSection tags = new YAMLSection(parseJSON("{\"tags\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://api.github.com/repos/ME1312/SubServers-2/git/refs/tags").openStream(), Charset.forName("UTF-8")))) + '}')); List versions = new LinkedList(); @@ -198,24 +199,22 @@ public final class SubPlugin extends JavaPlugin { if (disconnect == null || (this.reconnect && reconnect > 0 && disconnect.key() != DisconnectReason.PROTOCOL_MISMATCH && disconnect.key() != DisconnectReason.ENCRYPTION_MISMATCH)) { long reset = resetDate; if (disconnect != null) Bukkit.getLogger().info("SubData > Attempting reconnect in " + reconnect + " seconds"); - Bukkit.getScheduler().runTaskLaterAsynchronously(this, new Runnable() { - @Override - public void run() { - try { - if (reset == resetDate && (subdata.getOrDefault(0, null) == null || subdata.get(0).isClosed())) { - SubDataClient open = subprotocol.open(InetAddress.getByName(config.get().getMap("Settings").getMap("SubData").getString("Address", "127.0.0.1:4391").split(":")[0]), - Integer.parseInt(config.get().getMap("Settings").getMap("SubData").getString("Address", "127.0.0.1:4391").split(":")[1])); - if (subdata.getOrDefault(0, null) != null) subdata.get(0).reconnect(open); - subdata.put(0, open); - } - } catch (IOException e) { - Bukkit.getLogger().info("SubData > Connection was unsuccessful, retrying in " + reconnect + " seconds"); - Bukkit.getScheduler().runTaskLater(SubPlugin.this, this, reconnect * 20L); + AgnosticScheduler.async.repeats(this, cancel -> { + try { + if (reset == resetDate && (subdata.getOrDefault(0, null) == null || subdata.get(0).isClosed())) { + SubDataClient open = subprotocol.open(InetAddress.getByName(config.get().getMap("Settings").getMap("SubData").getString("Address", "127.0.0.1:4391").split(":")[0]), + Integer.parseInt(config.get().getMap("Settings").getMap("SubData").getString("Address", "127.0.0.1:4391").split(":")[1])); + + if (subdata.getOrDefault(0, null) != null) subdata.get(0).reconnect(open); + subdata.put(0, open); + cancel.run(); } + } catch (IOException e) { + Bukkit.getLogger().info("SubData > Connection was unsuccessful, retrying in " + reconnect + " seconds"); } - }, (disconnect == null)?0:reconnect * 20L); + }, (disconnect == null)?0:reconnect, reconnect, TimeUnit.SECONDS); } } diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubSigns.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubSigns.java index 1621dfcb..076df387 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubSigns.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubSigns.java @@ -1,11 +1,13 @@ package net.ME1312.SubServers.Client.Bukkit; import net.ME1312.Galaxi.Library.Container.Pair; +import net.ME1312.Galaxi.Library.Merger; import net.ME1312.SubData.Client.Library.EscapedOutputStream; import net.ME1312.SubServers.Client.Bukkit.Event.SubStartEvent; import net.ME1312.SubServers.Client.Bukkit.Event.SubStartedEvent; import net.ME1312.SubServers.Client.Bukkit.Event.SubStopEvent; import net.ME1312.SubServers.Client.Bukkit.Event.SubStoppedEvent; +import net.ME1312.SubServers.Client.Bukkit.Library.Compatibility.AgnosticScheduler; import net.ME1312.SubServers.Client.Bukkit.Library.Compatibility.OfflineBlock; import net.ME1312.SubServers.Client.Bukkit.Library.SignState; import net.ME1312.SubServers.Client.Common.Network.API.Host; @@ -73,6 +75,7 @@ public class SubSigns implements Listener { private void load() throws IOException { if (file.exists()) { + Merger merge = new Merger(this::listen); FileInputStream in = new FileInputStream(file); ByteArrayOutputStream string = new ByteArrayOutputStream(); ByteBuffer magic = ByteBuffer.allocate(28).order(ByteOrder.BIG_ENDIAN); @@ -95,12 +98,18 @@ public class SubSigns implements Listener { Location loaded = location.load(); if (loaded == null) { data.put(location, name); - } else if (loaded.getBlock().getState() instanceof Sign) { - data.put(location, name); - signs.put(loaded, translate(name)); - locations.put(name.toLowerCase(), loaded); } else { - Bukkit.getLogger().warning("SubServers > Removed invalid sign data: [\"" + loaded.getWorld().getName() + "\", " + location.x + ", " + location.y + ", " + location.z + "] -> \"" + name + '\"'); + merge.reserve(); + AgnosticScheduler.at(loaded).runs(plugin, c -> { + if (loaded.getBlock().getState() instanceof Sign) { + data.put(location, name); + signs.put(loaded, translate(name)); + locations.put(name.toLowerCase(), loaded); + } else { + Bukkit.getLogger().warning("SubServers > Removed invalid sign data: [\"" + loaded.getWorld().getName() + "\", " + location.x + ", " + location.y + ", " + location.z + "] -> \"" + name + '\"'); + } + merge.release(); + }); } magic.clear(); string.reset(); @@ -118,7 +127,6 @@ public class SubSigns implements Listener { string.write(b); } } - listen(); } } @@ -223,7 +231,7 @@ public class SubSigns implements Listener { @SuppressWarnings("unchecked") private void refresh(Block block, Supplier translator) { - Bukkit.getScheduler().runTask(plugin, () -> { + AgnosticScheduler.at(block).runs(plugin, c -> { if (block.getState() instanceof Sign) { Object object = translator.get(); String name; diff --git a/SubServers.Client/Bukkit/src/plugin.yml b/SubServers.Client/Bukkit/src/plugin.yml index f83cc492..bfd32fcf 100644 --- a/SubServers.Client/Bukkit/src/plugin.yml +++ b/SubServers.Client/Bukkit/src/plugin.yml @@ -4,6 +4,7 @@ version: "2.19a" authors: ["ME1312"] softdepend: [TitleAPI, PlaceholderAPI] website: "https://github.com/ME1312/SubServers-2" +folia-supported: true #commands: # subservers: # description: "The SubServers Command" diff --git a/SubServers.Client/Common/pom.xml b/SubServers.Client/Common/pom.xml index 8cb84a81..b1536696 100644 --- a/SubServers.Client/Common/pom.xml +++ b/SubServers.Client/Common/pom.xml @@ -18,7 +18,7 @@ net.ME1312.Galaxi GalaxiBase - 23w14a + 23w14b compile diff --git a/SubServers.Client/Folia/pom.xml b/SubServers.Client/Folia/pom.xml new file mode 100644 index 00000000..34a337b4 --- /dev/null +++ b/SubServers.Client/Folia/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + net.ME1312.SubServers + SubServers.Client.Folia + -PLACEHOLDER + jar + + + + paper-repo + https://repo.papermc.io/repository/maven-public/ + + + + + + dev.folia + folia-api + 1.19.4-R0.1-SNAPSHOT + provided + + + net.ME1312.SubServers + SubServers.Client.Common + ${project.version} + compile + + + + + ../../out/compile/target/SubServers.Client.Folia + src + + + src + + **/*.java + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/SubServers.Client/Folia/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/AgnosticScheduler.java b/SubServers.Client/Folia/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/AgnosticScheduler.java new file mode 100644 index 00000000..b3316a6e --- /dev/null +++ b/SubServers.Client/Folia/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/AgnosticScheduler.java @@ -0,0 +1,252 @@ +package net.ME1312.SubServers.Client.Bukkit.Library.Compatibility; + +import net.ME1312.Galaxi.Library.Container.Container; +import net.ME1312.Galaxi.Library.Try; + +import org.bukkit.Bukkit; +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.entity.Entity; +import org.bukkit.plugin.Plugin; + +import java.time.Duration; +import java.time.Instant; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; + +public abstract class AgnosticScheduler { + private static final boolean regional = Try.all.get(() -> Class.forName("io.papermc.paper.threadedregions.scheduler.RegionScheduler") != null, false); + private static final Runnable empty = () -> {}; + + public static final AgnosticScheduler async = ((regional)? + new AgnosticScheduler() { + @Override + public Runnable runs(Plugin plugin, Consumer task) { + return Bukkit.getAsyncScheduler().runNow(plugin, t -> task.accept(t::cancel))::cancel; + } + + @Override + public Runnable runs(Plugin plugin, Consumer task, long delay) { + return Bukkit.getAsyncScheduler().runDelayed(plugin, t -> task.accept(t::cancel), delay * 50, TimeUnit.MILLISECONDS)::cancel; + } + + @Override + public Runnable runs(Plugin plugin, Consumer task, long delay, TimeUnit units) { + return Bukkit.getAsyncScheduler().runDelayed(plugin, t -> task.accept(t::cancel), delay, units)::cancel; + } + + @Override + public Runnable repeats(Plugin plugin, Consumer task, long repeat) { + return repeats(plugin, task, repeat *= 50, repeat, TimeUnit.MILLISECONDS); + } + + @Override + public Runnable repeats(Plugin plugin, Consumer task, long repeat, TimeUnit units) { + return repeats(plugin, task, repeat, repeat, units); + } + + @Override + public Runnable repeats(Plugin plugin, Consumer task, long delay, long repeat) { + return repeats(plugin, task, delay * 50, repeat * 50, TimeUnit.MILLISECONDS); + } + + @Override + public Runnable repeats(Plugin plugin, Consumer task, long delay, long repeat, TimeUnit units) { + if (repeat != 0) { + return Bukkit.getAsyncScheduler().runAtFixedRate(plugin, t -> task.accept(t::cancel), delay, repeat, units)::cancel; + } else if (units.ordinal() >= TimeUnit.MILLISECONDS.ordinal()) { + return Bukkit.getAsyncScheduler().runAtFixedRate(plugin, t -> task.accept(t::cancel), units.toMillis(delay), 50, TimeUnit.MILLISECONDS)::cancel; + } else { + return Bukkit.getAsyncScheduler().runAtFixedRate(plugin, t -> task.accept(t::cancel), delay, units.convert(50, TimeUnit.MILLISECONDS), units)::cancel; + } + } + } + : + new AgnosticScheduler() { + @Override + public Runnable runs(Plugin plugin, Consumer task) { + final Container cancel = new Container<>(empty); + return cancel.value = Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> task.accept(cancel.value))::cancel; + } + + @Override + public Runnable runs(Plugin plugin, Consumer task, long delay) { + final Container cancel = new Container<>(empty); + return cancel.value = Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, () -> task.accept(cancel.value), check(delay, 0))::cancel; + } + + @Override + public Runnable repeats(Plugin plugin, Consumer task, long delay, long repeat) { + final Container cancel = new Container<>(empty); + return cancel.value = Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, () -> task.accept(cancel.value), check(delay, 0), check(repeat, 0))::cancel; + } + } + ); + + public static final AgnosticScheduler global = ((regional)? + new AgnosticScheduler() { + @Override + public Runnable runs(Plugin plugin, Consumer task) { + return Bukkit.getGlobalRegionScheduler().run(plugin, t -> task.accept(t::cancel))::cancel; + } + + @Override + public Runnable runs(Plugin plugin, Consumer task, long delay) { + return Bukkit.getGlobalRegionScheduler().runDelayed(plugin, t -> task.accept(t::cancel), check(delay, 1))::cancel; + } + + @Override + public Runnable repeats(Plugin plugin, Consumer task, long delay, long repeat) { + return Bukkit.getGlobalRegionScheduler().runAtFixedRate(plugin, t -> task.accept(t::cancel), check(delay, 1), check(repeat, 1))::cancel; + } + } + : + new AgnosticScheduler() { + @Override + public Runnable runs(Plugin plugin, Consumer task) { + final Container cancel = new Container<>(empty); + return cancel.value = Bukkit.getScheduler().runTask(plugin, () -> task.accept(cancel.value))::cancel; + } + + @Override + public Runnable runs(Plugin plugin, Consumer task, long delay) { + final Container cancel = new Container<>(empty); + return cancel.value = Bukkit.getScheduler().runTaskLater(plugin, () -> task.accept(cancel.value), check(delay, 0))::cancel; + } + + @Override + public Runnable repeats(Plugin plugin, Consumer task, long delay, long repeat) { + final Container cancel = new Container<>(empty); + return cancel.value = Bukkit.getScheduler().runTaskTimer(plugin, () -> task.accept(cancel.value), check(delay, 0), check(repeat, 0))::cancel; + } + } + ); + + public static AgnosticScheduler at(Block block) { + return atChunk(block.getWorld(), block.getX() >> 4, block.getZ() >> 4); + } + + public static AgnosticScheduler at(Location location) { + return atChunk(location.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4); + } + + public static AgnosticScheduler at(World world, int x, int z) { + return atChunk(world, x >> 4, z >> 4); + } + + public static AgnosticScheduler atChunk(Chunk chunk) { + return atChunk(chunk.getWorld(), chunk.getX(), chunk.getZ()); + } + + public static AgnosticScheduler atChunk(World world, int cx, int cz) { + return (regional)? new AgnosticScheduler() { + @Override + public Runnable runs(Plugin plugin, Consumer task) { + return Bukkit.getRegionScheduler().run(plugin, world, cx, cz, t -> task.accept(t::cancel))::cancel; + } + + @Override + public Runnable runs(Plugin plugin, Consumer task, long delay) { + return Bukkit.getRegionScheduler().runDelayed(plugin, world, cx, cz, t -> task.accept(t::cancel), check(delay, 1))::cancel; + } + + @Override + public Runnable repeats(Plugin plugin, Consumer task, long delay, long repeat) { + return Bukkit.getRegionScheduler().runAtFixedRate(plugin, world, cx, cz, t -> task.accept(t::cancel), check(delay, 1), check(repeat, 1))::cancel; + } + } : global; + } + + public static AgnosticScheduler following(Entity entity) { + return (regional)? new AgnosticScheduler() { + @Override + public Runnable runs(Plugin plugin, Consumer task) { + final io.papermc.paper.threadedregions.scheduler.ScheduledTask value = entity.getScheduler().run(plugin, t -> task.accept(t::cancel), () -> { + at(entity.getLocation()).runs(plugin, task); + }); + return (value != null)? value::cancel : at(entity.getLocation()).runs(plugin, task); + } + + @Override + public Runnable runs(Plugin plugin, Consumer task, long delay) { + return runs(plugin, task, delay * 50, delay); + } + + @Override + public Runnable runs(Plugin plugin, Consumer task, long delay, TimeUnit units) { + return runs(plugin, task, delay = units.toMillis(delay), delay / 50); + } + + private Runnable runs(Plugin plugin, Consumer task, long dMS, long dT) { + if (dMS < 0) throw new IllegalStateException("Delay may not be < 0"); + final Instant next = Instant.now().plusMillis(dMS); + final io.papermc.paper.threadedregions.scheduler.ScheduledTask value = entity.getScheduler().runDelayed(plugin, t -> task.accept(t::cancel), () -> { + at(entity.getLocation()).runs(plugin, task, Math.min(0, Duration.between(Instant.now(), next).toMillis()), TimeUnit.MILLISECONDS); + }, (dT == 0)? 1 : dT); + return (value != null)? value::cancel : at(entity.getLocation()).runs(plugin, task, dT); + } + @Override + public Runnable repeats(Plugin plugin, Consumer task, long repeat) { + final long rMS; + return repeats(plugin, task, rMS = repeat * 50, repeat, rMS, repeat); + } + + @Override + public Runnable repeats(Plugin plugin, Consumer task, long repeat, TimeUnit units) { + final long rT; + return repeats(plugin, task, repeat = units.toMillis(repeat), rT = repeat / 50, repeat, rT); + } + + @Override + public Runnable repeats(Plugin plugin, Consumer task, long delay, long repeat) { + return repeats(plugin, task, delay * 50, delay, repeat * 50, repeat); + } + + @Override + public Runnable repeats(Plugin plugin, Consumer task, long delay, long repeat, TimeUnit units) { + return repeats(plugin, task, delay = units.toMillis(delay), delay / 50, repeat = units.toMillis(repeat), repeat / 50); + } + + private Runnable repeats(Plugin plugin, Consumer task, long dMS, long dT, long rMS, long rT) { + if (dMS < 0 || rMS < 0) throw new IllegalStateException("Delay may not be < 0"); + final Container next = new Container<>(Instant.now().plusMillis(dMS)); + final io.papermc.paper.threadedregions.scheduler.ScheduledTask value = entity.getScheduler().runAtFixedRate(plugin, t -> { + next.value = Instant.now().plusMillis(rMS); + task.accept(t::cancel); + }, () -> { + at(entity.getLocation()).repeats(plugin, task, Math.min(0, Duration.between(Instant.now(), next.value).toMillis()), rMS, TimeUnit.MILLISECONDS); + }, (dT == 0)? 1 : dT, (rT == 0)? 1 : rT); + return (value != null)? value::cancel : at(entity.getLocation()).repeats(plugin, task, dT, rT); + } + } : global; + } + + private static long check(long amount, int minimum) { + if (amount < 0) throw new IllegalArgumentException("Delay ticks may not be < 0"); + return (amount == 0)? minimum : amount; + } + + public abstract Runnable runs(Plugin plugin, Consumer task); + + public abstract Runnable runs(Plugin plugin, Consumer task, long delay); + + public Runnable runs(Plugin plugin, Consumer task, long delay, TimeUnit units) { + return runs(plugin, task, units.toMillis(delay) / 50); + } + + public Runnable repeats(Plugin plugin, Consumer task, long repeat) { + return repeats(plugin, task, repeat, repeat); + } + + public Runnable repeats(Plugin plugin, Consumer task, long repeat, TimeUnit units) { + return repeats(plugin, task, repeat = units.toMillis(repeat) / 50, repeat); + } + + public abstract Runnable repeats(Plugin plugin, Consumer task, long delay, long repeat); + + public Runnable repeats(Plugin plugin, Consumer task, long delay, long repeat, TimeUnit units) { + return repeats(plugin, task, units.toMillis(delay) / 50, units.toMillis(repeat) / 50); + } +} diff --git a/SubServers.Client/pom.xml b/SubServers.Client/pom.xml index d8662782..ee38792c 100644 --- a/SubServers.Client/pom.xml +++ b/SubServers.Client/pom.xml @@ -9,6 +9,7 @@ Common + Folia Bukkit Sponge Universal diff --git a/SubServers.Creator/Forge/build.sh b/SubServers.Creator/Forge/build.sh index 77d2e9b4..cc7fed77 100644 --- a/SubServers.Creator/Forge/build.sh +++ b/SubServers.Creator/Forge/build.sh @@ -19,17 +19,17 @@ function __DL() { fi } function __Restore() { - if [[ -f "Forge.old.jar.x" ]]; then + if [[ -f "Forge.old.jar" ]]; then if [[ -f "Forge.jar" ]]; then rm -Rf Forge.jar fi - mv Forge.old.jar.x Forge.jar + mv Forge.old.jar Forge.jar fi - if [[ -f "mods/Sponge.old.jar.x" ]]; then + if [[ -f "mods/Sponge.old.jar" ]]; then if [[ -f "mods/Sponge.jar" ]]; then rm -Rf mods/Sponge.jar fi - mv mods/Sponge.old.jar.x mods/Sponge.jar + mv mods/Sponge.old.jar mods/Sponge.jar fi } echo Downloading the Minecraft Forge Installer... @@ -60,10 +60,10 @@ if [[ $__RETURN -eq 0 ]]; then mv -f "forge-$mcf_version-universal.jar" Forge.jar echo Downloading SpongeForge... if [[ -f "mods/Sponge.jar" ]]; then - if [[ -f "mods/Sponge.old.jar.x" ]]; then - rm -Rf mods/Sponge.old.jar.x + if [[ -f "mods/Sponge.old.jar" ]]; then + rm -Rf mods/Sponge.old.jar fi - mv mods/Sponge.jar mods/Sponge.old.jar.x + mv mods/Sponge.jar mods/Sponge.old.jar fi __DL mods/Sponge.jar "https://repo.spongepowered.org/maven/org/spongepowered/spongeforge/$sp_version/spongeforge-$sp_version.jar"; __RETURN=$? if [[ $__RETURN -eq 0 ]]; then diff --git a/SubServers.Creator/Purpur/build.sh b/SubServers.Creator/Purpur/build.sh index e62efeed..d2bfaf5d 100644 --- a/SubServers.Creator/Purpur/build.sh +++ b/SubServers.Creator/Purpur/build.sh @@ -15,19 +15,19 @@ function __DL() { fi } function __Restore() { - if [[ -f "Purpur.old.jar.x" ]]; then + if [[ -f "Purpur.old.jar" ]]; then if [[ -f "Purpur.jar" ]]; then rm -Rf Purpur.jar fi - mv Purpur.old.jar.x Purpur.jar + mv Purpur.old.jar Purpur.jar fi } echo Downloading Purpur... if [[ -f "Purpur.jar" ]]; then - if [[ -f "Purpur.old.jar.x" ]]; then - rm -Rf Purpur.old.jar.x + if [[ -f "Purpur.old.jar" ]]; then + rm -Rf Purpur.old.jar fi - mv Purpur.jar Purpur.old.jar.x + mv Purpur.jar Purpur.old.jar fi __DL Purpur.jar "https://api.purpurmc.org/v2/purpur/$version/latest/download"; __RETURN=$? if [[ $__RETURN -eq 0 ]]; then diff --git a/SubServers.Creator/Spigot/build.sh b/SubServers.Creator/Spigot/build.sh index 3731ae2b..188d89c5 100644 --- a/SubServers.Creator/Spigot/build.sh +++ b/SubServers.Creator/Spigot/build.sh @@ -41,10 +41,10 @@ if [[ -z "$cache" ]] || [[ ! -f "$cache/Spigot-$version.jar" ]] || [[ "$mode" == if [[ $__RETURN -eq 0 ]]; then echo Copying Finished Jar... if [[ -f "Spigot.jar" ]]; then - if [[ -f "Spigot.old.jar.x" ]]; then - rm -Rf Spigot.old.jar.x + if [[ -f "Spigot.old.jar" ]]; then + rm -Rf Spigot.old.jar fi - mv Spigot.jar Spigot.old.jar.x + mv Spigot.jar Spigot.old.jar fi if [[ ! -z "$cache" ]] && [[ -d "$cache" ]]; then if [[ -f "$cache/Spigot-$version.jar" ]]; then diff --git a/SubServers.Creator/Sponge/build.sh b/SubServers.Creator/Sponge/build.sh index 1994cd94..fa3d757a 100644 --- a/SubServers.Creator/Sponge/build.sh +++ b/SubServers.Creator/Sponge/build.sh @@ -15,19 +15,19 @@ function __DL() { fi } function __Restore() { - if [[ -f "Sponge.old.jar.x" ]]; then + if [[ -f "Sponge.old.jar" ]]; then if [[ -f "Sponge.jar" ]]; then rm -Rf Sponge.jar fi - mv Sponge.old.jar.x Sponge.jar + mv Sponge.old.jar Sponge.jar fi } echo Downloading SpongeVanilla... if [[ -f "Sponge.jar" ]]; then - if [[ -f "Sponge.old.jar.x" ]]; then - rm -Rf Sponge.old.jar.x + if [[ -f "Sponge.old.jar" ]]; then + rm -Rf Sponge.old.jar fi - mv Sponge.jar Sponge.old.jar.x + mv Sponge.jar Sponge.old.jar fi __DL Sponge.jar "https://repo.spongepowered.org/maven/org/spongepowered/spongevanilla/$sp_version/spongevanilla-$sp_version.jar"; __RETURN=$? if [[ $__RETURN -eq 0 ]]; then diff --git a/SubServers.Creator/Vanilla/build.sh b/SubServers.Creator/Vanilla/build.sh index 02e818c3..f5c0104f 100644 --- a/SubServers.Creator/Vanilla/build.sh +++ b/SubServers.Creator/Vanilla/build.sh @@ -33,10 +33,10 @@ if [[ -z "$cache" ]] || [[ ! -f "$cache/Vanilla-$version.jar" ]]; then echo Copying Finished Jar... cd ../ if [[ -f "Vanilla.jar" ]]; then - if [[ -f "Vanilla.old.jar.x" ]]; then - rm -Rf Vanilla.old.jar.x + if [[ -f "Vanilla.old.jar" ]]; then + rm -Rf Vanilla.old.jar fi - mv Vanilla.jar Vanilla.old.jar.x + mv Vanilla.jar Vanilla.old.jar fi if [[ ! -z "$cache" ]] && [[ -d "$cache" ]]; then cp "VanillaCord/out/$version-bungee.jar" "$cache/Vanilla-$version.jar" diff --git a/SubServers.Host/pom.xml b/SubServers.Host/pom.xml index 377b5e62..c50d46ea 100644 --- a/SubServers.Host/pom.xml +++ b/SubServers.Host/pom.xml @@ -30,13 +30,13 @@ net.ME1312.Galaxi GalaxiEngine - 23w14a + 23w14b compile net.ME1312.Galaxi GalaxiUI - 23w14a + 23w14b runtime