Update to be compatible with the latest build of BungeeCord
This commit is contained in:
		
							
								
								
									
										2
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								README
									
									
									
									
									
								
							@@ -215,6 +215,8 @@ Bukkit Issue: Stargate will randomly NPE when drawing a sign. Long-standing Bukk
 | 
			
		||||
=============
 | 
			
		||||
  Changes
 | 
			
		||||
=============
 | 
			
		||||
[Version 0.7.9.3]
 | 
			
		||||
 - Update BungeeCord integration for b152+
 | 
			
		||||
[Version 0.7.9.2]
 | 
			
		||||
 - Remove my custom sign class. Stupid Bukkit team.
 | 
			
		||||
 - Will work with CB 1.4.5 builds, but now will break randomly due to Bukkit screwup
 | 
			
		||||
 
 | 
			
		||||
@@ -850,14 +850,14 @@ public class Portal {
 | 
			
		||||
		} else {
 | 
			
		||||
			// Check if network exists in our network list
 | 
			
		||||
			if (!lookupNamesNet.containsKey(getNetwork().toLowerCase())) {
 | 
			
		||||
				Stargate.debug("register", "Network not in lookupNamesNet, adding");
 | 
			
		||||
				Stargate.debug("register", "Network " + getNetwork() + " not in lookupNamesNet, adding");
 | 
			
		||||
				lookupNamesNet.put(getNetwork().toLowerCase(), new HashMap<String, Portal>());
 | 
			
		||||
			}
 | 
			
		||||
			lookupNamesNet.get(getNetwork().toLowerCase()).put(getName().toLowerCase(), this);
 | 
			
		||||
			
 | 
			
		||||
			// Check if this network exists
 | 
			
		||||
			if (!allPortalsNet.containsKey(getNetwork().toLowerCase())) {
 | 
			
		||||
				Stargate.debug("register", "Network not in allPortalsNet, adding");
 | 
			
		||||
				Stargate.debug("register", "Network " + getNetwork() + " not in allPortalsNet, adding");
 | 
			
		||||
				allPortalsNet.put(getNetwork().toLowerCase(), new ArrayList<String>());
 | 
			
		||||
			}
 | 
			
		||||
			allPortalsNet.get(getNetwork().toLowerCase()).add(getName().toLowerCase());
 | 
			
		||||
@@ -1204,7 +1204,7 @@ public class Portal {
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Portal getBungeeGate(String name) {
 | 
			
		||||
		return bungeePortals.get(name);
 | 
			
		||||
		return bungeePortals.get(name.toLowerCase());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static void saveAllGates(World world) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,13 @@
 | 
			
		||||
package net.TheDgtl.Stargate;
 | 
			
		||||
 | 
			
		||||
import java.io.ByteArrayOutputStream;
 | 
			
		||||
import java.io.DataOutputStream;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Iterator;
 | 
			
		||||
import java.util.LinkedList;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Queue;
 | 
			
		||||
import java.util.concurrent.ConcurrentLinkedQueue;
 | 
			
		||||
import java.util.logging.Level;
 | 
			
		||||
@@ -40,6 +44,7 @@ import org.bukkit.event.block.BlockPistonRetractEvent;
 | 
			
		||||
import org.bukkit.event.block.SignChangeEvent;
 | 
			
		||||
import org.bukkit.event.entity.EntityExplodeEvent;
 | 
			
		||||
import org.bukkit.event.player.PlayerInteractEvent;
 | 
			
		||||
import org.bukkit.event.player.PlayerJoinEvent;
 | 
			
		||||
import org.bukkit.event.player.PlayerMoveEvent;
 | 
			
		||||
import org.bukkit.event.player.PlayerPortalEvent;
 | 
			
		||||
import org.bukkit.event.server.PluginDisableEvent;
 | 
			
		||||
@@ -116,6 +121,9 @@ public class Stargate extends JavaPlugin {
 | 
			
		||||
	// Used for populating gate open/closed material.
 | 
			
		||||
	public static Queue<BloxPopulator> blockPopulatorQueue = new LinkedList<BloxPopulator>();
 | 
			
		||||
	
 | 
			
		||||
	// HashMap of player names for Bungee support
 | 
			
		||||
	public static Map<String, String> bungeeQueue = new HashMap<String, String>();
 | 
			
		||||
	
 | 
			
		||||
	public void onDisable() {
 | 
			
		||||
		Portal.closeAllGates();
 | 
			
		||||
		Portal.clearGates();
 | 
			
		||||
@@ -150,8 +158,8 @@ public class Stargate extends JavaPlugin {
 | 
			
		||||
		
 | 
			
		||||
		// Enable the required channels for Bungee support
 | 
			
		||||
		if (enableBungee) {
 | 
			
		||||
			Bukkit.getMessenger().registerOutgoingPluginChannel(this, "SGBungee");
 | 
			
		||||
			Bukkit.getMessenger().registerIncomingPluginChannel(this, "SGBungee", new pmListener());
 | 
			
		||||
			Bukkit.getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
 | 
			
		||||
			Bukkit.getMessenger().registerIncomingPluginChannel(this, "BungeeCord", new pmListener());
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		// It is important to load languages here, as they are used during reloadGates()
 | 
			
		||||
@@ -723,6 +731,21 @@ public class Stargate extends JavaPlugin {
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private class pListener implements Listener {
 | 
			
		||||
		@EventHandler
 | 
			
		||||
		public void onPlayerJoin(PlayerJoinEvent event) {
 | 
			
		||||
			if (!enableBungee) return;
 | 
			
		||||
			
 | 
			
		||||
			Player player = event.getPlayer();
 | 
			
		||||
			String destination = bungeeQueue.get(player.getName().toLowerCase());
 | 
			
		||||
			if (destination == null) return;
 | 
			
		||||
			
 | 
			
		||||
			Portal portal = Portal.getBungeeGate(destination);
 | 
			
		||||
			if (portal == null) {
 | 
			
		||||
				Stargate.debug("PlayerJoin", "Error fetching destination portal: " + destination);
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
			portal.teleport(player, portal, null);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@EventHandler
 | 
			
		||||
		public void onPlayerPortal(PlayerPortalEvent event) {
 | 
			
		||||
@@ -820,19 +843,51 @@ public class Stargate extends JavaPlugin {
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			Stargate.sendMessage(player, Stargate.getString("teleportMsg"), false);
 | 
			
		||||
			
 | 
			
		||||
			// BungeeCord Support
 | 
			
		||||
			if (portal.isBungee()) {
 | 
			
		||||
				
 | 
			
		||||
				if (!enableBungee) {
 | 
			
		||||
					player.sendMessage(Stargate.getString("bungeeDisabled"));
 | 
			
		||||
					portal.close(false);
 | 
			
		||||
					return;
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				// Teleport the player back to this gate, for sanity's sake
 | 
			
		||||
				portal.teleport(player, portal, event);
 | 
			
		||||
				
 | 
			
		||||
				// Teleport player via BungeeCord
 | 
			
		||||
				String pMsg = portal.getNetwork() + "@#@" + portal.getDestinationName();
 | 
			
		||||
				player.sendPluginMessage(stargate, "SGBungee", pMsg.getBytes());
 | 
			
		||||
				// Send the SGBungee packet first, it will be queued by BC if required
 | 
			
		||||
				try {
 | 
			
		||||
					// Build the message, format is <player>#@#<destination>
 | 
			
		||||
					String msg = event.getPlayer().getName() + "#@#" + portal.getDestinationName();
 | 
			
		||||
					// Build the message data, sent over the SGBungee bungeecord channel
 | 
			
		||||
					ByteArrayOutputStream bao = new ByteArrayOutputStream();
 | 
			
		||||
					DataOutputStream msgData = new DataOutputStream(bao);
 | 
			
		||||
					msgData.writeUTF("Forward");
 | 
			
		||||
					msgData.writeUTF(portal.getNetwork());	// Server
 | 
			
		||||
					msgData.writeUTF("SGBungee");			// Channel
 | 
			
		||||
					msgData.writeShort(msg.length()); 	// Data Length
 | 
			
		||||
					msgData.writeBytes(msg); 			// Data
 | 
			
		||||
					player.sendPluginMessage(stargate, "BungeeCord", bao.toByteArray());
 | 
			
		||||
				} catch (IOException ex) {
 | 
			
		||||
					Stargate.log.severe("[Stargate] Error sending BungeeCord teleport packet");
 | 
			
		||||
					ex.printStackTrace();
 | 
			
		||||
					return;
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				// Connect player to new server
 | 
			
		||||
				try {
 | 
			
		||||
					ByteArrayOutputStream bao = new ByteArrayOutputStream();
 | 
			
		||||
					DataOutputStream msgData = new DataOutputStream(bao);
 | 
			
		||||
					msgData.writeUTF("Connect");
 | 
			
		||||
					msgData.writeUTF(portal.getNetwork());
 | 
			
		||||
					
 | 
			
		||||
					player.sendPluginMessage(stargate, "BungeeCord", bao.toByteArray());
 | 
			
		||||
					bao.reset();
 | 
			
		||||
				} catch(IOException ex) {
 | 
			
		||||
					Stargate.log.severe("[Stargate] Error sending BungeeCord connect packet");
 | 
			
		||||
					ex.printStackTrace();
 | 
			
		||||
					return;
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				// Close portal if required (Should never be)
 | 
			
		||||
				portal.close(false);
 | 
			
		||||
@@ -1346,11 +1401,11 @@ public class Stargate extends JavaPlugin {
 | 
			
		||||
				// Enable the required channels for Bungee support
 | 
			
		||||
				if (oldEnableBungee != enableBungee) {
 | 
			
		||||
					if (enableBungee) {
 | 
			
		||||
						Bukkit.getMessenger().registerOutgoingPluginChannel(this, "SGBungee");
 | 
			
		||||
						Bukkit.getMessenger().registerIncomingPluginChannel(this, "SGBungee", new pmListener());
 | 
			
		||||
						Bukkit.getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
 | 
			
		||||
						Bukkit.getMessenger().registerIncomingPluginChannel(this, "BungeeCord", new pmListener());
 | 
			
		||||
					} else {
 | 
			
		||||
						Bukkit.getMessenger().unregisterIncomingPluginChannel(this, "SGBungee");
 | 
			
		||||
						Bukkit.getMessenger().unregisterOutgoingPluginChannel(this, "SGBungee");
 | 
			
		||||
						Bukkit.getMessenger().unregisterIncomingPluginChannel(this, "BungeeCord");
 | 
			
		||||
						Bukkit.getMessenger().unregisterOutgoingPluginChannel(this, "BungeeCord");
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
 
 | 
			
		||||
@@ -1,23 +1,57 @@
 | 
			
		||||
package net.TheDgtl.Stargate;
 | 
			
		||||
 | 
			
		||||
import java.io.ByteArrayInputStream;
 | 
			
		||||
import java.io.DataInputStream;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.plugin.messaging.PluginMessageListener;
 | 
			
		||||
 | 
			
		||||
public class pmListener implements PluginMessageListener {
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void onPluginMessageReceived(String channel, Player player, byte[] message) {
 | 
			
		||||
		if (!channel.equals("SGBungee") || !Stargate.enableBungee) return;
 | 
			
		||||
	public void onPluginMessageReceived(String channel, Player unused, byte[] message) {
 | 
			
		||||
		if (!Stargate.enableBungee || !channel.equals("BungeeCord")) return;
 | 
			
		||||
		
 | 
			
		||||
		// Message should be destination gate name.
 | 
			
		||||
		Portal dest = Portal.getBungeeGate(new String(message));
 | 
			
		||||
		
 | 
			
		||||
		// Specified an invalid gate. For now we'll just let them connect at their current location
 | 
			
		||||
		if (dest == null) {
 | 
			
		||||
		// 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;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		// Teleport the player to their destination portal
 | 
			
		||||
		dest.teleport(player, dest, null);
 | 
			
		||||
		// 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);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
name: Stargate
 | 
			
		||||
main: net.TheDgtl.Stargate.Stargate
 | 
			
		||||
version: 0.7.9.2
 | 
			
		||||
version: 0.7.9.3
 | 
			
		||||
description: Stargate mod for Bukkit
 | 
			
		||||
author: Drakia
 | 
			
		||||
website: http://www.thedgtl.net
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user