diff --git a/api/pom.xml b/api/pom.xml
index b5834e968..d3f9e82b0 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -37,6 +37,12 @@
${project.version}
compile
+
+ net.md-5
+ bungeecord-protocol
+ ${project.version}
+ compile
+
org.yaml
snakeyaml
diff --git a/api/src/main/java/net/md_5/bungee/api/connection/Connection.java b/api/src/main/java/net/md_5/bungee/api/connection/Connection.java
index ba72a96ad..f0a3f5040 100644
--- a/api/src/main/java/net/md_5/bungee/api/connection/Connection.java
+++ b/api/src/main/java/net/md_5/bungee/api/connection/Connection.java
@@ -1,6 +1,7 @@
package net.md_5.bungee.api.connection;
import java.net.InetSocketAddress;
+import net.md_5.bungee.protocol.packet.DefinedPacket;
/**
* A proxy connection is defined as a connection directly connected to a socket.
@@ -15,7 +16,7 @@ public interface Connection
*
* @return the remote address
*/
- public InetSocketAddress getAddress();
+ InetSocketAddress getAddress();
/**
* Disconnects this end of the connection for the specified reason. If this
@@ -25,5 +26,23 @@ public interface Connection
* @param reason the reason shown to the player / sent to the server on
* disconnect
*/
- public void disconnect(String reason);
+ void disconnect(String reason);
+
+ /**
+ * Get the unsafe methods of this class.
+ *
+ * @return the unsafe method interface
+ */
+ Unsafe unsafe();
+
+ interface Unsafe
+ {
+
+ /**
+ * Send a packet to this connection.
+ *
+ * @param packet the packet to send
+ */
+ void sendPacket(DefinedPacket packet);
+ }
}
diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
index 354abd32b..747a2f44c 100644
--- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
+++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
@@ -331,7 +331,7 @@ public class BungeeCord extends ProxyServer
{
for ( UserConnection con : connections.values() )
{
- con.sendPacket( packet );
+ con.unsafe().sendPacket( packet );
}
} finally
{
diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java
index 8ea46b323..14121f076 100644
--- a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java
+++ b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java
@@ -7,6 +7,7 @@ import lombok.RequiredArgsConstructor;
import lombok.Setter;
import net.md_5.bungee.api.connection.Server;
import net.md_5.bungee.netty.ChannelWrapper;
+import net.md_5.bungee.protocol.packet.DefinedPacket;
import net.md_5.bungee.protocol.packet.PacketFAPluginMessage;
import net.md_5.bungee.protocol.packet.PacketFFKick;
@@ -21,11 +22,19 @@ public class ServerConnection implements Server
@Getter
@Setter
private boolean isObsolete;
+ private final Unsafe unsafe = new Unsafe()
+ {
+ @Override
+ public void sendPacket(DefinedPacket packet)
+ {
+ unsafe().sendPacket( packet );
+ }
+ };
@Override
public void sendData(String channel, byte[] data)
{
- ch.write( new PacketFAPluginMessage( channel, data ) );
+ unsafe().sendPacket( new PacketFAPluginMessage( channel, data ) );
}
@Override
@@ -33,7 +42,7 @@ public class ServerConnection implements Server
{
if ( !ch.isClosed() )
{
- ch.write( new PacketFFKick( reason ) );
+ unsafe().sendPacket( new PacketFFKick( reason ) );
ch.getHandle().eventLoop().schedule( new Runnable()
{
@Override
@@ -50,4 +59,10 @@ public class ServerConnection implements Server
{
return getInfo().getAddress();
}
+
+ @Override
+ public Unsafe unsafe()
+ {
+ return unsafe;
+ }
}
diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java
index 970369e79..ba3c2bc83 100644
--- a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java
+++ b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java
@@ -147,7 +147,7 @@ public class ServerConnector extends PacketHandler
modLogin = new Packet1Login( login.getEntityId(), login.getLevelType(), login.getGameMode(), (byte) login.getDimension(), login.getDifficulty(), login.getUnused(),
(byte) user.getPendingConnection().getListener().getTabListSize() );
}
- user.sendPacket( modLogin );
+ user.unsafe().sendPacket( modLogin );
} else
{
bungee.getTabListHandler().onServerChange( user );
@@ -155,18 +155,18 @@ public class ServerConnector extends PacketHandler
Scoreboard serverScoreboard = user.getServerSentScoreboard();
for ( Objective objective : serverScoreboard.getObjectives() )
{
- user.sendPacket( new PacketCEScoreboardObjective( objective.getName(), objective.getValue(), (byte) 1 ) );
+ user.unsafe().sendPacket( new PacketCEScoreboardObjective( objective.getName(), objective.getValue(), (byte) 1 ) );
}
for ( Team team : serverScoreboard.getTeams() )
{
- user.sendPacket( new PacketD1Team( team.getName() ) );
+ user.unsafe().sendPacket( new PacketD1Team( team.getName() ) );
}
serverScoreboard.clear();
user.sendDimensionSwitch();
user.setServerEntityId( login.getEntityId() );
- user.sendPacket( new Packet9Respawn( login.getDimension(), login.getDifficulty(), login.getGameMode(), (short) 256, login.getLevelType() ) );
+ user.unsafe().sendPacket( new Packet9Respawn( login.getDimension(), login.getDifficulty(), login.getGameMode(), (short) 256, login.getLevelType() ) );
// Remove from old servers
user.getServer().setObsolete( true );
@@ -282,7 +282,7 @@ public class ServerConnector extends PacketHandler
}
}
- user.sendPacket( pluginMessage ); // We have to forward these to the user, especially with Forge as stuff might break
+ user.unsafe().sendPacket( pluginMessage ); // We have to forward these to the user, especially with Forge as stuff might break
if ( !sentMessages && user.getPendingConnection().getForgeLogin() != null )
{
for ( PacketFAPluginMessage message : user.getPendingConnection().getLoginMessages() )
diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java
index 3c789e82b..60bdd012d 100644
--- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java
+++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java
@@ -88,6 +88,14 @@ public final class UserConnection implements ProxiedPlayer
@Getter
private String displayName;
/*========================================================================*/
+ private final Unsafe unsafe = new Unsafe()
+ {
+ @Override
+ public void sendPacket(DefinedPacket packet)
+ {
+ ch.write( packet );
+ }
+ };
public void init()
{
@@ -100,11 +108,6 @@ public final class UserConnection implements ProxiedPlayer
}
}
- public void sendPacket(DefinedPacket p)
- {
- ch.write( p );
- }
-
public void sendPacket(byte[] b)
{
ch.write( b );
@@ -134,8 +137,8 @@ public final class UserConnection implements ProxiedPlayer
void sendDimensionSwitch()
{
- sendPacket( PacketConstants.DIM1_SWITCH );
- sendPacket( PacketConstants.DIM2_SWITCH );
+ unsafe().sendPacket( PacketConstants.DIM1_SWITCH );
+ unsafe().sendPacket( PacketConstants.DIM2_SWITCH );
}
public void connectNow(ServerInfo target)
@@ -220,7 +223,7 @@ public final class UserConnection implements ProxiedPlayer
if ( ch.getHandle().isActive() )
{
bungee.getLogger().log( Level.INFO, "[" + getName() + "] disconnected with: " + reason );
- sendPacket( new PacketFFKick( reason ) );
+ unsafe().sendPacket( new PacketFFKick( reason ) );
ch.getHandle().close();
if ( server != null )
{
@@ -239,7 +242,7 @@ public final class UserConnection implements ProxiedPlayer
@Override
public void sendMessage(String message)
{
- sendPacket( new Packet3Chat( message ) );
+ unsafe().sendPacket( new Packet3Chat( message ) );
}
@Override
@@ -254,7 +257,7 @@ public final class UserConnection implements ProxiedPlayer
@Override
public void sendData(String channel, byte[] data)
{
- sendPacket( new PacketFAPluginMessage( channel, data ) );
+ unsafe().sendPacket( new PacketFAPluginMessage( channel, data ) );
}
@Override
@@ -322,6 +325,12 @@ public final class UserConnection implements ProxiedPlayer
@Override
public void setTexturePack(TexturePackInfo pack)
{
- sendPacket( new PacketFAPluginMessage( "MC|TPack", ( pack.getUrl() + "\00" + pack.getSize() ).getBytes() ) );
+ unsafe().sendPacket( new PacketFAPluginMessage( "MC|TPack", ( pack.getUrl() + "\00" + pack.getSize() ).getBytes() ) );
+ }
+
+ @Override
+ public Unsafe unsafe()
+ {
+ return unsafe;
}
}
diff --git a/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java b/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java
index c020c8312..0debf17d4 100644
--- a/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java
+++ b/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java
@@ -36,6 +36,7 @@ import net.md_5.bungee.netty.CipherEncoder;
import net.md_5.bungee.netty.PacketDecoder;
import net.md_5.bungee.netty.PacketHandler;
import net.md_5.bungee.protocol.Forge;
+import net.md_5.bungee.protocol.packet.DefinedPacket;
import net.md_5.bungee.protocol.packet.Packet1Login;
import net.md_5.bungee.protocol.packet.Packet2Handshake;
import net.md_5.bungee.protocol.packet.PacketCDClientStatus;
@@ -44,7 +45,6 @@ import net.md_5.bungee.protocol.packet.PacketFCEncryptionResponse;
import net.md_5.bungee.protocol.packet.PacketFDEncryptionRequest;
import net.md_5.bungee.protocol.packet.PacketFEPing;
import net.md_5.bungee.protocol.packet.PacketFFKick;
-import net.md_5.bungee.protocol.Vanilla;
@RequiredArgsConstructor
public class InitialHandler extends PacketHandler implements PendingConnection
@@ -63,6 +63,14 @@ public class InitialHandler extends PacketHandler implements PendingConnection
private List loginMessages = new ArrayList<>();
private State thisState = State.HANDSHAKE;
private SecretKey sharedKey;
+ private final Unsafe unsafe = new Unsafe()
+ {
+ @Override
+ public void sendPacket(DefinedPacket packet)
+ {
+ unsafe().sendPacket( packet );
+ }
+ };
private static final PacketFAPluginMessage forgeMods = new PacketFAPluginMessage( "FML", new byte[]
{
0, 0, 0, 0, 0, 2
@@ -144,8 +152,8 @@ public class InitialHandler extends PacketHandler implements PendingConnection
}
this.handshake = handshake;
- ch.write( forgeMods );
- ch.write( request = EncryptionUtil.encryptRequest() );
+ unsafe().sendPacket( forgeMods );
+ unsafe().sendPacket( request = EncryptionUtil.encryptRequest() );
thisState = State.ENCRYPT;
}
@@ -224,7 +232,7 @@ public class InitialHandler extends PacketHandler implements PendingConnection
}
thisState = InitialHandler.State.LOGIN;
- ch.write( new PacketFCEncryptionResponse( new byte[ 0 ], new byte[ 0 ] ) );
+ unsafe().sendPacket( new PacketFCEncryptionResponse( new byte[ 0 ], new byte[ 0 ] ) );
try
{
Cipher encrypt = EncryptionUtil.getCipher( Cipher.ENCRYPT_MODE, sharedKey );
@@ -264,7 +272,7 @@ public class InitialHandler extends PacketHandler implements PendingConnection
{
if ( !ch.isClosed() )
{
- ch.write( new PacketFFKick( reason ) );
+ unsafe().sendPacket( new PacketFFKick( reason ) );
ch.close();
}
}
@@ -293,6 +301,12 @@ public class InitialHandler extends PacketHandler implements PendingConnection
return (InetSocketAddress) ch.getHandle().remoteAddress();
}
+ @Override
+ public Unsafe unsafe()
+ {
+ return unsafe;
+ }
+
@Override
public String toString()
{
diff --git a/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java b/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java
index 41a594239..32808b0df 100644
--- a/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java
+++ b/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java
@@ -27,9 +27,9 @@ public class UpstreamBridge extends PacketHandler
this.bungee = bungee;
this.con = con;
- BungeeCord.getInstance().addConnection( con );
bungee.getTabListHandler().onConnect( con );
- con.sendPacket( BungeeCord.getInstance().registerChannels() );
+ BungeeCord.getInstance().addConnection( con );
+ con.unsafe().sendPacket( BungeeCord.getInstance().registerChannels() );
TexturePackInfo texture = con.getPendingConnection().getListener().getTexturePack();
if ( texture != null )
diff --git a/proxy/src/main/java/net/md_5/bungee/tablist/Global.java b/proxy/src/main/java/net/md_5/bungee/tablist/Global.java
index e242cc557..0d40e8465 100644
--- a/proxy/src/main/java/net/md_5/bungee/tablist/Global.java
+++ b/proxy/src/main/java/net/md_5/bungee/tablist/Global.java
@@ -3,7 +3,6 @@ package net.md_5.bungee.tablist;
import java.util.Collection;
import java.util.HashSet;
import net.md_5.bungee.BungeeCord;
-import net.md_5.bungee.UserConnection;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.TabListHandler;
import net.md_5.bungee.api.connection.ProxiedPlayer;
@@ -17,10 +16,9 @@ public class Global implements TabListHandler
@Override
public void onConnect(ProxiedPlayer player)
{
- UserConnection con = (UserConnection) player;
for ( ProxiedPlayer p : ProxyServer.getInstance().getPlayers() )
{
- con.sendPacket( new PacketC9PlayerListItem( p.getDisplayName(), true, (short) p.getPing() ) );
+ player.unsafe().sendPacket( new PacketC9PlayerListItem( p.getDisplayName(), true, (short) p.getPing() ) );
}
BungeeCord.getInstance().broadcast( new PacketC9PlayerListItem( player.getDisplayName(), true, (short) player.getPing() ) );
}
diff --git a/proxy/src/main/java/net/md_5/bungee/tablist/ServerUnique.java b/proxy/src/main/java/net/md_5/bungee/tablist/ServerUnique.java
index 4b293c45e..184f0d319 100644
--- a/proxy/src/main/java/net/md_5/bungee/tablist/ServerUnique.java
+++ b/proxy/src/main/java/net/md_5/bungee/tablist/ServerUnique.java
@@ -38,7 +38,7 @@ public class ServerUnique implements TabListHandler
{
for ( String username : usernames )
{
- ( (UserConnection) player ).sendPacket( new PacketC9PlayerListItem( username, false, (short) 9999 ) );
+ player.unsafe().sendPacket( new PacketC9PlayerListItem( username, false, (short) 9999 ) );
}
usernames.clear();
}