diff --git a/src/main/java/net/knarcraft/stargate/BungeeCoordListener.java b/src/main/java/net/knarcraft/stargate/BungeeCoordListener.java deleted file mode 100644 index 57fe488..0000000 --- a/src/main/java/net/knarcraft/stargate/BungeeCoordListener.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.knarcraft.stargate; - -import org.bukkit.entity.Player; -import org.bukkit.plugin.messaging.PluginMessageListener; - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.IOException; - -public class BungeeCoordListener implements PluginMessageListener { - - @Override - public void onPluginMessageReceived(String channel, Player unused, byte[] message) { - if (!Stargate.enableBungee || !channel.equals("BungeeCord")) return; - - // Get data from message - String inChannel; - byte[] data; - try { - DataInputStream in = new DataInputStream(new ByteArrayInputStream(message)); - inChannel = in.readUTF(); - short len = in.readShort(); - data = new byte[len]; - in.readFully(data); - } catch (IOException ex) { - Stargate.log.severe("[stargate] Error receiving BungeeCord message"); - ex.printStackTrace(); - return; - } - - // Verify that it's an SGBungee packet - if (!inChannel.equals("SGBungee")) { - return; - } - - // Data should be player name, and destination gate name - String msg = new String(data); - String[] parts = msg.split("#@#"); - - String playerName = parts[0]; - String destination = parts[1]; - - // Check if the player is online, if so, teleport, otherwise, queue - Player player = Stargate.server.getPlayer(playerName); - if (player == null) { - Stargate.bungeeQueue.put(playerName.toLowerCase(), destination); - } else { - Portal dest = Portal.getBungeeGate(destination); - // Specified an invalid gate. For now we'll just let them connect at their current location - if (dest == null) { - Stargate.log.info("[stargate] Bungee gate " + destination + " does not exist"); - return; - } - dest.teleport(player, dest, null); - } - } - -} diff --git a/src/main/java/net/knarcraft/stargate/BungeeCordListener.java b/src/main/java/net/knarcraft/stargate/BungeeCordListener.java new file mode 100644 index 0000000..b4e4c43 --- /dev/null +++ b/src/main/java/net/knarcraft/stargate/BungeeCordListener.java @@ -0,0 +1,80 @@ +package net.knarcraft.stargate; + +import org.bukkit.entity.Player; +import org.bukkit.plugin.messaging.PluginMessageListener; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; + +/** + * This listener teleports a user if a valid message is received from BungeeCord + * + *
Specifically, if a string starts with SGBungee encoded to be readable by readUTF followed by + * PlayerName#@#DestinationPortal is received on the BungeeCord channel, this listener will teleport the player to the + * destination portal.
+ */ +public class BungeeCordListener implements PluginMessageListener { + + @Override + public void onPluginMessageReceived(String channel, Player unused, byte[] message) { + if (!Stargate.enableBungee || !channel.equals("BungeeCord")) { + return; + } + + String receivedMessage = readPluginMessage(message); + if (receivedMessage == null) { + return; + } + + String[] messageParts = receivedMessage.split("#@#"); + + String playerName = messageParts[0]; + String destination = messageParts[1]; + + // Check if the player is online, if so, teleport, otherwise, queue + Player player = Stargate.server.getPlayer(playerName); + if (player == null) { + Stargate.bungeeQueue.put(playerName.toLowerCase(), destination); + } else { + Portal destinationPortal = Portal.getBungeeGate(destination); + // Specified an invalid gate. For now we'll just let them connect at their current location + if (destinationPortal == null) { + Stargate.log.info("[stargate] Bungee gate " + destination + " does not exist"); + return; + } + destinationPortal.teleport(player, destinationPortal, null); + } + } + + /** + * Reads a plugin message byte array to a string + * @param messageThe byte array to read
+ * @returnThe message contained in the byte array
+ */ + private String readPluginMessage(byte[] message) { + // Get data from message + String inChannel; + byte[] data; + try { + DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(message)); + inChannel = dataInputStream.readUTF(); + short dataLength = dataInputStream.readShort(); + data = new byte[dataLength]; + dataInputStream.readFully(data); + } catch (IOException ex) { + Stargate.log.severe("[stargate] Error receiving BungeeCord message"); + ex.printStackTrace(); + return null; + } + + // Verify that it's an SGBungee packet + if (!inChannel.equals("SGBungee")) { + return null; + } + + // Data should be player name, and destination gate name + return new String(data); + } + +}