diff --git a/SubServers.Bungee/pom.xml b/SubServers.Bungee/pom.xml
index 743b4c2b..70e9966b 100644
--- a/SubServers.Bungee/pom.xml
+++ b/SubServers.Bungee/pom.xml
@@ -30,13 +30,13 @@
net.ME1312.Galaxi
GalaxiUtil
- 19w16a
+ 19w19b
compile
net.ME1312.SubData
Server
- 19w18a
+ 19w19c
compile
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalHost.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalHost.java
index e1a2d2bf..dfc696fb 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalHost.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalHost.java
@@ -1,8 +1,8 @@
package net.ME1312.SubServers.Bungee.Host.External;
import com.google.common.collect.Range;
+import net.ME1312.SubData.Server.ClientHandler;
import net.ME1312.SubData.Server.DataClient;
-import net.ME1312.SubData.Server.SerializableClientHandler;
import net.ME1312.SubData.Server.SubDataClient;
import net.ME1312.SubServers.Bungee.Event.SubAddServerEvent;
import net.ME1312.SubServers.Bungee.Event.SubRemoveServerEvent;
@@ -11,7 +11,6 @@ import net.ME1312.SubServers.Bungee.Host.SubCreator;
import net.ME1312.SubServers.Bungee.Host.SubServer;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException;
-import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Server.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Bungee.Network.Packet.PacketExAddServer;
@@ -26,14 +25,15 @@ import java.util.*;
/**
* External Host Class
*/
-public class ExternalHost extends Host implements SerializableClientHandler {
+public class ExternalHost extends Host implements ClientHandler {
+ private HashMap subdata = new HashMap();
private HashMap servers = new HashMap();
private String name;
+ protected boolean available;
private boolean enabled;
private InetAddress address;
private SubCreator creator;
private String directory;
- protected NamedContainer client;
private LinkedList queue;
private boolean clean;
protected SubPlugin plugin;
@@ -54,51 +54,69 @@ public class ExternalHost extends Host implements SerializableClientHandler {
super(plugin, name, enabled, ports, log, address, directory, gitBash);
this.plugin = plugin;
this.name = name;
+ this.available = false;
this.enabled = enabled;
this.address = address;
- this.client = new NamedContainer(false, null);
this.creator = new ExternalSubCreator(this, ports, log, gitBash);
this.directory = directory;
this.queue = new LinkedList();
this.clean = false;
+
+ setSubData(null, 0);
}
@Override
- public DataClient getSubData() {
- return client.get();
+ public DataClient[] getSubData() {
+ LinkedList keys = new LinkedList(subdata.keySet());
+ LinkedList channels = new LinkedList();
+ Collections.sort(keys);
+ for (Integer channel : keys) channels.add(subdata.get(channel));
+ return channels.toArray(new DataClient[0]);
+ }
+
+ public void setSubData(DataClient client, int channel) {
+ if (channel < 0) throw new IllegalArgumentException("Subchannel ID cannot be less than zero");
+ if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(channel) == null)) {
+ if (client != null || channel == 0) {
+ subdata.put(channel, (SubDataClient) client);
+ if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this);
+ } else {
+ subdata.remove(channel);
+ }
+ }
}
@Override
- public void setSubData(DataClient client) {
- this.client = new NamedContainer(false, (SubDataClient) client);
- if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this);
+ public void removeSubData(DataClient client) {
+ for (Integer channel : Util.getBackwards(subdata, (SubDataClient) client)) setSubData(null, channel);
}
protected void queue(PacketObjectOut... packet) {
- for (PacketObjectOut p : packet) if (client.get() == null || client.name() == false) {
+ for (PacketObjectOut p : packet) if (getSubData()[0] == null || !available) {
queue.add(p);
} else {
- client.get().sendPacket(p);
+ ((SubDataClient) getSubData()[0]).sendPacket(p);
}
}
private void requeue() {
+ SubDataClient client = (SubDataClient) getSubData()[0];
if (!clean) {
- client.get().sendPacket(new PacketOutExReset("Prevent Desync"));
+ client.sendPacket(new PacketOutExReset("Prevent Desync"));
clean = true;
}
for (SubServer server : servers.values()) {
- client.get().sendPacket(new PacketExAddServer(server.getName(), server.isEnabled(), server.getAddress().getPort(), server.isLogging(), server.getPath(), ((ExternalSubServer) server).exec, server.getStopCommand(), (server.isRunning())?((ExternalSubLogger) server.getLogger()).getExternalAddress():null));
+ client.sendPacket(new PacketExAddServer(server.getName(), server.isEnabled(), server.getAddress().getPort(), server.isLogging(), server.getPath(), ((ExternalSubServer) server).exec, server.getStopCommand(), (server.isRunning())?((ExternalSubLogger) server.getLogger()).getExternalAddress():null));
}
while (queue.size() != 0) {
- client.get().sendPacket(queue.get(0));
+ client.sendPacket(queue.get(0));
queue.remove(0);
}
- client.rename(true);
+ available = true;
}
@Override
public boolean isAvailable() {
- return this.client.name();
+ return available;
}
@Override
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 cd384730..697e225e 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
@@ -66,7 +66,7 @@ public class ExternalSubCreator extends SubCreator {
e.printStackTrace();
}
}
- if (host.client.name()) host.queue(new PacketExConfigureHost(host.plugin, host));
+ if (host.available) host.queue(new PacketExConfigureHost(host.plugin, host));
}
@Override
@@ -195,7 +195,7 @@ public class ExternalSubCreator extends SubCreator {
@Override
public void terminate(String name) {
if (this.thread.keySet().contains(name.toLowerCase())) {
- ((SubDataClient) host.getSubData()).sendPacket(new PacketExCreateServer(name.toLowerCase()));
+ ((SubDataClient) host.getSubData()[0]).sendPacket(new PacketExCreateServer(name.toLowerCase()));
thread.remove(name.toLowerCase());
}
}
@@ -211,7 +211,7 @@ public class ExternalSubCreator extends SubCreator {
@Override
public void waitFor(String name) throws InterruptedException {
- while (this.thread.keySet().contains(name.toLowerCase()) && host.client.get() != null) {
+ while (this.thread.keySet().contains(name.toLowerCase()) && host.getSubData()[0] != null) {
Thread.sleep(250);
}
}
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java
index 62ea4c6e..5cc6649c 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java
@@ -442,7 +442,7 @@ public class ExternalSubServer extends SubServerContainer {
@Override
public void waitFor() throws InterruptedException {
- while (running && host.client.get() != null) {
+ while (running && host.getSubData()[0] != null) {
Thread.sleep(250);
}
}
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java
index 95caf398..f70ebf60 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java
@@ -3,6 +3,7 @@ package net.ME1312.SubServers.Bungee.Host;
import com.google.common.collect.Range;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Map.ObjectMapValue;
+import net.ME1312.SubData.Server.DataClient;
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidHostException;
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException;
import net.ME1312.Galaxi.Library.ExtraDataHandler;
@@ -12,6 +13,7 @@ import net.ME1312.SubServers.Bungee.SubAPI;
import net.ME1312.SubServers.Bungee.SubPlugin;
import java.net.InetAddress;
+import java.util.LinkedList;
import java.util.Map;
import java.util.UUID;
@@ -448,7 +450,11 @@ public abstract class Host implements ExtraDataHandler {
servers.set(server.getName(), server.forSubData());
}
hinfo.set("servers", servers);
- if (this instanceof ClientHandler && ((ClientHandler) this).getSubData() != null) hinfo.set("subdata", ((ClientHandler) this).getSubData().getID());
+ if (this instanceof ClientHandler) {
+ LinkedList subdata = new LinkedList();
+ for (DataClient client : ((ClientHandler) this).getSubData()) subdata.add((client == null)?null:client.getID());
+ hinfo.set("subdata", subdata);
+ }
hinfo.set("signature", signature);
hinfo.set("extra", getExtra());
return hinfo;
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Proxy.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Proxy.java
index 778ea773..39b4c684 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Proxy.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Proxy.java
@@ -1,7 +1,6 @@
package net.ME1312.SubServers.Bungee.Host;
import net.ME1312.SubData.Server.DataClient;
-import net.ME1312.SubData.Server.SerializableClientHandler;
import net.ME1312.SubData.Server.SubDataClient;
import net.ME1312.SubServers.Bungee.Event.SubRemoveProxyEvent;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
@@ -19,11 +18,11 @@ import java.util.*;
/**
* Proxy Class
*/
-public class Proxy implements SerializableClientHandler, ExtraDataHandler {
+public class Proxy implements ClientHandler, ExtraDataHandler {
+ private HashMap subdata = new HashMap();
private ObjectMap extra = new ObjectMap();
private final String signature;
private boolean persistent = true;
- private SubDataClient client = null;
private String nick = null;
private final String name;
@@ -36,22 +35,41 @@ public class Proxy implements SerializableClientHandler, ExtraDataHandler {
if (name.contains(" ")) throw new IllegalArgumentException("Proxy names cannot have spaces: " + name);
this.name = name;
this.signature = SubAPI.getInstance().signAnonymousObject();
+
+ setSubData(null, 0);
}
@Override
- public DataClient getSubData() {
- return client;
+ public DataClient[] getSubData() {
+ LinkedList keys = new LinkedList(subdata.keySet());
+ LinkedList channels = new LinkedList();
+ Collections.sort(keys);
+ for (Integer channel : keys) channels.add(subdata.get(channel));
+ return channels.toArray(new DataClient[0]);
}
- @Override
@SuppressWarnings("deprecation")
- public void setSubData(DataClient client) {
- this.client = (SubDataClient) client;
- if (client == null && !persistent) {
- ProxyServer.getInstance().getPluginManager().callEvent(new SubRemoveProxyEvent(this));
- SubAPI.getInstance().getInternals().proxies.remove(getName().toLowerCase());
+ public void setSubData(DataClient client, int channel) {
+ if (channel < 0) throw new IllegalArgumentException("Subchannel ID cannot be less than zero");
+ if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(channel) == null)) {
+ if (client != null || channel == 0) {
+ subdata.put(channel, (SubDataClient) client);
+ if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this);
+ } else {
+ subdata.remove(channel);
+ }
+
+ DataClient[] subdata = getSubData();
+ if (subdata[0] == null && subdata.length <= 1 && !persistent) {
+ ProxyServer.getInstance().getPluginManager().callEvent(new SubRemoveProxyEvent(this));
+ SubAPI.getInstance().getInternals().proxies.remove(getName().toLowerCase());
+ }
}
- if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this);
+ }
+
+ @Override
+ public void removeSubData(DataClient client) {
+ for (Integer channel : Util.getBackwards(subdata, (SubDataClient) client)) setSubData(null, channel);
}
/**
@@ -166,7 +184,9 @@ public class Proxy implements SerializableClientHandler, ExtraDataHandler {
}
info.set("players", players);
info.set("redis", isRedis());
- if (getSubData() != null) info.set("subdata", getSubData().getID());
+ LinkedList subdata = new LinkedList();
+ for (DataClient client : getSubData()) subdata.add((client == null)?null:client.getID());
+ info.set("subdata", subdata);
info.set("signature", signature);
info.set("extra", getExtra());
return info;
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Server.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Server.java
index 73f7ecbe..c5c1db2b 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Server.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Server.java
@@ -3,7 +3,7 @@ package net.ME1312.SubServers.Bungee.Host;
import net.ME1312.Galaxi.Library.ExtraDataHandler;
import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.SubData.Server.ClientHandler;
-import net.ME1312.SubData.Server.SerializableClientHandler;
+import net.ME1312.SubData.Server.DataClient;
import net.md_5.bungee.api.config.ServerInfo;
import java.util.Collection;
@@ -13,7 +13,15 @@ import java.util.UUID;
/**
* Server Interface
*/
-public interface Server extends ServerInfo, SerializableClientHandler, ExtraDataHandler {
+public interface Server extends ServerInfo, ClientHandler, ExtraDataHandler {
+
+ /**
+ * Link a SubData Client to this Object
+ *
+ * @param client Client to Link
+ * @param channel Channel ID
+ */
+ void setSubData(DataClient client, int channel);
/**
* Get the Display Name of this Server
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java
index 494867d5..bd9af029 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java
@@ -25,8 +25,8 @@ import java.util.*;
* Server Class
*/
public class ServerContainer extends BungeeServerInfo implements Server {
+ private HashMap subdata = new HashMap();
private ObjectMap extra = new ObjectMap();
- private SubDataClient client = null;
private String nick = null;
private List groups = new ArrayList();
private List whitelist = new ArrayList();
@@ -40,23 +40,42 @@ public class ServerContainer extends BungeeServerInfo implements Server {
signature = SubAPI.getInstance().signAnonymousObject();
SubAPI.getInstance().getSubDataNetwork().getProtocol().whitelist(getAddress().getAddress().getHostAddress());
this.hidden = hidden;
+
+ setSubData(null, 0);
}
@Override
- public DataClient getSubData() {
- return client;
+ public DataClient[] getSubData() {
+ LinkedList keys = new LinkedList(subdata.keySet());
+ LinkedList channels = new LinkedList();
+ Collections.sort(keys);
+ for (Integer channel : keys) channels.add(subdata.get(channel));
+ return channels.toArray(new DataClient[0]);
}
- @Override
- public void setSubData(DataClient client) {
- this.client = (SubDataClient) client;
- for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData() != null) {
- ObjectMap args = new ObjectMap();
- args.set("server", getName());
- if (client != null) args.set("address", client.getAddress().toString());
- ((SubDataClient) proxy.getSubData()).sendPacket(new PacketOutExRunEvent((client != null)?SubNetworkConnectEvent.class:SubNetworkDisconnectEvent.class, args));
+ public void setSubData(DataClient client, int channel) {
+ if (channel < 0) throw new IllegalArgumentException("Subchannel ID cannot be less than zero");
+ if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(channel) == null)) {
+ if (client != null || channel == 0) {
+ subdata.put(channel, (SubDataClient) client);
+ if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this);
+ } else {
+ subdata.remove(channel);
+ }
+
+ for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData()[0] != null) {
+ ObjectMap args = new ObjectMap();
+ args.set("server", getName());
+ args.set("channel", channel);
+ if (client != null) args.set("address", client.getAddress().toString());
+ ((SubDataClient) proxy.getSubData()[0]).sendPacket(new PacketOutExRunEvent((client != null)?SubNetworkConnectEvent.class:SubNetworkDisconnectEvent.class, args));
+ }
}
- if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this);
+ }
+
+ @Override
+ public void removeSubData(DataClient client) {
+ for (Integer channel : Util.getBackwards(subdata, (SubDataClient) client)) setSubData(null, channel);
}
@Override
@@ -174,14 +193,14 @@ public class ServerContainer extends BungeeServerInfo implements Server {
public void whitelist(UUID player) {
if (Util.isNull(player)) throw new NullPointerException();
whitelist.add(player);
- for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData() != null) ((SubDataClient) proxy.getSubData()).sendPacket(new PacketOutExUpdateWhitelist(getName(), true, player));
+ for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData()[0] != null) ((SubDataClient) proxy.getSubData()[0]).sendPacket(new PacketOutExUpdateWhitelist(getName(), true, player));
}
@Override
public void unwhitelist(UUID player) {
if (Util.isNull(player)) throw new NullPointerException();
whitelist.remove(player);
- for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData() != null) ((SubDataClient) proxy.getSubData()).sendPacket(new PacketOutExUpdateWhitelist(getName(), false, player));
+ for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData()[0] != null) ((SubDataClient) proxy.getSubData()[0]).sendPacket(new PacketOutExUpdateWhitelist(getName(), false, player));
}
@Override
@@ -237,7 +256,9 @@ public class ServerContainer extends BungeeServerInfo implements Server {
players.set(player.get().toString(), pinfo);
}
info.set("players", players);
- if (getSubData() != null) info.set("subdata", getSubData().getID());
+ LinkedList subdata = new LinkedList();
+ for (DataClient client : getSubData()) subdata.add((client == null)?null:client.getID());
+ info.set("subdata", subdata);
info.set("signature", signature);
info.set("extra", getExtra());
return info;
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Fallback/SmartReconnectHandler.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Fallback/SmartReconnectHandler.java
index 52aa7028..fe76cc4b 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Fallback/SmartReconnectHandler.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Fallback/SmartReconnectHandler.java
@@ -77,7 +77,7 @@ public class SmartReconnectHandler implements ReconnectHandler {
if (server instanceof Server) {
if (!((Server) server).isHidden()) confidence++;
if (!((Server) server).isRestricted()) confidence++;
- if (((Server) server).getSubData() != null) confidence++;
+ if (((Server) server).getSubData()[0] != null) confidence++;
} if (server instanceof SubServer) {
if (!((SubServer) server).isRunning()) valid = false;
}
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkExHost.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkExHost.java
index fb1edae7..11cddfb5 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkExHost.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkExHost.java
@@ -1,14 +1,17 @@
package net.ME1312.SubServers.Bungee.Network.Packet;
import net.ME1312.SubData.Server.SubDataClient;
+import net.ME1312.SubServers.Bungee.Host.External.ExternalHost;
import net.ME1312.SubServers.Bungee.Host.Host;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Server.ClientHandler;
import net.ME1312.SubData.Server.Protocol.PacketObjectIn;
import net.ME1312.SubData.Server.Protocol.PacketObjectOut;
+import net.ME1312.SubServers.Bungee.Host.ServerContainer;
import net.ME1312.SubServers.Bungee.SubPlugin;
+import java.util.HashMap;
import java.util.Map;
/**
@@ -50,10 +53,12 @@ public class PacketLinkExHost implements PacketObjectIn, PacketObjectOu
Map hosts = plugin.api.getHosts();
if (hosts.keySet().contains(data.getRawString(0x0000).toLowerCase())) {
Host host = hosts.get(data.getRawString(0x0000).toLowerCase());
- if (host instanceof ClientHandler) {
- if (((ClientHandler) host).getSubData() == null) {
- client.setHandler((ClientHandler) host);
- System.out.println("SubData > " + client.getAddress().toString() + " has been defined as Host: " + host.getName());
+ if (host instanceof ExternalHost) {
+ Integer channel = data.getInt(0x0001);
+ HashMap subdata = Util.getDespiteException(() -> Util.reflect(ExternalHost.class.getDeclaredField("subdata"), host), null);
+ if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(0) == null)) {
+ ((ExternalHost) host).setSubData(client, channel);
+ System.out.println("SubData > " + client.getAddress().toString() + " has been defined as Host: " + host.getName() + ((channel > 0)?" (Sub "+channel+")":""));
client.sendPacket(new PacketLinkExHost(0));
} else {
client.sendPacket(new PacketLinkExHost(3));
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkProxy.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkProxy.java
index 1ae7b1ad..c2be0995 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkProxy.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkProxy.java
@@ -8,8 +8,10 @@ import net.ME1312.Galaxi.Library.Version.Version;
import net.ME1312.SubData.Server.SubDataClient;
import net.ME1312.SubData.Server.Protocol.PacketObjectOut;
import net.ME1312.SubData.Server.Protocol.PacketObjectIn;
+import net.ME1312.SubServers.Bungee.Host.ServerContainer;
import net.ME1312.SubServers.Bungee.SubPlugin;
+import java.util.HashMap;
import java.util.Map;
/**
@@ -54,18 +56,24 @@ public class PacketLinkProxy implements PacketObjectIn, PacketObjectOut
try {
Map proxies = plugin.api.getProxies();
String name = ((data.contains(0x0000))?data.getRawString(0x0000):null);
+ Integer channel = data.getInt(0x0001);
Proxy proxy;
- if (name != null && proxies.keySet().contains(name.toLowerCase()) && proxies.get(name.toLowerCase()).getSubData() == null) {
+ if (name != null && proxies.keySet().contains(name.toLowerCase())) {
proxy = proxies.get(name.toLowerCase());
} else {
proxy = new Proxy((name != null && !proxies.keySet().contains(name.toLowerCase()))?name:null);
plugin.getPluginManager().callEvent(new SubAddProxyEvent(proxy));
plugin.proxies.put(proxy.getName().toLowerCase(), proxy);
}
+ HashMap subdata = Util.getDespiteException(() -> Util.reflect(Proxy.class.getDeclaredField("subdata"), proxy), null);
+ if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(0) == null)) {
+ proxy.setSubData(client, channel);
+ System.out.println("SubData > " + client.getAddress().toString() + " has been defined as Proxy: " + proxy.getName() + ((channel > 0)?" (Sub "+channel+")":""));
+ client.sendPacket(new PacketLinkProxy(proxy.getName(), 0));
+ } else {
+ client.sendPacket(new PacketLinkProxy(proxy.getName(), 2));
- client.setHandler(proxy);
- System.out.println("SubData > " + client.getAddress().toString() + " has been defined as Proxy: " + proxy.getName());
- client.sendPacket(new PacketLinkProxy(proxy.getName(), 0));
+ }
} catch (Exception e) {
client.sendPacket(new PacketLinkProxy(null, 1));
e.printStackTrace();
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java
index 542951f1..bd0d5279 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java
@@ -1,7 +1,9 @@
package net.ME1312.SubServers.Bungee.Network.Packet;
+import net.ME1312.SubData.Server.DataClient;
import net.ME1312.SubData.Server.SubDataClient;
import net.ME1312.SubServers.Bungee.Host.Server;
+import net.ME1312.SubServers.Bungee.Host.ServerContainer;
import net.ME1312.SubServers.Bungee.Host.SubServer;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Util;
@@ -10,6 +12,7 @@ import net.ME1312.SubData.Server.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Bungee.SubPlugin;
import java.net.InetSocketAddress;
+import java.util.HashMap;
import java.util.Map;
/**
@@ -64,15 +67,16 @@ public class PacketLinkServer implements PacketObjectIn, PacketObjectOu
public void receive(SubDataClient client, ObjectMap data) {
String name = (data.contains(0x0000))?data.getRawString(0x0000):null;
Integer port = (data.contains(0x0001))?data.getInt(0x0001):null;
+ Integer channel = data.getInt(0x0002);
try {
Map servers = plugin.api.getServers();
Server server;
if (name != null && servers.keySet().contains(name.toLowerCase())) {
- link(client, servers.get(name.toLowerCase()));
+ link(client, servers.get(name.toLowerCase()), channel);
} else if (port != null) {
if ((server = search(new InetSocketAddress(client.getAddress().getAddress(), port))) != null) {
- link(client, server);
+ link(client, server, channel);
} else {
throw new ServerLinkException("There is no server with address: " + client.getAddress().getAddress().getHostAddress() + ':' + port);
}
@@ -91,10 +95,11 @@ public class PacketLinkServer implements PacketObjectIn, PacketObjectOu
}
}
- private void link(SubDataClient client, Server server) {
- if (server.getSubData() == null) {
- client.setHandler(server);
- System.out.println("SubData > " + client.getAddress().toString() + " has been defined as " + ((server instanceof SubServer) ? "SubServer" : "Server") + ": " + server.getName());
+ private void link(SubDataClient client, Server server, int channel) {
+ HashMap subdata = Util.getDespiteException(() -> Util.reflect(ServerContainer.class.getDeclaredField("subdata"), server), null);
+ if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(0) == null)) {
+ server.setSubData(client, channel);
+ System.out.println("SubData > " + client.getAddress().toString() + " has been defined as " + ((server instanceof SubServer) ? "SubServer" : "Server") + ": " + server.getName() + ((channel > 0)?" (Sub "+channel+")":""));
if (server instanceof SubServer && !((SubServer) server).isRunning()) {
System.out.println("SubServers > Sending shutdown signal to rogue SubServer: " + server.getName());
client.sendPacket(new PacketOutExReset("Rogue SubServer Detected"));
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java
index f10345d3..a08dc4da 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java
@@ -247,9 +247,9 @@ public final class SubCommand extends CommandX {
message = " (master)";
for (Proxy proxy : plugin.api.getProxies().values()) {
message += div;
- if (proxy.getSubData() != null && proxy.isRedis()) {
+ if (proxy.getSubData()[0] != null && proxy.isRedis()) {
message += ChatColor.GREEN;
- } else if (proxy.getSubData() != null) {
+ } else if (proxy.getSubData()[0] != null) {
message += ChatColor.AQUA;
} else if (proxy.isRedis()) {
message += ChatColor.WHITE;
@@ -280,7 +280,7 @@ public final class SubCommand extends CommandX {
sender.sendMessage(" -> Address: " + ChatColor.WHITE + server.getAddress().getAddress().getHostAddress()+':'+server.getAddress().getPort());
if (server instanceof SubServer) sender.sendMessage(" -> Running: " + ((((SubServer) server).isRunning())?ChatColor.GREEN+"yes":ChatColor.RED+"no"));
if (!(server instanceof SubServer) || ((SubServer) server).isRunning()) {
- sender.sendMessage(" -> Connected: " + ((server.getSubData() != null)?ChatColor.GREEN+"yes":ChatColor.RED+"no"));
+ sender.sendMessage(" -> Connected: " + ((server.getSubData()[0] != null)?ChatColor.GREEN+"yes"+((server.getSubData().length > 1)?ChatColor.AQUA+" +"+(server.getSubData().length-1):""):ChatColor.RED+"no"));
sender.sendMessage(" -> Players: " + ChatColor.AQUA + server.getPlayers().size() + " online");
}
sender.sendMessage(" -> MOTD: " + ChatColor.WHITE + ChatColor.stripColor(server.getMotd()));
@@ -325,7 +325,7 @@ public final class SubCommand extends CommandX {
sender.sendMessage(" -> Available: " + ((host.isAvailable())?ChatColor.GREEN+"yes":ChatColor.RED+"no"));
sender.sendMessage(" -> Enabled: " + ((host.isEnabled())?ChatColor.GREEN+"yes":ChatColor.RED+"no"));
sender.sendMessage(" -> Address: " + ChatColor.WHITE + host.getAddress().getHostAddress());
- if (host instanceof ClientHandler && ((ClientHandler) host).getSubData() != null) sender.sendMessage(" -> Connected: " + ChatColor.GREEN + "yes");
+ if (host instanceof ClientHandler && ((ClientHandler) host).getSubData()[0] != null) sender.sendMessage(" -> Connected: " + ChatColor.GREEN + "yes" + ((((ClientHandler) host).getSubData().length > 1)?ChatColor.AQUA+" +"+(((ClientHandler) host).getSubData().length-1):""));
sender.sendMessage(" -> SubServers: " + ((host.getSubServers().keySet().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + host.getSubServers().keySet().size()));
for (SubServer subserver : host.getSubServers().values()) sender.sendMessage(" - " + ((subserver.isEnabled())?ChatColor.WHITE:ChatColor.GRAY) + subserver.getDisplayName() + ((subserver.getName().equals(subserver.getDisplayName()))?"":" ("+subserver.getName()+')'));
sender.sendMessage(" -> Templates: " + ((host.getCreator().getTemplates().keySet().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + host.getCreator().getTemplates().keySet().size()));
@@ -344,7 +344,7 @@ public final class SubCommand extends CommandX {
if (proxy != null) {
sender.sendMessage("SubServers > Info on Proxy: " + ChatColor.WHITE + proxy.getDisplayName());
if (!proxy.getName().equals(proxy.getDisplayName())) sender.sendMessage(" -> System Name: " + ChatColor.WHITE + proxy.getName());
- sender.sendMessage(" -> Connected: " + ((proxy.getSubData() != null)?ChatColor.GREEN+"yes":ChatColor.RED+"no"));
+ sender.sendMessage(" -> Connected: " + ((proxy.getSubData()[0] != null)?ChatColor.GREEN+"yes"+((proxy.getSubData().length > 1)?ChatColor.AQUA+" +"+(proxy.getSubData().length-1):""):ChatColor.RED+"no"));
sender.sendMessage(" -> Redis: " + ((proxy.isRedis())?ChatColor.GREEN:ChatColor.RED+"un") + "available");
if (proxy.isRedis()) sender.sendMessage(" -> Players: " + ChatColor.AQUA + proxy.getPlayers().size() + " online");
sender.sendMessage(" -> Signature: " + ChatColor.AQUA + proxy.getSignature());
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java
index 8a31072f..5c06ca36 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java
@@ -46,6 +46,7 @@ import java.nio.file.Files;
import java.security.SecureRandom;
import java.text.DecimalFormat;
import java.util.*;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
@@ -424,8 +425,8 @@ public final class SubPlugin extends BungeeCord implements Listener {
}
if (bungee.get().getMap("servers").getMap(name).getKeys().contains("extra"))
for (String extra : config.get().getMap("servers").getMap(name).getMap("extra").getKeys()) server.addExtra(extra, config.get().getMap("servers").getMap(name).getMap("extra").getObject(extra));
- if (server.getSubData() != null)
- ((SubDataClient) server.getSubData()).sendPacket(new PacketOutExReload(null));
+ if (server.getSubData()[0] != null)
+ ((SubDataClient) server.getSubData()[0]).sendPacket(new PacketOutExReload(null));
ukeys.add(name.toLowerCase());
servers++;
}
@@ -563,8 +564,8 @@ public final class SubPlugin extends BungeeCord implements Listener {
}
if (status) {
- for (Host host : api.getHosts().values()) if (host instanceof ClientHandler && ((ClientHandler) host).getSubData() != null) ((SubDataClient) ((ClientHandler) host).getSubData()).sendPacket(new PacketOutExReload(null));
- for (Server server : api.getServers().values()) if (server.getSubData() != null) ((SubDataClient) server.getSubData()).sendPacket(new PacketOutExReload(null));
+ for (Host host : api.getHosts().values()) if (host instanceof ClientHandler && ((ClientHandler) host).getSubData()[0] != null) ((SubDataClient) ((ClientHandler) host).getSubData()[0]).sendPacket(new PacketOutExReload(null));
+ for (Server server : api.getServers().values()) if (server.getSubData()[0] != null) ((SubDataClient) server.getSubData()[0]).sendPacket(new PacketOutExReload(null));
}
System.out.println("SubServers > " + ((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");
@@ -586,7 +587,7 @@ public final class SubPlugin extends BungeeCord implements Listener {
server.start();
if (ar.size() > 0 && scd > 0) {
long sleep = Calendar.getInstance().getTime().getTime();
- while (running && begin == resetDate && server.getSubData() == null && Calendar.getInstance().getTime().getTime() - sleep < scd) {
+ while (running && begin == resetDate && server.getSubData()[0] == null && Calendar.getInstance().getTime().getTime() - sleep < scd) {
Thread.sleep(250);
}
}
diff --git a/SubServers.Client/Bukkit/pom.xml b/SubServers.Client/Bukkit/pom.xml
index 4c2e1c4f..8017fc0d 100644
--- a/SubServers.Client/Bukkit/pom.xml
+++ b/SubServers.Client/Bukkit/pom.xml
@@ -48,13 +48,13 @@
net.ME1312.Galaxi
GalaxiUtil
- 19w16a
+ 19w19b
compile
net.ME1312.SubData
Client
- 19w18a
+ 19w19c
compile
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 86694899..c07b8940 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
@@ -6,6 +6,7 @@ import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
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.Network.API.Host;
import net.ME1312.SubServers.Client.Bukkit.Network.API.SubServer;
import net.ME1312.SubServers.Client.Bukkit.Network.Packet.*;
@@ -62,7 +63,7 @@ public class DefaultUIHandler implements UIHandler, Listener {
String title = event.getView().getTitle();
if (gui.open && event.getClickedInventory() != null && title != null) {
- if (plugin.subdata == null) {
+ if (plugin.api.getSubDataNetwork()[0] == null) {
new IllegalStateException("SubData is not connected").printStackTrace();
} else if (Util.isException(() -> plugin.api.getLangChannels())) {
new IllegalStateException("There are no lang options available at this time").printStackTrace();
@@ -109,7 +110,7 @@ public class DefaultUIHandler implements UIHandler, Listener {
if (player.hasPermission("subservers.host.create.*") || player.hasPermission("subservers.host.create." + ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]).getHost().toLowerCase())) {
player.closeInventory();
gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response"));
- plugin.subdata.sendPacket(new PacketCreateServer(player.getUniqueId(), ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]), data -> {
+ ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketCreateServer(player.getUniqueId(), ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]), data -> {
gui.back();
}));
} else {
@@ -319,7 +320,7 @@ public class DefaultUIHandler implements UIHandler, Listener {
player.closeInventory();
if (player.hasPermission("subservers.subserver.start.*") || player.hasPermission("subservers.subserver.start." + ((String) gui.lastVisitedObjects[0]).toLowerCase())) {
gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response"));
- plugin.subdata.sendPacket(new PacketStartServer(player.getUniqueId(), (String) gui.lastVisitedObjects[0], data -> {
+ ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketStartServer(player.getUniqueId(), (String) gui.lastVisitedObjects[0], data -> {
gui.setDownloading(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Start.Title"));
Bukkit.getScheduler().runTaskLater(plugin, gui::reopen, 30);
}));
@@ -341,7 +342,7 @@ public class DefaultUIHandler implements UIHandler, Listener {
} catch (Exception e) {}
}
});
- plugin.subdata.sendPacket(new PacketStopServer(player.getUniqueId(), (String) gui.lastVisitedObjects[0], false, data -> {
+ ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketStopServer(player.getUniqueId(), (String) gui.lastVisitedObjects[0], false, data -> {
if (data.getInt(0x0001) != 0) {
gui.reopen();
listening.set(false);
@@ -365,7 +366,7 @@ public class DefaultUIHandler implements UIHandler, Listener {
} catch (Exception e) {}
}
});
- plugin.subdata.sendPacket(new PacketStopServer(player.getUniqueId(), (String) gui.lastVisitedObjects[0], false, data -> {
+ ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketStopServer(player.getUniqueId(), (String) gui.lastVisitedObjects[0], false, data -> {
if (data.getInt(0x0001) != 0) {
gui.reopen();
listening.set(false);
@@ -379,7 +380,7 @@ public class DefaultUIHandler implements UIHandler, Listener {
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"));
- plugin.subdata.sendPacket(new PacketCommandServer(player.getUniqueId(), (String) gui.lastVisitedObjects[0], (m.getString("message").startsWith("/"))?m.getString("message").substring(1):m.getString("message"), data -> {
+ ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketCommandServer(player.getUniqueId(), (String) gui.lastVisitedObjects[0], (m.getString("message").startsWith("/"))?m.getString("message").substring(1):m.getString("message"), data -> {
gui.reopen();
}));
});
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 059c5bdb..40732e2f 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
@@ -396,7 +396,7 @@ public class DefaultUIRenderer extends UIRenderer {
block = createItem("STAINED_GLASS_PANE", "LIME_STAINED_GLASS_PANE", (short) 5);
blockMeta = block.getItemMeta();
blockMeta.setDisplayName(ChatColor.GREEN + plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Version"));
- blockMeta.setLore(Arrays.asList(ChatColor.GRAY + ((options.getVersion() == null)?"Auto Select":"Minecraft "+options.getVersion().toString())));
+ blockMeta.setLore(Arrays.asList(ChatColor.GRAY + ((options.getVersion() == null)?"Unspecified":"Minecraft "+options.getVersion().toString())));
}
block.setItemMeta(blockMeta);
inv.setItem(32, block);
diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/BungeeChat.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/BungeeChat.java
index 56cb281e..fef6c27d 100644
--- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/BungeeChat.java
+++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/BungeeChat.java
@@ -311,7 +311,7 @@ public class BungeeChat {
hoverm = new LinkedList();
message = new TextComponent(proxy.getDisplayName());
hover = new TextComponent(proxy.getDisplayName());
- if (proxy.getSubData() != null && proxy.isRedis()) {
+ if (proxy.getSubData()[0] != null && proxy.isRedis()) {
message.setColor(ChatColor.GREEN);
hover.setColor(ChatColor.GREEN);
if (!proxy.getName().equals(proxy.getDisplayName())) {
@@ -321,7 +321,7 @@ public class BungeeChat {
}
hoverm.add(hover);
hover = new TextComponent('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Player-Count").replace("$int$", new DecimalFormat("#,###").format(proxy.getPlayers().size())));
- } else if (proxy.getSubData() != null) {
+ } else if (proxy.getSubData()[0] != null) {
message.setColor(ChatColor.AQUA);
hover.setColor(ChatColor.AQUA);
if (!proxy.getName().equals(proxy.getDisplayName())) {
diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Host.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Host.java
index 2e612a48..bd5c1c5a 100644
--- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Host.java
+++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Host.java
@@ -49,16 +49,16 @@ public class Host {
*/
public void refresh() {
String name = getName();
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketDownloadHostInfo(name, data -> load(data.getMap(name))));
+ ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketDownloadHostInfo(name, data -> load(data.getMap(name))));
}
/**
- * Gets the SubData Client ID
+ * Gets the SubData Client Channel IDs
*
- * @return SubData Client ID (or null if unlinked/unsupported)
+ * @return SubData Client Channel ID Array
*/
- public UUID getSubData() {
- return raw.getUUID("subdata", null);
+ public UUID[] getSubData() {
+ return raw.getUUIDList("subdata", Collections.emptyList()).toArray(new UUID[0]);
}
/**
@@ -275,7 +275,7 @@ public class Host {
public void addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted, Callback response) {
if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace();
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketAddServer(player, name, enabled, getName(), port, motd, log, directory, executable, stopcmd, hidden, restricted, data -> {
+ ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketAddServer(player, name, enabled, getName(), port, motd, log, directory, executable, stopcmd, hidden, restricted, data -> {
try {
response.run(data.getInt(0x0001));
} catch (Throwable e) {
@@ -412,7 +412,7 @@ public class Host {
private void removeSubServer(UUID player, String name, boolean force, Callback response) {
if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace();
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketRemoveServer(player, name, force, data -> {
+ ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketRemoveServer(player, name, force, data -> {
try {
response.run(data.getInt(0x0001));
} catch (Throwable e) {
@@ -598,7 +598,7 @@ public class Host {
private void deleteSubServer(UUID player, String name, boolean recycle, boolean force, Callback response) {
if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace();
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketDeleteServer(player, name, recycle, force, data -> {
+ ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketDeleteServer(player, name, recycle, force, data -> {
try {
response.run(data.getInt(0x0001));
} catch (Throwable e) {
diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Proxy.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Proxy.java
index adf25e60..bf2a064e 100644
--- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Proxy.java
+++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Proxy.java
@@ -38,16 +38,16 @@ public class Proxy {
*/
public void refresh() {
String name = getName();
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketDownloadProxyInfo(name, data -> load(data.getMap(name))));
+ ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketDownloadProxyInfo(name, data -> load(data.getMap(name))));
}
/**
- * Gets the SubData Client ID
+ * Gets the SubData Client Channel IDs
*
- * @return SubData Client ID (or null if not linked)
+ * @return SubData Client Channel ID Array
*/
- public UUID getSubData() {
- return raw.getUUID("subdata", null);
+ public UUID[] getSubData() {
+ return raw.getUUIDList("subdata", Collections.emptyList()).toArray(new UUID[0]);
}
/**
diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Server.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Server.java
index 92603e0d..0e5c94ba 100644
--- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Server.java
+++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Server.java
@@ -37,16 +37,16 @@ public class Server {
*/
public void refresh() {
String name = getName();
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketDownloadServerInfo(name, data -> load(data.getMap(name))));
+ ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketDownloadServerInfo(name, data -> load(data.getMap(name))));
}
/**
- * Gets the SubData Client ID
+ * Gets the SubData Client Channel IDs
*
- * @return SubData Client ID (or null if not linked)
+ * @return SubData Client Channel ID Array
*/
- public UUID getSubData() {
- return raw.getUUID("subdata", null);
+ public UUID[] getSubData() {
+ return raw.getUUIDList("subdata", Collections.emptyList()).toArray(new UUID[0]);
}
/**
diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/SubCreator.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/SubCreator.java
index 3a640428..bdc33106 100644
--- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/SubCreator.java
+++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/SubCreator.java
@@ -122,7 +122,7 @@ public class SubCreator {
public void create(UUID player, String name, ServerTemplate template, Version version, int port, Callback response) {
if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace();
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketCreateServer(player, name, host.getName(), template.getName(), version, port, data -> {
+ ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketCreateServer(player, name, host.getName(), template.getName(), version, port, data -> {
try {
response.run(data.getInt(0x0001));
} catch (Throwable e) {
diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/SubServer.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/SubServer.java
index 8c4ab39d..8bfd92a5 100644
--- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/SubServer.java
+++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/SubServer.java
@@ -71,7 +71,7 @@ public class SubServer extends Server {
public void start(UUID player, Callback response) {
if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace();
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketStartServer(player, getName(), data -> {
+ ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketStartServer(player, getName(), data -> {
try {
response.run(data.getInt(0x0001));
} catch (Throwable e) {
@@ -116,7 +116,7 @@ public class SubServer extends Server {
public void stop(UUID player, Callback response) {
if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace();
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketStopServer(player, getName(), false, data -> {
+ ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketStopServer(player, getName(), false, data -> {
try {
response.run(data.getInt(0x0001));
} catch (Throwable e) {
@@ -161,7 +161,7 @@ public class SubServer extends Server {
public void terminate(UUID player, Callback response) {
if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace();
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketStopServer(player, getName(), true, data -> {
+ ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketStopServer(player, getName(), true, data -> {
try {
response.run(data.getInt(0x0001));
} catch (Throwable e) {
@@ -207,7 +207,7 @@ public class SubServer extends Server {
public void command(UUID player, String command, Callback response) {
if (Util.isNull(command, response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace();
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketCommandServer(player, getName(), command, data -> {
+ ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketCommandServer(player, getName(), command, data -> {
try {
response.run(data.getInt(0x0001));
} catch (Throwable e) {
@@ -330,7 +330,7 @@ public class SubServer extends Server {
private void edit(UUID player, ObjectMap edit, boolean perma, Callback response) {
if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace();
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketEditServer(player, getName(), edit, perma, data -> {
+ ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketEditServer(player, getName(), edit, perma, data -> {
try {
if (data.getInt(0x0001) != 0) {
response.run(data.getInt(0x0001) * -1);
diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketLinkServer.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketLinkServer.java
index 18cfadfa..b17fd479 100644
--- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketLinkServer.java
+++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketLinkServer.java
@@ -15,9 +15,10 @@ import org.bukkit.Bukkit;
*/
public class PacketLinkServer implements PacketObjectIn, PacketObjectOut {
private SubPlugin plugin;
+ private int channel;
/**
- * New PacketLinkServer
+ * New PacketLinkServer (In)
*
* @param plugin SubServers.Client
*/
@@ -25,12 +26,24 @@ public class PacketLinkServer implements PacketObjectIn, PacketObjectOu
if (Util.isNull(plugin)) throw new NullPointerException();
this.plugin = plugin;
}
+ /**
+ * New PacketLinkServer (Out)
+ *
+ * @param plugin SubServers.Client
+ * @param channel Channel ID
+ */
+ public PacketLinkServer(SubPlugin plugin, int channel) {
+ if (Util.isNull(plugin)) throw new NullPointerException();
+ this.plugin = plugin;
+ this.channel = channel;
+ }
@Override
public ObjectMap send(SubDataClient client) {
ObjectMap json = new ObjectMap();
if (plugin.api.getName() != null) json.set(0x0000, plugin.api.getName());
json.set(0x0001, Bukkit.getServer().getPort());
+ json.set(0x0002, channel);
return json;
}
@@ -41,8 +54,10 @@ public class PacketLinkServer implements PacketObjectIn, PacketObjectOu
if (data.contains(0x0000)) {
Util.reflect(SubAPI.class.getDeclaredField("name"), plugin.api, data.getRawString(0x0000));
}
- client.sendPacket(new PacketDownloadLang());
- Bukkit.getPluginManager().callEvent(new SubNetworkConnectEvent(client));
+ if (SubAPI.getInstance().getSubDataNetwork()[0] == client) {
+ client.sendPacket(new PacketDownloadLang());
+ Bukkit.getPluginManager().callEvent(new SubNetworkConnectEvent(client));
+ }
} catch (Exception e) {}
} else {
Bukkit.getLogger().info("SubData > Could not link name with server" + ((data.contains(0x0002))?": "+data.getRawString(0x0002):'.'));
diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/SubProtocol.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/SubProtocol.java
index f10dba6d..b5b640de 100644
--- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/SubProtocol.java
+++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/SubProtocol.java
@@ -1,7 +1,9 @@
package net.ME1312.SubServers.Client.Bukkit.Network;
import net.ME1312.Galaxi.Library.Callback.Callback;
+import net.ME1312.Galaxi.Library.Util;
import net.ME1312.Galaxi.Library.Version.Version;
+import net.ME1312.SubData.Client.Library.DisconnectReason;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubData.Client.SubDataProtocol;
import net.ME1312.SubServers.Client.Bukkit.Event.SubNetworkDisconnectEvent;
@@ -11,7 +13,9 @@ import net.ME1312.SubServers.Client.Bukkit.SubPlugin;
import org.bukkit.Bukkit;
import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress;
+import java.util.HashMap;
import java.util.logging.Handler;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
@@ -110,16 +114,56 @@ public class SubProtocol extends SubDataProtocol {
return instance;
}
+ @Override
+ protected SubDataClient openChannel(Callback scheduler, Logger logger, InetAddress address, int port) throws IOException {
+ SubPlugin plugin = SubAPI.getInstance().getInternals();
+ SubDataClient subdata = super.open(scheduler, logger, address, port);
+ HashMap map = Util.getDespiteException(() -> Util.reflect(SubPlugin.class.getDeclaredField("subdata"), plugin), null);
+
+ int channel = 1;
+ while (map.keySet().contains(channel)) channel++;
+ final int fc = channel;
+
+ map.put(fc, subdata);
+ subdata.on.ready(client -> ((SubDataClient) client).sendPacket(new PacketLinkServer(plugin, fc)));
+ subdata.on.closed(client -> map.remove(fc));
+
+ return subdata;
+ }
+
@SuppressWarnings("deprecation")
@Override
public SubDataClient open(Callback scheduler, Logger logger, InetAddress address, int port) throws IOException {
- SubDataClient subdata = super.open(scheduler, logger, address, port);
SubPlugin plugin = SubAPI.getInstance().getInternals();
+ SubDataClient subdata = super.open(scheduler, logger, address, port);
+ HashMap map = Util.getDespiteException(() -> Util.reflect(SubPlugin.class.getDeclaredField("subdata"), plugin), null);
- subdata.on.ready(client -> ((SubDataClient) client).sendPacket(new PacketLinkServer(plugin)));
+ subdata.on.ready(client -> ((SubDataClient) client).sendPacket(new PacketLinkServer(plugin, 0)));
subdata.on.closed(client -> {
SubNetworkDisconnectEvent event = new SubNetworkDisconnectEvent(client.get(), client.name());
if (plugin.isEnabled()) Bukkit.getPluginManager().callEvent(event);
+ map.put(0, null);
+
+ int reconnect = plugin.config.get().getMap("Settings").getMap("SubData").getInt("Reconnect", 30);
+ if (Util.getDespiteException(() -> Util.reflect(SubPlugin.class.getDeclaredField("reconnect"), plugin), false) && reconnect > 0
+ && client.name() != DisconnectReason.PROTOCOL_MISMATCH && client.name() != DisconnectReason.ENCRYPTION_MISMATCH) {
+ Bukkit.getLogger().info("SubData > Attempting reconnect in " + reconnect + " seconds");
+ Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Util.reflect(SubPlugin.class.getDeclaredMethod("connect"), plugin);
+ } catch (InvocationTargetException e) {
+ if (e.getTargetException() instanceof IOException) {
+ Bukkit.getLogger().info("SubData > Connection was unsuccessful, retrying in " + reconnect + " seconds");
+ Bukkit.getScheduler().runTaskLater(plugin, this, reconnect * 20);
+ } else e.printStackTrace();
+ } catch (NoSuchMethodException | IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+ }, reconnect * 20);
+ }
});
return subdata;
diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubAPI.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubAPI.java
index 03dfb83c..92b35302 100644
--- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubAPI.java
+++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubAPI.java
@@ -14,7 +14,6 @@ import net.ME1312.SubServers.Client.Bukkit.Network.Packet.*;
import net.ME1312.SubData.Client.SubDataClient;
import org.bukkit.Bukkit;
-import javax.xml.ws.Response;
import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress;
import java.util.*;
@@ -80,7 +79,7 @@ public final class SubAPI {
public void getHosts(Callback