diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java index fde849b0..4b4b3735 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java @@ -3,7 +3,6 @@ package net.ME1312.SubServers.Bungee.Host.External; import com.google.common.collect.Range; import net.ME1312.Galaxi.Library.*; import net.ME1312.Galaxi.Library.Callback.Callback; -import net.ME1312.Galaxi.Library.Callback.ReturnCallback; import net.ME1312.Galaxi.Library.Container.Container; import net.ME1312.Galaxi.Library.Container.NamedContainer; import net.ME1312.SubData.Server.SubDataClient; @@ -14,11 +13,12 @@ import net.ME1312.Galaxi.Library.Config.YAMLConfig; import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Version.Version; import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger; -import net.ME1312.SubServers.Bungee.Library.ReplacementScanner; import net.ME1312.SubServers.Bungee.Network.Packet.PacketExConfigureHost; import net.ME1312.SubServers.Bungee.Network.Packet.PacketExCreateServer; import net.ME1312.SubServers.Bungee.Network.Packet.PacketExDownloadTemplates; +import net.ME1312.SubServers.Bungee.Network.Packet.PacketExUploadTemplates; import net.ME1312.SubServers.Bungee.SubAPI; +import net.ME1312.SubServers.Bungee.SubProxy; import net.md_5.bungee.api.ChatColor; import java.io.File; @@ -32,6 +32,8 @@ import java.util.*; @SuppressWarnings("unchecked") public class ExternalSubCreator extends SubCreator { private HashMap templates = new HashMap(); + private HashMap templatesR = new HashMap(); + private Boolean enableRT = false; private ExternalHost host; private Range ports; private Container log; @@ -59,13 +61,13 @@ public class ExternalSubCreator extends SubCreator { @Override public void reload() { - templates.clear(); + templatesR.clear(); if (new UniversalFile(host.plugin.dir, "SubServers:Templates").exists()) for (File file : new UniversalFile(host.plugin.dir, "SubServers:Templates").listFiles()) { try { if (file.isDirectory() && !file.getName().endsWith(".x")) { ObjectMap config = (new UniversalFile(file, "template.yml").exists())?new YAMLConfig(new UniversalFile(file, "template.yml")).get().getMap("Template", new ObjectMap()):new ObjectMap(); ServerTemplate template = new ServerTemplate(file.getName(), config.getBoolean("Enabled", true), config.getRawString("Icon", "::NULL::"), file, config.getMap("Build", new ObjectMap()), config.getMap("Settings", new ObjectMap())); - templates.put(file.getName().toLowerCase(), template); + templatesR.put(file.getName().toLowerCase(), template); if (config.getKeys().contains("Display")) template.setDisplayName(config.getString("Display")); } } catch (Exception e) { @@ -74,9 +76,10 @@ public class ExternalSubCreator extends SubCreator { } } - if (host.available) { + if (host.available && !Util.getDespiteException(() -> Util.reflect(SubProxy.class.getDeclaredField("reloading"), host.plugin), false)) { host.queue(new PacketExConfigureHost(host.plugin, host)); - host.queue(new PacketExDownloadTemplates(host.plugin, host)); + host.queue(new PacketExUploadTemplates(host.plugin)); + if (enableRT == null || enableRT) host.queue(new PacketExDownloadTemplates(host.plugin, host)); } } @@ -136,7 +139,7 @@ public class ExternalSubCreator extends SubCreator { SubServer subserver = host.addSubServer(player, name, server.getBoolean("Enabled"), fport, ChatColor.translateAlternateColorCodes('&', server.getString("Motd")), server.getBoolean("Log"), server.getRawString("Directory"), server.getRawString("Executable"), server.getRawString("Stop-Command"), server.getBoolean("Hidden"), server.getBoolean("Restricted")); if (server.getString("Display").length() > 0) subserver.setDisplayName(server.getString("Display")); - subserver.setTemplate(getTemplate(server.getRawString("Template"))); + subserver.setTemplate(server.getRawString("Template")); for (String group : server.getStringList("Group")) subserver.addGroup(group); SubServer.StopAction action = Util.getDespiteException(() -> SubServer.StopAction.valueOf(server.getRawString("Stop-Action").toUpperCase().replace('-', '_').replace(' ', '_')), null); if (action != null) subserver.setStopAction(action); @@ -315,7 +318,10 @@ public class ExternalSubCreator extends SubCreator { @Override public Map getTemplates() { - return new TreeMap(templates); + TreeMap map = new TreeMap(); + if (enableRT != null && enableRT) map.putAll(templatesR); + map.putAll(templates); + return map; } @Override diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java index 1636d770..6e6f52ec 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java @@ -4,7 +4,6 @@ import com.google.common.collect.Range; import com.google.gson.Gson; import net.ME1312.Galaxi.Library.*; import net.ME1312.Galaxi.Library.Callback.Callback; -import net.ME1312.Galaxi.Library.Callback.ReturnCallback; import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Container.Container; import net.ME1312.Galaxi.Library.Container.NamedContainer; @@ -295,7 +294,7 @@ public class InternalSubCreator extends SubCreator { subserver = host.addSubServer(player, name, server.getBoolean("Enabled"), port, ChatColor.translateAlternateColorCodes('&', server.getString("Motd")), server.getBoolean("Log"), server.getRawString("Directory"), server.getRawString("Executable"), server.getRawString("Stop-Command"), server.getBoolean("Hidden"), server.getBoolean("Restricted")); if (server.getString("Display").length() > 0) subserver.setDisplayName(server.getString("Display")); - subserver.setTemplate(getTemplate(server.getRawString("Template"))); + subserver.setTemplate(server.getRawString("Template")); for (String group : server.getStringList("Group")) subserver.addGroup(group); SubServer.StopAction action = Util.getDespiteException(() -> SubServer.StopAction.valueOf(server.getRawString("Stop-Action").toUpperCase().replace('-', '_').replace(' ', '_')), null); if (action != null) subserver.setStopAction(action); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServer.java index 7e83b46d..bcea5410 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServer.java @@ -240,6 +240,13 @@ public interface SubServer extends Server { */ void setTemplate(SubCreator.ServerTemplate value); + /** + * Sets the Template this Server was created from + * + * @param value Value + */ + void setTemplate(String value); + /** * Is this Host Available? * diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerImpl.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerImpl.java index 59b3edaa..430579a8 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerImpl.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerImpl.java @@ -16,7 +16,8 @@ import java.util.*; */ public abstract class SubServerImpl extends ServerImpl implements SubServer { private List> incompatibilities = new ArrayList>(); - private String template = null; + private SubCreator.ServerTemplate templateV = null; + private String templateS = null; protected boolean started; private boolean updating; @@ -84,16 +85,26 @@ public abstract class SubServerImpl extends ServerImpl implements SubServer { return !updating && getHost().isAvailable(); } + @Override + public void setTemplate(String template) { + SubAPI.getInstance().getInternals().getPluginManager().callEvent(new SubEditServerEvent(null, this, new NamedContainer("template", template), false)); + this.templateV = null; + this.templateS = template; + } + @Override public void setTemplate(SubCreator.ServerTemplate template) { SubAPI.getInstance().getInternals().getPluginManager().callEvent(new SubEditServerEvent(null, this, new NamedContainer("template", (template != null)?template.getName():null), false)); - this.template = (template != null)?template.getName():null; + this.templateV = template; + this.templateS = (template != null)?template.getName():null; } @Override public SubCreator.ServerTemplate getTemplate() { - if (template != null && getHost().getCreator().getTemplates().keySet().contains(template.toLowerCase())) { - return getHost().getCreator().getTemplate(template.toLowerCase()); + if (templateV != null) { + return templateV; + } else if (templateS != null && getHost().getCreator().getTemplates().keySet().contains(templateS.toLowerCase())) { + return getHost().getCreator().getTemplate(templateS.toLowerCase()); } else { return null; } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExConfigureHost.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExConfigureHost.java index e79235e0..4e9d2ac5 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExConfigureHost.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExConfigureHost.java @@ -1,17 +1,18 @@ package net.ME1312.SubServers.Bungee.Network.Packet; +import net.ME1312.Galaxi.Library.Util; +import net.ME1312.SubData.Server.Protocol.PacketObjectIn; import net.ME1312.SubServers.Bungee.Host.External.ExternalHost; -import net.ME1312.SubServers.Bungee.Host.SubCreator; +import net.ME1312.SubServers.Bungee.Host.External.ExternalSubCreator; import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.SubData.Server.SubDataClient; -import net.ME1312.SubData.Server.Protocol.PacketIn; import net.ME1312.SubData.Server.Protocol.PacketObjectOut; import net.ME1312.SubServers.Bungee.SubProxy; /** * External Host Configuration Packet */ -public class PacketExConfigureHost implements PacketIn, PacketObjectOut { +public class PacketExConfigureHost implements PacketObjectIn, PacketObjectOut { private SubProxy plugin; private ExternalHost host; @@ -34,25 +35,15 @@ public class PacketExConfigureHost implements PacketIn, PacketObjectOut public ObjectMap send(SubDataClient client) { ObjectMap data = new ObjectMap(); data.set(0x0000, plugin.config.get().getMap("Hosts").getMap(host.getName()).clone()); - ObjectMap templates = new ObjectMap(); - for (SubCreator.ServerTemplate template : host.getCreator().getTemplates().values()) { - ObjectMap tinfo = new ObjectMap(); - tinfo.set("enabled", template.isEnabled()); - tinfo.set("display", template.getDisplayName()); - tinfo.set("icon", template.getIcon()); - tinfo.set("build", template.getBuildOptions().clone()); - tinfo.set("settings", template.getConfigOptions().clone()); - templates.set(template.getName(), tinfo); - } - data.set(0x0001, templates); return data; } @SuppressWarnings("unchecked") @Override - public void receive(SubDataClient client) { + public void receive(SubDataClient client, ObjectMap data) { if (client.getHandler() != null && client.getHandler() instanceof ExternalHost && plugin.config.get().getMap("Hosts").getKeys().contains(((ExternalHost) client.getHandler()).getName())) { client.sendPacket(new PacketExConfigureHost(plugin, (ExternalHost) client.getHandler())); + Util.isException(() -> Util.reflect(ExternalSubCreator.class.getDeclaredField("enableRT"), ((ExternalHost) client.getHandler()).getCreator(), ((data == null || data.getBoolean(0x0000, false))?null:false))); } } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExDownloadTemplates.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExDownloadTemplates.java index 34568892..ec8bc55d 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExDownloadTemplates.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExDownloadTemplates.java @@ -6,6 +6,7 @@ import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubData.Server.SubDataClient; import net.ME1312.SubData.Server.Protocol.PacketIn; import net.ME1312.SubData.Server.Protocol.PacketStreamOut; +import net.ME1312.SubServers.Bungee.Host.External.ExternalSubCreator; import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger; import net.ME1312.SubServers.Bungee.SubProxy; @@ -38,6 +39,8 @@ public class PacketExDownloadTemplates implements PacketIn, PacketStreamOut { try { Util.zip(new UniversalFile(plugin.dir, "SubServers:Templates"), stream); stream.close(); + + Util.isException(() -> Util.reflect(ExternalSubCreator.class.getDeclaredField("enableRT"), host.getCreator(), true)); } catch (Exception e) { Logger.get("SubData").info("Problem encoding template files for Host: " + host.getName()); e.printStackTrace(); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExUploadTemplates.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExUploadTemplates.java new file mode 100644 index 00000000..9acb544a --- /dev/null +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExUploadTemplates.java @@ -0,0 +1,58 @@ +package net.ME1312.SubServers.Bungee.Network.Packet; + +import net.ME1312.Galaxi.Library.Map.ObjectMap; +import net.ME1312.Galaxi.Library.UniversalFile; +import net.ME1312.Galaxi.Library.Util; +import net.ME1312.SubData.Server.Protocol.PacketObjectIn; +import net.ME1312.SubData.Server.Protocol.PacketOut; +import net.ME1312.SubData.Server.SubDataClient; +import net.ME1312.SubServers.Bungee.Host.External.ExternalHost; +import net.ME1312.SubServers.Bungee.Host.External.ExternalSubCreator; +import net.ME1312.SubServers.Bungee.Host.SubCreator; +import net.ME1312.SubServers.Bungee.SubProxy; + +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Logger; + +/** + * External Host Template Upload Packet + */ +public class PacketExUploadTemplates implements PacketObjectIn, PacketOut { + private SubProxy plugin; + + /** + * New PacketExUploadTemplates + */ + public PacketExUploadTemplates(SubProxy plugin) { + this.plugin = plugin; + } + + @SuppressWarnings("unchecked") + @Override + public void receive(SubDataClient client, ObjectMap data) { + if (client.getHandler() != null && client.getHandler() instanceof ExternalHost) { + HashMap map = Util.getDespiteException(() -> Util.reflect(ExternalSubCreator.class.getDeclaredField("templates"), ((ExternalHost) client.getHandler()).getCreator()), new HashMap<>()); + UniversalFile templatedir = new UniversalFile(plugin.dir, "SubServers:Cache:Remote:Templates"); + ObjectMap templates = new ObjectMap<>((Map) data.getObject(0x0000)); + templatedir.mkdirs(); + for (String name : templates.getKeys()) { + try { + UniversalFile dir = new UniversalFile(templatedir, name); + SubCreator.ServerTemplate template = new SubCreator.ServerTemplate(name, templates.getMap(name).getBoolean("enabled"), templates.getMap(name).getRawString("icon"), dir, + templates.getMap(name).getMap("build").clone(), templates.getMap(name).getMap("settings").clone()); + map.put(name.toLowerCase(), template); + if (!templates.getMap(name).getRawString("display").equals(name)) template.setDisplayName(templates.getMap(name).getRawString("display")); + } catch (Exception e) { + Logger.getLogger("SubServers").severe("Couldn't load template: " + name); + e.printStackTrace(); + } + } + } + } + + @Override + public int version() { + return 0x0001; + } +} diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubProtocol.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubProtocol.java index 9730050a..343c85d5 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubProtocol.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubProtocol.java @@ -96,26 +96,28 @@ public class SubProtocol extends SubDataProtocol { // 50-6F: External Host Packets instance.registerPacket(0x0050, PacketExConfigureHost.class); - instance.registerPacket(0x0051, PacketExDownloadTemplates.class); - //instance.registerPacket(0x0052, PacketInExRequestQueue.class); - instance.registerPacket(0x0053, PacketExCreateServer.class); - instance.registerPacket(0x0054, PacketExAddServer.class); - instance.registerPacket(0x0055, PacketExEditServer.class); - //instance.registerPacket(0x0056, PacketInExLogMessage.class); - instance.registerPacket(0x0057, PacketExRemoveServer.class); - instance.registerPacket(0x0058, PacketExDeleteServer.class); - //instance.registerPacket(0x0059, PacketExRestoreServer.class); + instance.registerPacket(0x0051, PacketExUploadTemplates.class); + instance.registerPacket(0x0052, PacketExDownloadTemplates.class); + //instance.registerPacket(0x0053, PacketInExRequestQueue.class); + instance.registerPacket(0x0054, PacketExCreateServer.class); + instance.registerPacket(0x0055, PacketExAddServer.class); + instance.registerPacket(0x0056, PacketExEditServer.class); + //instance.registerPacket(0x0057, PacketInExLogMessage.class); + instance.registerPacket(0x0058, PacketExRemoveServer.class); + instance.registerPacket(0x0059, PacketExDeleteServer.class); + //instance.registerPacket(0x005A, PacketExRestoreServer.class); instance.registerPacket(0x0050, new PacketExConfigureHost(plugin)); - instance.registerPacket(0x0051, new PacketExDownloadTemplates(plugin)); - instance.registerPacket(0x0052, new PacketInExRequestQueue(plugin)); - instance.registerPacket(0x0053, new PacketExCreateServer(null)); - instance.registerPacket(0x0054, new PacketExAddServer()); - instance.registerPacket(0x0055, new PacketExEditServer(plugin)); - instance.registerPacket(0x0056, new PacketInExLogMessage()); - instance.registerPacket(0x0057, new PacketExRemoveServer()); - instance.registerPacket(0x0058, new PacketExDeleteServer()); - //instance.registerPacket(0x0059, new PacketExRestoreServer()); + instance.registerPacket(0x0051, new PacketExUploadTemplates(plugin)); + instance.registerPacket(0x0052, new PacketExDownloadTemplates(plugin)); + instance.registerPacket(0x0053, new PacketInExRequestQueue(plugin)); + instance.registerPacket(0x0054, new PacketExCreateServer(null)); + instance.registerPacket(0x0055, new PacketExAddServer()); + instance.registerPacket(0x0056, new PacketExEditServer(plugin)); + instance.registerPacket(0x0057, new PacketInExLogMessage()); + instance.registerPacket(0x0058, new PacketExRemoveServer()); + instance.registerPacket(0x0059, new PacketExDeleteServer()); + //instance.registerPacket(0x005A, new PacketExRestoreServer()); // 70-7F: External Misc Packets diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java index 01dd9fe6..d7eceae4 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java @@ -83,6 +83,7 @@ public final class SubProxy extends BungeeCord implements Listener { public final boolean isGalaxi; public long resetDate = 0; private boolean running = false; + private boolean reloading = false; private boolean posted = false; private static BigInteger lastSignature = BigInteger.valueOf(-1); @@ -284,6 +285,7 @@ public final class SubProxy extends BungeeCord implements Listener { long begin = Calendar.getInstance().getTime().getTime(); boolean status; if (!(status = running)) resetDate = begin; + reloading = true; ConfigUpdater.updateConfig(new UniversalFile(dir, "SubServers:config.yml")); ConfigUpdater.updateServers(new UniversalFile(dir, "SubServers:servers.yml")); @@ -505,7 +507,7 @@ public final class SubProxy extends BungeeCord implements Listener { if (this.servers.get().getMap("Servers").getMap(name).getKeys().contains("Display") && ((this.servers.get().getMap("Servers").getMap(name).getRawString("Display").length() == 0 && !server.getName().equals(server.getDisplayName())) || (this.servers.get().getMap("Servers").getMap(name).getRawString("Display").length() > 0 && !this.servers.get().getMap("Servers").getMap(name).getRawString("Display").equals(server.getDisplayName())))) server.setDisplayName(this.servers.get().getMap("Servers").getMap(name).getRawString("Display")); if (this.servers.get().getMap("Servers").getMap(name).getKeys().contains("Template") && ((this.servers.get().getMap("Servers").getMap(name).getRawString("Template").length() == 0 && server.getTemplate() != null) || (this.servers.get().getMap("Servers").getMap(name).getRawString("Template").length() > 0 && server.getTemplate() == null) || (server.getTemplate() != null && !this.servers.get().getMap("Servers").getMap(name).getString("Template").equalsIgnoreCase(server.getTemplate().getName())))) - server.setTemplate(server.getHost().getCreator().getTemplate(this.servers.get().getMap("Servers").getMap(name).getString("Template"))); + server.setTemplate(this.servers.get().getMap("Servers").getMap(name).getRawString("Template")); if (this.servers.get().getMap("Servers").getMap(name).getKeys().contains("Group")) { for (String group : server.getGroups()) server.removeGroup(group); for (String group : this.servers.get().getMap("Servers").getMap(name).getStringList("Group")) server.addGroup(group); @@ -609,6 +611,7 @@ public final class SubProxy extends BungeeCord implements Listener { for (Server server : api.getServers().values()) if (server.getSubData()[0] != null) ((SubDataClient) server.getSubData()[0]).sendPacket(new PacketOutExReload(null)); } + reloading = false; Logger.get("SubServers").info(((plugins > 0)?plugins+" Plugin"+((plugins == 1)?"":"s")+", ":"") + ((proxies > 1)?proxies+" Proxies, ":"") + hosts + " Host"+((hosts == 1)?"":"s")+", " + servers + " Server"+((servers == 1)?"":"s")+", and " + subservers + " SubServer"+((subservers == 1)?"":"s")+" "+((status)?"re":"")+"loaded in " + new DecimalFormat("0.000").format((Calendar.getInstance().getTime().getTime() - begin) / 1000D) + "s"); long scd = TimeUnit.SECONDS.toMillis(this.servers.get().getMap("Settings").getLong("Run-On-Launch-Timeout", 0L)); 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 3834d3a9..b0f453eb 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 @@ -104,14 +104,14 @@ public class DefaultUIHandler implements UIHandler, Listener { gui.back(); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.Generic.Undo"))) { player.closeInventory(); - ((UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]).undo(); - gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]); + ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]).undo(); + gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.Host-Creator.Submit"))) { - String host = ((UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]).getHost().toLowerCase(); + String host = ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]).getHost().toLowerCase(); if (player.hasPermission("subservers.host.*.*") || player.hasPermission("subservers.host.*.create") || player.hasPermission("subservers.host." + host + ".*") || player.hasPermission("subservers.host." + host + ".create")) { player.closeInventory(); gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response")); - ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketCreateServer(player.getUniqueId(), ((UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]), data -> { + ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketCreateServer(player.getUniqueId(), ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]), data -> { gui.back(); })); } else { @@ -125,7 +125,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.lastVisitedObjectz[0]), 4 * 20); + Bukkit.getScheduler().runTaskLater(plugin, () -> gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]), 4 * 20); } else { gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response")); plugin.api.getSubServer(m.getString("message"), server -> { @@ -133,26 +133,26 @@ 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.lastVisitedObjectz[0]), 4 * 20); + Bukkit.getScheduler().runTaskLater(plugin, () -> gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]), 4 * 20); } else { - ((UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]).setName(m.getString("message")); - gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]); + ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]).setName(m.getString("message")); + gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]); } }); } }); } else if (ChatColor.stripColor(item).equals(ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Template")))) { player.closeInventory(); - gui.hostCreatorTemplates(1, (UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]); + gui.hostCreatorTemplates(1, (UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]); } else if (ChatColor.stripColor(item).equals(ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Version")))) { player.closeInventory(); if (!gui.sendTitle(plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Version.Title"), 4 * 20)) player.sendMessage(plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Version.Message")); input.put(player.getUniqueId(), m -> { if (m.getString("message").length() <= 0) { - ((UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]).setVersion(null); - } else ((UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]).setVersion(new Version(m.getString("message"))); - gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]); + ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]).setVersion(null); + } else ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]).setVersion(new Version(m.getString("message"))); + gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]); }); } else if (ChatColor.stripColor(item).equals(ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Port")))) { player.closeInventory(); @@ -160,15 +160,15 @@ public class DefaultUIHandler implements UIHandler, Listener { player.sendMessage(plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Port.Message")); input.put(player.getUniqueId(), m -> { if (m.getString("message").length() <= 0) { - ((UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]).setPort(null); - gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]); + ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]).setPort(null); + gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]); } else if (Util.isException(() -> 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.lastVisitedObjectz[0]), 4 * 20); + Bukkit.getScheduler().runTaskLater(plugin, () -> gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]), 4 * 20); } else { - ((UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]).setPort(Integer.valueOf(m.getString("message"))); - gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]); + ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]).setPort(Integer.valueOf(m.getString("message"))); + gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]); } }); } @@ -180,13 +180,13 @@ public class DefaultUIHandler implements UIHandler, Listener { String item = event.getCurrentItem().getItemMeta().getDisplayName(); if (item.equals(plugin.api.getLang("SubServers", "Interface.Generic.Back-Arrow"))) { player.closeInventory(); - gui.hostCreatorTemplates(gui.lastPage - 1, (UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]); + gui.hostCreatorTemplates(gui.lastPage - 1, (UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.Generic.Next-Arrow"))) { player.closeInventory(); - gui.hostCreatorTemplates(gui.lastPage + 1, (UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]); + gui.hostCreatorTemplates(gui.lastPage + 1, (UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.Generic.Back"))) { player.closeInventory(); - gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]); + gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]); } else { player.closeInventory(); String obj; @@ -195,8 +195,8 @@ public class DefaultUIHandler implements UIHandler, Listener { } else { obj = ChatColor.stripColor(item); } - ((UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]).setTemplate(obj); - gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjectz[0]); + ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]).setTemplate(obj); + gui.hostCreator((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]); } } } else if (title.startsWith(plugin.api.getLang("SubServers", "Interface.Host-Plugin.Title").split("\\$str\\$")[0]) && // Host Plugin @@ -206,10 +206,10 @@ public class DefaultUIHandler implements UIHandler, Listener { String item = event.getCurrentItem().getItemMeta().getDisplayName(); if (item.equals(plugin.api.getLang("SubServers", "Interface.Generic.Back-Arrow"))) { player.closeInventory(); - gui.hostPlugin(gui.lastPage - 1, ((Host) gui.lastVisitedObjectz[0]).getName()); + gui.hostPlugin(gui.lastPage - 1, ((Host) gui.lastVisitedObjects[0]).getName()); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.Generic.Next-Arrow"))) { player.closeInventory(); - gui.hostPlugin(gui.lastPage + 1, ((Host) gui.lastVisitedObjectz[0]).getName()); + gui.hostPlugin(gui.lastPage + 1, ((Host) gui.lastVisitedObjects[0]).getName()); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.Generic.Back"))) { player.closeInventory(); gui.back(); @@ -222,8 +222,8 @@ public class DefaultUIHandler implements UIHandler, Listener { if (plugin.get() == null) { gui.reopen(); } else { - gui.setDownloading(ChatColor.stripColor(this.plugin.api.getLang("SubServers", "Interface.Host-Plugin.Title").replace("$str$", ((Host) gui.lastVisitedObjectz[0]).getName()))); - this.plugin.api.getHost(((Host) gui.lastVisitedObjectz[0]).getName(), host -> { + gui.setDownloading(ChatColor.stripColor(this.plugin.api.getLang("SubServers", "Interface.Host-Plugin.Title").replace("$str$", ((Host) gui.lastVisitedObjects[0]).getName()))); + this.plugin.api.getHost(((Host) gui.lastVisitedObjects[0]).getName(), host -> { if (host != null) { gui.setDownloading(null); plugin.get().open(player, host); @@ -265,10 +265,10 @@ public class DefaultUIHandler implements UIHandler, Listener { if (item.equals(plugin.api.getLang("SubServers", "Interface.Generic.Back-Arrow"))) { player.closeInventory(); - gui.serverMenu(gui.lastPage - 1, (String) gui.lastVisitedObjectz[0], (String) gui.lastVisitedObjectz[1]); + gui.serverMenu(gui.lastPage - 1, (String) gui.lastVisitedObjects[0], (String) gui.lastVisitedObjects[1]); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.Generic.Next-Arrow"))) { player.closeInventory(); - gui.serverMenu(gui.lastPage + 1, (String) gui.lastVisitedObjectz[0], (String) gui.lastVisitedObjectz[1]); + gui.serverMenu(gui.lastPage + 1, (String) gui.lastVisitedObjects[0], (String) gui.lastVisitedObjects[1]); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.Server-Menu.Host-Menu"))) { player.closeInventory(); gui.hostMenu(1); @@ -297,15 +297,15 @@ public class DefaultUIHandler implements UIHandler, Listener { gui.back(); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.Host-Admin.Creator"))) { player.closeInventory(); - if (player.hasPermission("subservers.host.create.*") || player.hasPermission("subservers.host.create." + ((Host) gui.lastVisitedObjectz[0]).getName().toLowerCase())) { - gui.hostCreator(new UIRenderer.CreatorOptions(((Host) gui.lastVisitedObjectz[0]).getName())); + if (player.hasPermission("subservers.host.create.*") || player.hasPermission("subservers.host.create." + ((Host) gui.lastVisitedObjects[0]).getName().toLowerCase())) { + gui.hostCreator(new UIRenderer.CreatorOptions(((Host) gui.lastVisitedObjects[0]).getName())); } else gui.reopen(); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.Host-Admin.SubServers"))) { player.closeInventory(); - gui.serverMenu(1, ((Host) gui.lastVisitedObjectz[0]).getName(), null); + gui.serverMenu(1, ((Host) gui.lastVisitedObjects[0]).getName(), null); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.Host-Admin.Plugins"))) { player.closeInventory(); - gui.hostPlugin(1, ((Host) gui.lastVisitedObjectz[0]).getName()); + gui.hostPlugin(1, ((Host) gui.lastVisitedObjects[0]).getName()); } } } else if (title.startsWith(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Title").split("\\$str\\$")[0]) && // SubServer Admin @@ -319,12 +319,12 @@ public class DefaultUIHandler implements UIHandler, Listener { gui.back(); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Update"))) { player.closeInventory(); - if (((SubServer) gui.lastVisitedObjectz[0]).permits(player, "subservers.subserver.%.*", "subservers.subserver.%.update")) { + if (((SubServer) gui.lastVisitedObjects[0]).permits(player, "subservers.subserver.%.*", "subservers.subserver.%.update")) { if (!gui.sendTitle(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Update.Title"), 4 * 20)) player.sendMessage(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Update.Message")); input.put(player.getUniqueId(), m -> { gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response")); - ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketUpdateServer(player.getUniqueId(), ((SubServer) gui.lastVisitedObjectz[0]).getName(), + ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketUpdateServer(player.getUniqueId(), ((SubServer) gui.lastVisitedObjects[0]).getName(), (m.getString("message").length() == 0 || m.getString("message").equals("/"))?null:new Version((m.getString("message").startsWith("/"))?m.getString("message").substring(1):m.getString("message")), data -> { gui.reopen(); })); @@ -332,23 +332,23 @@ public class DefaultUIHandler implements UIHandler, Listener { } else gui.reopen(); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Start"))) { player.closeInventory(); - if (((SubServer) gui.lastVisitedObjectz[0]).permits(player, "subservers.subserver.%.*", "subservers.subserver.%.start")) { + if (((SubServer) gui.lastVisitedObjects[0]).permits(player, "subservers.subserver.%.*", "subservers.subserver.%.start")) { gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response")); - ((SubServer) gui.lastVisitedObjectz[0]).start(player.getUniqueId(), response -> { + ((SubServer) gui.lastVisitedObjects[0]).start(player.getUniqueId(), response -> { gui.setDownloading(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Start.Title")); Bukkit.getScheduler().runTaskLater(plugin, gui::reopen, 30); }); } else gui.reopen(); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Stop"))) { player.closeInventory(); - if (((SubServer) gui.lastVisitedObjectz[0]).permits(player, "subservers.subserver.%.*", "subservers.subserver.%.stop")) { + if (((SubServer) gui.lastVisitedObjects[0]).permits(player, "subservers.subserver.%.*", "subservers.subserver.%.stop")) { gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response")); final Container listening = new Container(true); PacketInExRunEvent.callback("SubStoppedEvent", new Callback>() { @Override public void run(ObjectMap json) { try { - if (listening.get()) if (!json.getString("server").equalsIgnoreCase(((SubServer) gui.lastVisitedObjectz[0]).getName())) { + if (listening.get()) if (!json.getString("server").equalsIgnoreCase(((SubServer) gui.lastVisitedObjects[0]).getName())) { PacketInExRunEvent.callback("SubStoppedEvent", this); } else { Bukkit.getScheduler().runTaskLater(plugin, gui::reopen, 5); @@ -356,23 +356,23 @@ public class DefaultUIHandler implements UIHandler, Listener { } catch (Exception e) {} } }); - ((SubServer) gui.lastVisitedObjectz[0]).stop(player.getUniqueId(), response -> { + ((SubServer) gui.lastVisitedObjects[0]).stop(player.getUniqueId(), response -> { if (response != 0) { gui.reopen(); listening.set(false); - } else gui.setDownloading(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Stop.Title").replace("$str$", ((SubServer) gui.lastVisitedObjectz[0]).getName())); + } else gui.setDownloading(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Stop.Title").replace("$str$", ((SubServer) gui.lastVisitedObjects[0]).getName())); }); } else gui.reopen(); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Terminate"))) { player.closeInventory(); - if (((SubServer) gui.lastVisitedObjectz[0]).permits(player, "subservers.subserver.%.*", "subservers.subserver.%.terminate")) { + if (((SubServer) gui.lastVisitedObjects[0]).permits(player, "subservers.subserver.%.*", "subservers.subserver.%.terminate")) { gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response")); final Container listening = new Container(true); PacketInExRunEvent.callback("SubStoppedEvent", new Callback>() { @Override public void run(ObjectMap json) { try { - if (listening.get()) if (!json.getString("server").equalsIgnoreCase(((SubServer) gui.lastVisitedObjectz[0]).getName())) { + if (listening.get()) if (!json.getString("server").equalsIgnoreCase(((SubServer) gui.lastVisitedObjects[0]).getName())) { PacketInExRunEvent.callback("SubStoppedEvent", this); } else { gui.reopen(); @@ -380,28 +380,28 @@ public class DefaultUIHandler implements UIHandler, Listener { } catch (Exception e) {} } }); - ((SubServer) gui.lastVisitedObjectz[0]).terminate(player.getUniqueId(), response -> { + ((SubServer) gui.lastVisitedObjects[0]).terminate(player.getUniqueId(), response -> { if (response != 0) { gui.reopen(); listening.set(false); - } else gui.setDownloading(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Terminate.Title").replace("$str$", ((SubServer) gui.lastVisitedObjectz[0]).getName())); + } else gui.setDownloading(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Terminate.Title").replace("$str$", ((SubServer) gui.lastVisitedObjects[0]).getName())); }); } else gui.reopen(); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Command"))) { player.closeInventory(); - if (((SubServer) gui.lastVisitedObjectz[0]).permits(player, "subservers.subserver.%.*", "subservers.subserver.%.command")) { + if (((SubServer) gui.lastVisitedObjects[0]).permits(player, "subservers.subserver.%.*", "subservers.subserver.%.command")) { if (!gui.sendTitle(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Command.Title"), 4 * 20)) player.sendMessage(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Command.Message")); input.put(player.getUniqueId(), m -> { gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response")); - ((SubServer) gui.lastVisitedObjectz[0]).command(player.getUniqueId(), (m.getString("message").startsWith("/"))?m.getString("message").substring(1):m.getString("message"), response -> { + ((SubServer) gui.lastVisitedObjects[0]).command(player.getUniqueId(), (m.getString("message").startsWith("/"))?m.getString("message").substring(1):m.getString("message"), response -> { gui.reopen(); }); }); } else gui.reopen(); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Plugins"))) { player.closeInventory(); - gui.subserverPlugin(1, ((SubServer) gui.lastVisitedObjectz[0]).getName()); + gui.subserverPlugin(1, ((SubServer) gui.lastVisitedObjects[0]).getName()); } } } else if (title.startsWith(plugin.api.getLang("SubServers", "Interface.SubServer-Plugin.Title").split("\\$str\\$")[0]) && // SubServer Plugin @@ -411,10 +411,10 @@ public class DefaultUIHandler implements UIHandler, Listener { String item = event.getCurrentItem().getItemMeta().getDisplayName(); if (item.equals(plugin.api.getLang("SubServers", "Interface.Generic.Back-Arrow"))) { player.closeInventory(); - gui.subserverPlugin(gui.lastPage - 1, ((SubServer) gui.lastVisitedObjectz[0]).getName()); + gui.subserverPlugin(gui.lastPage - 1, ((SubServer) gui.lastVisitedObjects[0]).getName()); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.Generic.Next-Arrow"))) { player.closeInventory(); - gui.subserverPlugin(gui.lastPage + 1, ((SubServer) gui.lastVisitedObjectz[0]).getName()); + gui.subserverPlugin(gui.lastPage + 1, ((SubServer) gui.lastVisitedObjects[0]).getName()); } else if (item.equals(plugin.api.getLang("SubServers", "Interface.Generic.Back"))) { player.closeInventory(); gui.back(); @@ -427,8 +427,8 @@ public class DefaultUIHandler implements UIHandler, Listener { if (plugin.get() == null) { gui.reopen(); } else { - gui.setDownloading(ChatColor.stripColor(this.plugin.api.getLang("SubServers", "Interface.SubServer-Plugin.Title").replace("$str$", ((SubServer) gui.lastVisitedObjectz[0]).getName()))); - this.plugin.api.getSubServer(((SubServer) gui.lastVisitedObjectz[0]).getName(), subserver -> { + gui.setDownloading(ChatColor.stripColor(this.plugin.api.getLang("SubServers", "Interface.SubServer-Plugin.Title").replace("$str$", ((SubServer) gui.lastVisitedObjects[0]).getName()))); + this.plugin.api.getSubServer(((SubServer) gui.lastVisitedObjects[0]).getName(), subserver -> { if (subserver != null) { gui.setDownloading(null); plugin.get().open(player, subserver); 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 5be4ed0f..f66fb1cf 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 @@ -3,7 +3,6 @@ package net.ME1312.SubServers.Client.Bukkit.Graphic; import net.ME1312.Galaxi.Library.Container.Container; import net.ME1312.Galaxi.Library.Container.NamedContainer; import net.ME1312.Galaxi.Library.Version.Version; -import net.ME1312.SubData.Client.Protocol.PacketObjectOut; import net.ME1312.SubServers.Client.Bukkit.Network.API.Host; import net.ME1312.SubServers.Client.Bukkit.Network.API.Server; import net.ME1312.SubServers.Client.Bukkit.Network.API.SubCreator; @@ -26,7 +25,7 @@ import java.util.*; public class DefaultUIRenderer extends UIRenderer { private static int MAX_VISITED_OBJECTS = 2; private List windowHistory = new LinkedList(); - Object[] lastVisitedObjectz = new Object[MAX_VISITED_OBJECTS]; + Object[] lastVisitedObjects = new Object[MAX_VISITED_OBJECTS]; int lastPage = 1; Runnable lastMenu = null; boolean open = false; @@ -84,7 +83,7 @@ public class DefaultUIRenderer extends UIRenderer { setDownloading(ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.Host-Menu.Title"))); plugin.api.getHosts(hosts -> plugin.api.getGroups(groups -> { setDownloading(null); - lastVisitedObjectz[0] = null; + lastVisitedObjects[0] = null; lastPage = page; lastMenu = () -> hostMenu(1); windowHistory.add(() -> hostMenu(page)); @@ -220,7 +219,7 @@ public class DefaultUIRenderer extends UIRenderer { if (hasHistory()) back(); } else { setDownloading(null); - lastVisitedObjectz[0] = host; + lastVisitedObjects[0] = host; ItemStack block; ItemMeta blockMeta; @@ -328,11 +327,11 @@ public class DefaultUIRenderer extends UIRenderer { public void hostCreator(final CreatorOptions options) { setDownloading(ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.Host-Creator.Title").replace("$str$", options.getHost()))); if (!options.init()) windowHistory.add(() -> hostCreator(options)); - lastVisitedObjectz[0] = options; + lastVisitedObjects[0] = options; plugin.api.getHost(options.getHost(), host -> { if (host == null || !host.isAvailable() || !host.isEnabled()) { - lastVisitedObjectz[0] = null; + lastVisitedObjects[0] = null; if (hasHistory()) back(); } else { setDownloading(null); @@ -455,10 +454,10 @@ public class DefaultUIRenderer extends UIRenderer { public void hostCreatorTemplates(final int page, final CreatorOptions options) { setDownloading(ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Template.Title").replace("$str$", options.getHost()))); options.init(); - lastVisitedObjectz[0] = options; + lastVisitedObjects[0] = options; plugin.api.getHost(options.getHost(), host -> { if (host == null || !host.isAvailable() || !host.isEnabled()) { - lastVisitedObjectz[0] = null; + lastVisitedObjects[0] = null; if (hasHistory()) back(); } else { lastPage = page; @@ -573,7 +572,7 @@ public class DefaultUIRenderer extends UIRenderer { if (hasHistory()) back(); } else { setDownloading(null); - lastVisitedObjectz[0] = host; + lastVisitedObjects[0] = host; lastPage = page; List renderers = new LinkedList(); for (String renderer : renderers) { @@ -677,7 +676,7 @@ public class DefaultUIRenderer extends UIRenderer { setDownloading(ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.Group-Menu.Title"))); plugin.api.getGroups(groups -> { setDownloading(null); - lastVisitedObjectz[0] = null; + lastVisitedObjects[0] = null; lastPage = page; lastMenu = () -> groupMenu(1); windowHistory.add(() -> groupMenu(page)); @@ -791,8 +790,8 @@ public class DefaultUIRenderer extends UIRenderer { lastPage = page; List servers = servercontainer.get(); - lastVisitedObjectz[0] = host; - lastVisitedObjectz[1] = group; + lastVisitedObjects[0] = host; + lastVisitedObjects[1] = group; windowHistory.add(() -> serverMenu(page, host, group)); ItemStack block; @@ -985,7 +984,7 @@ public class DefaultUIRenderer extends UIRenderer { if (hasHistory()) back(); } else { setDownloading(null); - lastVisitedObjectz[0] = subserver; + lastVisitedObjects[0] = subserver; ItemStack block; ItemMeta blockMeta; ItemStack div = createItem("STAINED_GLASS_PANE", "BLACK_STAINED_GLASS_PANE", (short) 15); @@ -1191,7 +1190,7 @@ public class DefaultUIRenderer extends UIRenderer { if (hasHistory()) back(); } else { setDownloading(null); - lastVisitedObjectz[0] = subserver; + lastVisitedObjects[0] = subserver; lastPage = page; List renderers = new LinkedList(); for (String renderer : renderers) { diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java b/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java index 6f5a23e9..61f16185 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java @@ -46,6 +46,7 @@ import java.util.jar.Manifest; public final class ExHost { HashMap subdata = new HashMap(); NamedContainer>> lang = null; + public HashMap templatesR = new HashMap(); public HashMap templates = new HashMap(); public HashMap servers = new HashMap(); public SubCreatorImpl creator; @@ -122,7 +123,7 @@ public final class ExHost { config = new YAMLConfig(new UniversalFile(engine.getRuntimeDirectory(), "config.yml")); if (!(new UniversalFile(engine.getRuntimeDirectory(), "Templates").exists())) { - new UniversalFile(engine.getRuntimeDirectory(), "Templates").mkdir(); + new UniversalFile(engine.getRuntimeDirectory(), "Templates").mkdirs(); log.info.println("Created ./Templates/"); } @@ -234,6 +235,7 @@ public final class ExHost { ConfigUpdater.updateConfig(new UniversalFile(engine.getRuntimeDirectory(), "config.yml")); config.reload(); + creator.load(false); subprotocol.unregisterCipher("AES"); subprotocol.unregisterCipher("AES-128"); @@ -347,7 +349,7 @@ public final class ExHost { log.error.println(e); } - if (new File(engine.getRuntimeDirectory(), "Templates").exists()) Util.deleteDirectory(new File(engine.getRuntimeDirectory(), "Templates")); + if (new UniversalFile(engine.getRuntimeDirectory(), "Cache:Remote").exists()) Util.deleteDirectory(new UniversalFile(engine.getRuntimeDirectory(), "Cache:Remote")); } } } \ No newline at end of file diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/SubCreatorImpl.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/SubCreatorImpl.java index 05054218..2a96e4b9 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/SubCreatorImpl.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/SubCreatorImpl.java @@ -1,6 +1,7 @@ package net.ME1312.SubServers.Host.Executable; import net.ME1312.Galaxi.Engine.GalaxiEngine; +import net.ME1312.Galaxi.Library.Config.YAMLConfig; import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Container.NamedContainer; import net.ME1312.Galaxi.Library.Map.ObjectMap; @@ -201,7 +202,32 @@ public class SubCreatorImpl { } } + /** + * Loads Template Metadata + * + * @param remote Loads from the Remote Templates directory when true + */ + public void load(boolean remote) { + HashMap templates = (remote)?host.templatesR:host.templates; + UniversalFile dir = new UniversalFile(GalaxiEngine.getInstance().getRuntimeDirectory(), ((remote)?"Cache:Remote:":"") + "Templates"); + templates.clear(); + if (dir.exists()) for (File file : dir.listFiles()) { + try { + if (file.isDirectory() && !file.getName().endsWith(".x")) { + ObjectMap config = (new UniversalFile(file, "template.yml").exists())?new YAMLConfig(new UniversalFile(file, "template.yml")).get().getMap("Template", new ObjectMap()):new ObjectMap(); + ServerTemplate template = new ServerTemplate(file.getName(), config.getBoolean("Enabled", true), config.getRawString("Icon", "::NULL::"), file, config.getMap("Build", new ObjectMap()), config.getMap("Settings", new ObjectMap())); + templates.put(file.getName().toLowerCase(), template); + if (config.getKeys().contains("Display")) template.setDisplayName(config.getString("Display")); + } + } catch (Exception e) { + host.log.error.println("Couldn't load template: " + file.getName()); + host.log.error.println(e); + } + } + } + private class CreatorTask extends Thread { + private final HashMap templates; private final SubServerImpl update; private final UUID player; private final String name; @@ -216,6 +242,7 @@ public class SubCreatorImpl { private CreatorTask(UUID player, String name, ServerTemplate template, Version version, int port, UUID address, UUID tracker) { super(SubAPI.getInstance().getAppInfo().getName() + "::SubCreator_Process_Handler(" + name + ')'); + this.templates = new HashMap(); this.update = host.servers.getOrDefault(name.toLowerCase(), null); this.player = player; this.name = name; @@ -226,6 +253,9 @@ public class SubCreatorImpl { this.replacements = new HashMap(); this.address = address; this.tracker = tracker; + + templates.putAll(host.templatesR); + templates.putAll(host.templates); } private ObjectMap build(File dir, ServerTemplate template, List history) throws SubCreatorException { @@ -236,11 +266,11 @@ public class SubCreatorImpl { if (history.contains(template)) throw new IllegalStateException("Template Import loop detected"); history.add(template); for (String other : template.getBuildOptions().getStringList("Import", new ArrayList())) { - if (host.templates.keySet().contains(other.toLowerCase())) { - if (host.templates.get(other.toLowerCase()).isEnabled()) { - if (version != null || !host.templates.get(other.toLowerCase()).requiresVersion()) { - if (update == null || host.templates.get(other.toLowerCase()).canUpdate()) { - ObjectMap config = build(dir, host.templates.get(other.toLowerCase()), history); + if (templates.keySet().contains(other.toLowerCase())) { + if (templates.get(other.toLowerCase()).isEnabled()) { + if (version != null || !templates.get(other.toLowerCase()).requiresVersion()) { + if (update == null || templates.get(other.toLowerCase()).canUpdate()) { + ObjectMap config = build(dir, templates.get(other.toLowerCase()), history); if (config == null) { throw new SubCreatorException(); } else { diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Library/ConfigUpdater.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Library/ConfigUpdater.java index 657e93b2..af87a6a2 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Library/ConfigUpdater.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Library/ConfigUpdater.java @@ -46,9 +46,13 @@ public class ConfigUpdater { existing = updated.clone(); i++; + } if (was.compareTo(new Version("20w24c")) <= 0) { + // additions only this time + + i++; }// if (was.compareTo(new Version("99w99a")) <= 0) { // // do something - // i++ + // i++; //} if (i > 0) SubAPI.getInstance().getAppInfo().getLogger().info.println("Updated ./config.yml (" + i + " pass" + ((i != 1)?"es":"") + ")"); @@ -59,6 +63,7 @@ public class ConfigUpdater { settings.set("Version", ((now.compareTo(was) <= 0)?was:now).toString()); settings.set("Console-Log", updated.getMap("Settings", new YAMLSection()).getBoolean("Console-Log", true)); settings.set("Network-Log", updated.getMap("Settings", new YAMLSection()).getBoolean("Network-Log", true)); + settings.set("Download-Templates", updated.getMap("Settings", new YAMLSection()).getBoolean("Download-Templates", true)); settings.set("Server-Bind", updated.getMap("Settings", new YAMLSection()).getRawString("Server-Bind", "127.0.0.1")); YAMLSection upnp = new YAMLSection(); diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExConfigureHost.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExConfigureHost.java index a61a6e76..7a589290 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExConfigureHost.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExConfigureHost.java @@ -1,13 +1,9 @@ package net.ME1312.SubServers.Host.Network.Packet; -import net.ME1312.Galaxi.Engine.GalaxiEngine; import net.ME1312.Galaxi.Library.Map.ObjectMap; -import net.ME1312.Galaxi.Library.UniversalFile; -import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubData.Client.Protocol.PacketObjectIn; -import net.ME1312.SubData.Client.Protocol.PacketOut; +import net.ME1312.SubData.Client.Protocol.PacketObjectOut; import net.ME1312.SubData.Client.SubDataSender; -import net.ME1312.SubServers.Host.Executable.SubCreatorImpl; import net.ME1312.SubServers.Host.ExHost; import java.util.Map; @@ -15,7 +11,7 @@ import java.util.Map; /** * External Host Configuration Packet */ -public class PacketExConfigureHost implements PacketObjectIn, PacketOut { +public class PacketExConfigureHost implements PacketObjectIn, PacketObjectOut { private static boolean first = false; private ExHost host; @@ -27,35 +23,20 @@ public class PacketExConfigureHost implements PacketObjectIn, PacketOut } @Override - public void sending(SubDataSender client) { + public ObjectMap send(SubDataSender client) { host.log.info.println("Downloading Host Settings..."); first = true; + + ObjectMap data = new ObjectMap(); + data.set(0x0000, host.config.get().getMap("Settings").getBoolean("Download-Templates", true)); + return data; } @SuppressWarnings("unchecked") @Override public void receive(SubDataSender client, ObjectMap data) { host.host = new ObjectMap<>((Map) data.getObject(0x0000)); - for (SubCreatorImpl.ServerTemplate template : host.templates.values()) { - Util.deleteDirectory(template.getDirectory()); - } - host.templates.clear(); - UniversalFile templatedir = new UniversalFile(GalaxiEngine.getInstance().getRuntimeDirectory(), "Templates"); - ObjectMap templates = new ObjectMap<>((Map) data.getObject(0x0001)); - Util.deleteDirectory(templatedir); - templatedir.mkdirs(); - for (String name : templates.getKeys()) { - try { - UniversalFile dir = new UniversalFile(templatedir, name); - SubCreatorImpl.ServerTemplate template = new SubCreatorImpl.ServerTemplate(name, templates.getMap(name).getBoolean("enabled"), templates.getMap(name).getRawString("icon"), dir, - templates.getMap(name).getMap("build").clone(), templates.getMap(name).getMap("settings").clone()); - host.templates.put(name.toLowerCase(), template); - if (!templates.getMap(name).getRawString("display").equals(name)) template.setDisplayName(templates.getMap(name).getRawString("display")); - } catch (Exception e) { - host.log.error.println("Couldn't load template: " + name); - host.log.error.println(e); - } - } + host.log.info.println(((first)?"":"New ") + "Host Settings Downloaded"); first = false; } diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExCreateServer.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExCreateServer.java index 8ac114e8..862700d1 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExCreateServer.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExCreateServer.java @@ -7,6 +7,7 @@ import net.ME1312.SubData.Client.Protocol.PacketObjectIn; import net.ME1312.SubData.Client.Protocol.PacketObjectOut; import net.ME1312.SubData.Client.SubDataSender; import net.ME1312.SubServers.Host.ExHost; +import net.ME1312.SubServers.Host.Executable.SubCreatorImpl; import java.util.Map; import java.util.UUID; @@ -90,7 +91,10 @@ public class PacketExCreateServer implements PacketObjectIn, PacketObje UUID log = data.getUUID(0x0006); UUID player = (data.contains(0x0007)?data.getUUID(0x0007):null); - host.creator.create(player, name, host.templates.get(template.toLowerCase()), version, port, log, tracker); + SubCreatorImpl.ServerTemplate templateV = host.templates.get(template.toLowerCase()); + if (templateV == null) templateV = host.templatesR.get(template.toLowerCase()); + + host.creator.create(player, name, templateV, version, port, log, tracker); } } catch (Throwable e) { host.log.error.println(e); diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExDownloadTemplates.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExDownloadTemplates.java index 6da50efa..3e9ad98d 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExDownloadTemplates.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExDownloadTemplates.java @@ -27,13 +27,13 @@ public class PacketExDownloadTemplates implements PacketOut, PacketStreamIn { @Override public void sending(SubDataSender client) throws Throwable { - host.log.info.println("Downloading Template Files..."); + host.log.info.println("Downloading Remote Template Files..."); first = true; } @Override public void receive(SubDataSender client, InputStream stream) { - UniversalFile dir = new UniversalFile(GalaxiEngine.getInstance().getRuntimeDirectory(), "Templates"); + UniversalFile dir = new UniversalFile(GalaxiEngine.getInstance().getRuntimeDirectory(), "Cache:Remote:Templates"); try { if (dir.exists()) Util.deleteDirectory(dir); } catch (Exception e) { @@ -41,8 +41,10 @@ public class PacketExDownloadTemplates implements PacketOut, PacketStreamIn { } try { + dir.mkdirs(); Util.unzip(stream, dir); - host.log.info.println(((first)?"":"New ") + "Template Files Downloaded"); + host.creator.load(true); + host.log.info.println(((first)?"":"New ") + "Remote Template Files Downloaded"); } catch (Exception e) { SubAPI.getInstance().getAppInfo().getLogger().error.println("Problem decoding template files"); SubAPI.getInstance().getAppInfo().getLogger().error.println(e); diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExUploadTemplates.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExUploadTemplates.java new file mode 100644 index 00000000..4d24dbc3 --- /dev/null +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExUploadTemplates.java @@ -0,0 +1,58 @@ +package net.ME1312.SubServers.Host.Network.Packet; + +import net.ME1312.Galaxi.Library.Map.ObjectMap; +import net.ME1312.SubData.Client.Protocol.PacketIn; +import net.ME1312.SubData.Client.Protocol.PacketObjectOut; +import net.ME1312.SubData.Client.SubDataSender; +import net.ME1312.SubServers.Host.ExHost; +import net.ME1312.SubServers.Host.Executable.SubCreatorImpl; + +/** + * External Host Template Upload Packet + */ +public class PacketExUploadTemplates implements PacketIn, PacketObjectOut { + private boolean first; + private ExHost host; + + /** + * New PacketExUploadTemplates + */ + public PacketExUploadTemplates(ExHost host) { + this(host, true); + } + private PacketExUploadTemplates(ExHost host, boolean first) { + this.host = host; + this.first = first; + } + + @Override + public ObjectMap send(SubDataSender client) { + host.log.info.println(((first)?"S":"Res") + "ending Local Template Metadata..."); + if (!first) host.creator.load(false); + + ObjectMap data = new ObjectMap(); + ObjectMap templates = new ObjectMap(); + for (SubCreatorImpl.ServerTemplate template : host.templates.values()) { + ObjectMap tinfo = new ObjectMap(); + tinfo.set("enabled", template.isEnabled()); + tinfo.set("display", template.getDisplayName()); + tinfo.set("icon", template.getIcon()); + tinfo.set("build", template.getBuildOptions().clone()); + tinfo.set("settings", template.getConfigOptions().clone()); + templates.set(template.getName(), tinfo); + } + data.set(0x0000, templates); + return data; + } + + @SuppressWarnings("unchecked") + @Override + public void receive(SubDataSender client) { + client.sendPacket(new PacketExUploadTemplates(host, false)); + } + + @Override + public int version() { + return 0x0001; + } +} diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/SubProtocol.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/SubProtocol.java index 159239d9..233cf5b4 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/SubProtocol.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/SubProtocol.java @@ -89,24 +89,26 @@ public class SubProtocol extends SubDataProtocol { // 50-6F: External Host Packets instance.registerPacket(0x0050, PacketExConfigureHost.class); - instance.registerPacket(0x0051, PacketExDownloadTemplates.class); - instance.registerPacket(0x0052, PacketOutExRequestQueue.class); - instance.registerPacket(0x0053, PacketExCreateServer.class); - instance.registerPacket(0x0054, PacketExAddServer.class); - instance.registerPacket(0x0055, PacketExEditServer.class); - instance.registerPacket(0x0056, PacketOutExLogMessage.class); - instance.registerPacket(0x0057, PacketExRemoveServer.class); - instance.registerPacket(0x0058, PacketExDeleteServer.class); + instance.registerPacket(0x0051, PacketExUploadTemplates.class); + instance.registerPacket(0x0052, PacketExDownloadTemplates.class); + instance.registerPacket(0x0053, PacketOutExRequestQueue.class); + instance.registerPacket(0x0054, PacketExCreateServer.class); + instance.registerPacket(0x0055, PacketExAddServer.class); + instance.registerPacket(0x0056, PacketExEditServer.class); + instance.registerPacket(0x0057, PacketOutExLogMessage.class); + instance.registerPacket(0x0058, PacketExRemoveServer.class); + instance.registerPacket(0x0059, PacketExDeleteServer.class); instance.registerPacket(0x0050, new PacketExConfigureHost(host)); - instance.registerPacket(0x0051, new PacketExDownloadTemplates(host)); - //instance.registerPacket(0x0052, new PacketOutExRequestQueue(host)); - instance.registerPacket(0x0053, new PacketExCreateServer(host)); - instance.registerPacket(0x0054, new PacketExAddServer(host)); - instance.registerPacket(0x0055, new PacketExEditServer(host)); - //instance.registerPacket(0x0056, new PacketOutExLogMessage()); - instance.registerPacket(0x0057, new PacketExRemoveServer(host)); - instance.registerPacket(0x0058, new PacketExDeleteServer(host)); + instance.registerPacket(0x0051, new PacketExUploadTemplates(host)); + instance.registerPacket(0x0052, new PacketExDownloadTemplates(host)); + //instance.registerPacket(0x0053, new PacketOutExRequestQueue(host)); + instance.registerPacket(0x0054, new PacketExCreateServer(host)); + instance.registerPacket(0x0055, new PacketExAddServer(host)); + instance.registerPacket(0x0056, new PacketExEditServer(host)); + //instance.registerPacket(0x0057, new PacketOutExLogMessage()); + instance.registerPacket(0x0058, new PacketExRemoveServer(host)); + instance.registerPacket(0x0059, new PacketExDeleteServer(host)); // 70-7F: External Misc Packets @@ -152,7 +154,9 @@ public class SubProtocol extends SubDataProtocol { SubDataClient subdata = super.open(scheduler, logger, address, port); subdata.sendPacket(new PacketLinkExHost(host, 0)); subdata.sendPacket(new PacketExConfigureHost(host)); - subdata.sendPacket(new PacketExDownloadTemplates(host)); + subdata.sendPacket(new PacketExUploadTemplates(host)); + if (host.config.get().getMap("Settings").getBoolean("Download-Templates", true)) + subdata.sendPacket(new PacketExDownloadTemplates(host)); subdata.sendPacket(new PacketDownloadLang()); subdata.sendPacket(new PacketOutExRequestQueue()); subdata.on.ready(client -> host.engine.getPluginManager().executeEvent(new SubNetworkConnectEvent((SubDataClient) client)));