diff --git a/api/pom.xml b/api/pom.xml index 1828ce78..cf923879 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -6,25 +6,19 @@ net.md-5 bungeecord-parent - 1.6.4-SNAPSHOT + 1.7-SNAPSHOT ../pom.xml net.md-5 bungeecord-api - 1.6.4-SNAPSHOT + 1.7-SNAPSHOT jar BungeeCord-API API implemented by the Elastic Portal Suite - - com.google.guava - guava - 14.0.1 - compile - net.md-5 bungeecord-config diff --git a/api/src/main/java/net/md_5/bungee/api/ProxyServer.java b/api/src/main/java/net/md_5/bungee/api/ProxyServer.java index 474391e1..b4894ab4 100644 --- a/api/src/main/java/net/md_5/bungee/api/ProxyServer.java +++ b/api/src/main/java/net/md_5/bungee/api/ProxyServer.java @@ -180,7 +180,7 @@ public abstract class ProxyServer * * @return the Minecraft protocol version */ - public abstract byte getProtocolVersion(); + public abstract int getProtocolVersion(); /** * Factory method to construct an implementation specific server info diff --git a/api/src/main/java/net/md_5/bungee/api/ServerPing.java b/api/src/main/java/net/md_5/bungee/api/ServerPing.java index e37f9aee..2458d133 100644 --- a/api/src/main/java/net/md_5/bungee/api/ServerPing.java +++ b/api/src/main/java/net/md_5/bungee/api/ServerPing.java @@ -1,33 +1,38 @@ package net.md_5.bungee.api; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; /** * Represents the standard list data returned by opening a server in the * Minecraft client server list, or hitting it with a packet 0xFE. */ @Data +@NoArgsConstructor +@AllArgsConstructor public class ServerPing { - /** - * Numeric protocol version supported by the server. - */ - private final byte protocolVersion; - /** - * Human readable game version. - */ - private final String gameVersion; - /** - * Server MOTD. - */ - private final String motd; - /** - * Current amount of players on the server. - */ - private final int currentPlayers; - /** - * Max amount of players the server will allow. - */ - private final int maxPlayers; + private Protocol version; + + @Data + @AllArgsConstructor + public static class Protocol + { + + private String name; + private int protocol; + } + private Players players; + + @Data + @AllArgsConstructor + public static class Players + { + + private int max; + private int online; + } + private String description; } 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 f0a3f504..2c9cae14 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,7 +1,7 @@ package net.md_5.bungee.api.connection; import java.net.InetSocketAddress; -import net.md_5.bungee.protocol.packet.DefinedPacket; +import net.md_5.bungee.protocol.DefinedPacket; /** * A proxy connection is defined as a connection directly connected to a socket. diff --git a/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java b/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java index fba6e4f7..8513e8e3 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/PendingConnection.java @@ -21,7 +21,7 @@ public interface PendingConnection extends Connection * * @return the protocol version of the remote client */ - byte getVersion(); + int getVersion(); /** * Get the requested virtual host that the client tried to connect to. @@ -36,4 +36,11 @@ public interface PendingConnection extends Connection * @return the accepting listener */ ListenerInfo getListener(); + + /** + * Get this connection's UUID, if set. + * + * @return the UUID + */ + String getUUID(); } diff --git a/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java index 6ef00b28..bc5f6ee5 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java @@ -99,4 +99,11 @@ public interface ProxiedPlayer extends Connection, CommandSender * @param server the server to set */ void setReconnectServer(ServerInfo server); + + /** + * Get this connection's UUID, if set. + * + * @return the UUID + */ + String getUUID(); } diff --git a/api/src/main/java/net/md_5/bungee/api/event/PlayerHandshakeEvent.java b/api/src/main/java/net/md_5/bungee/api/event/PlayerHandshakeEvent.java index de927325..2f7b38d9 100644 --- a/api/src/main/java/net/md_5/bungee/api/event/PlayerHandshakeEvent.java +++ b/api/src/main/java/net/md_5/bungee/api/event/PlayerHandshakeEvent.java @@ -4,8 +4,8 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; import net.md_5.bungee.api.connection.PendingConnection; -import net.md_5.bungee.protocol.packet.Packet2Handshake; import net.md_5.bungee.api.plugin.Event; +import net.md_5.bungee.protocol.packet.Handshake; /** * Event called to represent a player first making their presence and username @@ -24,9 +24,9 @@ public class PlayerHandshakeEvent extends Event /** * The handshake. */ - private final Packet2Handshake handshake; + private final Handshake handshake; - public PlayerHandshakeEvent(PendingConnection connection, Packet2Handshake handshake) + public PlayerHandshakeEvent(PendingConnection connection, Handshake handshake) { this.connection = connection; this.handshake = handshake; diff --git a/bootstrap/pom.xml b/bootstrap/pom.xml index f2107213..c81de384 100644 --- a/bootstrap/pom.xml +++ b/bootstrap/pom.xml @@ -6,13 +6,13 @@ net.md-5 bungeecord-parent - 1.6.4-SNAPSHOT + 1.7-SNAPSHOT ../pom.xml net.md-5 bungeecord-bootstrap - 1.6.4-SNAPSHOT + 1.7-SNAPSHOT jar BungeeCord-Bootstrap diff --git a/config/pom.xml b/config/pom.xml index 8c7e4cff..b96e3420 100644 --- a/config/pom.xml +++ b/config/pom.xml @@ -6,13 +6,13 @@ net.md-5 bungeecord-parent - 1.6.4-SNAPSHOT + 1.7-SNAPSHOT ../pom.xml net.md-5 bungeecord-config - 1.6.4-SNAPSHOT + 1.7-SNAPSHOT jar BungeeCord-Config diff --git a/event/pom.xml b/event/pom.xml index 51f10759..bb4a8313 100644 --- a/event/pom.xml +++ b/event/pom.xml @@ -6,13 +6,13 @@ net.md-5 bungeecord-parent - 1.6.4-SNAPSHOT + 1.7-SNAPSHOT ../pom.xml net.md-5 bungeecord-event - 1.6.4-SNAPSHOT + 1.7-SNAPSHOT jar BungeeCord-Event diff --git a/pom.xml b/pom.xml index 768bda2f..cf3da354 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ net.md-5 bungeecord-parent - 1.6.4-SNAPSHOT + 1.7-SNAPSHOT pom BungeeCord @@ -73,6 +73,18 @@ 4.11 test + + com.google.guava + guava + 14.0.1 + compile + + + net.sf.trove4j + trove4j + 3.0.3 + compile + org.projectlombok lombok diff --git a/protocol/pom.xml b/protocol/pom.xml index e13e8062..545508d5 100644 --- a/protocol/pom.xml +++ b/protocol/pom.xml @@ -6,13 +6,13 @@ net.md-5 bungeecord-parent - 1.6.4-SNAPSHOT + 1.7-SNAPSHOT ../pom.xml net.md-5 bungeecord-protocol - 1.6.4-SNAPSHOT + 1.7-SNAPSHOT jar BungeeCord-Protocol @@ -21,7 +21,7 @@ io.netty - netty-buffer + netty-codec ${netty.version} compile diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/AbstractPacketHandler.java b/protocol/src/main/java/net/md_5/bungee/protocol/AbstractPacketHandler.java new file mode 100644 index 00000000..08b12630 --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/AbstractPacketHandler.java @@ -0,0 +1,126 @@ +package net.md_5.bungee.protocol; + +import net.md_5.bungee.protocol.packet.KeepAlive; +import net.md_5.bungee.protocol.packet.ClientSettings; +import net.md_5.bungee.protocol.packet.ClientStatus; +import net.md_5.bungee.protocol.packet.Login; +import net.md_5.bungee.protocol.packet.Chat; +import net.md_5.bungee.protocol.packet.EncryptionRequest; +import net.md_5.bungee.protocol.packet.PlayerListItem; +import net.md_5.bungee.protocol.packet.TabCompleteRequest; +import net.md_5.bungee.protocol.packet.ScoreboardObjective; +import net.md_5.bungee.protocol.packet.ScoreboardScore; +import net.md_5.bungee.protocol.packet.ScoreboardDisplay; +import net.md_5.bungee.protocol.packet.Team; +import net.md_5.bungee.protocol.packet.PluginMessage; +import net.md_5.bungee.protocol.packet.Kick; +import net.md_5.bungee.protocol.packet.Respawn; +import net.md_5.bungee.protocol.packet.Handshake; +import net.md_5.bungee.protocol.packet.EncryptionResponse; +import net.md_5.bungee.protocol.packet.LegacyPing; +import net.md_5.bungee.protocol.packet.LoginRequest; +import net.md_5.bungee.protocol.packet.LoginSuccess; +import net.md_5.bungee.protocol.packet.PingPacket; +import net.md_5.bungee.protocol.packet.StatusRequest; +import net.md_5.bungee.protocol.packet.StatusResponse; +import net.md_5.bungee.protocol.packet.TabCompleteResponse; + +public abstract class AbstractPacketHandler +{ + + public void handle(LegacyPing ping) throws Exception + { + } + + public void handle(TabCompleteResponse tabResponse) throws Exception + { + } + + public void handle(PingPacket ping) throws Exception + { + } + + public void handle(StatusRequest statusRequest) throws Exception + { + } + + public void handle(StatusResponse statusResponse) throws Exception + { + } + + public void handle(Handshake handshake) throws Exception + { + } + + public void handle(KeepAlive keepAlive) throws Exception + { + } + + public void handle(Login login) throws Exception + { + } + + public void handle(Chat chat) throws Exception + { + } + + public void handle(Respawn respawn) throws Exception + { + } + + public void handle(LoginRequest loginRequest) throws Exception + { + } + + public void handle(ClientSettings settings) throws Exception + { + } + + public void handle(ClientStatus clientStatus) throws Exception + { + } + + public void handle(PlayerListItem playerListItem) throws Exception + { + } + + public void handle(TabCompleteRequest tabComplete) throws Exception + { + } + + public void handle(ScoreboardObjective scoreboardObjective) throws Exception + { + } + + public void handle(ScoreboardScore scoreboardScore) throws Exception + { + } + + public void handle(EncryptionRequest encryptionRequest) throws Exception + { + } + + public void handle(ScoreboardDisplay displayScoreboard) throws Exception + { + } + + public void handle(Team team) throws Exception + { + } + + public void handle(PluginMessage pluginMessage) throws Exception + { + } + + public void handle(Kick kick) throws Exception + { + } + + public void handle(EncryptionResponse encryptionResponse) throws Exception + { + } + + public void handle(LoginSuccess loginSuccess) throws Exception + { + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/BadPacketException.java b/protocol/src/main/java/net/md_5/bungee/protocol/BadPacketException.java index 523aeafc..6c0ef4df 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/BadPacketException.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/BadPacketException.java @@ -7,4 +7,9 @@ public class BadPacketException extends RuntimeException { super( message ); } + + public BadPacketException(String message, Throwable cause) + { + super( message, cause ); + } } diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/DefinedPacket.java b/protocol/src/main/java/net/md_5/bungee/protocol/DefinedPacket.java new file mode 100644 index 00000000..3cc2a54a --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/DefinedPacket.java @@ -0,0 +1,125 @@ +package net.md_5.bungee.protocol; + +import com.google.common.base.Charsets; +import io.netty.buffer.ByteBuf; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public abstract class DefinedPacket +{ + + public static void writeString(String s, ByteBuf buf) + { + // TODO: Check len - use Guava? + byte[] b = s.getBytes( Charsets.UTF_8 ); + writeVarInt( b.length, buf ); + buf.writeBytes( b ); + } + + public static String readString(ByteBuf buf) + { + int len = readVarInt( buf ); + byte[] b = new byte[ len ]; + buf.readBytes( b ); + + return new String( b, Charsets.UTF_8 ); + } + + public static void writeArray(byte[] b, ByteBuf buf) + { + // TODO: Check len - use Guava? + buf.writeShort( b.length ); + buf.writeBytes( b ); + } + + public static byte[] readArray(ByteBuf buf) + { + // TODO: Check len - use Guava? + short len = buf.readShort(); + byte[] ret = new byte[ len ]; + buf.readBytes( ret ); + return ret; + } + + public static void writeStringArray(String[] s, ByteBuf buf) + { + writeVarInt( s.length, buf ); + for ( String str : s ) + { + writeString( str, buf ); + } + } + + public static String[] readStringArray(ByteBuf buf) + { + int len = readVarInt( buf ); + String[] ret = new String[ len ]; + for ( int i = 0; i < ret.length; i++ ) + { + ret[i] = readString( buf ); + } + return ret; + } + + public static int readVarInt(ByteBuf input) + { + int out = 0; + int bytes = 0; + byte in; + while ( true ) + { + in = input.readByte(); + + out |= ( in & 0x7F ) << ( bytes++ * 7 ); + + if ( bytes > 32 ) + { + throw new RuntimeException( "VarInt too big" ); + } + + if ( ( in & 0x80 ) != 0x80 ) + { + break; + } + } + + return out; + } + + public static void writeVarInt(int value, ByteBuf output) + { + int part; + while ( true ) + { + part = value & 0x7F; + + value >>>= 7; + if ( value != 0 ) + { + part |= 0x80; + } + + output.writeByte( part ); + + if ( value == 0 ) + { + break; + } + } + } + + public abstract void read(ByteBuf buf); + + public abstract void write(ByteBuf buf); + + public abstract void handle(AbstractPacketHandler handler) throws Exception; + + @Override + public abstract boolean equals(Object obj); + + @Override + public abstract int hashCode(); + + @Override + public abstract String toString(); +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/Forge.java b/protocol/src/main/java/net/md_5/bungee/protocol/Forge.java deleted file mode 100644 index a5707e84..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/Forge.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.md_5.bungee.protocol; - -import io.netty.buffer.ByteBuf; -import lombok.Getter; -import net.md_5.bungee.protocol.packet.DefinedPacket; -import net.md_5.bungee.protocol.packet.forge.Forge1Login; -import net.md_5.bungee.protocol.skip.PacketReader; - -public class Forge extends Vanilla -{ - - @Getter - private static final Forge instance = new Forge(); - - public Forge() - { - classes[0x01] = Forge1Login.class; - skipper = new PacketReader( this ); // TODO: :( - } - - @Override - public DefinedPacket read(short packetId, ByteBuf buf) - { - int start = buf.readerIndex(); - DefinedPacket packet = read( packetId, buf, this ); - if ( buf.readerIndex() == start ) - { - packet = super.read( packetId, buf ); - } - - return packet; - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/KickStringWriter.java b/protocol/src/main/java/net/md_5/bungee/protocol/KickStringWriter.java new file mode 100644 index 00000000..eda9571e --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/KickStringWriter.java @@ -0,0 +1,20 @@ +package net.md_5.bungee.protocol; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; + +public class KickStringWriter extends MessageToByteEncoder +{ + + @Override + protected void encode(ChannelHandlerContext ctx, String msg, ByteBuf out) throws Exception + { + out.writeByte( 0xFF ); + out.writeShort( msg.length() ); + for ( char c : msg.toCharArray() ) + { + out.writeChar( c ); + } + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/LegacyDecoder.java b/protocol/src/main/java/net/md_5/bungee/protocol/LegacyDecoder.java new file mode 100644 index 00000000..7cc06d9b --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/LegacyDecoder.java @@ -0,0 +1,31 @@ +package net.md_5.bungee.protocol; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import java.util.List; +import net.md_5.bungee.protocol.packet.LegacyPing; + +public class LegacyDecoder extends ByteToMessageDecoder +{ + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception + { + if ( in.readableBytes() < 3 ) + { + return; + } + int i = in.readerIndex(); + short b1 = in.getUnsignedByte( i++ ); + short b2 = in.getUnsignedByte( i++ ); + short b3 = in.getUnsignedByte( i++ ); + + if ( b1 == 0xFE && b2 == 0x01 && b3 == 0xFA ) + { + out.add( new PacketWrapper( new LegacyPing(), Unpooled.EMPTY_BUFFER ) ); + } + ctx.pipeline().remove( this ); + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftDecoder.java b/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftDecoder.java new file mode 100644 index 00000000..7a222d66 --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftDecoder.java @@ -0,0 +1,43 @@ +package net.md_5.bungee.protocol; + +import com.google.common.base.Charsets; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Setter; + +@AllArgsConstructor +public class MinecraftDecoder extends ByteToMessageDecoder +{ + + @Setter + private Protocol protocol; + private boolean server; + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception + { + Protocol.ProtocolDirection prot = ( server ) ? protocol.TO_SERVER : protocol.TO_CLIENT; + ByteBuf copy = in.copy(); // TODO + + int packetId = DefinedPacket.readVarInt( in ); + + DefinedPacket packet = null; + if ( prot.hasPacket( packetId ) ) + { + packet = prot.createPacket( packetId ); + packet.read( in ); + if ( in.readableBytes() != 0 ) + { + throw new BadPacketException( "Did not read all bytes from packet " + packet.getClass() + " " + packetId + " Protocol " + protocol + " Direction " + prot ); + } + } else + { + in.skipBytes( in.readableBytes() ); + } + + out.add( new PacketWrapper( packet, copy ) ); + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftEncoder.java b/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftEncoder.java new file mode 100644 index 00000000..28689b9f --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftEncoder.java @@ -0,0 +1,24 @@ +package net.md_5.bungee.protocol; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; +import lombok.AllArgsConstructor; +import lombok.Setter; + +@AllArgsConstructor +public class MinecraftEncoder extends MessageToByteEncoder +{ + + @Setter + private Protocol protocol; + private boolean server; + + @Override + protected void encode(ChannelHandlerContext ctx, DefinedPacket msg, ByteBuf out) throws Exception + { + Protocol.ProtocolDirection prot = ( server ) ? protocol.TO_CLIENT : protocol.TO_SERVER; + DefinedPacket.writeVarInt( prot.getId( msg.getClass() ), out ); + msg.write( out ); + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/OpCode.java b/protocol/src/main/java/net/md_5/bungee/protocol/OpCode.java deleted file mode 100644 index e201c5c8..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/OpCode.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.md_5.bungee.protocol; - -public enum OpCode -{ - - BOOLEAN, BULK_CHUNK, BYTE, BYTE_INT, DOUBLE, FLOAT, INT, INT_3, INT_BYTE, ITEM, LONG, METADATA, OPTIONAL_MOTION, SHORT, SHORT_BYTE, SHORT_ITEM, STRING, USHORT_BYTE, OPTIONAL_WINDOW -} diff --git a/proxy/src/main/java/net/md_5/bungee/netty/PacketWrapper.java b/protocol/src/main/java/net/md_5/bungee/protocol/PacketWrapper.java similarity index 82% rename from proxy/src/main/java/net/md_5/bungee/netty/PacketWrapper.java rename to protocol/src/main/java/net/md_5/bungee/protocol/PacketWrapper.java index b61cfd04..8eba797b 100644 --- a/proxy/src/main/java/net/md_5/bungee/netty/PacketWrapper.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/PacketWrapper.java @@ -1,9 +1,8 @@ -package net.md_5.bungee.netty; +package net.md_5.bungee.protocol; import io.netty.buffer.ByteBuf; import lombok.RequiredArgsConstructor; import lombok.Setter; -import net.md_5.bungee.protocol.packet.DefinedPacket; @RequiredArgsConstructor public class PacketWrapper diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java b/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java index 82fbd8e5..b21a64dd 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java @@ -1,20 +1,168 @@ package net.md_5.bungee.protocol; -import io.netty.buffer.ByteBuf; +import com.google.common.base.Preconditions; +import gnu.trove.map.TObjectIntMap; +import gnu.trove.map.hash.TObjectIntHashMap; import java.lang.reflect.Constructor; -import net.md_5.bungee.protocol.packet.DefinedPacket; -import net.md_5.bungee.protocol.skip.PacketReader; +import lombok.RequiredArgsConstructor; +import net.md_5.bungee.protocol.packet.Chat; +import net.md_5.bungee.protocol.packet.ClientSettings; +import net.md_5.bungee.protocol.packet.EncryptionRequest; +import net.md_5.bungee.protocol.packet.EncryptionResponse; +import net.md_5.bungee.protocol.packet.Handshake; +import net.md_5.bungee.protocol.packet.KeepAlive; +import net.md_5.bungee.protocol.packet.Kick; +import net.md_5.bungee.protocol.packet.Login; +import net.md_5.bungee.protocol.packet.LoginRequest; +import net.md_5.bungee.protocol.packet.LoginSuccess; +import net.md_5.bungee.protocol.packet.PingPacket; +import net.md_5.bungee.protocol.packet.PlayerListItem; +import net.md_5.bungee.protocol.packet.PluginMessage; +import net.md_5.bungee.protocol.packet.Respawn; +import net.md_5.bungee.protocol.packet.ScoreboardDisplay; +import net.md_5.bungee.protocol.packet.ScoreboardObjective; +import net.md_5.bungee.protocol.packet.ScoreboardScore; +import net.md_5.bungee.protocol.packet.StatusRequest; +import net.md_5.bungee.protocol.packet.StatusResponse; +import net.md_5.bungee.protocol.packet.TabCompleteRequest; +import net.md_5.bungee.protocol.packet.TabCompleteResponse; +import net.md_5.bungee.protocol.packet.Team; -public interface Protocol +public enum Protocol { - PacketReader getSkipper(); + // Undef + HANDSHAKE + { + + { + TO_SERVER.registerPacket( 0x00, Handshake.class ); + } + }, + // 0 + GAME + { + + { + TO_CLIENT.registerPacket( 0x00, KeepAlive.class ); + TO_CLIENT.registerPacket( 0x01, Login.class ); + TO_CLIENT.registerPacket( 0x02, Chat.class ); + TO_CLIENT.registerPacket( 0x07, Respawn.class ); + TO_CLIENT.registerPacket( 0x38, PlayerListItem.class ); + TO_CLIENT.registerPacket( 0x3A, TabCompleteResponse.class ); + TO_CLIENT.registerPacket( 0x3B, ScoreboardObjective.class ); + TO_CLIENT.registerPacket( 0x3C, ScoreboardScore.class ); + TO_CLIENT.registerPacket( 0x3D, ScoreboardDisplay.class ); + TO_CLIENT.registerPacket( 0x3E, Team.class ); + TO_CLIENT.registerPacket( 0x3F, PluginMessage.class ); + TO_CLIENT.registerPacket( 0x40, Kick.class ); - DefinedPacket read(short packetId, ByteBuf buf); - OpCode[][] getOpCodes(); + TO_SERVER.registerPacket( 0x00, KeepAlive.class ); + TO_SERVER.registerPacket( 0x01, Chat.class ); + TO_SERVER.registerPacket( 0x14, TabCompleteRequest.class ); + TO_SERVER.registerPacket( 0x15, ClientSettings.class ); + TO_SERVER.registerPacket( 0x17, PluginMessage.class ); + } + }, + // 1 + STATUS + { + + { + TO_CLIENT.registerPacket( 0x00, StatusResponse.class ); + TO_CLIENT.registerPacket( 0x01, PingPacket.class ); - Class[] getClasses(); + TO_SERVER.registerPacket( 0x00, StatusRequest.class ); + TO_SERVER.registerPacket( 0x01, PingPacket.class ); + } + }, + //2 + LOGIN + { + + { + TO_CLIENT.registerPacket( 0x00, Kick.class ); + TO_CLIENT.registerPacket( 0x01, EncryptionRequest.class ); + TO_CLIENT.registerPacket( 0x02, LoginSuccess.class ); - Constructor[] getConstructors(); + TO_SERVER.registerPacket( 0x00, LoginRequest.class ); + TO_SERVER.registerPacket( 0x01, EncryptionResponse.class ); + } + }; + /*========================================================================*/ + public static final int MAX_PACKET_ID = 0xFF; + public static final int PROTOCOL_VERSION = 0x03; + public static final String MINECRAFT_VERSION = "1.7"; + /*========================================================================*/ + public final ProtocolDirection TO_SERVER = new ProtocolDirection( "TO_SERVER" ); + public final ProtocolDirection TO_CLIENT = new ProtocolDirection( "TO_CLIENT" ); + + @RequiredArgsConstructor + public class ProtocolDirection + { + + private final String name; + private final TObjectIntMap> packetMap = new TObjectIntHashMap<>( MAX_PACKET_ID ); + private final Class[] packetClasses = new Class[ MAX_PACKET_ID ]; + private final Constructor[] packetConstructors = new Constructor[ MAX_PACKET_ID ]; + + public boolean hasPacket(int id) + { + return id < MAX_PACKET_ID && packetConstructors[id] != null; + } + + @Override + public String toString() + { + return name; + } + + public final DefinedPacket createPacket(int id) + { + if ( id > MAX_PACKET_ID ) + { + throw new BadPacketException( "Packet with id " + id + " outside of range " ); + } + if ( packetConstructors[id] == null ) + { + throw new BadPacketException( "No packet with id " + id ); + } + + try + { + return packetClasses[id].newInstance(); + } catch ( ReflectiveOperationException ex ) + { + throw new BadPacketException( "Could not construct packet with id " + id, ex ); + } + } + + protected final void registerPacket(int id, Class packetClass) + { + try + { + packetConstructors[id] = packetClass.getDeclaredConstructor(); + } catch ( NoSuchMethodException ex ) + { + throw new BadPacketException( "No NoArgsConstructor for packet class " + packetClass ); + } + packetClasses[id] = packetClass; + packetMap.put( packetClass, id ); + } + + protected final void unregisterPacket(int id) + { + packetMap.remove( packetClasses[id] ); + packetClasses[id] = null; + packetConstructors[id] = null; + } + + final int getId(Class packet) + { + Preconditions.checkArgument( packetMap.containsKey( packet ), "Cannot get ID for packet " + packet ); + + return packetMap.get( packet ); + } + } } diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/Vanilla.java b/protocol/src/main/java/net/md_5/bungee/protocol/Vanilla.java deleted file mode 100644 index 87312772..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/Vanilla.java +++ /dev/null @@ -1,386 +0,0 @@ -package net.md_5.bungee.protocol; - -import io.netty.buffer.ByteBuf; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import lombok.Getter; -import static net.md_5.bungee.protocol.OpCode.*; -import net.md_5.bungee.protocol.packet.DefinedPacket; -import net.md_5.bungee.protocol.packet.Packet0KeepAlive; -import net.md_5.bungee.protocol.packet.Packet1Login; -import net.md_5.bungee.protocol.packet.Packet2CEntityProperties; -import net.md_5.bungee.protocol.packet.Packet2Handshake; -import net.md_5.bungee.protocol.packet.Packet3Chat; -import net.md_5.bungee.protocol.packet.Packet9Respawn; -import net.md_5.bungee.protocol.packet.PacketC9PlayerListItem; -import net.md_5.bungee.protocol.packet.PacketCBTabComplete; -import net.md_5.bungee.protocol.packet.PacketCCSettings; -import net.md_5.bungee.protocol.packet.PacketCDClientStatus; -import net.md_5.bungee.protocol.packet.PacketCEScoreboardObjective; -import net.md_5.bungee.protocol.packet.PacketCFScoreboardScore; -import net.md_5.bungee.protocol.packet.PacketD0DisplayScoreboard; -import net.md_5.bungee.protocol.packet.PacketD1Team; -import net.md_5.bungee.protocol.packet.PacketFAPluginMessage; -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.skip.PacketReader; - -public class Vanilla implements Protocol -{ - - public static final byte PROTOCOL_VERSION = 78; - public static final String GAME_VERSION = "1.6.4"; - @Getter - private static final Vanilla instance = new Vanilla(); - /*========================================================================*/ - @Getter - private final OpCode[][] opCodes = new OpCode[ 256 ][]; - @SuppressWarnings("unchecked") - @Getter - protected Class[] classes = new Class[ 256 ]; - @SuppressWarnings("unchecked") - @Getter - private Constructor[] constructors = new Constructor[ 256 ]; - @Getter - protected PacketReader skipper; - /*========================================================================*/ - - public Vanilla() - { - classes[0x00] = Packet0KeepAlive.class; - classes[0x01] = Packet1Login.class; - classes[0x02] = Packet2Handshake.class; - classes[0x03] = Packet3Chat.class; - classes[0x09] = Packet9Respawn.class; - classes[0xC9] = PacketC9PlayerListItem.class; - classes[0x2C] = Packet2CEntityProperties.class; - classes[0xCC] = PacketCCSettings.class; - classes[0xCB] = PacketCBTabComplete.class; - classes[0xCD] = PacketCDClientStatus.class; - classes[0xCE] = PacketCEScoreboardObjective.class; - classes[0xCF] = PacketCFScoreboardScore.class; - classes[0xD0] = PacketD0DisplayScoreboard.class; - classes[0xD1] = PacketD1Team.class; - classes[0xFA] = PacketFAPluginMessage.class; - classes[0xFC] = PacketFCEncryptionResponse.class; - classes[0xFD] = PacketFDEncryptionRequest.class; - classes[0xFE] = PacketFEPing.class; - classes[0xFF] = PacketFFKick.class; - skipper = new PacketReader( this ); - } - - @Override - public DefinedPacket read(short packetId, ByteBuf buf) - { - int start = buf.readerIndex(); - DefinedPacket packet = read( packetId, buf, this ); - if ( buf.readerIndex() == start ) - { - throw new BadPacketException( "Unknown packet id " + packetId ); - } - return packet; - } - - public static DefinedPacket read(short id, ByteBuf buf, Protocol protocol) - { - DefinedPacket packet = packet( id, protocol ); - if ( packet != null ) - { - packet.read( buf ); - return packet; - } - protocol.getSkipper().tryRead( id, buf ); - return null; - } - - public static DefinedPacket packet(short id, Protocol protocol) - { - DefinedPacket ret = null; - Class clazz = protocol.getClasses()[id]; - - if ( clazz != null ) - { - try - { - Constructor constructor = protocol.getConstructors()[id]; - if ( constructor == null ) - { - constructor = clazz.getDeclaredConstructor(); - constructor.setAccessible( true ); - protocol.getConstructors()[id] = constructor; - } - - if ( constructor != null ) - { - ret = constructor.newInstance(); - } - } catch ( NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex ) - { - } - } - - return ret; - } - - - { - opCodes[0x04] = new OpCode[] - { - LONG, LONG - }; - opCodes[0x05] = new OpCode[] - { - INT, SHORT, ITEM - }; - opCodes[0x06] = new OpCode[] - { - INT, INT, INT - }; - opCodes[0x07] = new OpCode[] - { - INT, INT, BOOLEAN - }; - opCodes[0x08] = new OpCode[] - { - FLOAT, SHORT, FLOAT - }; - opCodes[0x0A] = new OpCode[] - { - BOOLEAN - }; - opCodes[0x0B] = new OpCode[] - { - DOUBLE, DOUBLE, DOUBLE, DOUBLE, BOOLEAN - }; - opCodes[0x0C] = new OpCode[] - { - FLOAT, FLOAT, BOOLEAN - }; - opCodes[0x0D] = new OpCode[] - { - DOUBLE, DOUBLE, DOUBLE, DOUBLE, FLOAT, FLOAT, BOOLEAN - }; - opCodes[0x0E] = new OpCode[] - { - BYTE, INT, BYTE, INT, BYTE - }; - opCodes[0x0F] = new OpCode[] - { - INT, BYTE, INT, BYTE, ITEM, BYTE, BYTE, BYTE - }; - opCodes[0x10] = new OpCode[] - { - SHORT - }; - opCodes[0x11] = new OpCode[] - { - INT, BYTE, INT, BYTE, INT - }; - opCodes[0x12] = new OpCode[] - { - INT, BYTE - }; - opCodes[0x13] = new OpCode[] - { - INT, BYTE, INT - }; - opCodes[0x14] = new OpCode[] - { - INT, STRING, INT, INT, INT, BYTE, BYTE, SHORT, METADATA - }; - opCodes[0x16] = new OpCode[] - { - INT, INT - }; - opCodes[0x17] = new OpCode[] - { - INT, BYTE, INT, INT, INT, BYTE, BYTE, OPTIONAL_MOTION - }; - opCodes[0x18] = new OpCode[] - { - INT, BYTE, INT, INT, INT, BYTE, BYTE, BYTE, SHORT, SHORT, SHORT, METADATA - }; - opCodes[0x19] = new OpCode[] - { - INT, STRING, INT, INT, INT, INT - }; - opCodes[0x1A] = new OpCode[] - { - INT, INT, INT, INT, SHORT - }; - opCodes[0x1B] = new OpCode[] - { - FLOAT, FLOAT, BOOLEAN, BOOLEAN - }; - opCodes[0x1C] = new OpCode[] - { - INT, SHORT, SHORT, SHORT - }; - opCodes[0x1D] = new OpCode[] - { - BYTE_INT - }; - opCodes[0x1E] = new OpCode[] - { - INT - }; - opCodes[0x1F] = new OpCode[] - { - INT, BYTE, BYTE, BYTE - }; - opCodes[0x20] = new OpCode[] - { - INT, BYTE, BYTE - }; - opCodes[0x21] = new OpCode[] - { - INT, BYTE, BYTE, BYTE, BYTE, BYTE - }; - opCodes[0x22] = new OpCode[] - { - INT, INT, INT, INT, BYTE, BYTE - }; - opCodes[0x23] = new OpCode[] - { - INT, BYTE - }; - opCodes[0x26] = new OpCode[] - { - INT, BYTE - }; - opCodes[0x27] = new OpCode[] - { - INT, INT, BOOLEAN - }; - opCodes[0x28] = new OpCode[] - { - INT, METADATA - }; - opCodes[0x29] = new OpCode[] - { - INT, BYTE, BYTE, SHORT - }; - opCodes[0x2A] = new OpCode[] - { - INT, BYTE - }; - opCodes[0x2B] = new OpCode[] - { - FLOAT, SHORT, SHORT - }; - opCodes[0x33] = new OpCode[] - { - INT, INT, BOOLEAN, SHORT, SHORT, INT_BYTE - }; - opCodes[0x34] = new OpCode[] - { - INT, INT, SHORT, INT_BYTE - }; - opCodes[0x35] = new OpCode[] - { - INT, BYTE, INT, SHORT, BYTE - }; - opCodes[0x36] = new OpCode[] - { - INT, SHORT, INT, BYTE, BYTE, SHORT - }; - opCodes[0x37] = new OpCode[] - { - INT, INT, INT, INT, BYTE - }; - opCodes[0x38] = new OpCode[] - { - BULK_CHUNK - }; - opCodes[0x3C] = new OpCode[] - { - DOUBLE, DOUBLE, DOUBLE, FLOAT, INT_3, FLOAT, FLOAT, FLOAT - }; - opCodes[0x3D] = new OpCode[] - { - INT, INT, BYTE, INT, INT, BOOLEAN - }; - opCodes[0x3E] = new OpCode[] - { - STRING, INT, INT, INT, FLOAT, BYTE - }; - opCodes[0x3F] = new OpCode[] - { - STRING, FLOAT, FLOAT, FLOAT, FLOAT, FLOAT, FLOAT, FLOAT, INT - }; - opCodes[0x46] = new OpCode[] - { - BYTE, BYTE - }; - opCodes[0x47] = new OpCode[] - { - INT, BYTE, INT, INT, INT - }; - opCodes[0x64] = new OpCode[] - { - OPTIONAL_WINDOW - }; - opCodes[0x65] = new OpCode[] - { - BYTE - }; - opCodes[0x66] = new OpCode[] - { - BYTE, SHORT, BYTE, SHORT, BOOLEAN, ITEM - }; - opCodes[0x67] = new OpCode[] - { - BYTE, SHORT, ITEM - }; - opCodes[0x68] = new OpCode[] - { - BYTE, SHORT_ITEM - }; - opCodes[0x69] = new OpCode[] - { - BYTE, SHORT, SHORT - }; - opCodes[0x6A] = new OpCode[] - { - BYTE, SHORT, BOOLEAN - }; - opCodes[0x6B] = new OpCode[] - { - SHORT, ITEM - }; - opCodes[0x6C] = new OpCode[] - { - BYTE, BYTE - }; - opCodes[0x82] = new OpCode[] - { - INT, SHORT, INT, STRING, STRING, STRING, STRING - }; - opCodes[0x83] = new OpCode[] - { - SHORT, SHORT, USHORT_BYTE - }; - opCodes[0x84] = new OpCode[] - { - INT, SHORT, INT, BYTE, SHORT_BYTE - }; - opCodes[0x85] = new OpCode[] - { - BYTE, INT, INT, INT - }; - opCodes[0xC3] = new OpCode[] - { - SHORT, SHORT, INT_BYTE - }; - opCodes[0xC8] = new OpCode[] - { - INT, INT - }; - opCodes[0xCA] = new OpCode[] - { - BYTE, FLOAT, FLOAT - }; - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/Varint21FrameDecoder.java b/protocol/src/main/java/net/md_5/bungee/protocol/Varint21FrameDecoder.java new file mode 100644 index 00000000..c6441445 --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/Varint21FrameDecoder.java @@ -0,0 +1,47 @@ +package net.md_5.bungee.protocol; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import io.netty.handler.codec.CorruptedFrameException; + +import java.util.List; + +public class Varint21FrameDecoder extends ByteToMessageDecoder +{ + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception + { + in.markReaderIndex(); + + final byte[] buf = new byte[ 3 ]; + for ( int i = 0; i < buf.length; i++ ) + { + if ( !in.isReadable() ) + { + in.resetReaderIndex(); + return; + } + + buf[i] = in.readByte(); + if ( buf[i] >= 0 ) + { + int length = DefinedPacket.readVarInt( Unpooled.wrappedBuffer( buf ) ); + + if ( in.readableBytes() < length ) + { + in.resetReaderIndex(); + return; + } else + { + out.add( in.readBytes( length ) ); + return; + } + } + } + + throw new CorruptedFrameException( "length wider than 21-bit" ); + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/Varint21LengthFieldPrepender.java b/protocol/src/main/java/net/md_5/bungee/protocol/Varint21LengthFieldPrepender.java new file mode 100644 index 00000000..dfae35ae --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/Varint21LengthFieldPrepender.java @@ -0,0 +1,43 @@ +package net.md_5.bungee.protocol; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; +import io.netty.channel.ChannelHandler; + +@ChannelHandler.Sharable +public class Varint21LengthFieldPrepender extends MessageToByteEncoder +{ + + @Override + protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception + { + int bodyLen = msg.readableBytes(); + int headerLen = varintSize( bodyLen ); + out.ensureWritable( headerLen + bodyLen ); + + DefinedPacket.writeVarInt( bodyLen, out ); + out.writeBytes( msg ); + } + + private static int varintSize(int paramInt) + { + if ( ( paramInt & 0xFFFFFF80 ) == 0 ) + { + return 1; + } + if ( ( paramInt & 0xFFFFC000 ) == 0 ) + { + return 2; + } + if ( ( paramInt & 0xFFE00000 ) == 0 ) + { + return 3; + } + if ( ( paramInt & 0xF0000000 ) == 0 ) + { + return 4; + } + return 5; + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/AbstractPacketHandler.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/AbstractPacketHandler.java deleted file mode 100644 index 7c2cf698..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/AbstractPacketHandler.java +++ /dev/null @@ -1,81 +0,0 @@ -package net.md_5.bungee.protocol.packet; - -public abstract class AbstractPacketHandler -{ - - public void handle(Packet0KeepAlive alive) throws Exception - { - } - - public void handle(Packet1Login login) throws Exception - { - } - - public void handle(Packet2Handshake handshake) throws Exception - { - } - - public void handle(Packet3Chat chat) throws Exception - { - } - - public void handle(Packet9Respawn respawn) throws Exception - { - } - - public void handle(Packet2CEntityProperties properties) throws Exception - { - } - - public void handle(PacketC9PlayerListItem playerList) throws Exception - { - } - - public void handle(PacketCCSettings settings) throws Exception - { - } - - public void handle(PacketCDClientStatus clientStatus) throws Exception - { - } - - public void handle(PacketCEScoreboardObjective objective) throws Exception - { - } - - public void handle(PacketCFScoreboardScore score) throws Exception - { - } - - public void handle(PacketD0DisplayScoreboard displayScoreboard) throws Exception - { - } - - public void handle(PacketD1Team team) throws Exception - { - } - - public void handle(PacketFAPluginMessage pluginMessage) throws Exception - { - } - - public void handle(PacketFCEncryptionResponse encryptResponse) throws Exception - { - } - - public void handle(PacketFDEncryptionRequest encryptRequest) throws Exception - { - } - - public void handle(PacketFEPing ping) throws Exception - { - } - - public void handle(PacketFFKick kick) throws Exception - { - } - - public void handle(PacketCBTabComplete tabComplete) throws Exception - { - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketFFKick.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Chat.java similarity index 64% rename from protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketFFKick.java rename to protocol/src/main/java/net/md_5/bungee/protocol/packet/Chat.java index 54923cee..40e92d68 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketFFKick.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Chat.java @@ -1,29 +1,22 @@ package net.md_5.bungee.protocol.packet; +import net.md_5.bungee.protocol.DefinedPacket; import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; -@Getter -@ToString +@Data +@NoArgsConstructor +@AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class PacketFFKick extends DefinedPacket +public class Chat extends DefinedPacket { private String message; - private PacketFFKick() - { - super( 0xFF ); - } - - public PacketFFKick(String message) - { - this(); - this.message = message; - } - @Override public void read(ByteBuf buf) { diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketCCSettings.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/ClientSettings.java similarity index 70% rename from protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketCCSettings.java rename to protocol/src/main/java/net/md_5/bungee/protocol/packet/ClientSettings.java index 83c2d361..e3078ba0 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketCCSettings.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/ClientSettings.java @@ -1,31 +1,34 @@ package net.md_5.bungee.protocol.packet; +import net.md_5.bungee.protocol.DefinedPacket; import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.ToString; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; -@ToString +@Data +@NoArgsConstructor +@AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class PacketCCSettings extends DefinedPacket +public class ClientSettings extends DefinedPacket { private String locale; private byte viewDistance; private byte chatFlags; + private boolean unknown; private byte difficulty; private boolean showCape; - private PacketCCSettings() - { - super( 0xCC ); - } - @Override public void read(ByteBuf buf) { locale = readString( buf ); viewDistance = buf.readByte(); chatFlags = buf.readByte(); + unknown = buf.readBoolean(); difficulty = buf.readByte(); showCape = buf.readBoolean(); } @@ -36,6 +39,7 @@ public class PacketCCSettings extends DefinedPacket writeString( locale, buf ); buf.writeByte( viewDistance ); buf.writeByte( chatFlags ); + buf.writeBoolean( unknown ); buf.writeByte( difficulty ); buf.writeBoolean( showCape ); } diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketCDClientStatus.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/ClientStatus.java similarity index 63% rename from protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketCDClientStatus.java rename to protocol/src/main/java/net/md_5/bungee/protocol/packet/ClientStatus.java index ff2d7c18..d4314dc5 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketCDClientStatus.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/ClientStatus.java @@ -1,27 +1,22 @@ package net.md_5.bungee.protocol.packet; +import net.md_5.bungee.protocol.DefinedPacket; import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.ToString; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; -@ToString +@Data +@NoArgsConstructor +@AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class PacketCDClientStatus extends DefinedPacket +public class ClientStatus extends DefinedPacket { private byte payload; - private PacketCDClientStatus() - { - super( 0xCD ); - } - - public PacketCDClientStatus(byte payload) - { - this(); - this.payload = payload; - } - @Override public void read(ByteBuf buf) { diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/DefinedPacket.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/DefinedPacket.java deleted file mode 100644 index cf81095a..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/DefinedPacket.java +++ /dev/null @@ -1,69 +0,0 @@ -package net.md_5.bungee.protocol.packet; - -import io.netty.buffer.ByteBuf; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public abstract class DefinedPacket -{ - - private final int id; - - public final int getId() - { - return id; - } - - public void writeString(String s, ByteBuf buf) - { - // TODO: Check len - use Guava? - buf.writeShort( s.length() ); - for ( char c : s.toCharArray() ) - { - buf.writeChar( c ); - } - } - - public String readString(ByteBuf buf) - { - // TODO: Check len - use Guava? - short len = buf.readShort(); - char[] chars = new char[ len ]; - for ( int i = 0; i < len; i++ ) - { - chars[i] = buf.readChar(); - } - return new String( chars ); - } - - public void writeArray(byte[] b, ByteBuf buf) - { - // TODO: Check len - use Guava? - buf.writeShort( b.length ); - buf.writeBytes( b ); - } - - public byte[] readArray(ByteBuf buf) - { - // TODO: Check len - use Guava? - short len = buf.readShort(); - byte[] ret = new byte[ len ]; - buf.readBytes( ret ); - return ret; - } - - public abstract void read(ByteBuf buf); - - public abstract void write(ByteBuf buf); - - public abstract void handle(AbstractPacketHandler handler) throws Exception; - - @Override - public abstract boolean equals(Object obj); - - @Override - public abstract int hashCode(); - - @Override - public abstract String toString(); -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketFDEncryptionRequest.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/EncryptionRequest.java similarity index 62% rename from protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketFDEncryptionRequest.java rename to protocol/src/main/java/net/md_5/bungee/protocol/packet/EncryptionRequest.java index 278646a0..4521f6c3 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketFDEncryptionRequest.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/EncryptionRequest.java @@ -1,33 +1,24 @@ package net.md_5.bungee.protocol.packet; import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; +import net.md_5.bungee.protocol.DefinedPacket; -@Getter -@ToString +@Data +@NoArgsConstructor +@AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class PacketFDEncryptionRequest extends DefinedPacket +public class EncryptionRequest extends DefinedPacket { private String serverId; private byte[] publicKey; private byte[] verifyToken; - private PacketFDEncryptionRequest() - { - super( 0xFD ); - } - - public PacketFDEncryptionRequest(String serverId, byte[] publicKey, byte[] verifyToken) - { - this(); - this.serverId = serverId; - this.publicKey = publicKey; - this.verifyToken = verifyToken; - } - @Override public void read(ByteBuf buf) { diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketFCEncryptionResponse.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/EncryptionResponse.java similarity index 61% rename from protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketFCEncryptionResponse.java rename to protocol/src/main/java/net/md_5/bungee/protocol/packet/EncryptionResponse.java index 2f484622..443c7a5b 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketFCEncryptionResponse.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/EncryptionResponse.java @@ -1,31 +1,23 @@ package net.md_5.bungee.protocol.packet; +import net.md_5.bungee.protocol.DefinedPacket; import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; -@Getter -@ToString +@Data +@NoArgsConstructor +@AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class PacketFCEncryptionResponse extends DefinedPacket +public class EncryptionResponse extends DefinedPacket { private byte[] sharedSecret; private byte[] verifyToken; - private PacketFCEncryptionResponse() - { - super( 0xFC ); - } - - public PacketFCEncryptionResponse(byte[] sharedSecret, byte[] verifyToken) - { - this(); - this.sharedSecret = sharedSecret; - this.verifyToken = verifyToken; - } - @Override public void read(ByteBuf buf) { diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Handshake.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Handshake.java new file mode 100644 index 00000000..930b3474 --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Handshake.java @@ -0,0 +1,46 @@ +package net.md_5.bungee.protocol.packet; + +import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.DefinedPacket; +import net.md_5.bungee.protocol.AbstractPacketHandler; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class Handshake extends DefinedPacket +{ + + private int protocolVersion; + private String host; + private int port; + private int requestedProtocol; + + @Override + public void read(ByteBuf buf) + { + protocolVersion = readVarInt( buf ); + host = readString( buf ); + port = buf.readUnsignedShort(); + requestedProtocol = readVarInt( buf ); + } + + @Override + public void write(ByteBuf buf) + { + writeVarInt( protocolVersion, buf ); + writeString( host, buf ); + buf.writeShort( port ); + writeVarInt( requestedProtocol, buf ); + } + + @Override + public void handle(AbstractPacketHandler handler) throws Exception + { + handler.handle( this ); + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet0KeepAlive.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/KeepAlive.java similarity index 61% rename from protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet0KeepAlive.java rename to protocol/src/main/java/net/md_5/bungee/protocol/packet/KeepAlive.java index 9afdcb38..12065ac4 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet0KeepAlive.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/KeepAlive.java @@ -1,23 +1,22 @@ package net.md_5.bungee.protocol.packet; +import net.md_5.bungee.protocol.DefinedPacket; import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; -@Getter -@ToString +@Data +@NoArgsConstructor +@AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class Packet0KeepAlive extends DefinedPacket +public class KeepAlive extends DefinedPacket { private int randomId; - private Packet0KeepAlive() - { - super( 0x00 ); - } - @Override public void read(ByteBuf buf) { diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet3Chat.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Kick.java similarity index 62% rename from protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet3Chat.java rename to protocol/src/main/java/net/md_5/bungee/protocol/packet/Kick.java index 44a60738..05ae1ae0 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet3Chat.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Kick.java @@ -1,31 +1,22 @@ package net.md_5.bungee.protocol.packet; +import net.md_5.bungee.protocol.DefinedPacket; import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; -@Getter -@Setter -@ToString +@Data +@NoArgsConstructor +@AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class Packet3Chat extends DefinedPacket +public class Kick extends DefinedPacket { private String message; - private Packet3Chat() - { - super( 0x03 ); - } - - public Packet3Chat(String message) - { - this(); - this.message = message; - } - @Override public void read(ByteBuf buf) { diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/LegacyPing.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/LegacyPing.java new file mode 100644 index 00000000..2ead20af --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/LegacyPing.java @@ -0,0 +1,46 @@ +package net.md_5.bungee.protocol.packet; + +import io.netty.buffer.ByteBuf; +import net.md_5.bungee.protocol.AbstractPacketHandler; +import net.md_5.bungee.protocol.DefinedPacket; + +public class LegacyPing extends DefinedPacket +{ + + @Override + public void read(ByteBuf buf) + { + throw new UnsupportedOperationException( "Not supported yet." ); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void write(ByteBuf buf) + { + throw new UnsupportedOperationException( "Not supported yet." ); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void handle(AbstractPacketHandler handler) throws Exception + { + handler.handle( this ); + } + + @Override + public boolean equals(Object obj) + { + throw new UnsupportedOperationException( "Not supported yet." ); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public int hashCode() + { + throw new UnsupportedOperationException( "Not supported yet." ); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public String toString() + { + throw new UnsupportedOperationException( "Not supported yet." ); //To change body of generated methods, choose Tools | Templates. + } + +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Login.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Login.java new file mode 100644 index 00000000..ff41f7b9 --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Login.java @@ -0,0 +1,52 @@ +package net.md_5.bungee.protocol.packet; + +import net.md_5.bungee.protocol.DefinedPacket; +import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class Login extends DefinedPacket +{ + + private int entityId; + private short gameMode; + private int dimension; + private short difficulty; + private short maxPlayers; + private String levelType; + + @Override + public void read(ByteBuf buf) + { + entityId = buf.readInt(); + gameMode = buf.readUnsignedByte(); + dimension = buf.readByte(); + difficulty = buf.readUnsignedByte(); + maxPlayers = buf.readUnsignedByte(); + levelType = readString( buf ); + } + + @Override + public void write(ByteBuf buf) + { + buf.writeInt( entityId ); + buf.writeByte( gameMode ); + buf.writeByte( dimension ); + buf.writeByte( difficulty ); + buf.writeByte( maxPlayers ); + writeString( levelType, buf ); + } + + @Override + public void handle(AbstractPacketHandler handler) throws Exception + { + handler.handle( this ); + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/LoginRequest.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/LoginRequest.java new file mode 100644 index 00000000..32ba098c --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/LoginRequest.java @@ -0,0 +1,41 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package net.md_5.bungee.protocol.packet; + +import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; +import net.md_5.bungee.protocol.DefinedPacket; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class LoginRequest extends DefinedPacket +{ + + private String data; + + @Override + public void read(ByteBuf buf) + { + data = readString( buf ); + } + + @Override + public void write(ByteBuf buf) + { + writeString( data, buf ); + } + + @Override + public void handle(AbstractPacketHandler handler) throws Exception + { + handler.handle( this ); + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet2Handshake.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/LoginSuccess.java similarity index 50% rename from protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet2Handshake.java rename to protocol/src/main/java/net/md_5/bungee/protocol/packet/LoginSuccess.java index af8b059f..09c718b5 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet2Handshake.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/LoginSuccess.java @@ -1,44 +1,35 @@ package net.md_5.bungee.protocol.packet; import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.DefinedPacket; +import net.md_5.bungee.protocol.AbstractPacketHandler; -@Getter -@Setter -@ToString +@Data +@NoArgsConstructor +@AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class Packet2Handshake extends DefinedPacket +public class LoginSuccess extends DefinedPacket { - private byte protocolVersion; + private String uuid; private String username; - private String host; - private int port; - - private Packet2Handshake() - { - super( 0x02 ); - } @Override public void read(ByteBuf buf) { - protocolVersion = buf.readByte(); + uuid = readString( buf ); username = readString( buf ); - host = readString( buf ); - port = buf.readInt(); } @Override public void write(ByteBuf buf) { - buf.writeByte( protocolVersion ); + writeString( uuid, buf ); writeString( username, buf ); - writeString( host, buf ); - buf.writeInt( port ); } @Override diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet1Login.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet1Login.java deleted file mode 100644 index d73674fd..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet1Login.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.md_5.bungee.protocol.packet; - -import io.netty.buffer.ByteBuf; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; - -@Getter -@ToString -@EqualsAndHashCode(callSuper = false) -public class Packet1Login extends DefinedPacket -{ - - protected int entityId; - protected String levelType; - protected byte gameMode; - protected int dimension; - protected byte difficulty; - protected byte unused; - protected byte maxPlayers; - - protected Packet1Login() - { - super( 0x01 ); - } - - public Packet1Login(int entityId, String levelType, byte gameMode, byte dimension, byte difficulty, byte unused, byte maxPlayers) - { - this( entityId, levelType, gameMode, (int) dimension, difficulty, unused, maxPlayers ); - } - - public Packet1Login(int entityId, String levelType, byte gameMode, int dimension, byte difficulty, byte unused, byte maxPlayers) - { - this(); - this.entityId = entityId; - this.levelType = levelType; - this.gameMode = gameMode; - this.dimension = dimension; - this.difficulty = difficulty; - this.unused = unused; - this.maxPlayers = maxPlayers; - } - - @Override - public void read(ByteBuf buf) - { - entityId = buf.readInt(); - levelType = readString( buf ); - gameMode = buf.readByte(); - dimension = buf.readByte(); - difficulty = buf.readByte(); - unused = buf.readByte(); - maxPlayers = buf.readByte(); - } - - @Override - public void write(ByteBuf buf) - { - buf.writeInt( entityId ); - writeString( levelType, buf ); - buf.writeByte( gameMode ); - buf.writeByte( dimension ); - buf.writeByte( difficulty ); - buf.writeByte( unused ); - buf.writeByte( maxPlayers ); - } - - @Override - public void handle(AbstractPacketHandler handler) throws Exception - { - handler.handle( this ); - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet2CEntityProperties.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet2CEntityProperties.java deleted file mode 100644 index a0bd50de..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet2CEntityProperties.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.md_5.bungee.protocol.packet; - -import io.netty.buffer.ByteBuf; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; - -@Getter -@ToString -@EqualsAndHashCode(callSuper = false) -public class Packet2CEntityProperties extends DefinedPacket -{ - - public Packet2CEntityProperties() - { - super( 0x2C ); - } - - @Override - public void read(ByteBuf buf) - { - buf.readInt(); - int recordCount = buf.readInt(); - for ( int i = 0; i < recordCount; i++ ) - { - readString( buf ); - buf.readDouble(); - short size = buf.readShort(); - for ( short s = 0; s < size; s++ ) - { - buf.skipBytes( 25 ); // long, long, double, byte - } - } - } - - @Override - public void write(ByteBuf buf) - { - throw new UnsupportedOperationException(); - } - - @Override - public void handle(AbstractPacketHandler handler) throws Exception - { - handler.handle( this ); - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet9Respawn.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet9Respawn.java deleted file mode 100644 index 3e916cbc..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Packet9Respawn.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.md_5.bungee.protocol.packet; - -import io.netty.buffer.ByteBuf; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ToString -@EqualsAndHashCode(callSuper = false) -public class Packet9Respawn extends DefinedPacket -{ - - private int dimension; - private byte difficulty; - private byte gameMode; - private short worldHeight; - private String levelType; - - private Packet9Respawn() - { - super( 0x09 ); - } - - public Packet9Respawn(int dimension, byte difficulty, byte gameMode, short worldHeight, String levelType) - { - this(); - this.dimension = dimension; - this.difficulty = difficulty; - this.gameMode = gameMode; - this.worldHeight = worldHeight; - this.levelType = levelType; - } - - @Override - public void read(ByteBuf buf) - { - dimension = buf.readInt(); - difficulty = buf.readByte(); - gameMode = buf.readByte(); - worldHeight = buf.readShort(); - levelType = readString( buf ); - } - - @Override - public void write(ByteBuf buf) - { - buf.writeInt( dimension ); - buf.writeByte( difficulty ); - buf.writeByte( gameMode ); - buf.writeShort( worldHeight ); - writeString( levelType, buf ); - } - - @Override - public void handle(AbstractPacketHandler handler) throws Exception - { - handler.handle( this ); - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketCBTabComplete.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketCBTabComplete.java deleted file mode 100644 index 01df2ff4..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketCBTabComplete.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.md_5.bungee.protocol.packet; - -import io.netty.buffer.ByteBuf; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; - -@Getter -@ToString -@EqualsAndHashCode(callSuper = false) -public class PacketCBTabComplete extends DefinedPacket -{ - - private String cursor; - private String[] commands; - - private PacketCBTabComplete() - { - super( 0xCB ); - } - - public PacketCBTabComplete(String[] alternatives) - { - this(); - commands = alternatives; - } - - @Override - public void read(ByteBuf buf) - { - cursor = readString( buf ); - } - - @Override - public void write(ByteBuf buf) - { - StringBuilder tab = new StringBuilder(); - for ( String alternative : commands ) - { - tab.append( alternative ); - tab.append( "\00" ); - } - writeString( tab.substring( 0, tab.length() - 1 ), buf ); - } - - @Override - public void handle(AbstractPacketHandler handler) throws Exception - { - handler.handle( this ); - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PingPacket.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/PingPacket.java new file mode 100644 index 00000000..5f24d425 --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/PingPacket.java @@ -0,0 +1,37 @@ +package net.md_5.bungee.protocol.packet; + +import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; +import net.md_5.bungee.protocol.DefinedPacket; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class PingPacket extends DefinedPacket +{ + + private long time; + + @Override + public void read(ByteBuf buf) + { + time = buf.readLong(); + } + + @Override + public void write(ByteBuf buf) + { + buf.writeLong( time ); + } + + @Override + public void handle(AbstractPacketHandler handler) throws Exception + { + handler.handle( this ); + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketC9PlayerListItem.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/PlayerListItem.java similarity index 63% rename from protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketC9PlayerListItem.java rename to protocol/src/main/java/net/md_5/bungee/protocol/packet/PlayerListItem.java index 9fbfaf7d..9182c1cc 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketC9PlayerListItem.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/PlayerListItem.java @@ -1,33 +1,24 @@ package net.md_5.bungee.protocol.packet; +import net.md_5.bungee.protocol.DefinedPacket; import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; -@Getter -@ToString +@Data +@NoArgsConstructor +@AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class PacketC9PlayerListItem extends DefinedPacket +public class PlayerListItem extends DefinedPacket { private String username; private boolean online; private short ping; - private PacketC9PlayerListItem() - { - super( 0xC9 ); - } - - public PacketC9PlayerListItem(String username, boolean online, short ping) - { - super( 0xC9 ); - this.username = username; - this.online = online; - this.ping = ping; - } - @Override public void read(ByteBuf buf) { diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketFAPluginMessage.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/PluginMessage.java similarity index 72% rename from protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketFAPluginMessage.java rename to protocol/src/main/java/net/md_5/bungee/protocol/packet/PluginMessage.java index d2eef89b..57d4efea 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketFAPluginMessage.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/PluginMessage.java @@ -1,37 +1,28 @@ package net.md_5.bungee.protocol.packet; +import net.md_5.bungee.protocol.DefinedPacket; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import java.io.ByteArrayInputStream; import java.io.DataInput; import java.io.DataInputStream; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; +import lombok.NoArgsConstructor; import net.md_5.bungee.protocol.MinecraftInput; -import net.md_5.bungee.protocol.MinecraftOutput; +import net.md_5.bungee.protocol.AbstractPacketHandler; -@Getter -@ToString +@Data +@NoArgsConstructor +@AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class PacketFAPluginMessage extends DefinedPacket +public class PluginMessage extends DefinedPacket { private String tag; private byte[] data; - private PacketFAPluginMessage() - { - super( 0xFA ); - } - - public PacketFAPluginMessage(String tag, byte[] data) - { - this(); - this.tag = tag; - this.data = data; - } - @Override public void read(ByteBuf buf) { diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Respawn.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Respawn.java new file mode 100644 index 00000000..d0a7529e --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Respawn.java @@ -0,0 +1,46 @@ +package net.md_5.bungee.protocol.packet; + +import net.md_5.bungee.protocol.DefinedPacket; +import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class Respawn extends DefinedPacket +{ + + private int dimension; + private short difficulty; + private short gameMode; + private String levelType; + + @Override + public void read(ByteBuf buf) + { + dimension = buf.readInt(); + difficulty = buf.readUnsignedByte(); + gameMode = buf.readUnsignedByte(); + levelType = readString( buf ); + } + + @Override + public void write(ByteBuf buf) + { + buf.writeInt( dimension ); + buf.writeByte( difficulty ); + buf.writeByte( gameMode ); + writeString( levelType, buf ); + } + + @Override + public void handle(AbstractPacketHandler handler) throws Exception + { + handler.handle( this ); + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketD0DisplayScoreboard.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/ScoreboardDisplay.java similarity index 69% rename from protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketD0DisplayScoreboard.java rename to protocol/src/main/java/net/md_5/bungee/protocol/packet/ScoreboardDisplay.java index de729f17..3a6830db 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketD0DisplayScoreboard.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/ScoreboardDisplay.java @@ -1,14 +1,18 @@ package net.md_5.bungee.protocol.packet; +import net.md_5.bungee.protocol.DefinedPacket; import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; -@Getter -@ToString +@Data +@NoArgsConstructor +@AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class PacketD0DisplayScoreboard extends DefinedPacket +public class ScoreboardDisplay extends DefinedPacket { /** @@ -17,11 +21,6 @@ public class PacketD0DisplayScoreboard extends DefinedPacket private byte position; private String name; - private PacketD0DisplayScoreboard() - { - super( 0xD0 ); - } - @Override public void read(ByteBuf buf) { diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketCEScoreboardObjective.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/ScoreboardObjective.java similarity index 64% rename from protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketCEScoreboardObjective.java rename to protocol/src/main/java/net/md_5/bungee/protocol/packet/ScoreboardObjective.java index db5d6033..e2b61e48 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketCEScoreboardObjective.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/ScoreboardObjective.java @@ -1,14 +1,18 @@ package net.md_5.bungee.protocol.packet; +import net.md_5.bungee.protocol.DefinedPacket; import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; -@Getter -@ToString +@Data +@NoArgsConstructor +@AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class PacketCEScoreboardObjective extends DefinedPacket +public class ScoreboardObjective extends DefinedPacket { private String name; @@ -18,19 +22,6 @@ public class PacketCEScoreboardObjective extends DefinedPacket */ private byte action; - private PacketCEScoreboardObjective() - { - super( 0xCE ); - } - - public PacketCEScoreboardObjective(String name, String text, byte action) - { - this(); - this.name = name; - this.text = text; - this.action = action; - } - @Override public void read(ByteBuf buf) { diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketCFScoreboardScore.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/ScoreboardScore.java similarity index 77% rename from protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketCFScoreboardScore.java rename to protocol/src/main/java/net/md_5/bungee/protocol/packet/ScoreboardScore.java index e55efa1e..a14fd155 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketCFScoreboardScore.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/ScoreboardScore.java @@ -1,14 +1,18 @@ package net.md_5.bungee.protocol.packet; +import net.md_5.bungee.protocol.DefinedPacket; import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; -@Getter -@ToString +@Data +@NoArgsConstructor +@AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class PacketCFScoreboardScore extends DefinedPacket +public class ScoreboardScore extends DefinedPacket { private String itemName; @@ -19,11 +23,6 @@ public class PacketCFScoreboardScore extends DefinedPacket private String scoreName; private int value; - private PacketCFScoreboardScore() - { - super( 0xCF ); - } - @Override public void read(ByteBuf buf) { diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketFEPing.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/StatusRequest.java similarity index 59% rename from protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketFEPing.java rename to protocol/src/main/java/net/md_5/bungee/protocol/packet/StatusRequest.java index b2824c7e..738f0c92 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketFEPing.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/StatusRequest.java @@ -1,36 +1,31 @@ -package net.md_5.bungee.protocol.packet; - -import io.netty.buffer.ByteBuf; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ToString -@EqualsAndHashCode(callSuper = false) -public class PacketFEPing extends DefinedPacket -{ - - private byte version; - - private PacketFEPing() - { - super( 0xFE ); - } - - @Override - public void read(ByteBuf buf) - { - version = buf.readByte(); - } - - @Override - public void write(ByteBuf buf) - { - buf.writeByte( version ); - } - - @Override - public void handle(AbstractPacketHandler handler) throws Exception - { - handler.handle( this ); - } -} +package net.md_5.bungee.protocol.packet; + +import io.netty.buffer.ByteBuf; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; +import net.md_5.bungee.protocol.DefinedPacket; + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class StatusRequest extends DefinedPacket +{ + + @Override + public void read(ByteBuf buf) + { + } + + @Override + public void write(ByteBuf buf) + { + } + + @Override + public void handle(AbstractPacketHandler handler) throws Exception + { + handler.handle( this ); + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/StatusResponse.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/StatusResponse.java new file mode 100644 index 00000000..69a9d46c --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/StatusResponse.java @@ -0,0 +1,37 @@ +package net.md_5.bungee.protocol.packet; + +import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; +import net.md_5.bungee.protocol.DefinedPacket; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class StatusResponse extends DefinedPacket +{ + + private String response; + + @Override + public void read(ByteBuf buf) + { + response = readString( buf ); + } + + @Override + public void write(ByteBuf buf) + { + writeString( response, buf ); + } + + @Override + public void handle(AbstractPacketHandler handler) throws Exception + { + handler.handle( this ); + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/TabCompleteRequest.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/TabCompleteRequest.java new file mode 100644 index 00000000..3bedbd5e --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/TabCompleteRequest.java @@ -0,0 +1,37 @@ +package net.md_5.bungee.protocol.packet; + +import net.md_5.bungee.protocol.DefinedPacket; +import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class TabCompleteRequest extends DefinedPacket +{ + + private String cursor; + + @Override + public void read(ByteBuf buf) + { + cursor = readString( buf ); + } + + @Override + public void write(ByteBuf buf) + { + writeString( cursor, buf ); + } + + @Override + public void handle(AbstractPacketHandler handler) throws Exception + { + handler.handle( this ); + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/TabCompleteResponse.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/TabCompleteResponse.java new file mode 100644 index 00000000..0027b989 --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/TabCompleteResponse.java @@ -0,0 +1,37 @@ +package net.md_5.bungee.protocol.packet; + +import net.md_5.bungee.protocol.DefinedPacket; +import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class TabCompleteResponse extends DefinedPacket +{ + + private String[] commands; + + @Override + public void read(ByteBuf buf) + { + commands = readStringArray( buf ); + } + + @Override + public void write(ByteBuf buf) + { + writeStringArray( commands, buf ); + } + + @Override + public void handle(AbstractPacketHandler handler) throws Exception + { + handler.handle( this ); + } +} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketD1Team.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Team.java similarity index 86% rename from protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketD1Team.java rename to protocol/src/main/java/net/md_5/bungee/protocol/packet/Team.java index 69bf3771..2ecce118 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/PacketD1Team.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Team.java @@ -1,14 +1,18 @@ package net.md_5.bungee.protocol.packet; +import net.md_5.bungee.protocol.DefinedPacket; import io.netty.buffer.ByteBuf; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; +import lombok.NoArgsConstructor; +import net.md_5.bungee.protocol.AbstractPacketHandler; -@Getter -@ToString +@Data +@NoArgsConstructor +@AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class PacketD1Team extends DefinedPacket +public class Team extends DefinedPacket { private String name; @@ -23,17 +27,12 @@ public class PacketD1Team extends DefinedPacket private short playerCount; private String[] players; - private PacketD1Team() - { - super( 0xD1 ); - } - /** * Packet to destroy a team. * * @param name */ - public PacketD1Team(String name) + public Team(String name) { this(); this.name = name; diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/forge/Forge1Login.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/forge/Forge1Login.java deleted file mode 100644 index 96e12d2d..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/forge/Forge1Login.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.md_5.bungee.protocol.packet.forge; - -import net.md_5.bungee.protocol.packet.*; -import io.netty.buffer.ByteBuf; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ToString -@EqualsAndHashCode(callSuper = false) -public class Forge1Login extends Packet1Login -{ - - private Forge1Login() - { - super(); - } - - public Forge1Login(int entityId, String levelType, byte gameMode, int dimension, byte difficulty, byte unused, byte maxPlayers) - { - super( entityId, levelType, gameMode, dimension, difficulty, unused, maxPlayers ); - } - - @Override - public void read(ByteBuf buf) - { - entityId = buf.readInt(); - levelType = readString( buf ); - gameMode = buf.readByte(); - dimension = buf.readInt(); - difficulty = buf.readByte(); - unused = buf.readByte(); - maxPlayers = buf.readByte(); - } - - @Override - public void write(ByteBuf buf) - { - buf.writeInt( entityId ); - writeString( levelType, buf ); - buf.writeByte( gameMode ); - buf.writeInt( dimension ); - buf.writeByte( difficulty ); - buf.writeByte( unused ); - buf.writeByte( maxPlayers ); - } - - @Override - public void handle(AbstractPacketHandler handler) throws Exception - { - handler.handle( this ); - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/skip/BulkChunk.java b/protocol/src/main/java/net/md_5/bungee/protocol/skip/BulkChunk.java deleted file mode 100644 index 33f03e37..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/skip/BulkChunk.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.md_5.bungee.protocol.skip; - -import io.netty.buffer.ByteBuf; - -public class BulkChunk extends Instruction -{ - - @Override - void read(ByteBuf in) - { - short count = in.readShort(); - int size = in.readInt(); - in.readBoolean(); - in.skipBytes( size + count * 12 ); - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/skip/ByteHeader.java b/protocol/src/main/java/net/md_5/bungee/protocol/skip/ByteHeader.java deleted file mode 100644 index d9f99e02..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/skip/ByteHeader.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.md_5.bungee.protocol.skip; - -import io.netty.buffer.ByteBuf; - -class ByteHeader extends Instruction -{ - - private final Instruction child; - - ByteHeader(Instruction child) - { - this.child = child; - } - - @Override - void read(ByteBuf in) - { - byte size = in.readByte(); - for ( byte b = 0; b < size; b++ ) - { - child.read( in ); - } - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/skip/Instruction.java b/protocol/src/main/java/net/md_5/bungee/protocol/skip/Instruction.java deleted file mode 100644 index b85feeeb..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/skip/Instruction.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.md_5.bungee.protocol.skip; - -import io.netty.buffer.ByteBuf; - -abstract class Instruction -{ - - static final Instruction BOOLEAN = new Jump( 1 ); - static final Instruction BULK_CHUNK = new BulkChunk(); - static final Instruction BYTE = new Jump( 1 ); - // BYTE_INT moved down - static final Instruction DOUBLE = new Jump( 8 ); - static final Instruction FLOAT = new Jump( 4 ); - static final Instruction INT = new Jump( 4 ); - static final Instruction INT_3 = new IntHeader( new Jump( 3 ) ); - static final Instruction INT_BYTE = new IntHeader( BYTE ); - static final Instruction ITEM = new Item(); - static final Instruction LONG = new Jump( 8 ); - static final Instruction METADATA = new MetaData(); - static final Instruction OPTIONAL_MOTION = new OptionalMotion(); - static final Instruction SHORT = new Jump( 2 ); - static final Instruction SHORT_BYTE = new ShortHeader( BYTE ); - static final Instruction SHORT_ITEM = new ShortHeader( ITEM ); - static final Instruction STRING = new ShortHeader( new Jump( 2 ) ); - static final Instruction USHORT_BYTE = new UnsignedShortByte(); - static final Instruction OPTIONAL_WINDOW = new OptionalWindow(); - // Illegal forward references below this line - static final Instruction BYTE_INT = new ByteHeader( INT ); - // Custom instructions - static final Instruction STRING_ARRAY = new ShortHeader( STRING ); - - abstract void read(ByteBuf in); -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/skip/IntHeader.java b/protocol/src/main/java/net/md_5/bungee/protocol/skip/IntHeader.java deleted file mode 100644 index 0b87c54e..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/skip/IntHeader.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.md_5.bungee.protocol.skip; - -import io.netty.buffer.ByteBuf; - -class IntHeader extends Instruction -{ - - private final Instruction child; - - IntHeader(Instruction child) - { - this.child = child; - } - - @Override - void read(ByteBuf in) - { - int size = in.readInt(); - for ( int i = 0; i < size; i++ ) - { - child.read( in ); - } - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/skip/Item.java b/protocol/src/main/java/net/md_5/bungee/protocol/skip/Item.java deleted file mode 100644 index cb632e33..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/skip/Item.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.md_5.bungee.protocol.skip; - -import io.netty.buffer.ByteBuf; - -class Item extends Instruction -{ - - @Override - void read(ByteBuf in) - { - short type = in.readShort(); - if ( type >= 0 ) - { - in.skipBytes( 3 ); - SHORT_BYTE.read( in ); - } - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/skip/Jump.java b/protocol/src/main/java/net/md_5/bungee/protocol/skip/Jump.java deleted file mode 100644 index d7c451ae..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/skip/Jump.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.md_5.bungee.protocol.skip; - -import io.netty.buffer.ByteBuf; - -class Jump extends Instruction -{ - - final int len; - - Jump(int len) - { - if ( len < 0 ) - { - throw new IndexOutOfBoundsException(); - } - this.len = len; - } - - @Override - void read(ByteBuf in) - { - in.skipBytes( len ); - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/skip/MetaData.java b/protocol/src/main/java/net/md_5/bungee/protocol/skip/MetaData.java deleted file mode 100644 index 929a664f..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/skip/MetaData.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.md_5.bungee.protocol.skip; - -import io.netty.buffer.ByteBuf; - -class MetaData extends Instruction -{ - - @Override - void read(ByteBuf in) - { - int x = in.readUnsignedByte(); - while ( x != 127 ) - { - int type = x >> 5; - switch ( type ) - { - case 0: - BYTE.read( in ); - break; - case 1: - SHORT.read( in ); - break; - case 2: - INT.read( in ); - break; - case 3: - FLOAT.read( in ); - break; - case 4: - STRING.read( in ); - break; - case 5: - ITEM.read( in ); - break; - case 6: - in.skipBytes( 12 ); // int, int, int - break; - default: - throw new IllegalArgumentException( "Unknown metadata type " + type ); - } - x = in.readUnsignedByte(); - } - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/skip/OptionalMotion.java b/protocol/src/main/java/net/md_5/bungee/protocol/skip/OptionalMotion.java deleted file mode 100644 index 45e040fb..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/skip/OptionalMotion.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.md_5.bungee.protocol.skip; - -import io.netty.buffer.ByteBuf; - -class OptionalMotion extends Instruction -{ - - @Override - void read(ByteBuf in) - { - int data = in.readInt(); - if ( data > 0 ) - { - in.skipBytes( 6 ); - } - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/skip/OptionalWindow.java b/protocol/src/main/java/net/md_5/bungee/protocol/skip/OptionalWindow.java deleted file mode 100644 index 1fc71340..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/skip/OptionalWindow.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.md_5.bungee.protocol.skip; - -import io.netty.buffer.ByteBuf; - -public class OptionalWindow extends Instruction -{ - - @Override - void read(ByteBuf in) - { - BYTE.read( in ); - byte type = in.readByte(); - STRING.read( in ); - BYTE.read( in ); - BOOLEAN.read( in ); - if ( type == 11 ) - { - INT.read( in ); - } - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/skip/PacketReader.java b/protocol/src/main/java/net/md_5/bungee/protocol/skip/PacketReader.java deleted file mode 100644 index 141b718d..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/skip/PacketReader.java +++ /dev/null @@ -1,74 +0,0 @@ -package net.md_5.bungee.protocol.skip; - -import io.netty.buffer.ByteBuf; -import java.util.ArrayList; -import java.util.List; -import net.md_5.bungee.protocol.OpCode; -import net.md_5.bungee.protocol.Protocol; - -public class PacketReader -{ - - private final Instruction[][] instructions; - - public PacketReader(Protocol protocol) - { - instructions = new Instruction[ protocol.getOpCodes().length ][]; - for ( int i = 0; i < instructions.length; i++ ) - { - List output = new ArrayList<>(); - - OpCode[] enums = protocol.getOpCodes()[i]; - if ( enums != null ) - { - for ( OpCode struct : enums ) - { - try - { - output.add( (Instruction) Instruction.class.getDeclaredField( struct.name() ).get( null ) ); - } catch ( NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex ) - { - throw new UnsupportedOperationException( "No definition for " + struct.name() ); - } - } - - List crushed = new ArrayList<>(); - int nextJumpSize = 0; - for ( Instruction child : output ) - { - if ( child instanceof Jump ) - { - nextJumpSize += ( (Jump) child ).len; - } else - { - if ( nextJumpSize != 0 ) - { - crushed.add( new Jump( nextJumpSize ) ); - } - crushed.add( child ); - nextJumpSize = 0; - } - } - if ( nextJumpSize != 0 ) - { - crushed.add( new Jump( nextJumpSize ) ); - } - - instructions[i] = crushed.toArray( new Instruction[ crushed.size() ] ); - } - } - } - - public void tryRead(short packetId, ByteBuf in) - { - Instruction[] packetDef = instructions[packetId]; - - if ( packetDef != null ) - { - for ( Instruction instruction : packetDef ) - { - instruction.read( in ); - } - } - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/skip/ShortHeader.java b/protocol/src/main/java/net/md_5/bungee/protocol/skip/ShortHeader.java deleted file mode 100644 index 6db71894..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/skip/ShortHeader.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.md_5.bungee.protocol.skip; - -import io.netty.buffer.ByteBuf; - -class ShortHeader extends Instruction -{ - - private final Instruction child; - - ShortHeader(Instruction child) - { - this.child = child; - } - - @Override - void read(ByteBuf in) - { - short size = in.readShort(); - for ( short s = 0; s < size; s++ ) - { - child.read( in ); - } - } -} diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/skip/UnsignedShortByte.java b/protocol/src/main/java/net/md_5/bungee/protocol/skip/UnsignedShortByte.java deleted file mode 100644 index 3ea6ebea..00000000 --- a/protocol/src/main/java/net/md_5/bungee/protocol/skip/UnsignedShortByte.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.md_5.bungee.protocol.skip; - -import io.netty.buffer.ByteBuf; - -class UnsignedShortByte extends Instruction -{ - - @Override - void read(ByteBuf in) - { - int size = in.readUnsignedShort(); - in.skipBytes( size ); - } -} diff --git a/protocol/src/test/java/net/md_5/bungee/protocol/PacketTest.java b/protocol/src/test/java/net/md_5/bungee/protocol/PacketTest.java deleted file mode 100644 index f1596308..00000000 --- a/protocol/src/test/java/net/md_5/bungee/protocol/PacketTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.md_5.bungee.protocol; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import net.md_5.bungee.protocol.packet.AbstractPacketHandler; -import net.md_5.bungee.protocol.packet.DefinedPacket; -import org.junit.Assert; -import org.junit.Test; - -public class PacketTest -{ - - @Test - public void testPackets() throws Exception - { - AbstractPacketHandler handler = new AbstractPacketHandler() - { - }; - - for ( short i = 0; i < 256; i++ ) - { - Class clazz = Vanilla.getInstance().getClasses()[ i]; - if ( clazz != null ) - { - Assert.assertTrue( "Packet " + clazz + " is not public", Modifier.isPublic( clazz.getModifiers() ) ); - DefinedPacket packet = Vanilla.packet( i, Vanilla.getInstance() ); - Assert.assertTrue( "Could not create packet with id " + i + " and class " + clazz, packet != null ); - Assert.assertTrue( "Packet with id " + i + " does not have correct class (expected " + clazz + " but got " + packet.getClass(), packet.getClass() == clazz ); - Assert.assertTrue( "Packet " + clazz + " does not report correct id", packet.getId() == i ); - Assert.assertTrue( "Packet " + clazz + " does not have custom hash code", packet.hashCode() != System.identityHashCode( packet ) ); - Assert.assertTrue( "Packet " + clazz + " does not have custom toString", packet.toString().indexOf( '@' ) == -1 ); - // TODO: Enable this test again in v2 - // Assert.assertTrue( "Packet " + clazz + " does not have private no args constructor", Modifier.isPrivate( clazz.getDeclaredConstructor().getModifiers() ) ); - - for ( Field field : clazz.getDeclaredFields() ) - { - // TODO: Enable this test again in v2 - // Assert.assertTrue( "Packet " + clazz + " has non private field " + field, Modifier.isPrivate( field.getModifiers() ) ); - } - - packet.handle( handler ); // Make sure there are no exceptions - } - } - } -} diff --git a/protocol/src/test/java/net/md_5/bungee/protocol/ProtocolTest.java b/protocol/src/test/java/net/md_5/bungee/protocol/ProtocolTest.java deleted file mode 100644 index d9f675ad..00000000 --- a/protocol/src/test/java/net/md_5/bungee/protocol/ProtocolTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.md_5.bungee.protocol; - -import org.junit.Assert; -import org.junit.Test; - -public class ProtocolTest -{ - - @Test - public void testProtocol() - { - Assert.assertFalse( "Protocols should have different login packet", Vanilla.getInstance().getClasses()[0x01] == Forge.getInstance().classes[0x01] ); - } -} diff --git a/proxy/pom.xml b/proxy/pom.xml index 91000270..1369b852 100644 --- a/proxy/pom.xml +++ b/proxy/pom.xml @@ -6,13 +6,13 @@ net.md-5 bungeecord-parent - 1.6.4-SNAPSHOT + 1.7-SNAPSHOT ../pom.xml net.md-5 bungeecord-proxy - 1.6.4-SNAPSHOT + 1.7-SNAPSHOT jar BungeeCord-Proxy @@ -59,12 +59,6 @@ ${project.version} compile - - net.sf.trove4j - trove4j - 3.0.3 - compile - mysql mysql-connector-java diff --git a/proxy/src/main/java/Test.java b/proxy/src/main/java/Test.java new file mode 100644 index 00000000..cc08bad4 --- /dev/null +++ b/proxy/src/main/java/Test.java @@ -0,0 +1,40 @@ + +import net.md_5.bungee.BungeeCord; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.command.ConsoleCommandSender; + +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +/** + * + * @author michael + */ +public class Test +{ + + public static void main(String[] args) throws Exception + { + + System.setProperty( "java.net.preferIPv4Stack", "true" ); + + BungeeCord bungee = new BungeeCord(); + ProxyServer.setInstance( bungee ); + bungee.getLogger().info( "Enabled BungeeCord version " + bungee.getVersion() ); + bungee.start(); + + while ( bungee.isRunning ) + { + String line = bungee.getConsoleReader().readLine( ">" ); + if ( line != null ) + { + if ( !bungee.getPluginManager().dispatchCommand( ConsoleCommandSender.getInstance(), line ) ) + { + bungee.getConsole().sendMessage( ChatColor.RED + "Command not found" ); + } + } + } + } +} 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 f6bf1e0c..badcac32 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java @@ -57,10 +57,10 @@ import net.md_5.bungee.command.*; import net.md_5.bungee.config.YamlConfig; import net.md_5.bungee.log.LoggingOutputStream; import net.md_5.bungee.netty.PipelineUtils; -import net.md_5.bungee.protocol.packet.DefinedPacket; -import net.md_5.bungee.protocol.packet.Packet3Chat; -import net.md_5.bungee.protocol.packet.PacketFAPluginMessage; -import net.md_5.bungee.protocol.Vanilla; +import net.md_5.bungee.protocol.DefinedPacket; +import net.md_5.bungee.protocol.Protocol; +import net.md_5.bungee.protocol.packet.Chat; +import net.md_5.bungee.protocol.packet.PluginMessage; import net.md_5.bungee.query.RemoteQuery; import net.md_5.bungee.tab.Custom; import net.md_5.bungee.util.CaseInsensitiveMap; @@ -448,21 +448,21 @@ public class BungeeCord extends ProxyServer return Collections.unmodifiableCollection( pluginChannels ); } - public PacketFAPluginMessage registerChannels() + public PluginMessage registerChannels() { - return new PacketFAPluginMessage( "REGISTER", Util.format( pluginChannels, "\00" ).getBytes() ); + return new PluginMessage( "REGISTER", Util.format( pluginChannels, "\00" ).getBytes() ); } @Override - public byte getProtocolVersion() + public int getProtocolVersion() { - return Vanilla.PROTOCOL_VERSION; + return Protocol.PROTOCOL_VERSION; } @Override public String getGameVersion() { - return Vanilla.GAME_VERSION; + return Protocol.MINECRAFT_VERSION; } @Override @@ -483,7 +483,7 @@ public class BungeeCord extends ProxyServer getConsole().sendMessage( message ); // TODO: Here too String encoded = BungeeCord.getInstance().gson.toJson( message ); - broadcast( new Packet3Chat( "{\"text\":" + encoded + "}" ) ); + broadcast( new Chat( "{\"text\":" + encoded + "}" ) ); } public void addConnection(UserConnection con) diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeServerInfo.java b/proxy/src/main/java/net/md_5/bungee/BungeeServerInfo.java index 489b2082..48e46ed1 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeServerInfo.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeServerInfo.java @@ -25,8 +25,8 @@ import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.connection.PingHandler; import net.md_5.bungee.netty.HandlerBoss; import net.md_5.bungee.netty.PipelineUtils; -import net.md_5.bungee.protocol.packet.DefinedPacket; -import net.md_5.bungee.protocol.packet.PacketFAPluginMessage; +import net.md_5.bungee.protocol.DefinedPacket; +import net.md_5.bungee.protocol.packet.PluginMessage; @RequiredArgsConstructor public class BungeeServerInfo implements ServerInfo @@ -97,7 +97,7 @@ public class BungeeServerInfo implements ServerInfo server.sendData( channel, data ); } else { - packetQueue.add( new PacketFAPluginMessage( channel, data ) ); + packetQueue.add( new PluginMessage( channel, data ) ); } } } diff --git a/proxy/src/main/java/net/md_5/bungee/EncryptionUtil.java b/proxy/src/main/java/net/md_5/bungee/EncryptionUtil.java index 046a84d2..eb7fe4f1 100644 --- a/proxy/src/main/java/net/md_5/bungee/EncryptionUtil.java +++ b/proxy/src/main/java/net/md_5/bungee/EncryptionUtil.java @@ -15,8 +15,8 @@ import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import lombok.Getter; -import net.md_5.bungee.protocol.packet.PacketFCEncryptionResponse; -import net.md_5.bungee.protocol.packet.PacketFDEncryptionRequest; +import net.md_5.bungee.protocol.packet.EncryptionResponse; +import net.md_5.bungee.protocol.packet.EncryptionRequest; /** * Class containing all encryption related methods for the proxy. @@ -40,16 +40,16 @@ public class EncryptionUtil } } - public static PacketFDEncryptionRequest encryptRequest(boolean onlinemode) + public static EncryptionRequest encryptRequest() { - String hash = ( onlinemode ) ? Long.toString( random.nextLong(), 16 ) : "-"; + String hash = Long.toString( random.nextLong(), 16 ); byte[] pubKey = keys.getPublic().getEncoded(); byte[] verify = new byte[ 4 ]; random.nextBytes( verify ); - return new PacketFDEncryptionRequest( hash, pubKey, verify ); + return new EncryptionRequest( hash, pubKey, verify ); } - public static SecretKey getSecret(PacketFCEncryptionResponse resp, PacketFDEncryptionRequest request) throws GeneralSecurityException + public static SecretKey getSecret(EncryptionResponse resp, EncryptionRequest request) throws GeneralSecurityException { Cipher cipher = Cipher.getInstance( "RSA" ); cipher.init( Cipher.DECRYPT_MODE, keys.getPrivate() ); @@ -71,7 +71,7 @@ public class EncryptionUtil return cip; } - public static PublicKey getPubkey(PacketFDEncryptionRequest request) throws GeneralSecurityException + public static PublicKey getPubkey(EncryptionRequest request) throws GeneralSecurityException { return KeyFactory.getInstance( "RSA" ).generatePublic( new X509EncodedKeySpec( request.getPublicKey() ) ); } diff --git a/proxy/src/main/java/net/md_5/bungee/PacketConstants.java b/proxy/src/main/java/net/md_5/bungee/PacketConstants.java index e63212da..82814b07 100644 --- a/proxy/src/main/java/net/md_5/bungee/PacketConstants.java +++ b/proxy/src/main/java/net/md_5/bungee/PacketConstants.java @@ -1,18 +1,18 @@ package net.md_5.bungee; -import net.md_5.bungee.protocol.packet.Packet9Respawn; -import net.md_5.bungee.protocol.packet.PacketCDClientStatus; -import net.md_5.bungee.protocol.packet.PacketFAPluginMessage; +import net.md_5.bungee.protocol.packet.Respawn; +import net.md_5.bungee.protocol.packet.ClientStatus; +import net.md_5.bungee.protocol.packet.PluginMessage; public class PacketConstants { - public static final Packet9Respawn DIM1_SWITCH = new Packet9Respawn( (byte) 1, (byte) 0, (byte) 0, (short) 256, "DEFAULT" ); - public static final Packet9Respawn DIM2_SWITCH = new Packet9Respawn( (byte) -1, (byte) 0, (byte) 0, (short) 256, "DEFAULT" ); - public static final PacketCDClientStatus CLIENT_LOGIN = new PacketCDClientStatus( (byte) 0 ); - public static final PacketFAPluginMessage FORGE_MOD_REQUEST = new PacketFAPluginMessage( "FML", new byte[] + public static final Respawn DIM1_SWITCH = new Respawn( (byte) 1, (byte) 0, (byte) 0, "default" ); + public static final Respawn DIM2_SWITCH = new Respawn( (byte) -1, (byte) 0, (byte) 0, "default" ); + public static final ClientStatus CLIENT_LOGIN = new ClientStatus( (byte) 0 ); + public static final PluginMessage FORGE_MOD_REQUEST = new PluginMessage( "FML", new byte[] { 0, 0, 0, 0, 0, 2 } ); - public static final PacketFAPluginMessage I_AM_BUNGEE = new PacketFAPluginMessage( "BungeeCord", new byte[ 0 ] ); + public static final PluginMessage I_AM_BUNGEE = new PluginMessage( "BungeeCord", new byte[ 0 ] ); } 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 555b0ff4..b5c5af50 100644 --- a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java @@ -7,9 +7,9 @@ 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; +import net.md_5.bungee.protocol.DefinedPacket; +import net.md_5.bungee.protocol.packet.PluginMessage; +import net.md_5.bungee.protocol.packet.Kick; @RequiredArgsConstructor public class ServerConnection implements Server @@ -34,7 +34,7 @@ public class ServerConnection implements Server @Override public void sendData(String channel, byte[] data) { - unsafe().sendPacket( new PacketFAPluginMessage( channel, data ) ); + unsafe().sendPacket( new PluginMessage( channel, data ) ); } @Override @@ -43,7 +43,7 @@ public class ServerConnection implements Server if ( !ch.isClosed() ) { // TODO: Can we just use a future here? - unsafe().sendPacket( new PacketFFKick( reason ) ); + unsafe().sendPacket( new Kick( reason ) ); ch.getHandle().eventLoop().schedule( new Runnable() { @Override 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 a410ff5f..d56e0f5e 100644 --- a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java +++ b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java @@ -3,12 +3,8 @@ package net.md_5.bungee; import com.google.common.base.Preconditions; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; -import java.io.DataInput; -import java.security.PublicKey; import java.util.Objects; import java.util.Queue; -import javax.crypto.Cipher; -import javax.crypto.SecretKey; import lombok.RequiredArgsConstructor; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ProxyServer; @@ -23,23 +19,16 @@ import net.md_5.bungee.connection.CancelSendSignal; import net.md_5.bungee.connection.DownstreamBridge; import net.md_5.bungee.netty.HandlerBoss; import net.md_5.bungee.netty.ChannelWrapper; -import net.md_5.bungee.netty.CipherDecoder; -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.netty.PipelineUtils; -import net.md_5.bungee.protocol.Forge; import net.md_5.bungee.protocol.MinecraftOutput; -import net.md_5.bungee.protocol.packet.DefinedPacket; -import net.md_5.bungee.protocol.packet.Packet1Login; -import net.md_5.bungee.protocol.packet.Packet9Respawn; -import net.md_5.bungee.protocol.packet.PacketCEScoreboardObjective; -import net.md_5.bungee.protocol.packet.PacketD1Team; -import net.md_5.bungee.protocol.packet.PacketFAPluginMessage; -import net.md_5.bungee.protocol.packet.PacketFCEncryptionResponse; -import net.md_5.bungee.protocol.packet.PacketFDEncryptionRequest; -import net.md_5.bungee.protocol.packet.PacketFFKick; -import net.md_5.bungee.protocol.packet.forge.Forge1Login; +import net.md_5.bungee.protocol.DefinedPacket; +import net.md_5.bungee.protocol.Protocol; +import net.md_5.bungee.protocol.packet.Login; +import net.md_5.bungee.protocol.packet.Respawn; +import net.md_5.bungee.protocol.packet.ScoreboardObjective; +import net.md_5.bungee.protocol.packet.PluginMessage; +import net.md_5.bungee.protocol.packet.Kick; +import net.md_5.bungee.protocol.packet.LoginSuccess; @RequiredArgsConstructor public class ServerConnector extends PacketHandler @@ -49,14 +38,12 @@ public class ServerConnector extends PacketHandler private ChannelWrapper ch; private final UserConnection user; private final BungeeServerInfo target; - private State thisState = State.ENCRYPT_REQUEST; - private SecretKey secretkey; - private boolean sentMessages; + private State thisState = State.LOGIN_SUCCESS; private enum State { - ENCRYPT_REQUEST, ENCRYPT_RESPONSE, LOGIN, FINISHED; + LOGIN_SUCCESS, ENCRYPT_RESPONSE, LOGIN, FINISHED; } @Override @@ -81,15 +68,12 @@ public class ServerConnector extends PacketHandler out.writeUTF( "Login" ); out.writeUTF( user.getAddress().getHostString() ); out.writeInt( user.getAddress().getPort() ); - channel.write( new PacketFAPluginMessage( "BungeeCord", out.toByteArray() ) ); + // channel.write( new PluginMessage( "BungeeCord", out.toByteArray() ) ); MOJANG channel.write( user.getPendingConnection().getHandshake() ); - // Skip encryption if we are not using Forge - if ( user.getPendingConnection().getForgeLogin() == null ) - { - channel.write( PacketConstants.CLIENT_LOGIN ); - } + channel.setProtocol( Protocol.LOGIN ); + channel.write( user.getPendingConnection().getLoginRequest() ); } @Override @@ -99,7 +83,17 @@ public class ServerConnector extends PacketHandler } @Override - public void handle(Packet1Login login) throws Exception + public void handle(LoginSuccess loginSuccess) throws Exception + { + Preconditions.checkState( thisState == State.LOGIN_SUCCESS, "Not exepcting LOGIN_SUCCESS" ); + ch.setProtocol( Protocol.GAME ); + thisState = State.LOGIN; + + throw new CancelSendSignal(); + } + + @Override + public void handle(Login login) throws Exception { Preconditions.checkState( thisState == State.LOGIN, "Not exepcting LOGIN" ); @@ -117,17 +111,10 @@ public class ServerConnector extends PacketHandler } } - for ( PacketFAPluginMessage message : user.getPendingConnection().getRegisterMessages() ) + for ( PluginMessage message : user.getPendingConnection().getRegisterMessages() ) { ch.write( message ); } - if ( !sentMessages ) - { - for ( PacketFAPluginMessage message : user.getPendingConnection().getLoginMessages() ) - { - ch.write( message ); - } - } if ( user.getSettings() != null ) { @@ -143,21 +130,14 @@ public class ServerConnector extends PacketHandler user.setServerEntityId( login.getEntityId() ); // Set tab list size, this sucks balls, TODO: what shall we do about packet mutability - Packet1Login modLogin; - if ( ch.getHandle().pipeline().get( PacketDecoder.class ).getProtocol() == Forge.getInstance() ) - { - modLogin = new Forge1Login( login.getEntityId(), login.getLevelType(), login.getGameMode(), login.getDimension(), login.getDifficulty(), login.getUnused(), - (byte) user.getPendingConnection().getListener().getTabListSize() ); - } else - { - modLogin = new Packet1Login( login.getEntityId(), login.getLevelType(), login.getGameMode(), (byte) login.getDimension(), login.getDifficulty(), login.getUnused(), - (byte) user.getPendingConnection().getListener().getTabListSize() ); - } + Login modLogin = new Login( login.getEntityId(), login.getGameMode(), (byte) login.getDimension(), login.getDifficulty(), + (byte) user.getPendingConnection().getListener().getTabListSize(), login.getLevelType() ); + user.unsafe().sendPacket( modLogin ); MinecraftOutput out = new MinecraftOutput(); out.writeStringUTF8WithoutLengthHeaderBecauseDinnerboneStuffedUpTheMCBrandPacket( ProxyServer.getInstance().getName() + " (" + ProxyServer.getInstance().getVersion() + ")" ); - user.unsafe().sendPacket( new PacketFAPluginMessage( "MC|Brand", out.toArray() ) ); + user.unsafe().sendPacket( new PluginMessage( "MC|Brand", out.toArray() ) ); } else { user.getTabList().onServerChange(); @@ -165,18 +145,18 @@ public class ServerConnector extends PacketHandler Scoreboard serverScoreboard = user.getServerSentScoreboard(); for ( Objective objective : serverScoreboard.getObjectives() ) { - user.unsafe().sendPacket( new PacketCEScoreboardObjective( objective.getName(), objective.getValue(), (byte) 1 ) ); + user.unsafe().sendPacket( new ScoreboardObjective( objective.getName(), objective.getValue(), (byte) 1 ) ); } for ( Team team : serverScoreboard.getTeams() ) { - user.unsafe().sendPacket( new PacketD1Team( team.getName() ) ); + user.unsafe().sendPacket( new net.md_5.bungee.protocol.packet.Team( team.getName() ) ); } serverScoreboard.clear(); user.sendDimensionSwitch(); user.setServerEntityId( login.getEntityId() ); - user.unsafe().sendPacket( new Packet9Respawn( login.getDimension(), login.getDifficulty(), login.getGameMode(), (short) 256, login.getLevelType() ) ); + user.unsafe().sendPacket( new Respawn( login.getDimension(), login.getDifficulty(), login.getGameMode(), login.getLevelType() ) ); // Remove from old servers user.getServer().setObsolete( true ); @@ -209,47 +189,7 @@ public class ServerConnector extends PacketHandler } @Override - public void handle(PacketFDEncryptionRequest encryptRequest) throws Exception - { - Preconditions.checkState( thisState == State.ENCRYPT_REQUEST, "Not expecting ENCRYPT_REQUEST" ); - - // Only need to handle this if we want to use encryption - if ( user.getPendingConnection().getForgeLogin() != null ) - { - PublicKey publickey = EncryptionUtil.getPubkey( encryptRequest ); - this.secretkey = EncryptionUtil.getSecret(); - - byte[] shared = EncryptionUtil.encrypt( publickey, secretkey.getEncoded() ); - byte[] token = EncryptionUtil.encrypt( publickey, encryptRequest.getVerifyToken() ); - - ch.write( new PacketFCEncryptionResponse( shared, token ) ); - - Cipher encrypt = EncryptionUtil.getCipher( Cipher.ENCRYPT_MODE, secretkey ); - ch.addBefore( PipelineUtils.PACKET_DECODE_HANDLER, PipelineUtils.ENCRYPT_HANDLER, new CipherEncoder( encrypt ) ); - - thisState = State.ENCRYPT_RESPONSE; - } else - { - thisState = State.LOGIN; - } - } - - @Override - public void handle(PacketFCEncryptionResponse encryptResponse) throws Exception - { - Preconditions.checkState( thisState == State.ENCRYPT_RESPONSE, "Not expecting ENCRYPT_RESPONSE" ); - - Cipher decrypt = EncryptionUtil.getCipher( Cipher.DECRYPT_MODE, secretkey ); - ch.addBefore( PipelineUtils.PACKET_DECODE_HANDLER, PipelineUtils.DECRYPT_HANDLER, new CipherDecoder( decrypt ) ); - - ch.write( user.getPendingConnection().getForgeLogin() ); - - ch.write( PacketConstants.CLIENT_LOGIN ); - thisState = State.LOGIN; - } - - @Override - public void handle(PacketFFKick kick) throws Exception + public void handle(Kick kick) throws Exception { ServerInfo def = bungee.getServerInfo( user.getPendingConnection().getListener().getFallbackServer() ); if ( Objects.equals( target, def ) ) @@ -273,40 +213,6 @@ public class ServerConnector extends PacketHandler } } - @Override - public void handle(PacketFAPluginMessage pluginMessage) throws Exception - { - if ( pluginMessage.equals( PacketConstants.I_AM_BUNGEE ) ) - { - throw new IllegalStateException( "May not connect to another BungeCord!" ); - } - - DataInput in = pluginMessage.getStream(); - if ( pluginMessage.getTag().equals( "FML" ) && in.readUnsignedByte() == 0 ) - { - int count = in.readInt(); - for ( int i = 0; i < count; i++ ) - { - in.readUTF(); - } - if ( in.readByte() != 0 ) - { - // TODO: Using forge flag - ch.getHandle().pipeline().get( PacketDecoder.class ).setProtocol( Forge.getInstance() ); - } - } - - 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() ) - { - ch.write( message ); - } - sentMessages = true; - } - } - @Override public String toString() { 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 9dec6c59..fa19f25b 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -19,7 +19,6 @@ import lombok.Getter; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.Setter; -import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; @@ -30,13 +29,16 @@ import net.md_5.bungee.api.tab.TabListHandler; import net.md_5.bungee.connection.InitialHandler; import net.md_5.bungee.netty.ChannelWrapper; import net.md_5.bungee.netty.HandlerBoss; -import net.md_5.bungee.netty.PacketWrapper; +import net.md_5.bungee.protocol.PacketWrapper; import net.md_5.bungee.netty.PipelineUtils; -import net.md_5.bungee.protocol.packet.DefinedPacket; -import net.md_5.bungee.protocol.packet.Packet3Chat; -import net.md_5.bungee.protocol.packet.PacketCCSettings; -import net.md_5.bungee.protocol.packet.PacketFAPluginMessage; -import net.md_5.bungee.protocol.packet.PacketFFKick; +import net.md_5.bungee.protocol.DefinedPacket; +import net.md_5.bungee.protocol.MinecraftDecoder; +import net.md_5.bungee.protocol.MinecraftEncoder; +import net.md_5.bungee.protocol.Protocol; +import net.md_5.bungee.protocol.packet.Chat; +import net.md_5.bungee.protocol.packet.ClientSettings; +import net.md_5.bungee.protocol.packet.PluginMessage; +import net.md_5.bungee.protocol.packet.Kick; import net.md_5.bungee.util.CaseInsensitiveSet; @RequiredArgsConstructor @@ -88,7 +90,7 @@ public final class UserConnection implements ProxiedPlayer private int serverEntityId; @Getter @Setter - private PacketCCSettings settings; + private ClientSettings settings; @Getter private final Scoreboard serverSentScoreboard = new Scoreboard(); /*========================================================================*/ @@ -200,6 +202,8 @@ public final class UserConnection implements ProxiedPlayer protected void initChannel(Channel ch) throws Exception { PipelineUtils.BASE.initChannel( ch ); + ch.pipeline().addAfter( PipelineUtils.FRAME_DECODER, PipelineUtils.PACKET_DECODER, new MinecraftDecoder( Protocol.HANDSHAKE, false ) ); + ch.pipeline().addAfter( PipelineUtils.FRAME_PREPENDER, PipelineUtils.PACKET_ENCODER, new MinecraftEncoder( Protocol.HANDSHAKE, false ) ); ch.pipeline().get( HandlerBoss.class ).setHandler( new ServerConnector( bungee, UserConnection.this, target ) ); } }; @@ -251,7 +255,7 @@ public final class UserConnection implements ProxiedPlayer if ( ch.getHandle().isActive() ) { bungee.getLogger().log( Level.INFO, "[" + getName() + "] disconnected with: " + reason ); - unsafe().sendPacket( new PacketFFKick( reason ) ); + unsafe().sendPacket( new Kick( reason ) ); ch.close(); if ( server != null ) { @@ -264,7 +268,7 @@ public final class UserConnection implements ProxiedPlayer public void chat(String message) { Preconditions.checkState( server != null, "Not connected to server" ); - server.getCh().write( new Packet3Chat( message ) ); + server.getCh().write( new Chat( message ) ); } @Override @@ -272,7 +276,7 @@ public final class UserConnection implements ProxiedPlayer { // TODO: Fix this String encoded = BungeeCord.getInstance().gson.toJson( message ); - unsafe().sendPacket( new Packet3Chat( "{\"text\":" + encoded + "}" ) ); + unsafe().sendPacket( new Chat( "{\"text\":" + encoded + "}" ) ); } @Override @@ -287,7 +291,7 @@ public final class UserConnection implements ProxiedPlayer @Override public void sendData(String channel, byte[] data) { - unsafe().sendPacket( new PacketFAPluginMessage( channel, data ) ); + unsafe().sendPacket( new PluginMessage( channel, data ) ); } @Override @@ -357,4 +361,10 @@ public final class UserConnection implements ProxiedPlayer { return unsafe; } + + @Override + public String getUUID() + { + return getPendingConnection().getUUID(); + } } diff --git a/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java b/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java index 2e9286d8..d39410c9 100644 --- a/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java +++ b/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java @@ -21,15 +21,14 @@ import net.md_5.bungee.api.score.Scoreboard; import net.md_5.bungee.api.score.Team; import net.md_5.bungee.netty.ChannelWrapper; import net.md_5.bungee.netty.PacketHandler; -import net.md_5.bungee.netty.PacketWrapper; -import net.md_5.bungee.protocol.packet.Packet0KeepAlive; -import net.md_5.bungee.protocol.packet.PacketC9PlayerListItem; -import net.md_5.bungee.protocol.packet.PacketCEScoreboardObjective; -import net.md_5.bungee.protocol.packet.PacketCFScoreboardScore; -import net.md_5.bungee.protocol.packet.PacketD0DisplayScoreboard; -import net.md_5.bungee.protocol.packet.PacketD1Team; -import net.md_5.bungee.protocol.packet.PacketFAPluginMessage; -import net.md_5.bungee.protocol.packet.PacketFFKick; +import net.md_5.bungee.protocol.PacketWrapper; +import net.md_5.bungee.protocol.packet.KeepAlive; +import net.md_5.bungee.protocol.packet.PlayerListItem; +import net.md_5.bungee.protocol.packet.ScoreboardObjective; +import net.md_5.bungee.protocol.packet.ScoreboardScore; +import net.md_5.bungee.protocol.packet.ScoreboardDisplay; +import net.md_5.bungee.protocol.packet.PluginMessage; +import net.md_5.bungee.protocol.packet.Kick; @RequiredArgsConstructor public class DownstreamBridge extends PacketHandler @@ -75,20 +74,20 @@ public class DownstreamBridge extends PacketHandler { if ( !server.isObsolete() ) { - EntityMap.rewrite( packet.buf, con.getServerEntityId(), con.getClientEntityId() ); + // EntityMap.rewrite( packet.buf, con.getServerEntityId(), con.getClientEntityId() ); con.sendPacket( packet ); } } @Override - public void handle(Packet0KeepAlive alive) throws Exception + public void handle(KeepAlive alive) throws Exception { con.setSentPingId( alive.getRandomId() ); con.setSentPingTime( System.currentTimeMillis() ); } @Override - public void handle(PacketC9PlayerListItem playerList) throws Exception + public void handle(PlayerListItem playerList) throws Exception { if ( !con.getTabList().onListUpdate( playerList.getUsername(), playerList.isOnline(), playerList.getPing() ) ) @@ -98,7 +97,7 @@ public class DownstreamBridge extends PacketHandler } @Override - public void handle(PacketCEScoreboardObjective objective) throws Exception + public void handle(ScoreboardObjective objective) throws Exception { Scoreboard serverScoreboard = con.getServerSentScoreboard(); switch ( objective.getAction() ) @@ -113,7 +112,7 @@ public class DownstreamBridge extends PacketHandler } @Override - public void handle(PacketCFScoreboardScore score) throws Exception + public void handle(ScoreboardScore score) throws Exception { Scoreboard serverScoreboard = con.getServerSentScoreboard(); switch ( score.getAction() ) @@ -130,7 +129,7 @@ public class DownstreamBridge extends PacketHandler } @Override - public void handle(PacketD0DisplayScoreboard displayScoreboard) throws Exception + public void handle(ScoreboardDisplay displayScoreboard) throws Exception { Scoreboard serverScoreboard = con.getServerSentScoreboard(); serverScoreboard.setName( displayScoreboard.getName() ); @@ -138,7 +137,7 @@ public class DownstreamBridge extends PacketHandler } @Override - public void handle(PacketD1Team team) throws Exception + public void handle(net.md_5.bungee.protocol.packet.Team team) throws Exception { Scoreboard serverScoreboard = con.getServerSentScoreboard(); // Remove team and move on @@ -185,7 +184,7 @@ public class DownstreamBridge extends PacketHandler } @Override - public void handle(PacketFAPluginMessage pluginMessage) throws Exception + public void handle(PluginMessage pluginMessage) throws Exception { DataInput in = pluginMessage.getStream(); PluginMessageEvent event = new PluginMessageEvent( con.getServer(), con, pluginMessage.getTag(), pluginMessage.getData().clone() ); @@ -330,7 +329,7 @@ public class DownstreamBridge extends PacketHandler } @Override - public void handle(PacketFFKick kick) throws Exception + public void handle(Kick kick) throws Exception { ServerInfo def = bungee.getServerInfo( con.getPendingConnection().getListener().getFallbackServer() ); if ( Objects.equals( server.getInfo(), def ) ) 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 77683b0b..89f9d299 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 @@ -1,7 +1,6 @@ package net.md_5.bungee.connection; import com.google.common.base.Preconditions; -import io.netty.util.concurrent.ScheduledFuture; import java.math.BigInteger; import java.net.InetSocketAddress; import java.net.URLEncoder; @@ -9,7 +8,6 @@ import java.security.GeneralSecurityException; import java.security.MessageDigest; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.TimeUnit; import java.util.logging.Level; import javax.crypto.Cipher; import javax.crypto.SecretKey; @@ -17,7 +15,6 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import net.md_5.bungee.BungeeCord; import net.md_5.bungee.EncryptionUtil; -import net.md_5.bungee.PacketConstants; import net.md_5.bungee.UserConnection; import net.md_5.bungee.Util; import net.md_5.bungee.api.Callback; @@ -36,23 +33,24 @@ import net.md_5.bungee.netty.HandlerBoss; import net.md_5.bungee.netty.ChannelWrapper; import net.md_5.bungee.netty.CipherDecoder; 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.netty.PipelineUtils; -import net.md_5.bungee.protocol.Forge; -import net.md_5.bungee.protocol.MinecraftInput; -import net.md_5.bungee.protocol.Vanilla; -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; -import net.md_5.bungee.protocol.packet.PacketFAPluginMessage; -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.DefinedPacket; +import net.md_5.bungee.protocol.packet.Login; +import net.md_5.bungee.protocol.packet.Handshake; +import net.md_5.bungee.protocol.packet.PluginMessage; +import net.md_5.bungee.protocol.packet.EncryptionResponse; +import net.md_5.bungee.protocol.packet.EncryptionRequest; +import net.md_5.bungee.protocol.packet.Kick; import net.md_5.bungee.api.AbstractReconnectHandler; import net.md_5.bungee.api.event.PlayerHandshakeEvent; +import net.md_5.bungee.protocol.Protocol; +import net.md_5.bungee.protocol.packet.LegacyPing; +import net.md_5.bungee.protocol.packet.LoginRequest; +import net.md_5.bungee.protocol.packet.LoginSuccess; +import net.md_5.bungee.protocol.packet.PingPacket; +import net.md_5.bungee.protocol.packet.StatusRequest; +import net.md_5.bungee.protocol.packet.StatusResponse; @RequiredArgsConstructor public class InitialHandler extends PacketHandler implements PendingConnection @@ -63,14 +61,16 @@ public class InitialHandler extends PacketHandler implements PendingConnection @Getter private final ListenerInfo listener; @Getter - private Packet1Login forgeLogin; + private Login forgeLogin; @Getter - private Packet2Handshake handshake; - private PacketFDEncryptionRequest request; + private Handshake handshake; @Getter - private List loginMessages = new ArrayList<>(); + private LoginRequest loginRequest; + private EncryptionRequest request; @Getter - private List registerMessages = new ArrayList<>(); + private List loginMessages = new ArrayList<>(); + @Getter + private List registerMessages = new ArrayList<>(); private State thisState = State.HANDSHAKE; private SecretKey sharedKey; private final Unsafe unsafe = new Unsafe() @@ -83,14 +83,15 @@ public class InitialHandler extends PacketHandler implements PendingConnection }; @Getter private boolean onlineMode = BungeeCord.getInstance().config.isOnlineMode(); - private ScheduledFuture pingFuture; private InetSocketAddress vHost; private byte version = -1; + @Getter + private String UUID; private enum State { - HANDSHAKE, ENCRYPT, LOGIN, FINISHED; + HANDSHAKE, STATUS, PING, USERNAME, ENCRYPT, FINISHED; } @Override @@ -106,24 +107,8 @@ public class InitialHandler extends PacketHandler implements PendingConnection } @Override - public void handle(PacketFAPluginMessage pluginMessage) throws Exception + public void handle(PluginMessage pluginMessage) throws Exception { - if ( pluginMessage.getTag().equals( "MC|PingHost" ) ) - { - if ( pingFuture.cancel( false ) ) - { - MinecraftInput in = pluginMessage.getMCStream(); - version = in.readByte(); - String connectHost = in.readString(); - int connectPort = in.readInt(); - this.vHost = new InetSocketAddress( connectHost, connectPort ); - - respondToPing(); - } - - return; - } - // TODO: Unregister? if ( pluginMessage.getTag().equals( "REGISTER" ) ) { @@ -134,8 +119,25 @@ public class InitialHandler extends PacketHandler implements PendingConnection } } - private void respondToPing() + @Override + public void handle(LegacyPing ping) throws Exception { + String kickMessage = ChatColor.DARK_BLUE + + "\00" + bungee.getProtocolVersion() + + "\00" + bungee.getGameVersion() + + "\00" + listener.getMotd() + + "\00" + bungee.getOnlineCount() + + "\00" + listener.getMaxPlayers(); + + ch.getHandle().writeAndFlush( kickMessage ); + ch.close(); + } + + @Override + public void handle(StatusRequest statusRequest) throws Exception + { + Preconditions.checkState( thisState == State.STATUS, "Not expecting STATUS" ); + ServerInfo forced = AbstractReconnectHandler.getForcedHost( this ); final String motd = ( forced != null ) ? forced.getMotd() : listener.getMotd(); @@ -146,18 +148,13 @@ public class InitialHandler extends PacketHandler implements PendingConnection { if ( error != null ) { - result = new ServerPing( (byte) -1, "-1", "Error pinging remote server: " + Util.exception( error ), -1, -1 ); + result = new ServerPing(); + result.setDescription( "Error pinging remote server: " + Util.exception( error ) ); } result = bungee.getPluginManager().callEvent( new ProxyPingEvent( InitialHandler.this, result ) ).getResponse(); - String kickMessage = ChatColor.DARK_BLUE - + "\00" + result.getProtocolVersion() - + "\00" + result.getGameVersion() - + "\00" + result.getMotd() - + "\00" + result.getCurrentPlayers() - + "\00" + result.getMaxPlayers(); BungeeCord.getInstance().getConnectionThrottle().unthrottle( getAddress().getAddress() ); - disconnect( kickMessage ); + unsafe.sendPacket( new StatusResponse( BungeeCord.getInstance().gson.toJson( result ) ) ); } }; @@ -166,35 +163,26 @@ public class InitialHandler extends PacketHandler implements PendingConnection forced.ping( pingBack ); } else { - pingBack.done( new ServerPing( bungee.getProtocolVersion(), bungee.getGameVersion(), motd, bungee.getOnlineCount(), listener.getMaxPlayers() ), null ); + pingBack.done( new ServerPing( + new ServerPing.Protocol( bungee.getGameVersion(), bungee.getProtocolVersion() ), + new ServerPing.Players( listener.getMaxPlayers(), bungee.getOnlineCount() ), + motd ), + null ); } + + thisState = State.PING; } @Override - public void handle(PacketFEPing ping) throws Exception + public void handle(PingPacket ping) throws Exception { - pingFuture = ch.getHandle().eventLoop().schedule( new Runnable() - { - @Override - public void run() - { - respondToPing(); - } - }, 200, TimeUnit.MILLISECONDS ); + Preconditions.checkState( thisState == State.PING, "Not expecting PING" ); + unsafe.sendPacket( ping ); + disconnect( "" ); } @Override - public void handle(Packet1Login login) throws Exception - { - Preconditions.checkState( thisState == State.LOGIN, "Not expecting FORGE LOGIN" ); - Preconditions.checkState( forgeLogin == null, "Already received FORGE LOGIN" ); - forgeLogin = login; - - ch.getHandle().pipeline().get( PacketDecoder.class ).setProtocol( Forge.getInstance() ); - } - - @Override - public void handle(Packet2Handshake handshake) throws Exception + public void handle(Handshake handshake) throws Exception { Preconditions.checkState( thisState == State.HANDSHAKE, "Not expecting HANDSHAKE" ); this.handshake = handshake; @@ -203,15 +191,40 @@ public class InitialHandler extends PacketHandler implements PendingConnection bungee.getPluginManager().callEvent( new PlayerHandshakeEvent( InitialHandler.this, handshake ) ); - if ( handshake.getProtocolVersion() > Vanilla.PROTOCOL_VERSION ) + switch ( handshake.getRequestedProtocol() ) + { + case 1: + // Ping + thisState = State.STATUS; + ch.setProtocol( Protocol.STATUS ); + break; + case 2: + thisState = State.USERNAME; + ch.setProtocol( Protocol.LOGIN ); + // Login + break; + default: + throw new IllegalArgumentException( "Cannot request protocol " + handshake.getRequestedProtocol() ); + } + } + + @Override + public void handle(LoginRequest loginRequest) throws Exception + { + Preconditions.checkState( thisState == State.USERNAME, "Not expecting USERNAME" ); + this.loginRequest = loginRequest; + + if ( handshake.getProtocolVersion() > bungee.getProtocolVersion() ) { disconnect( bungee.getTranslation( "outdated_server" ) ); - } else if ( handshake.getProtocolVersion() < Vanilla.PROTOCOL_VERSION ) + return; + } else if ( handshake.getProtocolVersion() < bungee.getProtocolVersion() ) { disconnect( bungee.getTranslation( "outdated_client" ) ); + return; } - if ( handshake.getUsername().length() > 16 ) + if ( getName().length() > 16 ) { disconnect( "Cannot have username longer than 16 characters" ); return; @@ -225,27 +238,33 @@ public class InitialHandler extends PacketHandler implements PendingConnection } // If offline mode and they are already on, don't allow connect - if ( !isOnlineMode() && bungee.getPlayer( handshake.getUsername() ) != null ) + if ( !isOnlineMode() && bungee.getPlayer( getName() ) != null ) { disconnect( bungee.getTranslation( "already_connected" ) ); return; } - unsafe().sendPacket( PacketConstants.I_AM_BUNGEE ); - unsafe().sendPacket( PacketConstants.FORGE_MOD_REQUEST ); - - unsafe().sendPacket( request = EncryptionUtil.encryptRequest( this.onlineMode ) ); + // TODO: Nuuuu Mojang why u do this + // unsafe().sendPacket( PacketConstants.I_AM_BUNGEE ); + // unsafe().sendPacket( PacketConstants.FORGE_MOD_REQUEST ); + if ( this.onlineMode ) + { + unsafe().sendPacket( request = EncryptionUtil.encryptRequest() ); + } else + { + finish(); + } thisState = State.ENCRYPT; } @Override - public void handle(final PacketFCEncryptionResponse encryptResponse) throws Exception + public void handle(final EncryptionResponse encryptResponse) throws Exception { Preconditions.checkState( thisState == State.ENCRYPT, "Not expecting ENCRYPT" ); sharedKey = EncryptionUtil.getSecret( encryptResponse, request ); Cipher decrypt = EncryptionUtil.getCipher( Cipher.DECRYPT_MODE, sharedKey ); - ch.addBefore( PipelineUtils.PACKET_DECODE_HANDLER, PipelineUtils.DECRYPT_HANDLER, new CipherDecoder( decrypt ) ); + ch.addBefore( PipelineUtils.FRAME_DECODER, PipelineUtils.DECRYPT_HANDLER, new CipherDecoder( decrypt ) ); if ( this.onlineMode ) { @@ -259,9 +278,9 @@ public class InitialHandler extends PacketHandler implements PendingConnection { sha.update( bit ); } - String encodedHash = URLEncoder.encode( new BigInteger( sha.digest() ).toString( 16 ), "UTF-8" ); - String authURL = "http://session.minecraft.net/game/checkserver.jsp?user=" + encName + "&serverId=" + encodedHash; + + String authURL = "https://sessionserver.mojang.com/session/minecraft/hasJoined?username=" + encName + "&serverId=" + encodedHash; Callback handler = new Callback() { @@ -270,13 +289,14 @@ public class InitialHandler extends PacketHandler implements PendingConnection { if ( error == null ) { - if ( "YES".equals( result ) ) + LoginResult obj = BungeeCord.getInstance().gson.fromJson( result, LoginResult.class ); + if ( obj != null ) { + UUID = obj.getId(); finish(); - } else - { - disconnect( "Not authenticated with Minecraft.net" ); + return; } + disconnect( "Not authenticated with Minecraft.net" ); } else { disconnect( bungee.getTranslation( "mojang_fail" ) ); @@ -295,7 +315,7 @@ public class InitialHandler extends PacketHandler implements PendingConnection private void finish() { // Check for multiple connections - ProxiedPlayer old = bungee.getPlayer( handshake.getUsername() ); + ProxiedPlayer old = bungee.getPlayer( getName() ); if ( old != null ) { old.disconnect( bungee.getTranslation( "already_connected" ) ); @@ -314,7 +334,6 @@ public class InitialHandler extends PacketHandler implements PendingConnection { return; } - thisState = InitialHandler.State.LOGIN; ch.getHandle().eventLoop().execute( new Runnable() { @@ -323,15 +342,45 @@ public class InitialHandler extends PacketHandler implements PendingConnection { if ( ch.getHandle().isActive() ) { - unsafe().sendPacket( new PacketFCEncryptionResponse( new byte[ 0 ], new byte[ 0 ] ) ); - try + + if ( onlineMode ) { - Cipher encrypt = EncryptionUtil.getCipher( Cipher.ENCRYPT_MODE, sharedKey ); - ch.addBefore( PipelineUtils.DECRYPT_HANDLER, PipelineUtils.ENCRYPT_HANDLER, new CipherEncoder( encrypt ) ); - } catch ( GeneralSecurityException ex ) - { - disconnect( "Cipher error: " + Util.exception( ex ) ); + // unsafe().sendPacket( new EncryptionResponse( new byte[ 0 ], new byte[ 0 ] ) ); + try + { + Cipher encrypt = EncryptionUtil.getCipher( Cipher.ENCRYPT_MODE, sharedKey ); + ch.addBefore( PipelineUtils.FRAME_PREPENDER, PipelineUtils.ENCRYPT_HANDLER, new CipherEncoder( encrypt ) ); + } catch ( GeneralSecurityException ex ) + { + disconnect( "Cipher error: " + Util.exception( ex ) ); + } } + + if ( UUID == null ) + { + UUID = java.util.UUID.randomUUID().toString(); + } + unsafe.sendPacket( new LoginSuccess( UUID, getName() ) ); + ch.setProtocol( Protocol.GAME ); + + UserConnection userCon = new UserConnection( bungee, ch, getName(), InitialHandler.this ); + userCon.init(); + + bungee.getPluginManager().callEvent( new PostLoginEvent( userCon ) ); + + ch.getHandle().pipeline().get( HandlerBoss.class ).setHandler( new UpstreamBridge( bungee, userCon ) ); + + ServerInfo server; + if ( bungee.getReconnectHandler() != null ) + { + server = bungee.getReconnectHandler().getServer( userCon ); + } else + { + server = AbstractReconnectHandler.getForcedHost( InitialHandler.this ); + } + userCon.connect( server, true ); + + thisState = State.FINISHED; } } } ); @@ -342,38 +391,12 @@ public class InitialHandler extends PacketHandler implements PendingConnection bungee.getPluginManager().callEvent( new LoginEvent( InitialHandler.this, complete ) ); } - @Override - public void handle(PacketCDClientStatus clientStatus) throws Exception - { - Preconditions.checkState( thisState == State.LOGIN, "Not expecting LOGIN" ); - - UserConnection userCon = new UserConnection( bungee, ch, getName(), this ); - userCon.init(); - - bungee.getPluginManager().callEvent( new PostLoginEvent( userCon ) ); - - ch.getHandle().pipeline().get( HandlerBoss.class ).setHandler( new UpstreamBridge( bungee, userCon ) ); - - ServerInfo server; - if ( bungee.getReconnectHandler() != null ) - { - server = bungee.getReconnectHandler().getServer( userCon ); - } else - { - server = AbstractReconnectHandler.getForcedHost( this ); - } - userCon.connect( server, true ); - - thisState = State.FINISHED; - throw new CancelSendSignal(); - } - @Override public synchronized void disconnect(String reason) { if ( !ch.isClosed() ) { - unsafe().sendPacket( new PacketFFKick( reason ) ); + unsafe().sendPacket( new Kick( BungeeCord.getInstance().gson.toJson( reason ) ) ); ch.close(); } } @@ -381,11 +404,11 @@ public class InitialHandler extends PacketHandler implements PendingConnection @Override public String getName() { - return ( handshake == null ) ? null : handshake.getUsername(); + return ( loginRequest == null ) ? null : loginRequest.getData(); } @Override - public byte getVersion() + public int getVersion() { return ( handshake == null ) ? version : handshake.getProtocolVersion(); } diff --git a/proxy/src/main/java/net/md_5/bungee/connection/LoginResult.java b/proxy/src/main/java/net/md_5/bungee/connection/LoginResult.java new file mode 100644 index 00000000..e0b4060c --- /dev/null +++ b/proxy/src/main/java/net/md_5/bungee/connection/LoginResult.java @@ -0,0 +1,12 @@ +package net.md_5.bungee.connection; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class LoginResult +{ + + private String id; +} diff --git a/proxy/src/main/java/net/md_5/bungee/connection/PingHandler.java b/proxy/src/main/java/net/md_5/bungee/connection/PingHandler.java index 20b5abef..8629f055 100644 --- a/proxy/src/main/java/net/md_5/bungee/connection/PingHandler.java +++ b/proxy/src/main/java/net/md_5/bungee/connection/PingHandler.java @@ -8,7 +8,7 @@ import net.md_5.bungee.api.ServerPing; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.netty.ChannelWrapper; import net.md_5.bungee.netty.PacketHandler; -import net.md_5.bungee.protocol.packet.PacketFFKick; +import net.md_5.bungee.protocol.packet.Kick; @RequiredArgsConstructor public class PingHandler extends PacketHandler @@ -20,7 +20,7 @@ public class PingHandler extends PacketHandler @Override public void connected(ChannelWrapper channel) throws Exception { - // TODO: Update this to 1.6.4 style! + // TODO: Update this to 1.7 style! channel.write( Unpooled.wrappedBuffer( new byte[] { (byte) 0xFE, (byte) 0x01 @@ -34,11 +34,11 @@ public class PingHandler extends PacketHandler } @Override - public void handle(PacketFFKick kick) throws Exception + public void handle(Kick kick) throws Exception { String[] split = kick.getMessage().split( "\00" ); - ServerPing ping = new ServerPing( Byte.parseByte( split[1] ), split[2], split[3], Integer.parseInt( split[4] ), Integer.parseInt( split[5] ) ); - callback.done( ping, null ); + // ServerPing ping = new ServerPing( Byte.parseByte( split[1] ), split[2], split[3], Integer.parseInt( split[4] ), Integer.parseInt( split[5] ) ); + // callback.done( ping, null ); } @Override 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 d2e5afef..411003cb 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 @@ -1,7 +1,6 @@ package net.md_5.bungee.connection; import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.EntityMap; import net.md_5.bungee.UserConnection; import net.md_5.bungee.Util; import net.md_5.bungee.api.ProxyServer; @@ -10,14 +9,15 @@ import net.md_5.bungee.api.event.PlayerDisconnectEvent; import net.md_5.bungee.api.event.PluginMessageEvent; import net.md_5.bungee.netty.ChannelWrapper; import net.md_5.bungee.netty.PacketHandler; -import net.md_5.bungee.netty.PacketWrapper; -import net.md_5.bungee.protocol.packet.Packet0KeepAlive; -import net.md_5.bungee.protocol.packet.Packet3Chat; -import net.md_5.bungee.protocol.packet.PacketCBTabComplete; -import net.md_5.bungee.protocol.packet.PacketCCSettings; -import net.md_5.bungee.protocol.packet.PacketFAPluginMessage; +import net.md_5.bungee.protocol.PacketWrapper; +import net.md_5.bungee.protocol.packet.KeepAlive; +import net.md_5.bungee.protocol.packet.Chat; +import net.md_5.bungee.protocol.packet.TabCompleteRequest; +import net.md_5.bungee.protocol.packet.ClientSettings; +import net.md_5.bungee.protocol.packet.PluginMessage; import java.util.ArrayList; import java.util.List; +import net.md_5.bungee.protocol.packet.TabCompleteResponse; public class UpstreamBridge extends PacketHandler { @@ -59,7 +59,7 @@ public class UpstreamBridge extends PacketHandler @Override public void handle(PacketWrapper packet) throws Exception { - EntityMap.rewrite( packet.buf, con.getClientEntityId(), con.getServerEntityId() ); + // EntityMap.rewrite( packet.buf, con.getClientEntityId(), con.getServerEntityId() ); if ( con.getServer() != null ) { con.getServer().getCh().write( packet ); @@ -67,7 +67,7 @@ public class UpstreamBridge extends PacketHandler } @Override - public void handle(Packet0KeepAlive alive) throws Exception + public void handle(KeepAlive alive) throws Exception { if ( alive.getRandomId() == con.getSentPingId() ) { @@ -78,7 +78,7 @@ public class UpstreamBridge extends PacketHandler } @Override - public void handle(Packet3Chat chat) throws Exception + public void handle(Chat chat) throws Exception { ChatEvent chatEvent = new ChatEvent( con, con.getServer(), chat.getMessage() ); if ( !bungee.getPluginManager().callEvent( chatEvent ).isCancelled() ) @@ -93,7 +93,7 @@ public class UpstreamBridge extends PacketHandler } @Override - public void handle(PacketCBTabComplete tabComplete) throws Exception + public void handle(TabCompleteRequest tabComplete) throws Exception { if ( tabComplete.getCursor().startsWith( "/" ) ) { @@ -102,20 +102,20 @@ public class UpstreamBridge extends PacketHandler if ( !results.isEmpty() ) { - con.unsafe().sendPacket( new PacketCBTabComplete( results.toArray( new String[ results.size() ] ) ) ); + con.unsafe().sendPacket( new TabCompleteResponse( results.toArray( new String[ results.size() ] ) ) ); throw new CancelSendSignal(); } } } @Override - public void handle(PacketCCSettings settings) throws Exception + public void handle(ClientSettings settings) throws Exception { con.setSettings( settings ); } @Override - public void handle(PacketFAPluginMessage pluginMessage) throws Exception + public void handle(PluginMessage pluginMessage) throws Exception { if ( pluginMessage.getTag().equals( "BungeeCord" ) ) { diff --git a/proxy/src/main/java/net/md_5/bungee/http/HttpHandler.java b/proxy/src/main/java/net/md_5/bungee/http/HttpHandler.java index fd486e04..96d0a71d 100644 --- a/proxy/src/main/java/net/md_5/bungee/http/HttpHandler.java +++ b/proxy/src/main/java/net/md_5/bungee/http/HttpHandler.java @@ -36,7 +36,15 @@ public class HttpHandler extends SimpleChannelInboundHandler if ( msg instanceof HttpResponse ) { HttpResponse response = (HttpResponse) msg; - if ( response.getStatus().code() != 200 ) + int responseCode = response.getStatus().code(); + + if ( responseCode == HttpResponseStatus.NO_CONTENT.code() ) + { + done( ctx ); + return; + } + + if ( responseCode != HttpResponseStatus.OK.code() ) { throw new IllegalStateException( "Expected HTTP response 200 OK, got " + response.getStatus() ); } @@ -48,14 +56,19 @@ public class HttpHandler extends SimpleChannelInboundHandler if ( msg instanceof LastHttpContent ) { - try - { - callback.done( buffer.toString(), null ); - } finally - { - ctx.channel().close(); - } + done( ctx ); } } } + + private void done(ChannelHandlerContext ctx) + { + try + { + callback.done( buffer.toString(), null ); + } finally + { + ctx.channel().close(); + } + } } diff --git a/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java b/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java index e16ae233..77ecd687 100644 --- a/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java +++ b/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java @@ -1,10 +1,14 @@ package net.md_5.bungee.netty; +import net.md_5.bungee.protocol.PacketWrapper; import com.google.common.base.Preconditions; import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import lombok.Getter; +import net.md_5.bungee.protocol.MinecraftDecoder; +import net.md_5.bungee.protocol.MinecraftEncoder; +import net.md_5.bungee.protocol.Protocol; public class ChannelWrapper { @@ -18,6 +22,12 @@ public class ChannelWrapper this.ch = ctx.channel(); } + public void setProtocol(Protocol protocol) + { + ch.pipeline().get( MinecraftDecoder.class ).setProtocol( protocol ); + ch.pipeline().get( MinecraftEncoder.class ).setProtocol( protocol ); + } + public synchronized void write(Object packet) { if ( !closed ) @@ -25,10 +35,10 @@ public class ChannelWrapper if ( packet instanceof PacketWrapper ) { ( (PacketWrapper) packet ).setReleased( true ); - ch.write( ( (PacketWrapper) packet ).buf ); + ch.write( ( (PacketWrapper) packet ).buf, ch.voidPromise() ); } else { - ch.write( packet ); + ch.write( packet, ch.voidPromise() ); } ch.flush(); } diff --git a/proxy/src/main/java/net/md_5/bungee/netty/DefinedPacketEncoder.java b/proxy/src/main/java/net/md_5/bungee/netty/DefinedPacketEncoder.java deleted file mode 100644 index cfa34503..00000000 --- a/proxy/src/main/java/net/md_5/bungee/netty/DefinedPacketEncoder.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.md_5.bungee.netty; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToByteEncoder; -import net.md_5.bungee.protocol.packet.DefinedPacket; - -@ChannelHandler.Sharable -public class DefinedPacketEncoder extends MessageToByteEncoder -{ - - @Override - protected void encode(ChannelHandlerContext ctx, DefinedPacket msg, ByteBuf out) throws Exception - { - out.writeByte( msg.getId() ); - msg.write( out ); - } -} diff --git a/proxy/src/main/java/net/md_5/bungee/netty/HandlerBoss.java b/proxy/src/main/java/net/md_5/bungee/netty/HandlerBoss.java index d3a59eef..fc80d169 100644 --- a/proxy/src/main/java/net/md_5/bungee/netty/HandlerBoss.java +++ b/proxy/src/main/java/net/md_5/bungee/netty/HandlerBoss.java @@ -1,5 +1,6 @@ package net.md_5.bungee.netty; +import net.md_5.bungee.protocol.PacketWrapper; import com.google.common.base.Preconditions; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; diff --git a/proxy/src/main/java/net/md_5/bungee/netty/PacketDecoder.java b/proxy/src/main/java/net/md_5/bungee/netty/PacketDecoder.java deleted file mode 100644 index 47043da4..00000000 --- a/proxy/src/main/java/net/md_5/bungee/netty/PacketDecoder.java +++ /dev/null @@ -1,50 +0,0 @@ -package net.md_5.bungee.netty; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ReplayingDecoder; -import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; -import net.md_5.bungee.protocol.Protocol; -import net.md_5.bungee.protocol.packet.DefinedPacket; -import net.md_5.bungee.protocol.skip.PacketReader; - -/** - * This class will attempt to read a packet from {@link PacketReader}, with the - * specified {@link #protocol} before returning a new {@link ByteBuf} with the - * copied contents of all bytes read in this frame. - *

- * It is based on {@link ReplayingDecoder} so that packets will only be returned - * when all needed data is present. - */ -@AllArgsConstructor -public class PacketDecoder extends ReplayingDecoder -{ - - @Getter - @Setter - private Protocol protocol; - - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception - { - // While we have enough data - while ( true ) - { - // Store our start index - int startIndex = in.readerIndex(); - // Run packet through framer - DefinedPacket packet = protocol.read( in.readUnsignedByte(), in ); - // If we got this far, it means we have formed a packet, so lets grab the end index - int endIndex = in.readerIndex(); - // Allocate a buffer big enough for all bytes we have read - ByteBuf buf = in.copy( startIndex, endIndex - startIndex ); - // Checkpoint our state incase we don't have enough data for another packet - checkpoint(); - // Store our decoded message - out.add( new PacketWrapper( packet, buf ) ); - } - } -} diff --git a/proxy/src/main/java/net/md_5/bungee/netty/PacketHandler.java b/proxy/src/main/java/net/md_5/bungee/netty/PacketHandler.java index ca4684ff..08ab8152 100644 --- a/proxy/src/main/java/net/md_5/bungee/netty/PacketHandler.java +++ b/proxy/src/main/java/net/md_5/bungee/netty/PacketHandler.java @@ -1,6 +1,8 @@ package net.md_5.bungee.netty; -public abstract class PacketHandler extends net.md_5.bungee.protocol.packet.AbstractPacketHandler +import net.md_5.bungee.protocol.PacketWrapper; + +public abstract class PacketHandler extends net.md_5.bungee.protocol.AbstractPacketHandler { @Override diff --git a/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java b/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java index f37d9951..fd22e5c0 100644 --- a/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java +++ b/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java @@ -10,12 +10,17 @@ import java.net.InetSocketAddress; import java.util.concurrent.TimeUnit; import net.md_5.bungee.BungeeCord; import net.md_5.bungee.BungeeServerInfo; -import net.md_5.bungee.ServerConnector; import net.md_5.bungee.UserConnection; import net.md_5.bungee.connection.InitialHandler; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.config.ListenerInfo; -import net.md_5.bungee.protocol.Vanilla; +import net.md_5.bungee.protocol.KickStringWriter; +import net.md_5.bungee.protocol.LegacyDecoder; +import net.md_5.bungee.protocol.MinecraftDecoder; +import net.md_5.bungee.protocol.MinecraftEncoder; +import net.md_5.bungee.protocol.Protocol; +import net.md_5.bungee.protocol.Varint21FrameDecoder; +import net.md_5.bungee.protocol.Varint21LengthFieldPrepender; public class PipelineUtils { @@ -36,26 +41,25 @@ public class PipelineUtils } BASE.initChannel( ch ); + ch.pipeline().addBefore( FRAME_DECODER, LEGACY_DECODER, new LegacyDecoder() ); + ch.pipeline().addAfter( FRAME_DECODER, PACKET_DECODER, new MinecraftDecoder( Protocol.HANDSHAKE, true ) ); + ch.pipeline().addAfter( FRAME_PREPENDER, PACKET_ENCODER, new MinecraftEncoder( Protocol.HANDSHAKE, true ) ); + ch.pipeline().addBefore( FRAME_PREPENDER, LEGACY_KICKER, new KickStringWriter() ); ch.pipeline().get( HandlerBoss.class ).setHandler( new InitialHandler( ProxyServer.getInstance(), ch.attr( LISTENER ).get() ) ); } }; - public static final ChannelInitializer CLIENT = new ChannelInitializer() - { - @Override - protected void initChannel(Channel ch) throws Exception - { - BASE.initChannel( ch ); - ch.pipeline().get( HandlerBoss.class ).setHandler( new ServerConnector( ProxyServer.getInstance(), ch.attr( USER ).get(), ch.attr( TARGET ).get() ) ); - } - }; public static final Base BASE = new Base(); - private static final DefinedPacketEncoder packetEncoder = new DefinedPacketEncoder(); + private static final Varint21LengthFieldPrepender framePrepender = new Varint21LengthFieldPrepender(); public static String TIMEOUT_HANDLER = "timeout"; - public static String PACKET_DECODE_HANDLER = "packet-decoder"; - public static String PACKET_ENCODE_HANDLER = "packet-encoder"; + public static String PACKET_DECODER = "packet-decoder"; + public static String PACKET_ENCODER = "packet-encoder"; public static String BOSS_HANDLER = "inbound-boss"; public static String ENCRYPT_HANDLER = "encrypt"; public static String DECRYPT_HANDLER = "decrypt"; + public static String FRAME_DECODER = "frame-decoder"; + public static String FRAME_PREPENDER = "frame-prepender"; + public static String LEGACY_DECODER = "legacy-decoder"; + public static String LEGACY_KICKER = "legacy-kick"; public final static class Base extends ChannelInitializer { @@ -72,8 +76,9 @@ public class PipelineUtils } ch.pipeline().addLast( TIMEOUT_HANDLER, new ReadTimeoutHandler( BungeeCord.getInstance().config.getTimeout(), TimeUnit.MILLISECONDS ) ); - ch.pipeline().addLast( PACKET_DECODE_HANDLER, new PacketDecoder( Vanilla.getInstance() ) ); - ch.pipeline().addLast( PACKET_ENCODE_HANDLER, packetEncoder ); + ch.pipeline().addLast( FRAME_DECODER, new Varint21FrameDecoder() ); + ch.pipeline().addLast( FRAME_PREPENDER, framePrepender ); + ch.pipeline().addLast( BOSS_HANDLER, new HandlerBoss() ); } }; diff --git a/proxy/src/main/java/net/md_5/bungee/tab/Custom.java b/proxy/src/main/java/net/md_5/bungee/tab/Custom.java index b38ae4b1..902d2cf6 100644 --- a/proxy/src/main/java/net/md_5/bungee/tab/Custom.java +++ b/proxy/src/main/java/net/md_5/bungee/tab/Custom.java @@ -7,7 +7,7 @@ import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.tab.CustomTabList; import net.md_5.bungee.api.tab.TabListAdapter; -import net.md_5.bungee.protocol.packet.PacketC9PlayerListItem; +import net.md_5.bungee.protocol.packet.PlayerListItem; public class Custom extends TabListAdapter implements CustomTabList { @@ -96,7 +96,7 @@ public class Custom extends TabListAdapter implements CustomTabList { String text = ( slots[i][j] != null ) ? slots[i][j] : new StringBuilder().append( base( i ) ).append( base( j ) ).toString(); sent[i][j] = text; - getPlayer().unsafe().sendPacket( new PacketC9PlayerListItem( text, true, (short) 0 ) ); + getPlayer().unsafe().sendPacket( new PlayerListItem( text, true, (short) 0 ) ); } } } @@ -112,7 +112,7 @@ public class Custom extends TabListAdapter implements CustomTabList { String text = sent[i][j]; sent[i][j] = null; - getPlayer().unsafe().sendPacket( new PacketC9PlayerListItem( text, false, (short) 9999 ) ); + getPlayer().unsafe().sendPacket( new PlayerListItem( text, false, (short) 9999 ) ); } } } diff --git a/proxy/src/main/java/net/md_5/bungee/tab/Global.java b/proxy/src/main/java/net/md_5/bungee/tab/Global.java index ccc4f014..608513e4 100644 --- a/proxy/src/main/java/net/md_5/bungee/tab/Global.java +++ b/proxy/src/main/java/net/md_5/bungee/tab/Global.java @@ -4,7 +4,7 @@ import net.md_5.bungee.BungeeCord; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.tab.TabListAdapter; -import net.md_5.bungee.protocol.packet.PacketC9PlayerListItem; +import net.md_5.bungee.protocol.packet.PlayerListItem; public class Global extends TabListAdapter { @@ -16,9 +16,9 @@ public class Global extends TabListAdapter { for ( ProxiedPlayer p : ProxyServer.getInstance().getPlayers() ) { - getPlayer().unsafe().sendPacket( new PacketC9PlayerListItem( p.getDisplayName(), true, (short) p.getPing() ) ); + getPlayer().unsafe().sendPacket( new PlayerListItem( p.getDisplayName(), true, (short) p.getPing() ) ); } - BungeeCord.getInstance().broadcast( new PacketC9PlayerListItem( getPlayer().getDisplayName(), true, (short) getPlayer().getPing() ) ); + BungeeCord.getInstance().broadcast( new PlayerListItem( getPlayer().getDisplayName(), true, (short) getPlayer().getPing() ) ); } @Override @@ -27,14 +27,14 @@ public class Global extends TabListAdapter if ( !sentPing ) { sentPing = true; - BungeeCord.getInstance().broadcast( new PacketC9PlayerListItem( getPlayer().getDisplayName(), true, (short) getPlayer().getPing() ) ); + BungeeCord.getInstance().broadcast( new PlayerListItem( getPlayer().getDisplayName(), true, (short) getPlayer().getPing() ) ); } } @Override public void onDisconnect() { - BungeeCord.getInstance().broadcast( new PacketC9PlayerListItem( getPlayer().getDisplayName(), false, (short) 9999 ) ); + BungeeCord.getInstance().broadcast( new PlayerListItem( getPlayer().getDisplayName(), false, (short) 9999 ) ); } @Override diff --git a/proxy/src/main/java/net/md_5/bungee/tab/GlobalPing.java b/proxy/src/main/java/net/md_5/bungee/tab/GlobalPing.java index c7233a2a..0c6a1169 100644 --- a/proxy/src/main/java/net/md_5/bungee/tab/GlobalPing.java +++ b/proxy/src/main/java/net/md_5/bungee/tab/GlobalPing.java @@ -2,7 +2,7 @@ package net.md_5.bungee.tab; import net.md_5.bungee.BungeeCord; import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.protocol.packet.PacketC9PlayerListItem; +import net.md_5.bungee.protocol.packet.PlayerListItem; public class GlobalPing extends Global { @@ -17,7 +17,7 @@ public class GlobalPing extends Global if ( ping - PING_THRESHOLD > lastPing && ping + PING_THRESHOLD < lastPing ) { lastPing = ping; - BungeeCord.getInstance().broadcast( new PacketC9PlayerListItem( getPlayer().getDisplayName(), true, (short) ping ) ); + BungeeCord.getInstance().broadcast( new PlayerListItem( getPlayer().getDisplayName(), true, (short) ping ) ); } } } diff --git a/proxy/src/main/java/net/md_5/bungee/tab/ServerUnique.java b/proxy/src/main/java/net/md_5/bungee/tab/ServerUnique.java index 722987b1..00dc2074 100644 --- a/proxy/src/main/java/net/md_5/bungee/tab/ServerUnique.java +++ b/proxy/src/main/java/net/md_5/bungee/tab/ServerUnique.java @@ -3,7 +3,7 @@ package net.md_5.bungee.tab; import java.util.Collection; import java.util.HashSet; import net.md_5.bungee.api.tab.TabListAdapter; -import net.md_5.bungee.protocol.packet.PacketC9PlayerListItem; +import net.md_5.bungee.protocol.packet.PlayerListItem; public class ServerUnique extends TabListAdapter { @@ -17,7 +17,7 @@ public class ServerUnique extends TabListAdapter { for ( String username : usernames ) { - getPlayer().unsafe().sendPacket( new PacketC9PlayerListItem( username, false, (short) 9999 ) ); + getPlayer().unsafe().sendPacket( new PlayerListItem( username, false, (short) 9999 ) ); } usernames.clear(); } diff --git a/query/pom.xml b/query/pom.xml index f86726ce..bcf3dc50 100644 --- a/query/pom.xml +++ b/query/pom.xml @@ -6,13 +6,13 @@ net.md-5 bungeecord-parent - 1.6.4-SNAPSHOT + 1.7-SNAPSHOT ../pom.xml net.md-5 bungeecord-query - 1.6.4-SNAPSHOT + 1.7-SNAPSHOT jar BungeeCord-Query