diff --git a/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/BungeeCommon.java b/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/BungeeCommon.java index 0f583f7c..b39613e2 100644 --- a/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/BungeeCommon.java +++ b/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/BungeeCommon.java @@ -12,10 +12,12 @@ * BungeeCord Common Layout Class */ public abstract class BungeeCommon extends BungeeCord { + private static BungeeCommon instance; final ReturnRunnable api; protected BungeeCommon(ReturnRunnable api) throws IOException { this.api = api; + instance = this; } /** @@ -31,4 +33,13 @@ protected BungeeCommon(ReturnRunnable api) throws IOException { * @return Server Map Copy */ public abstract Map getServersCopy(); + + /** + * Gets the ProxyServer Common Object + * + * @return ProxyServer Common + */ + public static BungeeCommon getInstance() { + return instance; + } } diff --git a/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/Library/Compatibility/RPSI.java b/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/Library/Compatibility/RPSI.java new file mode 100644 index 00000000..1e289d5f --- /dev/null +++ b/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/Library/Compatibility/RPSI.java @@ -0,0 +1,53 @@ +package net.ME1312.SubServers.Bungee.Library.Compatibility; + +import net.ME1312.Galaxi.Library.Callback.Callback; + +import net.md_5.bungee.api.chat.BaseComponent; + +import java.util.UUID; + +/** + * RemotePlayer Static Implementation Layout Class + */ +public abstract class RPSI { + protected static RPSI instance; + protected RPSI() { + if (instance == null) instance = this; + } + + /** + * Sends messages to this player + * + * @param players Players to send to + * @param messages Messages to send + * @param response Success Status + */ + protected abstract void sendMessage(UUID[] players, String[] messages, Callback response); + + /** + * Sends messages to this player + * + * @param players Players to send to + * @param messages Messages to send + * @param response Success Status + */ + protected abstract void sendMessage(UUID[] players, BaseComponent[] messages, Callback response); + + /** + * Transfers this player to another server + * + * @param players Players to send to + * @param server Target server + * @param response Success Status + */ + protected abstract void transfer(UUID[] players, String server, Callback response); + + /** + * Disconnects this player from the network + * + * @param players Players to send to + * @param reason Disconnect Reason + * @param response Success status + */ + protected abstract void disconnect(UUID[] players, String reason, Callback response); +} diff --git a/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/Library/Compatibility/RemotePlayer.java b/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/Library/Compatibility/RemotePlayer.java index 1d0c16e0..ca903800 100644 --- a/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/Library/Compatibility/RemotePlayer.java +++ b/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/Library/Compatibility/RemotePlayer.java @@ -3,15 +3,14 @@ import net.ME1312.Galaxi.Library.Callback.Callback; import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; import java.net.InetSocketAddress; -import java.util.Arrays; -import java.util.LinkedList; import java.util.UUID; +import static net.ME1312.SubServers.Bungee.Library.Compatibility.RPSI.instance; + /** * RemotePlayer Layout Class */ @@ -66,6 +65,35 @@ public interface RemotePlayer { */ ServerInfo getServer(); + /** + * Sends messages to all players + * + * @param messages Messages to send + */ + static void broadcastMessage(String... messages) { + broadcastMessage(messages, i -> {}); + } + + /** + * Sends messages to all players + * + * @param message Message to send + * @param response Success Status + */ + static void broadcastMessage(String message, Callback response) { + broadcastMessage(new String[]{ message }, response); + } + + /** + * Sends messages to all players + * + * @param messages Messages to send + * @param response Success Status + */ + static void broadcastMessage(String[] messages, Callback response) { + sendMessage(null, messages, response); + } + /** * Sends messages to this player * @@ -91,7 +119,67 @@ default void sendMessage(String message, Callback response) { * @param messages Messages to send * @param response Success Status */ - void sendMessage(String[] messages, Callback response); + default void sendMessage(String[] messages, Callback response) { + sendMessage(new UUID[]{ getUniqueId() }, messages, response); + } + + /** + * Sends messages to this player + * + * @param messages Messages to send + */ + static void sendMessage(UUID[] players, String... messages) { + sendMessage(players, messages, i -> {}); + } + + /** + * Sends messages to this player + * + * @param message Message to send + * @param response Success Status + */ + static void sendMessage(UUID[] players, String message, Callback response) { + sendMessage(players, new String[]{ message }, response); + } + + /** + * Sends messages to this player + * + * @param messages Messages to send + * @param response Success Status + */ + static void sendMessage(UUID[] players, String[] messages, Callback response) { + instance.sendMessage(players, messages, response); + } + + /** + * Sends messages to all players + * + * @param messages Messages to send + */ + static void broadcastMessage(BaseComponent... messages) { + broadcastMessage(messages, i -> {}); + } + + /** + * Sends messages to all players + * + * @param message Message to send + * @param response Success Status + */ + static void broadcastMessage(BaseComponent message, Callback response) { + broadcastMessage(new BaseComponent[]{ message }, response); + } + + /** + * Sends messages to all players + * + * @param messages Messages to send + * @param response Success Status + */ + static void broadcastMessage(BaseComponent[] messages, Callback response) { + sendMessage(null, messages, response); + } /** * Sends messages to this player @@ -118,7 +206,41 @@ default void sendMessage(BaseComponent message, Callback response) { * @param messages Messages to send * @param response Success Status */ - void sendMessage(BaseComponent[] messages, Callback response); + default void sendMessage(BaseComponent[] messages, Callback response) { + sendMessage(new UUID[]{ getUniqueId() }, messages, response); + } + + /** + * Sends messages to this player + * + * @param players Players to select + * @param messages Messages to send + */ + static void sendMessage(UUID[] players, BaseComponent... messages) { + sendMessage(players, messages, i -> {}); + } + + /** + * Sends messages to this player + * + * @param players Players to select + * @param message Message to send + * @param response Success Status + */ + static void sendMessage(UUID[] players, BaseComponent message, Callback response) { + sendMessage(players, new BaseComponent[]{ message }, response); + } + + /** + * Sends messages to this player + * + * @param players Players to select + * @param message Message to send + * @param response Success Status + */ + static void sendMessage(UUID[] players, BaseComponent[] message, Callback response) { + instance.sendMessage(players, message, response); + } /** * Transfers this player to another server @@ -135,7 +257,30 @@ default void transfer(String server) { * @param server Target server * @param response Success status */ - void transfer(String server, Callback response); + default void transfer(String server, Callback response) { + transfer(new UUID[]{ getUniqueId() }, server, response); + } + + /** + * Transfers this player to another server + * + * @param players Players to select + * @param server Target server + */ + static void transfer(UUID[] players, String server) { + transfer(players, server, i -> {}); + } + + /** + * Transfers this player to another server + * + * @param players Players to select + * @param server Target server + * @param response Success status + */ + static void transfer(UUID[] players, String server, Callback response) { + instance.transfer(players, server, response); + } /** * Transfers this player to another server @@ -152,13 +297,36 @@ default void transfer(ServerInfo server) { * @param server Target server * @param response Success status */ - void transfer(ServerInfo server, Callback response); + default void transfer(ServerInfo server, Callback response) { + transfer(new UUID[]{ getUniqueId() }, server, response); + } + + /** + * Transfers this player to another server + * + * @param players Players to select + * @param server Target server + */ + static void transfer(UUID[] players, ServerInfo server) { + transfer(players, server, i -> {}); + } + + /** + * Transfers this player to another server + * + * @param players Players to select + * @param server Target server + * @param response Success status + */ + static void transfer(UUID[] players, ServerInfo server, Callback response) { + instance.transfer(players, server.getName(), response); + } /** * Disconnects this player from the network */ default void disconnect() { - disconnect(i -> {}); + disconnect((String) null); } /** @@ -167,7 +335,7 @@ default void disconnect() { * @param response Success status */ default void disconnect(Callback response) { - disconnect(null, response); + disconnect((String) null, response); } /** @@ -185,5 +353,47 @@ default void disconnect(String reason) { * @param reason Disconnect Reason * @param response Success status */ - void disconnect(String reason, Callback response); + default void disconnect(String reason, Callback response) { + disconnect(new UUID[]{ getUniqueId() }, reason, response); + } + + /** + * Disconnects this player from the network + * + * @param players Players to select + */ + static void disconnect(UUID... players) { + disconnect(players, (String) null); + } + + /** + * Disconnects this player from the network + * + * @param players Players to select + * @param response Success status + */ + static void disconnect(UUID[] players, Callback response) { + disconnect(players, null, response); + } + + /** + * Disconnects this player from the network + * + * @param players Players to select + * @param reason Disconnect Reason + */ + static void disconnect(UUID[] players, String reason) { + disconnect(players, reason, i -> {}); + } + + /** + * Disconnects this player from the network + * + * @param players Players to select + * @param reason Disconnect Reason + * @param response Success status + */ + static void disconnect(UUID[] players, String reason, Callback response) { + instance.disconnect(players, reason, response); + } } 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 f6a30e9f..d737b6d6 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 @@ -160,8 +160,8 @@ public SubCreator getCreator() { @Override public SubServer getSubServer(String name) { - if (Util.isNull(name)) throw new NullPointerException(); - return getSubServers().get(name.toLowerCase()); + if (Util.isNull(name)) return null; + return servers.get(name.toLowerCase()); } @Override diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java index 8217459d..4cc0a27f 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java @@ -94,8 +94,8 @@ public SubCreator getCreator() { @Override public SubServer getSubServer(String name) { - if (Util.isNull(name)) throw new NullPointerException(); - return getSubServers().get(name.toLowerCase()); + if (Util.isNull(name)) return null; + return servers.get(name.toLowerCase()); } @Override diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/RemotePlayer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/RemotePlayer.java index 860caa03..37b0248f 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/RemotePlayer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/RemotePlayer.java @@ -1,15 +1,16 @@ package net.ME1312.SubServers.Bungee.Host; import net.ME1312.Galaxi.Library.Callback.Callback; +import net.ME1312.Galaxi.Library.Container.ContainedPair; import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubData.Server.SubDataClient; import net.ME1312.SubData.Server.SubDataSerializable; -import net.ME1312.SubServers.Bungee.Network.Packet.PacketExDisconnectPlayer; -import net.ME1312.SubServers.Bungee.Network.Packet.PacketExMessagePlayer; -import net.ME1312.SubServers.Bungee.Network.Packet.PacketExTransferPlayer; +import net.ME1312.SubServers.Bungee.Library.Compatibility.RPSI; +import net.ME1312.SubServers.Bungee.Network.Packet.*; import net.ME1312.SubServers.Bungee.SubAPI; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; @@ -17,6 +18,7 @@ import java.lang.reflect.InvocationTargetException; import java.net.InetSocketAddress; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.UUID; @@ -78,6 +80,10 @@ public ProxiedPlayer get() { return local; } + private static ProxiedPlayer get(UUID player) { + return ProxyServer.getInstance().getPlayer(player); + } + @Override public UUID getUniqueId() { if (local != null) { @@ -133,119 +139,29 @@ public String getServerName() { return (server == null)? null : server.getName(); } - @Override - public void sendMessage(String[] messages, Callback response) { - if (local != null) { - local.sendMessages(messages); - response.run(0); - } else { - SubDataClient client = getProxyConnection(); - if (client != null) { - StackTraceElement[] origin = new Exception().getStackTrace(); - client.sendPacket(new PacketExMessagePlayer(getUniqueId(), Arrays.asList(messages), null, data -> { - try { - response.run(data.getInt(0x0001)); - } catch (Throwable e) { - Throwable ew = new InvocationTargetException(e); - ew.setStackTrace(origin); - ew.printStackTrace(); - } - })); - } else response.run(4); - } - } - - @Override - public void sendMessage(BaseComponent[] messages, Callback response) { - if (local != null) { - local.sendMessage(messages); - response.run(0); - } else { - SubDataClient client = getProxyConnection(); - if (client != null) { - StackTraceElement[] origin = new Exception().getStackTrace(); - client.sendPacket(new PacketExMessagePlayer(getUniqueId(), null, Collections.singletonList(ComponentSerializer.toString(messages)), data -> { - try { - response.run(data.getInt(0x0001)); - } catch (Throwable e) { - Throwable ew = new InvocationTargetException(e); - ew.setStackTrace(origin); - ew.printStackTrace(); - } - })); - } else response.run(4); - } - } - - @Override - public void transfer(String server, Callback response) { - if (local != null) { - Server info = SubAPI.getInstance().getServer(server); - if (info != null) { - local.connect(info); - response.run(0); - } else response.run(1); - } else { - SubDataClient client = getProxyConnection(); - if (client != null) { - StackTraceElement[] origin = new Exception().getStackTrace(); - client.sendPacket(new PacketExTransferPlayer(getUniqueId(), server, data -> { - try { - response.run(data.getInt(0x0001)); - } catch (Throwable e) { - Throwable ew = new InvocationTargetException(e); - ew.setStackTrace(origin); - ew.printStackTrace(); - } - })); - } else response.run(4); - } - } - - @Override - public void transfer(ServerInfo server, Callback response) { - if (local != null) { - local.connect(server); - response.run(0); - } else { - SubDataClient client = getProxyConnection(); - if (client != null) { - StackTraceElement[] origin = new Exception().getStackTrace(); - client.sendPacket(new PacketExTransferPlayer(getUniqueId(), server.getName(), data -> { - try { - response.run(data.getInt(0x0001)); - } catch (Throwable e) { - Throwable ew = new InvocationTargetException(e); - ew.setStackTrace(origin); - ew.printStackTrace(); - } - })); - } else response.run(4); - } - } - - @Override - public void disconnect(String reason, Callback response) { - if (local != null) { - if (reason != null) { - local.disconnect(reason); - } else local.disconnect(); - response.run(0); - } else { - SubDataClient client = getProxyConnection(); - if (client != null) { - StackTraceElement[] origin = new Exception().getStackTrace(); - client.sendPacket(new PacketExDisconnectPlayer(getUniqueId(), reason, data -> { - try { - response.run(data.getInt(0x0001)); - } catch (Throwable e) { - Throwable ew = new InvocationTargetException(e); - ew.setStackTrace(origin); - ew.printStackTrace(); - } - })); - } else response.run(4); - } + static { + // These overrides provide for the static methods in BungeeCommon + new RPSI() { + @Override + protected void sendMessage(UUID[] players, String[] messages, Callback response) { + PacketMessagePlayer.run(Arrays.asList(players), new ContainedPair<>(messages, null), null, response); + } + + @Override + protected void sendMessage(UUID[] players, BaseComponent[] messages, Callback response) { + PacketMessagePlayer.run(Arrays.asList(players), new ContainedPair<>(null, messages), null, response); + } + + @Override + protected void transfer(UUID[] players, String server, Callback response) { + PacketTransferPlayer.run(Arrays.asList(players), server, response); + } + + @Override + protected void disconnect(UUID[] players, String reason, Callback response) { + PacketDisconnectPlayer.run(Arrays.asList(players), reason, response); + } + }; } @Override diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDisconnectPlayer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDisconnectPlayer.java index da69df70..5f2ec5b3 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDisconnectPlayer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketDisconnectPlayer.java @@ -1,33 +1,34 @@ package net.ME1312.SubServers.Bungee.Network.Packet; +import net.ME1312.Galaxi.Library.AsyncConsolidator; +import net.ME1312.Galaxi.Library.Callback.Callback; +import net.ME1312.Galaxi.Library.Container.Container; import net.ME1312.Galaxi.Library.Map.ObjectMap; -import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubData.Server.Protocol.PacketObjectIn; import net.ME1312.SubData.Server.Protocol.PacketObjectOut; import net.ME1312.SubData.Server.SubDataClient; +import net.ME1312.SubServers.Bungee.Host.Proxy; import net.ME1312.SubServers.Bungee.Host.RemotePlayer; -import net.ME1312.SubServers.Bungee.SubProxy; +import net.ME1312.SubServers.Bungee.Host.Server; +import net.ME1312.SubServers.Bungee.SubAPI; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.connection.ProxiedPlayer; -import java.util.UUID; +import java.util.*; /** * Disconnect Player Packet */ public class PacketDisconnectPlayer implements PacketObjectIn, PacketObjectOut { - private SubProxy plugin; private int response; private UUID tracker; /** * New PacketDisconnectPlayer (In) - * - * @param plugin SubPlugin */ - public PacketDisconnectPlayer(SubProxy plugin) { - if (Util.isNull(plugin)) throw new NullPointerException(); - this.plugin = plugin; + public PacketDisconnectPlayer() { + } /** @@ -52,32 +53,50 @@ public ObjectMap send(SubDataClient client) { @Override public void receive(SubDataClient client, ObjectMap data) { UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null); - try { - UUID id = data.getUUID(0x0001); + run(data.getUUIDList(0x0001), data.contains(0x0002)?data.getRawString(0x0002):null, i -> { + client.sendPacket(new PacketDisconnectPlayer(i, tracker)); + }); + } - ProxiedPlayer local; - RemotePlayer remote; - if ((local = plugin.getPlayer(id)) != null) { - if (data.contains(0x0002)) { - local.disconnect(data.getRawString(0x0002)); + @SuppressWarnings("deprecation") + public static void run(List ids, String reason, Callback callback) { + try { + Container failures = new Container<>(0); + HashMap> requests = new HashMap>(); + for (UUID id : ids) { + ProxiedPlayer local; + RemotePlayer remote; + if ((local = ProxyServer.getInstance().getPlayer(id)) != null) { + if (reason != null) { + local.disconnect(reason); + } else local.disconnect(); + } else if ((remote = SubAPI.getInstance().getRemotePlayer(id)) != null && remote.getProxy().getSubData()[0] != null) { + Proxy proxy = remote.getProxy(); + List list = requests.getOrDefault(proxy, new ArrayList<>()); + list.add(id); + requests.put(proxy, list); } else { - local.disconnect(); + ++failures.value; } - client.sendPacket(new PacketDisconnectPlayer(0, tracker)); - } else if ((remote = plugin.api.getRemotePlayer(id)) != null) { - if (remote.getProxy().getSubData()[0] != null) { - ((SubDataClient) remote.getProxy().getSubData()[0]).sendPacket(new PacketExDisconnectPlayer(remote.getUniqueId(), (data.contains(0x0002)?data.getRawString(0x0002):null), r -> { - client.sendPacket(new PacketDisconnectPlayer(r.getInt(0x0001), tracker)); + } + + if (requests.size() == 0) { + callback.run(failures.value); + } else { + AsyncConsolidator merge = new AsyncConsolidator(() -> { + callback.run(failures.value); + }); + for (Map.Entry> entry : requests.entrySet()) { + merge.reserve(); + ((SubDataClient) entry.getKey().getSubData()[0]).sendPacket(new PacketExDisconnectPlayer(entry.getValue(), reason, r -> { + failures.value += r.getInt(0x0001); + merge.release(); })); - } else { - client.sendPacket(new PacketDisconnectPlayer(4, tracker)); } - } else { - client.sendPacket(new PacketDisconnectPlayer(3, tracker)); } } catch (Throwable e) { - client.sendPacket(new PacketDisconnectPlayer(2, tracker)); e.printStackTrace(); + callback.run(-1); } } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExDisconnectPlayer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExDisconnectPlayer.java index feff246f..d632ca1e 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExDisconnectPlayer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExDisconnectPlayer.java @@ -8,6 +8,7 @@ import net.ME1312.SubData.Server.SubDataClient; import java.util.HashMap; +import java.util.List; import java.util.UUID; /** @@ -15,7 +16,7 @@ */ public class PacketExDisconnectPlayer implements PacketObjectIn, PacketObjectOut { private static HashMap>[]> callbacks = new HashMap>[]>(); - private UUID player; + private List players; private String reason; private UUID id; @@ -27,14 +28,14 @@ public PacketExDisconnectPlayer() {} /** * New PacketExDisconnectPlayer (Out) * - * @param player Player + * @param players Players * @param reason Reason * @param callback Callbacks */ @SafeVarargs - public PacketExDisconnectPlayer(UUID player, String reason, Callback>... callback) { - if (Util.isNull(player, callback)) throw new NullPointerException(); - this.player = player; + public PacketExDisconnectPlayer(List players, String reason, Callback>... callback) { + if (Util.isNull(players, callback)) throw new NullPointerException(); + this.players = players; this.reason = reason; this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID); callbacks.put(id, callback); @@ -44,7 +45,7 @@ public PacketExDisconnectPlayer(UUID player, String reason, Callback send(SubDataClient client) { ObjectMap data = new ObjectMap(); data.set(0x0000, id); - data.set(0x0001, player); + data.set(0x0001, players); if (reason != null) data.set(0x0002, reason); return data; } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExMessagePlayer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExMessagePlayer.java index 66de98d0..8b33fdb6 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExMessagePlayer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExMessagePlayer.java @@ -16,7 +16,7 @@ */ public class PacketExMessagePlayer implements PacketObjectIn, PacketObjectOut { private static HashMap>[]> callbacks = new HashMap>[]>(); - private UUID player; + private List players; private List legacy, raw; private UUID id; @@ -28,15 +28,14 @@ public PacketExMessagePlayer() {} /** * New PacketExMessagePlayer (Out) * - * @param player Player + * @param players Players * @param legacy Messages (Legacy) * @param raw Messages (JSON) * @param callback Callbacks */ @SafeVarargs - public PacketExMessagePlayer(UUID player, List legacy, List raw, Callback>... callback) { - if (Util.isNull(player, callback)) throw new NullPointerException(); - this.player = player; + public PacketExMessagePlayer(List players, List legacy, List raw, Callback>... callback) { + this.players = players; this.legacy = legacy; this.raw = raw; this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID); @@ -47,7 +46,7 @@ public PacketExMessagePlayer(UUID player, List legacy, List raw, public ObjectMap send(SubDataClient client) { ObjectMap data = new ObjectMap(); data.set(0x0000, id); - data.set(0x0001, player); + if (players != null) data.set(0x0001, players); if (legacy != null) data.set(0x0002, legacy); if (raw != null) data.set(0x0003, raw); return data; diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExTransferPlayer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExTransferPlayer.java index df72d0f2..1bf4216e 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExTransferPlayer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExTransferPlayer.java @@ -8,6 +8,7 @@ import net.ME1312.SubData.Server.SubDataClient; import java.util.HashMap; +import java.util.List; import java.util.UUID; /** @@ -15,7 +16,7 @@ */ public class PacketExTransferPlayer implements PacketObjectIn, PacketObjectOut { private static HashMap>[]> callbacks = new HashMap>[]>(); - private UUID player; + private List players; private String server; private UUID id; @@ -27,14 +28,14 @@ public PacketExTransferPlayer() {} /** * New PacketExTransferPlayer (Out) * - * @param player Player + * @param players Players * @param server Server * @param callback Callbacks */ @SafeVarargs - public PacketExTransferPlayer(UUID player, String server, Callback>... callback) { - if (Util.isNull(player, callback)) throw new NullPointerException(); - this.player = player; + public PacketExTransferPlayer(List players, String server, Callback>... callback) { + if (Util.isNull(players, server, callback)) throw new NullPointerException(); + this.players = players; this.server = server; this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID); callbacks.put(id, callback); @@ -44,8 +45,8 @@ public PacketExTransferPlayer(UUID player, String server, Callback send(SubDataClient client) { ObjectMap data = new ObjectMap(); data.set(0x0000, id); - data.set(0x0001, player); - if (server != null) data.set(0x0002, server); + data.set(0x0001, players); + data.set(0x0002, server); return data; } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketMessagePlayer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketMessagePlayer.java index d3a87121..bc6fac5a 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketMessagePlayer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketMessagePlayer.java @@ -1,38 +1,38 @@ package net.ME1312.SubServers.Bungee.Network.Packet; +import net.ME1312.Galaxi.Library.AsyncConsolidator; +import net.ME1312.Galaxi.Library.Callback.Callback; +import net.ME1312.Galaxi.Library.Container.ContainedPair; +import net.ME1312.Galaxi.Library.Container.Container; import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubData.Server.Protocol.PacketObjectIn; import net.ME1312.SubData.Server.Protocol.PacketObjectOut; import net.ME1312.SubData.Server.SubDataClient; +import net.ME1312.SubServers.Bungee.Host.Proxy; import net.ME1312.SubServers.Bungee.Host.RemotePlayer; +import net.ME1312.SubServers.Bungee.SubAPI; import net.ME1312.SubServers.Bungee.SubProxy; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.chat.ComponentSerializer; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; -import java.util.UUID; +import java.util.*; /** * Message Player Packet */ public class PacketMessagePlayer implements PacketObjectIn, PacketObjectOut { - private SubProxy plugin; private int response; private UUID tracker; /** * New PacketMessagePlayer (In) - * - * @param plugin SubPlugin */ - public PacketMessagePlayer(SubProxy plugin) { - if (Util.isNull(plugin)) throw new NullPointerException(); - this.plugin = plugin; + public PacketMessagePlayer() { + } /** @@ -54,40 +54,91 @@ public ObjectMap send(SubDataClient client) { return json; } - @SuppressWarnings("deprecation") @Override public void receive(SubDataClient client, ObjectMap data) { UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null); + run(data.contains(0x0001)?data.getUUIDList(0x0001):null, null, data, i -> { + client.sendPacket(new PacketMessagePlayer(i, tracker)); + }); + } + + @SuppressWarnings("deprecation") + public static void run(List ids, ContainedPair message, ObjectMap data, Callback callback) { try { - UUID id = data.getUUID(0x0001); + Container failures = new Container<>(0); + HashMap> requests = new HashMap>(); + if (ids == null || ids.size() == 0) { + if (ProxyServer.getInstance().getPlayers().size() > 0) { + if (message == null) message = parseMessage(data); - ProxiedPlayer local; - RemotePlayer remote; - if ((local = plugin.getPlayer(id)) != null) { - if (data.contains(0x0002)) - local.sendMessages(data.getRawStringList(0x0002).toArray(new String[0])); - if (data.contains(0x0003)) { - List messages = data.getRawStringList(0x0003); - LinkedList components = new LinkedList(); - for (String message : messages) components.addAll(Arrays.asList(ComponentSerializer.parse(message))); - local.sendMessage(components.toArray(new BaseComponent[0])); + if (message.key != null) for (String s : message.key) + ProxyServer.getInstance().broadcast(s); + if (message.value != null) + ProxyServer.getInstance().broadcast(message.value); } - client.sendPacket(new PacketMessagePlayer(0, tracker)); - } else if ((remote = plugin.api.getRemotePlayer(id)) != null) { - if (remote.getProxy().getSubData()[0] != null) { - ((SubDataClient) remote.getProxy().getSubData()[0]).sendPacket(new PacketExMessagePlayer(remote.getUniqueId(), (data.contains(0x0002)?data.getRawStringList(0x0002):null), (data.contains(0x0003)?data.getRawStringList(0x0003):null), r -> { - client.sendPacket(new PacketMessagePlayer(r.getInt(0x0001), tracker)); - })); - } else { - client.sendPacket(new PacketMessagePlayer(4, tracker)); + for (Proxy proxy : SubAPI.getInstance().getProxies().values()) { + if (proxy.getPlayers().size() > 0) requests.put(proxy, null); } } else { - client.sendPacket(new PacketMessagePlayer(3, tracker)); + for (UUID id : ids) { + ProxiedPlayer local; + RemotePlayer remote; + if ((local = ProxyServer.getInstance().getPlayer(id)) != null) { + if (message == null) message = parseMessage(data); + if (message.key != null) + local.sendMessages(message.key); + if (message.value != null) + local.sendMessage(message.value); + } else if ((remote = SubAPI.getInstance().getRemotePlayer(id)) != null && remote.getProxy().getSubData()[0] != null) { + Proxy proxy = remote.getProxy(); + List list = requests.getOrDefault(proxy, new ArrayList<>()); + list.add(id); + requests.put(proxy, list); + } else { + ++failures.value; + } + } + } + + if (requests.size() == 0) { + callback.run(failures.value); + } else { + AsyncConsolidator merge = new AsyncConsolidator(() -> { + callback.run(failures.value); + }); + List legacy, raw; + if (data == null) { + legacy = (message.key != null?Arrays.asList(message.key):null); + raw = (message.value != null?Collections.singletonList(ComponentSerializer.toString(message.value)):null); + } else { + legacy = (data.contains(0x0002)?data.getRawStringList(0x0002):null); + raw = (data.contains(0x0003)?data.getRawStringList(0x0003):null); + } + for (Map.Entry> entry : requests.entrySet()) { + merge.reserve(); + ((SubDataClient) entry.getKey().getSubData()[0]).sendPacket(new PacketExMessagePlayer(entry.getValue(), legacy, raw, r -> { + failures.value += r.getInt(0x0001); + merge.release(); + })); + } } } catch (Throwable e) { - client.sendPacket(new PacketMessagePlayer(2, tracker)); e.printStackTrace(); + callback.run((ids == null || ids.size() == 0)? 1 : ids.size()); + } + } + + private static ContainedPair parseMessage(ObjectMap data) { + ContainedPair value = new ContainedPair<>(); + if (data.contains(0x0002)) + value.key = data.getRawStringList(0x0002).toArray(new String[0]); + if (data.contains(0x0003)) { + List messages = data.getRawStringList(0x0003); + LinkedList components = new LinkedList(); + for (String message : messages) components.addAll(Arrays.asList(ComponentSerializer.parse(message))); + value.value = components.toArray(new BaseComponent[0]); } + return value; } @Override diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketTransferPlayer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketTransferPlayer.java index 847caf81..4d96e664 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketTransferPlayer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketTransferPlayer.java @@ -1,34 +1,34 @@ package net.ME1312.SubServers.Bungee.Network.Packet; +import net.ME1312.Galaxi.Library.AsyncConsolidator; +import net.ME1312.Galaxi.Library.Callback.Callback; +import net.ME1312.Galaxi.Library.Container.Container; import net.ME1312.Galaxi.Library.Map.ObjectMap; -import net.ME1312.Galaxi.Library.Util; import net.ME1312.SubData.Server.Protocol.PacketObjectIn; import net.ME1312.SubData.Server.Protocol.PacketObjectOut; import net.ME1312.SubData.Server.SubDataClient; +import net.ME1312.SubServers.Bungee.Host.Proxy; import net.ME1312.SubServers.Bungee.Host.RemotePlayer; import net.ME1312.SubServers.Bungee.Host.Server; -import net.ME1312.SubServers.Bungee.SubProxy; +import net.ME1312.SubServers.Bungee.SubAPI; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.connection.ProxiedPlayer; -import java.util.UUID; +import java.util.*; /** * Transfer Player Packet */ public class PacketTransferPlayer implements PacketObjectIn, PacketObjectOut { - private SubProxy plugin; private int response; private UUID tracker; /** * New PacketTransferPlayer (In) - * - * @param plugin SubPlugin */ - public PacketTransferPlayer(SubProxy plugin) { - if (Util.isNull(plugin)) throw new NullPointerException(); - this.plugin = plugin; + public PacketTransferPlayer() { + } /** @@ -53,33 +53,50 @@ public ObjectMap send(SubDataClient client) { @Override public void receive(SubDataClient client, ObjectMap data) { UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null); - try { - UUID id = data.getUUID(0x0001); + run(data.getUUIDList(0x0001), data.getRawString(0x0002), i -> { + client.sendPacket(new PacketTransferPlayer(i, tracker)); + }); + } - ProxiedPlayer local; - RemotePlayer remote; - if ((local = plugin.getPlayer(id)) != null) { - Server server; - if (data.contains(0x0002) && (server = plugin.api.getServer(data.getRawString(0x0002))) != null) { - local.connect(server); - client.sendPacket(new PacketTransferPlayer(0, tracker)); + public static void run(List ids, String name, Callback callback) { + try { + Container failures = new Container<>(0); + HashMap> requests = new HashMap>(); + Server server = SubAPI.getInstance().getServer(name); + for (UUID id : ids) { + ProxiedPlayer local; + RemotePlayer remote; + if ((local = ProxyServer.getInstance().getPlayer(id)) != null) { + if (name != null) { + local.connect(server); + } else ++failures.value; + } else if ((remote = SubAPI.getInstance().getRemotePlayer(id)) != null && remote.getProxy().getSubData()[0] != null) { + Proxy proxy = remote.getProxy(); + List list = requests.getOrDefault(proxy, new ArrayList<>()); + list.add(id); + requests.put(proxy, list); } else { - client.sendPacket(new PacketTransferPlayer(1, tracker)); + ++failures.value; } - } else if ((remote = plugin.api.getRemotePlayer(id)) != null) { - if (remote.getProxy().getSubData()[0] != null) { - ((SubDataClient) remote.getProxy().getSubData()[0]).sendPacket(new PacketExTransferPlayer(remote.getUniqueId(), (data.contains(0x0002)?data.getRawString(0x0002):null), r -> { - client.sendPacket(new PacketTransferPlayer(r.getInt(0x0001), tracker)); + } + + if (requests.size() == 0) { + callback.run(failures.value); + } else { + AsyncConsolidator merge = new AsyncConsolidator(() -> { + callback.run(failures.value); + }); + for (Map.Entry> entry : requests.entrySet()) { + merge.reserve(); + ((SubDataClient) entry.getKey().getSubData()[0]).sendPacket(new PacketExTransferPlayer(entry.getValue(), name, r -> { + failures.value += r.getInt(0x0001); + merge.release(); })); - } else { - client.sendPacket(new PacketTransferPlayer(4, tracker)); } - } else { - client.sendPacket(new PacketTransferPlayer(3, tracker)); } } catch (Throwable e) { - client.sendPacket(new PacketTransferPlayer(2, tracker)); e.printStackTrace(); + callback.run(-1); } } 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 a83cb5da..7756a7d2 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubProtocol.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubProtocol.java @@ -89,9 +89,9 @@ protected SubProtocol() { registerPacket(0x0038, new PacketRemoveServer(plugin)); registerPacket(0x0039, new PacketDeleteServer(plugin)); //registerPacket(0x003A, new PacketRestoreServer(plugin)); // TODO - registerPacket(0x003B, new PacketTransferPlayer(plugin)); - registerPacket(0x003C, new PacketDisconnectPlayer(plugin)); - registerPacket(0x003D, new PacketMessagePlayer(plugin)); + registerPacket(0x003B, new PacketTransferPlayer()); + registerPacket(0x003C, new PacketDisconnectPlayer()); + registerPacket(0x003D, new PacketMessagePlayer()); // 50-6F: External Host Packets diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java index 42027e4f..d57b6734 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java @@ -123,8 +123,8 @@ public Map getHosts() { * @return a Host */ public Host getHost(String name) { - if (Util.isNull(name)) throw new NullPointerException(); - return getHosts().get(name.toLowerCase()); + if (Util.isNull(name)) return null; + return plugin.hosts.get(name.toLowerCase()); } /** @@ -350,7 +350,7 @@ public Map> getLowercaseGroups() { * @return a Server Group */ public Pair> getGroup(String name) { - if (Util.isNull(name)) throw new NullPointerException(); + if (Util.isNull(name)) return null; for (Map.Entry> group : getLowercaseGroups().entrySet()) { if (group.getKey().equalsIgnoreCase(name)) return new ContainedPair<>(group.getKey(), group.getValue()); } @@ -378,8 +378,9 @@ public Map getServers() { * @return a Server */ public Server getServer(String name) { - if (Util.isNull(name)) throw new NullPointerException(); - return getServers().get(name.toLowerCase()); + if (Util.isNull(name)) return null; + Server server = plugin.exServers.getOrDefault(name.toLowerCase(), null); + return (server == null)? getSubServer(name) : server; } /** @@ -516,8 +517,13 @@ public Map getSubServers() { * @return a SubServer */ public SubServer getSubServer(String name) { - if (Util.isNull(name)) throw new NullPointerException(); - return getSubServers().get(name.toLowerCase()); + if (Util.isNull(name)) return null; + SubServer server; + for (Host host : plugin.hosts.values()) { + server = host.getSubServer(name); + if (server != null) return server; + } + return null; } /** @@ -536,8 +542,8 @@ public Map getProxies() { * @return a Proxy */ public Proxy getProxy(String name) { - if (Util.isNull(name)) throw new NullPointerException(); - Proxy proxy = getProxies().getOrDefault(name.toLowerCase(), null); + if (Util.isNull(name)) return null; + Proxy proxy = plugin.proxies.getOrDefault(name.toLowerCase(), null); if (proxy == null && plugin.mProxy != null && plugin.mProxy.getName().equalsIgnoreCase(name)) proxy = plugin.mProxy; return proxy; } @@ -594,7 +600,7 @@ public Map getRemotePlayers() { */ public RemotePlayer getRemotePlayer(String name) { if (Util.isNull(name)) throw new NullPointerException(); - for (RemotePlayer player : getRemotePlayers().values()) { + for (RemotePlayer player : plugin.rPlayers.values()) { if (player.getName().equalsIgnoreCase(name)) return player; } return null; @@ -608,7 +614,7 @@ public RemotePlayer getRemotePlayer(String name) { */ public RemotePlayer getRemotePlayer(UUID id) { if (Util.isNull(id)) throw new NullPointerException(); - return getRemotePlayers().getOrDefault(id, null); + return plugin.rPlayers.getOrDefault(id, null); } /** @@ -620,7 +626,7 @@ public RemotePlayer getRemotePlayer(UUID id) { */ public void setLang(String channel, String key, String value) { if (Util.isNull(channel, key, value)) throw new NullPointerException(); - LinkedHashMap map = (plugin.exLang.keySet().contains(channel.toLowerCase()))?plugin.exLang.get(channel.toLowerCase()):new LinkedHashMap(); + LinkedHashMap map = (plugin.exLang.containsKey(channel.toLowerCase()))?plugin.exLang.get(channel.toLowerCase()):new LinkedHashMap(); map.put(key, value); plugin.exLang.put(channel.toLowerCase(), map); } @@ -641,7 +647,7 @@ public Collection getLangChannels() { * @return Lang Value */ public Map getLang(String channel) { - if (Util.isNull(channel)) throw new NullPointerException(); + if (Util.isNull(channel)) return null; return new LinkedHashMap<>(plugin.exLang.get(channel.toLowerCase())); } @@ -680,7 +686,7 @@ public String signObject(Object object) { @SuppressWarnings("unchecked") public R getObjectBySignature(String signature) { if (Util.isNull(signature)) throw new NullPointerException(); - return (R) knownSignatures.get(signature); + return (R) knownSignatures.getOrDefault(signature, null); } /** diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java index 42d507e8..f2c8b0e6 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java @@ -110,6 +110,7 @@ public final class SubProxy extends BungeeCommon implements Listener { this.isPatched = isPatched; Logger.get("SubServers").info("Loading SubServers.Bungee v" + version.toString() + " Libraries (for Minecraft " + api.getGameVersion()[api.getGameVersion().length - 1] + ")"); + Util.isException(() -> new RemotePlayer(null)); // runs this.out = out; if (!(new UniversalFile(dir, "config.yml").exists())) { @@ -914,7 +915,11 @@ public Map getServersCopy() { */ @Override public ServerInfo getServerInfo(String name) { - return getServersCopy().get(name); + if (!ready) { + return getServersCopy().get(name); + } else { + return api.getServer(name); + } } @EventHandler(priority = Byte.MIN_VALUE) @@ -975,7 +980,7 @@ public void login(LoginEvent e) { ProxiedPlayer p = getPlayer(player.getUniqueId()); if (p != null) p.disconnect(new TextComponent(getTranslation("already_connected_proxy"))); } else if (player.getProxy().getSubData()[0] != null) { - ((SubDataClient) player.getProxy().getSubData()[0]).sendPacket(new PacketExDisconnectPlayer(player.getUniqueId(), getTranslation("already_connected_proxy"))); + ((SubDataClient) player.getProxy().getSubData()[0]).sendPacket(new PacketExDisconnectPlayer(Collections.singletonList(player.getUniqueId()), getTranslation("already_connected_proxy"))); } } } diff --git a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/Host.java b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/Host.java index b3c0f529..4f3b8a8f 100644 --- a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/Host.java +++ b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/Host.java @@ -189,11 +189,15 @@ public void getRemotePlayers(Callback> callback) { if (players == null) { LinkedList ids = new LinkedList(); - for (SubServer server : getSubServers().values()) for (Pair player : server.getRemotePlayers()) ids.add(player.value()); + HashMap servers = new HashMap(); + for (SubServer server : getSubServers().values()) for (Pair player : server.getRemotePlayers()) { + ids.add(player.value()); + servers.put(player.value(), server); + } client().sendPacket(new PacketDownloadPlayerInfo(ids, data -> { LinkedList players = new LinkedList(); for (String player : data.getKeys()) { - players.add(new RemotePlayer(data.getMap(player))); + players.add(RemotePlayer.st4tic.construct(servers.get(UUID.fromString(player)), data.getMap(player))); } this.players = players; diff --git a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/Proxy.java b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/Proxy.java index 3015d079..2451ea9a 100644 --- a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/Proxy.java +++ b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/Proxy.java @@ -149,7 +149,7 @@ public void getPlayers(Callback> callback) { client().sendPacket(new PacketDownloadPlayerInfo(ids, data -> { LinkedList players = new LinkedList(); for (String player : data.getKeys()) { - players.add(new RemotePlayer(data.getMap(player))); + players.add(RemotePlayer.st4tic.construct(this, data.getMap(player))); } this.players = players; diff --git a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/RemotePlayer.java b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/RemotePlayer.java index 5038c178..bb8dd019 100644 --- a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/RemotePlayer.java +++ b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/RemotePlayer.java @@ -16,6 +16,7 @@ * Simplified RemotePlayer Data Class */ public class RemotePlayer { + protected static StaticImpl st4tic = new StaticImpl(); ObjectMap raw; private Proxy proxy = null; private Server server = null; @@ -37,7 +38,7 @@ public RemotePlayer(ObjectMap raw) { * @param client SubData connection * @param raw Raw representation of the Remote Player */ - RemotePlayer(DataClient client, ObjectMap raw) { + protected RemotePlayer(DataClient client, ObjectMap raw) { this.client = client; load(raw); } @@ -167,6 +168,35 @@ public void getServer(Callback callback) { } } + /** + * Sends messages to all players + * + * @param messages Messages to send + */ + public static void broadcastMessage(String... messages) { + broadcastMessage(messages, i -> {}); + } + + /** + * Sends messages to all players + * + * @param message Message to send + * @param response Success Status + */ + public static void broadcastMessage(String message, Callback response) { + broadcastMessage(new String[]{ message }, response); + } + + /** + * Sends messages to all players + * + * @param messages Messages to send + * @param response Success Status + */ + public static void broadcastMessage(String[] messages, Callback response) { + sendMessage(null, messages, response); + } + /** * Sends messages to this player * @@ -193,16 +223,65 @@ public void sendMessage(String message, Callback response) { * @param response Success Status */ public void sendMessage(String[] messages, Callback response) { - StackTraceElement[] origin = new Exception().getStackTrace(); - client().sendPacket(new PacketMessagePlayer(getUniqueId(), messages, null, data -> { - try { - response.run(data.getInt(0x0001)); - } catch (Throwable e) { - Throwable ew = new InvocationTargetException(e); - ew.setStackTrace(origin); - ew.printStackTrace(); - } - })); + st4tic.sendMessage(client(), new UUID[]{ getUniqueId() }, messages, response); + } + + /** + * Sends messages to this player + * + * @param messages Messages to send + */ + public static void sendMessage(UUID[] players, String... messages) { + sendMessage(players, messages, i -> {}); + } + + /** + * Sends messages to this player + * + * @param message Message to send + * @param response Success Status + */ + public static void sendMessage(UUID[] players, String message, Callback response) { + sendMessage(players, new String[]{ message }, response); + } + + /** + * Sends messages to this player + * + * @param messages Messages to send + * @param response Success Status + */ + public static void sendMessage(UUID[] players, String[] messages, Callback response) { + st4tic.sendMessage(SimplifiedData.client(ClientAPI.getInstance().getSubDataNetwork()[0]), players, messages, response); + } + + /** + * Sends JSON format messages to all players + * + * @param messages Messages to send + */ + public static void broadcastRawMessage(String... messages) { + broadcastRawMessage(messages, i -> {}); + } + + /** + * Sends JSON format messages to all players + * + * @param message Message to send + * @param response Success Status + */ + public static void broadcastRawMessage(String message, Callback response) { + broadcastRawMessage(new String[]{ message }, response); + } + + /** + * Sends JSON format messages to all players + * + * @param messages Messages to send + * @param response Success Status + */ + public static void broadcastRawMessage(String[] messages, Callback response) { + sendRawMessage(null, messages, response); } /** @@ -227,20 +306,43 @@ public void sendRawMessage(String message, Callback response) { /** * Sends JSON format messages to this player * + * @param message Message to send + * @param response Success Status + */ + public void sendRawMessage(String[] message, Callback response) { + st4tic.sendRawMessage(client(), new UUID[]{ getUniqueId() }, message, response); + } + + /** + * Sends JSON format messages to this player + * + * @param players Players to select * @param messages Messages to send + */ + public static void sendRawMessage(UUID[] players, String... messages) { + sendRawMessage(players, messages, i -> {}); + } + + /** + * Sends JSON format messages to this player + * + * @param players Players to select + * @param message Message to send * @param response Success Status */ - public void sendRawMessage(String[] messages, Callback response) { - StackTraceElement[] origin = new Exception().getStackTrace(); - client().sendPacket(new PacketMessagePlayer(getUniqueId(), null, messages, data -> { - try { - response.run(data.getInt(0x0001)); - } catch (Throwable e) { - Throwable ew = new InvocationTargetException(e); - ew.setStackTrace(origin); - ew.printStackTrace(); - } - })); + public static void sendRawMessage(UUID[] players, String message, Callback response) { + sendRawMessage(players, new String[]{ message }, response); + } + + /** + * Sends JSON format messages to this player + * + * @param players Players to select + * @param message Message to send + * @param response Success Status + */ + public static void sendRawMessage(UUID[] players, String[] message, Callback response) { + st4tic.sendRawMessage(SimplifiedData.client(ClientAPI.getInstance().getSubDataNetwork()[0]), players, message, response); } /** @@ -259,42 +361,35 @@ public void transfer(String server) { * @param response Success status */ public void transfer(String server, Callback response) { - StackTraceElement[] origin = new Exception().getStackTrace(); - client().sendPacket(new PacketTransferPlayer(getUniqueId(), server, data -> { - try { - response.run(data.getInt(0x0001)); - } catch (Throwable e) { - Throwable ew = new InvocationTargetException(e); - ew.setStackTrace(origin); - ew.printStackTrace(); - } - })); + st4tic.transfer(client(), new UUID[]{ getUniqueId() }, server, response); } /** * Transfers this player to another server * + * @param players Players to select * @param server Target server */ - public void transfer(Server server) { - transfer(server, i -> {}); + public static void transfer(UUID[] players, String server) { + transfer(players, server, i -> {}); } /** * Transfers this player to another server * + * @param players Players to select * @param server Target server * @param response Success status */ - public void transfer(Server server, Callback response) { - transfer(server.getName(), response); + public static void transfer(UUID[] players, String server, Callback response) { + st4tic.transfer(SimplifiedData.client(ClientAPI.getInstance().getSubDataNetwork()[0]), players, server, response); } /** * Disconnects this player from the network */ public void disconnect() { - disconnect(i -> {}); + disconnect((String) null); } /** @@ -303,7 +398,7 @@ public void disconnect() { * @param response Success status */ public void disconnect(Callback response) { - disconnect(null, response); + disconnect((String) null, response); } /** @@ -322,16 +417,47 @@ public void disconnect(String reason) { * @param response Success status */ public void disconnect(String reason, Callback response) { - StackTraceElement[] origin = new Exception().getStackTrace(); - client().sendPacket(new PacketDisconnectPlayer(getUniqueId(), reason, data -> { - try { - response.run(data.getInt(0x0001)); - } catch (Throwable e) { - Throwable ew = new InvocationTargetException(e); - ew.setStackTrace(origin); - ew.printStackTrace(); - } - })); + st4tic.disconnect(client(), new UUID[]{ getUniqueId() }, reason, response); + } + + /** + * Disconnects this player from the network + * + * @param players Players to select + */ + public static void disconnect(UUID... players) { + disconnect(players, (String) null); + } + + /** + * Disconnects this player from the network + * + * @param players Players to select + * @param response Success status + */ + public static void disconnect(UUID[] players, Callback response) { + disconnect(players, null, response); + } + + /** + * Disconnects this player from the network + * + * @param players Players to select + * @param reason Disconnect Reason + */ + public static void disconnect(UUID[] players, String reason) { + disconnect(players, reason, i -> {}); + } + + /** + * Disconnects this player from the network + * + * @param players Players to select + * @param reason Disconnect Reason + * @param response Success status + */ + public static void disconnect(UUID[] players, String reason, Callback response) { + st4tic.disconnect(SimplifiedData.client(ClientAPI.getInstance().getSubDataNetwork()[0]), players, reason, response); } /** @@ -353,11 +479,134 @@ public ObjectMap getRaw() { } /** - * Get the raw representation of the Server - * - * @return Raw Server + * RemotePlayer Static Implementation Class */ - protected static ObjectMap raw(RemotePlayer player) { - return player.raw; + protected static class StaticImpl { + /** + * Create an API representation of a Remote Player + * + * @param raw Raw representation of the Remote Player + */ + protected final RemotePlayer construct(ObjectMap raw) { + return construct((DataClient) null, raw); + } + + /** + * Create an API representation of a Remote Player + * + * @param client SubData connection + * @param raw Raw representation of the Remote Player + */ + protected RemotePlayer construct(DataClient client, ObjectMap raw) { + return new RemotePlayer(client, raw); + } + + /** + * Create an API representation of a Remote Player + * + * @param server Server + * @param raw Raw representation of the Remote Player + */ + final RemotePlayer construct(Server server, ObjectMap raw) { + RemotePlayer player = new RemotePlayer(server.client, raw); + player.server = server; + return player; + } + + /** + * Create an API representation of a Remote Player + * + * @param proxy Proxy + * @param raw Raw representation of the Remote Player + */ + final RemotePlayer construct(Proxy proxy, ObjectMap raw) { + RemotePlayer player = new RemotePlayer(proxy.client, raw); + player.proxy = proxy; + return player; + } + + /** + * Sends messages to this player + * + * @param client SubData Connection + * @param players Players to send to + * @param messages Messages to send + * @param response Success Status + */ + protected void sendMessage(SubDataClient client, UUID[] players, String[] messages, Callback response) { + StackTraceElement[] origin = new Exception().getStackTrace(); + client.sendPacket(new PacketMessagePlayer(players, messages, null, data -> { + try { + response.run(data.getInt(0x0001)); + } catch (Throwable e) { + Throwable ew = new InvocationTargetException(e); + ew.setStackTrace(origin); + ew.printStackTrace(); + } + })); + } + + /** + * Sends JSON format messages to this player + * + * @param client SubData Connection + * @param players Players to send to + * @param messages Messages to send + * @param response Success Status + */ + protected void sendRawMessage(SubDataClient client, UUID[] players, String[] messages, Callback response) { + StackTraceElement[] origin = new Exception().getStackTrace(); + client.sendPacket(new PacketMessagePlayer(players, null, messages, data -> { + try { + response.run(data.getInt(0x0001)); + } catch (Throwable e) { + Throwable ew = new InvocationTargetException(e); + ew.setStackTrace(origin); + ew.printStackTrace(); + } + })); + } + + /** + * Transfers this player to another server + * + * @param client SubData Connection + * @param players Players to send to + * @param server Target server + * @param response Success Status + */ + protected void transfer(SubDataClient client, UUID[] players, String server, Callback response) { + StackTraceElement[] origin = new Exception().getStackTrace(); + client.sendPacket(new PacketTransferPlayer(players, server, data -> { + try { + response.run(data.getInt(0x0001)); + } catch (Throwable e) { + Throwable ew = new InvocationTargetException(e); + ew.setStackTrace(origin); + ew.printStackTrace(); + } + })); + } + + /** + * Disconnects this player from the network + * + * @param client SubData Connection + * @param players Players to send to + * @param reason Disconnect Reason + * @param response Success status + */ + protected void disconnect(SubDataClient client, UUID[] players, String reason, Callback response) { + StackTraceElement[] origin = new Exception().getStackTrace(); + client.sendPacket(new PacketDisconnectPlayer(players, reason, data -> { + try { + response.run(data.getInt(0x0001)); + } catch (Throwable e) { + Throwable ew = new InvocationTargetException(e); + ew.setStackTrace(origin); + ew.printStackTrace(); + } + })); + } } } diff --git a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/Server.java b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/Server.java index d18fcaf3..a4b20cd3 100644 --- a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/Server.java +++ b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/Server.java @@ -157,7 +157,7 @@ public void getRemotePlayers(Callback> callback) { client().sendPacket(new PacketDownloadPlayerInfo(ids, data -> { LinkedList players = new LinkedList(); for (String player : data.getKeys()) { - players.add(new RemotePlayer(data.getMap(player))); + players.add(RemotePlayer.st4tic.construct(this, data.getMap(player))); } this.players = players; diff --git a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/SimplifiedData.java b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/SimplifiedData.java index ad8aa3ff..69eeac36 100644 --- a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/SimplifiedData.java +++ b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/SimplifiedData.java @@ -334,7 +334,7 @@ public static void requestRemotePlayers(DataClient client, Callback) null, data -> { TreeMap players = new TreeMap(); for (String player : data.getKeys()) { - players.put(UUID.fromString(player), new RemotePlayer(client, data.getMap(player))); + players.put(UUID.fromString(player), RemotePlayer.st4tic.construct(client, data.getMap(player))); } try { @@ -360,7 +360,7 @@ public static void requestRemotePlayer(DataClient client, String name, Callback< client(client).sendPacket(new PacketDownloadPlayerInfo(Collections.singletonList(name), data -> { RemotePlayer player = null; if (data.getKeys().size() > 0) { - player = new RemotePlayer(client, data.getMap(new LinkedList(data.getKeys()).getFirst())); + player = RemotePlayer.st4tic.construct(client, data.getMap(new LinkedList(data.getKeys()).getFirst())); } try { @@ -386,7 +386,7 @@ public static void requestRemotePlayer(DataClient client, UUID id, Callback { RemotePlayer player = null; if (data.getKeys().size() > 0) { - player = new RemotePlayer(client, data.getMap(new LinkedList(data.getKeys()).getFirst())); + player = RemotePlayer.st4tic.construct(client, data.getMap(new LinkedList(data.getKeys()).getFirst())); } try { diff --git a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/SubServer.java b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/SubServer.java index 72390de1..c2c37ec0 100644 --- a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/SubServer.java +++ b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/API/SubServer.java @@ -64,7 +64,7 @@ public SubServer(ObjectMap raw) { * @param raw JSON representation of the SubServer */ SubServer(Host host, ObjectMap raw) { - super(host.client, raw); + this(host.client, raw); this.host = host; } diff --git a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/Packet/PacketDisconnectPlayer.java b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/Packet/PacketDisconnectPlayer.java index 7fe5185c..7ff5d7dc 100644 --- a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/Packet/PacketDisconnectPlayer.java +++ b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/Packet/PacketDisconnectPlayer.java @@ -15,7 +15,7 @@ */ public class PacketDisconnectPlayer implements PacketObjectIn, PacketObjectOut { private static HashMap>[]> callbacks = new HashMap>[]>(); - private UUID player; + private UUID[] players; private String reason; private UUID id; @@ -27,14 +27,14 @@ public PacketDisconnectPlayer() {} /** * New PacketDisconnectPlayer (Out) * - * @param player Player + * @param players Players * @param reason Reason * @param callback Callbacks */ @SafeVarargs - public PacketDisconnectPlayer(UUID player, String reason, Callback>... callback) { - if (Util.isNull(player, callback)) throw new NullPointerException(); - this.player = player; + public PacketDisconnectPlayer(UUID[] players, String reason, Callback>... callback) { + if (Util.isNull(players, callback)) throw new NullPointerException(); + this.players = players; this.reason = reason; this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID); callbacks.put(id, callback); @@ -44,7 +44,7 @@ public PacketDisconnectPlayer(UUID player, String reason, Callback send(SubDataSender client) { ObjectMap data = new ObjectMap(); data.set(0x0000, id); - data.set(0x0001, player); + data.set(0x0001, players); if (reason != null) data.set(0x0002, reason); return data; } diff --git a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/Packet/PacketMessagePlayer.java b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/Packet/PacketMessagePlayer.java index 342b2446..1ededdc9 100644 --- a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/Packet/PacketMessagePlayer.java +++ b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/Packet/PacketMessagePlayer.java @@ -15,7 +15,7 @@ */ public class PacketMessagePlayer implements PacketObjectIn, PacketObjectOut { private static HashMap>[]> callbacks = new HashMap>[]>(); - private UUID player; + private UUID[] players; private String[] legacy, raw; private UUID id; @@ -27,15 +27,14 @@ public PacketMessagePlayer() {} /** * New PacketMessagePlayer (Out) * - * @param player Player + * @param players Players * @param legacy Messages (Legacy) * @param raw Messages (JSON) * @param callback Callbacks */ @SafeVarargs - public PacketMessagePlayer(UUID player, String[] legacy, String[] raw, Callback>... callback) { - if (Util.isNull(player, callback)) throw new NullPointerException(); - this.player = player; + public PacketMessagePlayer(UUID[] players, String[] legacy, String[] raw, Callback>... callback) { + this.players = players; this.legacy = legacy; this.raw = raw; this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID); @@ -46,7 +45,7 @@ public PacketMessagePlayer(UUID player, String[] legacy, String[] raw, Callback< public ObjectMap send(SubDataSender client) { ObjectMap data = new ObjectMap(); data.set(0x0000, id); - data.set(0x0001, player); + if (players != null) data.set(0x0001, players); if (legacy != null) data.set(0x0002, legacy); if (raw != null) data.set(0x0003, raw); return data; diff --git a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/Packet/PacketTransferPlayer.java b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/Packet/PacketTransferPlayer.java index f5d1f855..e3fd7dda 100644 --- a/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/Packet/PacketTransferPlayer.java +++ b/SubServers.Client/Common/src/net/ME1312/SubServers/Client/Common/Network/Packet/PacketTransferPlayer.java @@ -15,7 +15,7 @@ */ public class PacketTransferPlayer implements PacketObjectIn, PacketObjectOut { private static HashMap>[]> callbacks = new HashMap>[]>(); - private UUID player; + private UUID[] players; private String server; private UUID id; @@ -27,14 +27,14 @@ public PacketTransferPlayer() {} /** * New PacketTransferPlayer (Out) * - * @param player Player + * @param players Players * @param server Server * @param callback Callbacks */ @SafeVarargs - public PacketTransferPlayer(UUID player, String server, Callback>... callback) { - if (Util.isNull(player, callback)) throw new NullPointerException(); - this.player = player; + public PacketTransferPlayer(UUID[] players, String server, Callback>... callback) { + if (Util.isNull(players, server)) throw new NullPointerException(); + this.players = players; this.server = server; this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID); callbacks.put(id, callback); @@ -44,7 +44,7 @@ public PacketTransferPlayer(UUID player, String server, Callback send(SubDataSender client) { ObjectMap data = new ObjectMap(); data.set(0x0000, id); - data.set(0x0001, player); + data.set(0x0001, players); if (server != null) data.set(0x0002, server); return data; } diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java index 47a68138..fce0cf4b 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java @@ -85,6 +85,7 @@ public final class ExProxy extends BungeeCommon implements Listener { this.isPatched = isPatched; Logger.get("SubServers").info("Loading SubServers.Sync v" + version.toString() + " Libraries (for Minecraft " + api.getGameVersion()[api.getGameVersion().length - 1] + ")"); + Util.isException(() -> new CachedPlayer((ProxiedPlayer) null)); // runs this.out = out; if (!(new UniversalFile(dir, "config.yml").exists())) { @@ -478,7 +479,7 @@ public void login(LoginEvent e) { ProxiedPlayer p = getPlayer(player.getUniqueId()); if (p != null) p.disconnect(new TextComponent(getTranslation("already_connected_proxy"))); } else { - ((SubDataClient) api.getSubDataNetwork()[0]).sendPacket(new PacketDisconnectPlayer(player.getUniqueId(), getTranslation("already_connected_proxy"))); + ((SubDataClient) api.getSubDataNetwork()[0]).sendPacket(new PacketDisconnectPlayer(new UUID[]{ player.getUniqueId() }, getTranslation("already_connected_proxy"))); } } } diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketExDisconnectPlayer.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketExDisconnectPlayer.java index cc8716c1..291f2c9e 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketExDisconnectPlayer.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketExDisconnectPlayer.java @@ -5,9 +5,11 @@ import net.ME1312.SubData.Client.Protocol.PacketObjectOut; import net.ME1312.SubData.Client.SubDataSender; import net.ME1312.SubServers.Sync.ExProxy; +import net.ME1312.SubServers.Sync.Server.ServerImpl; import net.md_5.bungee.api.connection.ProxiedPlayer; +import java.util.List; import java.util.UUID; /** @@ -44,25 +46,26 @@ public ObjectMap send(SubDataSender client) { return json; } + @SuppressWarnings("deprecation") @Override public void receive(SubDataSender client, ObjectMap data) { - UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null); + UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null); + List ids = data.getUUIDList(0x0001); try { - UUID id = data.getUUID(0x0001); - - ProxiedPlayer local; - if ((local = plugin.getPlayer(id)) != null) { - if (data.contains(0x0002)) { - local.disconnect(data.getRawString(0x0002)); + int failures = 0; + for (UUID id : ids) { + ProxiedPlayer local; + if ((local = plugin.getPlayer(id)) != null) { + if (data.contains(0x0002)) { + local.disconnect(data.getRawString(0x0002)); + } else local.disconnect(); } else { - local.disconnect(); + ++failures; } - client.sendPacket(new PacketExDisconnectPlayer(0, tracker)); - } else { - client.sendPacket(new PacketExDisconnectPlayer(3, tracker)); } + client.sendPacket(new PacketExDisconnectPlayer(failures, tracker)); } catch (Throwable e) { - client.sendPacket(new PacketExDisconnectPlayer(2, tracker)); + client.sendPacket(new PacketExDisconnectPlayer(ids.size(), tracker)); e.printStackTrace(); } } diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketExMessagePlayer.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketExMessagePlayer.java index 99addde6..5858fc84 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketExMessagePlayer.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketExMessagePlayer.java @@ -6,6 +6,7 @@ import net.ME1312.SubData.Client.SubDataSender; import net.ME1312.SubServers.Sync.ExProxy; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.chat.ComponentSerializer; @@ -52,26 +53,43 @@ public ObjectMap send(SubDataSender client) { @SuppressWarnings("deprecation") @Override public void receive(SubDataSender client, ObjectMap data) { - UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null); + UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null); + List ids = (data.contains(0x0001)?data.getUUIDList(0x0001):null); try { - UUID id = data.getUUID(0x0001); + String[] legacy = null; + BaseComponent[] components = null; - ProxiedPlayer local; - if ((local = plugin.getPlayer(id)) != null) { if (data.contains(0x0002)) - local.sendMessages(data.getRawStringList(0x0002).toArray(new String[0])); + legacy = data.getRawStringList(0x0002).toArray(new String[0]); if (data.contains(0x0003)) { List messages = data.getRawStringList(0x0003); - LinkedList components = new LinkedList(); - for (String message : messages) components.addAll(Arrays.asList(ComponentSerializer.parse(message))); - local.sendMessage(components.toArray(new BaseComponent[0])); + LinkedList list = new LinkedList(); + for (String message : messages) list.addAll(Arrays.asList(ComponentSerializer.parse(message))); + components = list.toArray(new BaseComponent[0]); } - client.sendPacket(new PacketExMessagePlayer(0, tracker)); - } else { - client.sendPacket(new PacketExMessagePlayer(3, tracker)); - } + + int failures = 0; + if (ids == null || ids.size() == 0) { + if (legacy != null) for (String s : legacy) + ProxyServer.getInstance().broadcast(s); + if (components != null) + ProxyServer.getInstance().broadcast(components); + } else { + for (UUID id : ids) { + ProxiedPlayer local; + if ((local = ProxyServer.getInstance().getPlayer(id)) != null) { + if (legacy != null) + local.sendMessages(legacy); + if (components != null) + local.sendMessage(components); + } else { + ++failures; + } + } + } + client.sendPacket(new PacketExMessagePlayer(failures, tracker)); } catch (Throwable e) { - client.sendPacket(new PacketExMessagePlayer(2, tracker)); + client.sendPacket(new PacketExMessagePlayer((ids == null || ids.size() == 0)? 1 : ids.size(), tracker)); e.printStackTrace(); } } diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketExTransferPlayer.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketExTransferPlayer.java index afdf5934..b3c60881 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketExTransferPlayer.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketExTransferPlayer.java @@ -50,27 +50,28 @@ public ObjectMap send(SubDataSender client) { return json; } - @SuppressWarnings("deprecation") @Override public void receive(SubDataSender client, ObjectMap data) { - UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null); + UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null); + List ids = data.getUUIDList(0x0001); try { - UUID id = data.getUUID(0x0001); - - ProxiedPlayer local; - if ((local = plugin.getPlayer(id)) != null) { - ServerImpl server; - if (data.contains(0x0002) && (server = plugin.servers.get(data.getRawString(0x0002).toLowerCase())) != null) { - local.connect(server); - client.sendPacket(new PacketExTransferPlayer(0, tracker)); - } else { - client.sendPacket(new PacketExTransferPlayer(1, tracker)); + ServerImpl server = plugin.servers.getOrDefault(data.getRawString(0x0002).toLowerCase(), null); + if (server != null) { + int failures = 0; + for (UUID id : ids) { + ProxiedPlayer local; + if ((local = plugin.getPlayer(id)) != null) { + local.connect(server); + } else { + ++failures; + } } + client.sendPacket(new PacketExTransferPlayer(failures, tracker)); } else { - client.sendPacket(new PacketExTransferPlayer(3, tracker)); + client.sendPacket(new PacketExTransferPlayer(ids.size(), tracker)); } } catch (Throwable e) { - client.sendPacket(new PacketExTransferPlayer(2, tracker)); + client.sendPacket(new PacketExTransferPlayer(ids.size(), tracker)); e.printStackTrace(); } } diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Server/CachedPlayer.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Server/CachedPlayer.java index b6c3254a..0c9e3d8c 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Server/CachedPlayer.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Server/CachedPlayer.java @@ -2,8 +2,10 @@ import net.ME1312.Galaxi.Library.Callback.Callback; import net.ME1312.Galaxi.Library.Map.ObjectMap; +import net.ME1312.SubData.Client.DataClient; +import net.ME1312.SubData.Client.SubDataClient; +import net.ME1312.SubServers.Bungee.Library.Compatibility.RPSI; import net.ME1312.SubServers.Client.Common.Network.API.RemotePlayer; -import net.ME1312.SubServers.Client.Common.Network.API.Server; import net.ME1312.SubServers.Sync.SubAPI; import net.md_5.bungee.api.ProxyServer; @@ -12,9 +14,7 @@ import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.chat.ComponentSerializer; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; +import java.util.*; /** * Cached RemotePlayer Data Class @@ -48,26 +48,31 @@ public CachedPlayer(ProxiedPlayer player) { } /** - * Cache a Remote Player + * Create a Cached Remote Player * - * @param player Remote Player + * @param raw Raw representation of the Remote Player */ - public CachedPlayer(RemotePlayer player) { - this(raw(player)); + public CachedPlayer(ObjectMap raw) { + this(null, raw); } /** * Create a Cached Remote Player * + * @param client SubData connection * @param raw Raw representation of the Remote Player */ - public CachedPlayer(ObjectMap raw) { - super(raw); + CachedPlayer(DataClient client, ObjectMap raw) { + super(client, raw); } @Override public ProxiedPlayer get() { - return ProxyServer.getInstance().getPlayer(getUniqueId()); + return get(getUniqueId()); + } + + private static ProxiedPlayer get(UUID player) { + return ProxyServer.getInstance().getPlayer(player); } @Override @@ -76,78 +81,140 @@ public ServerInfo getServer() { return (name == null)? null : ProxyServer.getInstance().getServerInfo(name); } - // These overrides prevent sending unnecessary packets - - @Override - public void sendMessage(String[] messages, Callback response) { - ProxiedPlayer local = get(); - if (local != null) { - local.sendMessages(messages); - response.run(0); - } else { - super.sendMessage(messages, response); - } - } - - @Override - public void sendMessage(BaseComponent[] messages, Callback response) { - ProxiedPlayer local = get(); - if (local != null) { - local.sendMessage(messages); - response.run(0); - } else { - super.sendRawMessage(new String[]{ComponentSerializer.toString(messages)}, response); - } - } - - @Override - public void sendRawMessage(String[] messages, Callback response) { - ProxiedPlayer local = get(); - if (local != null) { - LinkedList components = new LinkedList(); - for (String message : messages) components.addAll(Arrays.asList(ComponentSerializer.parse(message))); - local.sendMessage(components.toArray(new BaseComponent[0])); - response.run(0); - } else { - super.sendRawMessage(messages, response); - } - } - - @Override - public void transfer(String server, Callback response) { - ProxiedPlayer local = get(); - if (local != null) { - ServerImpl info = SubAPI.getInstance().getInternals().servers.get(server.toLowerCase()); - if (info != null) { - local.connect(info); - response.run(0); - } else response.run(1); - } else { - super.transfer(server, response); - } - } - - @Override - public void transfer(ServerInfo server, Callback response) { - ProxiedPlayer local = get(); - if (local != null) { - local.connect(server); - response.run(0); - } else { - super.transfer(server.getName(), response); - } - } - - @Override - public void disconnect(String reason, Callback response) { - ProxiedPlayer local = get(); - if (local != null) { - if (reason != null) { - local.disconnect(reason); - } else local.disconnect(); - response.run(0); - } else { - super.disconnect(reason, response); - } + static { + // These overrides provide for the static methods in BungeeCommon + new RPSI() { + @Override + protected void sendMessage(UUID[] players, String[] messages, Callback response) { + RemotePlayer.sendMessage(players, messages, response); + } + + @Override + protected void sendMessage(UUID[] players, BaseComponent[] messages, Callback response) { + RemotePlayer.sendRawMessage(players, ComponentSerializer.toString(messages), response); + } + + @Override + protected void transfer(UUID[] players, String server, Callback response) { + RemotePlayer.transfer(players, server, response); + } + + @Override + protected void disconnect(UUID[] players, String reason, Callback response) { + RemotePlayer.disconnect(players, reason, response); + } + }; + // These overrides prevent sending unnecessary packets in ClientCommon + st4tic = new StaticImpl() { + @Override + protected RemotePlayer construct(DataClient client, ObjectMap raw) { + return new CachedPlayer(client, raw); + } + + @Override + protected void sendMessage(SubDataClient client, UUID[] players, String[] messages, Callback response) { + if (players != null && players.length > 0) { + ArrayList ids = new ArrayList(); + for (UUID id : players) { + ProxiedPlayer local = get(id); + if (local != null) { + local.sendMessages(messages); + } else { + ids.add(id); + } + } + + if (ids.size() == 0) { + response.run(0); + } else { + super.sendMessage(client, ids.toArray(new UUID[0]), messages, response); + } + } else { + super.sendMessage(client, players, messages, response); + } + } + + @Override + protected void sendRawMessage(SubDataClient client, UUID[] players, String[] messages, Callback response) { + if (players != null && players.length > 0) { + ArrayList ids = new ArrayList(); + BaseComponent[] components = null; + for (UUID id : players) { + ProxiedPlayer local = get(id); + if (local != null) { + if (components == null) { + LinkedList list = new LinkedList(); + for (String message : messages) list.addAll(Arrays.asList(ComponentSerializer.parse(message))); + components = list.toArray(new BaseComponent[0]); + } + local.sendMessage(components); + } else { + ids.add(id); + } + } + + if (ids.size() == 0) { + response.run(0); + } else { + super.sendRawMessage(client, ids.toArray(new UUID[0]), messages, response); + } + } else { + super.sendRawMessage(client, players, messages, response); + } + } + + @Override + protected void transfer(SubDataClient client, UUID[] players, String server, Callback response) { + if (players != null && players.length > 0) { + ArrayList ids = new ArrayList(); + ServerImpl info = SubAPI.getInstance().getInternals().servers.get(server.toLowerCase()); + int failures = 0; + for (UUID id : players) { + ProxiedPlayer local = get(id); + if (local != null) { + if (info != null) { + local.connect(info); + } else ++failures; + } else { + ids.add(id); + } + } + + if (ids.size() == 0) { + response.run(failures); + } else { + final int ff = failures; + super.transfer(client, ids.toArray(new UUID[0]), server, i -> response.run(i + ff)); + } + } else { + super.transfer(client, players, server, response); + } + } + + @Override + protected void disconnect(SubDataClient client, UUID[] players, String reason, Callback response) { + if (players != null && players.length > 0) { + ArrayList ids = new ArrayList(); + for (UUID id : players) { + ProxiedPlayer local = get(id); + if (local != null) { + if (reason != null) { + local.disconnect(reason); + } else local.disconnect(); + } else { + ids.add(id); + } + } + + if (ids.size() == 0) { + response.run(0); + } else { + super.disconnect(client, ids.toArray(new UUID[0]), reason, response); + } + } else { + super.disconnect(client, players, reason, response); + } + } + }; } } diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubAPI.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubAPI.java index a73c007a..16c06ab9 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubAPI.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubAPI.java @@ -96,14 +96,6 @@ public Map getRemotePlayers() { return new HashMap(plugin.rPlayers); } - @Override - public void getRemotePlayers(Callback> callback) { - super.getRemotePlayers(map -> { - map.replaceAll((k, v) -> new CachedPlayer(v)); - callback.run(map); - }); - } - /** * Gets a player on this network by searching across all known proxies (Cached) * @@ -118,11 +110,6 @@ public CachedPlayer getRemotePlayer(String name) { return null; } - @Override - public void getRemotePlayer(String name, Callback callback) { - super.getRemotePlayer(name, p -> callback.run(new CachedPlayer(p))); - } - /** * Gets a player on this network by searching across all known proxies (Cached) * @@ -134,11 +121,6 @@ public CachedPlayer getRemotePlayer(UUID id) { return getRemotePlayers().getOrDefault(id, null); } - @Override - public void getRemotePlayer(UUID id, Callback callback) { - super.getRemotePlayer(id, p -> callback.run(new CachedPlayer(p))); - } - /** * Gets the SubData Network Connections *