Update to be compatible with the latest build of BungeeCord

This commit is contained in:
Steven Scott 2013-02-03 21:00:06 -08:00
parent 1c58184656
commit 7b00e6fefd
5 changed files with 114 additions and 23 deletions

2
README
View File

@ -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

View File

@ -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) {

View File

@ -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);
if (portal.isBungee()) {
// 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");
}
}

View File

@ -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
// 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);
}
}
}

View File

@ -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