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
+
+
+
+
+
\ 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