diff --git a/api/pom.xml b/api/pom.xml index b5834e96..d3f9e82b 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 ba72a96a..f0a3f504 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 354abd32..747a2f44 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 8ea46b32..14121f07 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 970369e7..ba3c2bc8 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 3c789e82..60bdd012 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 c020c831..0debf17d 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 41a59423..32808b0d 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 e242cc55..0d40e846 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 4b293c45..184f0d31 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(); }