Retry this mess of connections again.

This commit is contained in:
md_5 2012-10-13 09:26:29 +11:00
parent aa2710c573
commit a51ce916ce
3 changed files with 17 additions and 14 deletions

View File

@ -69,7 +69,7 @@ public class ServerConnection extends GenericConnection {
throw ex; throw ex;
} catch (Exception ex) { } catch (Exception ex) {
InetSocketAddress def = BungeeCord.instance.config.getServer(null); InetSocketAddress def = BungeeCord.instance.config.getServer(null);
if (retry && address != def) { if (retry && !address.equals(def)) {
return connect(name, def, handshake, false); return connect(name, def, handshake, false);
} else { } else {
throw new RuntimeException("Could not connect to target server"); throw new RuntimeException("Could not connect to target server");

View File

@ -28,6 +28,7 @@ public class UserConnection extends GenericConnection implements CommandSender {
private Packet10HeldItem heldItem; private Packet10HeldItem heldItem;
private int clientEntityId; private int clientEntityId;
private int serverEntityId; private int serverEntityId;
private volatile boolean reconnecting;
public UserConnection(Socket socket, PacketInputStream in, OutputStream out, Packet2Handshake handshake) { public UserConnection(Socket socket, PacketInputStream in, OutputStream out, Packet2Handshake handshake) {
super(socket, in, out); super(socket, in, out);
@ -43,6 +44,13 @@ public class UserConnection extends GenericConnection implements CommandSender {
private void connect(String name, InetSocketAddress serverAddr) { private void connect(String name, InetSocketAddress serverAddr) {
try { try {
reconnecting = true;
if (server != null) {
out.write(new Packet9Respawn((byte) 1, (byte) 0, (byte) 0, (short) 256, "DEFAULT").getPacket());
out.write(new Packet9Respawn((byte) -1, (byte) 0, (byte) 0, (short) 256, "DEFAULT").getPacket());
}
ServerConnection newServer = ServerConnection.connect(name, serverAddr, handshake, server == null); ServerConnection newServer = ServerConnection.connect(name, serverAddr, handshake, server == null);
if (server == null) { if (server == null) {
clientEntityId = newServer.loginPacket.entityId; clientEntityId = newServer.loginPacket.entityId;
@ -50,14 +58,14 @@ public class UserConnection extends GenericConnection implements CommandSender {
upBridge = new UpstreamBridge(); upBridge = new UpstreamBridge();
upBridge.start(); upBridge.start();
} else { } else {
downBridge.alive = false;
try { try {
downBridge.interrupt();
downBridge.join(); downBridge.join();
} catch (InterruptedException ie) { } catch (InterruptedException ie) {
} }
server.disconnect("Quitting"); server.disconnect("Quitting");
out.write(new Packet9Respawn((byte) 1, (byte) 0, (byte) 0, (short) 256, "DEFAULT").getPacket());
out.write(new Packet9Respawn((byte) -1, (byte) 0, (byte) 0, (short) 256, "DEFAULT").getPacket());
Packet1Login login = newServer.loginPacket; Packet1Login login = newServer.loginPacket;
serverEntityId = login.entityId; serverEntityId = login.entityId;
out.write(new Packet9Respawn(login.dimension, login.difficulty, login.gameMode, (short) 256, login.levelType).getPacket()); out.write(new Packet9Respawn(login.dimension, login.difficulty, login.gameMode, (short) 256, login.levelType).getPacket());
@ -66,17 +74,14 @@ public class UserConnection extends GenericConnection implements CommandSender {
newServer.out.write(heldItem.getPacket()); newServer.out.write(heldItem.getPacket());
} }
} }
reconnecting = false;
downBridge = new DownstreamBridge(); downBridge = new DownstreamBridge();
server = newServer; server = newServer;
downBridge.start(); downBridge.start();
} catch (KickException ex) { } catch (KickException ex) {
destory(ex.getMessage()); destory(ex.getMessage());
} catch (Exception ex) { } catch (Exception ex) {
if (server == null) { destory("Could not connect to server");
destory("Could not connect to server");
} else {
packetQueue.add(new Packet3Chat(ChatColor.YELLOW + "The server you selected is not up at the moment."));
}
} }
} }
@ -135,8 +140,6 @@ public class UserConnection extends GenericConnection implements CommandSender {
private class DownstreamBridge extends Thread { private class DownstreamBridge extends Thread {
private volatile boolean alive = true;
public DownstreamBridge() { public DownstreamBridge() {
super("Downstream Bridge - " + username); super("Downstream Bridge - " + username);
} }
@ -144,7 +147,7 @@ public class UserConnection extends GenericConnection implements CommandSender {
@Override @Override
public void run() { public void run() {
try { try {
while (alive) { while (!reconnecting) {
byte[] packet = server.in.readPacket(); byte[] packet = server.in.readPacket();
boolean sendPacket = true; boolean sendPacket = true;
@ -154,7 +157,7 @@ public class UserConnection extends GenericConnection implements CommandSender {
if (message.tag.equals("RubberBand")) { if (message.tag.equals("RubberBand")) {
String server = new String(message.data); String server = new String(message.data);
connect(server); connect(server);
sendPacket = false; break;
} }
} }

View File

@ -6,7 +6,7 @@ import net.md_5.bungee.ChatColor;
import net.md_5.bungee.UserConnection; import net.md_5.bungee.UserConnection;
/** /**
* Command to list and switch a player between availible servers. * Command to list and switch a player between available servers.
*/ */
public class CommandServer extends Command { public class CommandServer extends Command {