mirror of
https://github.com/SpigotMC/BungeeCord.git
synced 2024-11-28 05:05:21 +01:00
***WARNING - FOR MINECRAFT 1.7*** Update master to 1.7.
Merge branch 'origin/snapshot'
This commit is contained in:
commit
07d9a56567
10
api/pom.xml
10
api/pom.xml
@ -6,25 +6,19 @@
|
||||
<parent>
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-parent</artifactId>
|
||||
<version>1.6.4-SNAPSHOT</version>
|
||||
<version>1.7-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-api</artifactId>
|
||||
<version>1.6.4-SNAPSHOT</version>
|
||||
<version>1.7-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>BungeeCord-API</name>
|
||||
<description>API implemented by the Elastic Portal Suite</description>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
<version>14.0.1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-config</artifactId>
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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.
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -6,13 +6,13 @@
|
||||
<parent>
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-parent</artifactId>
|
||||
<version>1.6.4-SNAPSHOT</version>
|
||||
<version>1.7-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-bootstrap</artifactId>
|
||||
<version>1.6.4-SNAPSHOT</version>
|
||||
<version>1.7-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>BungeeCord-Bootstrap</name>
|
||||
|
@ -6,13 +6,13 @@
|
||||
<parent>
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-parent</artifactId>
|
||||
<version>1.6.4-SNAPSHOT</version>
|
||||
<version>1.7-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-config</artifactId>
|
||||
<version>1.6.4-SNAPSHOT</version>
|
||||
<version>1.7-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>BungeeCord-Config</name>
|
||||
|
@ -6,13 +6,13 @@
|
||||
<parent>
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-parent</artifactId>
|
||||
<version>1.6.4-SNAPSHOT</version>
|
||||
<version>1.7-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-event</artifactId>
|
||||
<version>1.6.4-SNAPSHOT</version>
|
||||
<version>1.7-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>BungeeCord-Event</name>
|
||||
|
14
pom.xml
14
pom.xml
@ -11,7 +11,7 @@
|
||||
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-parent</artifactId>
|
||||
<version>1.6.4-SNAPSHOT</version>
|
||||
<version>1.7-SNAPSHOT</version>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<name>BungeeCord</name>
|
||||
@ -73,6 +73,18 @@
|
||||
<version>4.11</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
<version>14.0.1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.sf.trove4j</groupId>
|
||||
<artifactId>trove4j</artifactId>
|
||||
<version>3.0.3</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
|
@ -6,13 +6,13 @@
|
||||
<parent>
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-parent</artifactId>
|
||||
<version>1.6.4-SNAPSHOT</version>
|
||||
<version>1.7-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-protocol</artifactId>
|
||||
<version>1.6.4-SNAPSHOT</version>
|
||||
<version>1.7-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>BungeeCord-Protocol</name>
|
||||
@ -21,7 +21,7 @@
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>io.netty</groupId>
|
||||
<artifactId>netty-buffer</artifactId>
|
||||
<artifactId>netty-codec</artifactId>
|
||||
<version>${netty.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
@ -7,4 +7,9 @@ public class BadPacketException extends RuntimeException
|
||||
{
|
||||
super( message );
|
||||
}
|
||||
|
||||
public BadPacketException(String message, Throwable cause)
|
||||
{
|
||||
super( message, cause );
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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<String>
|
||||
{
|
||||
|
||||
@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 );
|
||||
}
|
||||
}
|
||||
}
|
@ -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<Object> 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 );
|
||||
}
|
||||
}
|
@ -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<Object> 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 ) );
|
||||
}
|
||||
}
|
@ -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<DefinedPacket>
|
||||
{
|
||||
|
||||
@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 );
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
@ -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
|
@ -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
|
||||
{
|
||||
|
||||
DefinedPacket read(short packetId, ByteBuf buf);
|
||||
{
|
||||
TO_SERVER.registerPacket( 0x00, Handshake.class );
|
||||
}
|
||||
},
|
||||
// 0
|
||||
GAME
|
||||
{
|
||||
|
||||
OpCode[][] getOpCodes();
|
||||
{
|
||||
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 );
|
||||
|
||||
Class<? extends DefinedPacket>[] getClasses();
|
||||
|
||||
Constructor<? extends DefinedPacket>[] getConstructors();
|
||||
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 );
|
||||
|
||||
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 );
|
||||
|
||||
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<Class<? extends DefinedPacket>> packetMap = new TObjectIntHashMap<>( MAX_PACKET_ID );
|
||||
private final Class<? extends DefinedPacket>[] packetClasses = new Class[ MAX_PACKET_ID ];
|
||||
private final Constructor<? extends DefinedPacket>[] 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<? extends DefinedPacket> 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<? extends DefinedPacket> packet)
|
||||
{
|
||||
Preconditions.checkArgument( packetMap.containsKey( packet ), "Cannot get ID for packet " + packet );
|
||||
|
||||
return packetMap.get( packet );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<? extends DefinedPacket>[] classes = new Class[ 256 ];
|
||||
@SuppressWarnings("unchecked")
|
||||
@Getter
|
||||
private Constructor<? extends DefinedPacket>[] 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<? extends DefinedPacket> clazz = protocol.getClasses()[id];
|
||||
|
||||
if ( clazz != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
Constructor<? extends DefinedPacket> 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
|
||||
};
|
||||
}
|
||||
}
|
@ -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<Object> 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" );
|
||||
}
|
||||
}
|
@ -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<ByteBuf>
|
||||
{
|
||||
|
||||
@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;
|
||||
}
|
||||
}
|
@ -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
|
||||
{
|
||||
}
|
||||
}
|
@ -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)
|
||||
{
|
@ -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 );
|
||||
}
|
@ -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)
|
||||
{
|
@ -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();
|
||||
}
|
@ -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)
|
||||
{
|
@ -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)
|
||||
{
|
@ -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 );
|
||||
}
|
||||
}
|
@ -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)
|
||||
{
|
@ -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)
|
||||
{
|
@ -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.
|
||||
}
|
||||
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
@ -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
|
@ -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 );
|
||||
}
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
@ -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)
|
||||
{
|
@ -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)
|
||||
{
|
@ -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 );
|
||||
}
|
||||
}
|
@ -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)
|
||||
{
|
@ -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)
|
||||
{
|
@ -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)
|
||||
{
|
@ -1,31 +1,26 @@
|
||||
package net.md_5.bungee.protocol.packet;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
import lombok.NoArgsConstructor;
|
||||
import net.md_5.bungee.protocol.AbstractPacketHandler;
|
||||
import net.md_5.bungee.protocol.DefinedPacket;
|
||||
|
||||
@ToString
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
public class PacketFEPing extends DefinedPacket
|
||||
public class StatusRequest 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
|
@ -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 );
|
||||
}
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
@ -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;
|
@ -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 );
|
||||
}
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
@ -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<Instruction> 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<Instruction> 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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
@ -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 );
|
||||
}
|
||||
}
|
@ -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<? extends DefinedPacket> 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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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] );
|
||||
}
|
||||
}
|
@ -6,13 +6,13 @@
|
||||
<parent>
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-parent</artifactId>
|
||||
<version>1.6.4-SNAPSHOT</version>
|
||||
<version>1.7-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-proxy</artifactId>
|
||||
<version>1.6.4-SNAPSHOT</version>
|
||||
<version>1.7-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>BungeeCord-Proxy</name>
|
||||
@ -59,12 +59,6 @@
|
||||
<version>${project.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.sf.trove4j</groupId>
|
||||
<artifactId>trove4j</artifactId>
|
||||
<version>3.0.3</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
|
40
proxy/src/main/java/Test.java
Normal file
40
proxy/src/main/java/Test.java
Normal file
@ -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" );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
|
@ -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 ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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() ) );
|
||||
}
|
||||
|
@ -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 ] );
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
{
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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 ) )
|
||||
|
@ -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<PacketFAPluginMessage> loginMessages = new ArrayList<>();
|
||||
private LoginRequest loginRequest;
|
||||
private EncryptionRequest request;
|
||||
@Getter
|
||||
private List<PacketFAPluginMessage> registerMessages = new ArrayList<>();
|
||||
private List<PluginMessage> loginMessages = new ArrayList<>();
|
||||
@Getter
|
||||
private List<PluginMessage> 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() )
|
||||
{
|
||||
disconnect( bungee.getTranslation( "outdated_server" ) );
|
||||
} else if ( handshake.getProtocolVersion() < Vanilla.PROTOCOL_VERSION )
|
||||
{
|
||||
disconnect( bungee.getTranslation( "outdated_client" ) );
|
||||
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() );
|
||||
}
|
||||
}
|
||||
|
||||
if ( handshake.getUsername().length() > 16 )
|
||||
@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" ) );
|
||||
return;
|
||||
} else if ( handshake.getProtocolVersion() < bungee.getProtocolVersion() )
|
||||
{
|
||||
disconnect( bungee.getTranslation( "outdated_client" ) );
|
||||
return;
|
||||
}
|
||||
|
||||
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<String> handler = new Callback<String>()
|
||||
{
|
||||
@ -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,31 +342,28 @@ public class InitialHandler extends PacketHandler implements PendingConnection
|
||||
{
|
||||
if ( ch.getHandle().isActive() )
|
||||
{
|
||||
unsafe().sendPacket( new PacketFCEncryptionResponse( new byte[ 0 ], new byte[ 0 ] ) );
|
||||
|
||||
if ( onlineMode )
|
||||
{
|
||||
// unsafe().sendPacket( new EncryptionResponse( new byte[ 0 ], new byte[ 0 ] ) );
|
||||
try
|
||||
{
|
||||
Cipher encrypt = EncryptionUtil.getCipher( Cipher.ENCRYPT_MODE, sharedKey );
|
||||
ch.addBefore( PipelineUtils.DECRYPT_HANDLER, PipelineUtils.ENCRYPT_HANDLER, new CipherEncoder( encrypt ) );
|
||||
ch.addBefore( PipelineUtils.FRAME_PREPENDER, PipelineUtils.ENCRYPT_HANDLER, new CipherEncoder( encrypt ) );
|
||||
} catch ( GeneralSecurityException ex )
|
||||
{
|
||||
disconnect( "Cipher error: " + Util.exception( ex ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
} );
|
||||
}
|
||||
};
|
||||
|
||||
// fire login event
|
||||
bungee.getPluginManager().callEvent( new LoginEvent( InitialHandler.this, complete ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(PacketCDClientStatus clientStatus) throws Exception
|
||||
if ( UUID == null )
|
||||
{
|
||||
Preconditions.checkState( thisState == State.LOGIN, "Not expecting LOGIN" );
|
||||
UUID = java.util.UUID.randomUUID().toString();
|
||||
}
|
||||
unsafe.sendPacket( new LoginSuccess( UUID, getName() ) );
|
||||
ch.setProtocol( Protocol.GAME );
|
||||
|
||||
UserConnection userCon = new UserConnection( bungee, ch, getName(), this );
|
||||
UserConnection userCon = new UserConnection( bungee, ch, getName(), InitialHandler.this );
|
||||
userCon.init();
|
||||
|
||||
bungee.getPluginManager().callEvent( new PostLoginEvent( userCon ) );
|
||||
@ -360,12 +376,19 @@ public class InitialHandler extends PacketHandler implements PendingConnection
|
||||
server = bungee.getReconnectHandler().getServer( userCon );
|
||||
} else
|
||||
{
|
||||
server = AbstractReconnectHandler.getForcedHost( this );
|
||||
server = AbstractReconnectHandler.getForcedHost( InitialHandler.this );
|
||||
}
|
||||
userCon.connect( server, true );
|
||||
|
||||
thisState = State.FINISHED;
|
||||
throw new CancelSendSignal();
|
||||
}
|
||||
}
|
||||
} );
|
||||
}
|
||||
};
|
||||
|
||||
// fire login event
|
||||
bungee.getPluginManager().callEvent( new LoginEvent( InitialHandler.this, complete ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -373,7 +396,7 @@ public class InitialHandler extends PacketHandler implements PendingConnection
|
||||
{
|
||||
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();
|
||||
}
|
||||
|
@ -0,0 +1,12 @@
|
||||
package net.md_5.bungee.connection;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
public class LoginResult
|
||||
{
|
||||
|
||||
private String id;
|
||||
}
|
@ -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
|
||||
|
@ -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" ) )
|
||||
{
|
||||
|
@ -36,7 +36,15 @@ public class HttpHandler extends SimpleChannelInboundHandler<HttpObject>
|
||||
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() );
|
||||
}
|
||||
@ -47,6 +55,13 @@ public class HttpHandler extends SimpleChannelInboundHandler<HttpObject>
|
||||
buffer.append( content.content().toString( Charset.forName( "UTF-8" ) ) );
|
||||
|
||||
if ( msg instanceof LastHttpContent )
|
||||
{
|
||||
done( ctx );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void done(ChannelHandlerContext ctx)
|
||||
{
|
||||
try
|
||||
{
|
||||
@ -56,6 +71,4 @@ public class HttpHandler extends SimpleChannelInboundHandler<HttpObject>
|
||||
ctx.channel().close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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<DefinedPacket>
|
||||
{
|
||||
|
||||
@Override
|
||||
protected void encode(ChannelHandlerContext ctx, DefinedPacket msg, ByteBuf out) throws Exception
|
||||
{
|
||||
out.writeByte( msg.getId() );
|
||||
msg.write( out );
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
@ -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.
|
||||
* <p/>
|
||||
* 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<Void>
|
||||
{
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
private Protocol protocol;
|
||||
|
||||
@Override
|
||||
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> 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 ) );
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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<Channel> CLIENT = new ChannelInitializer<Channel>()
|
||||
{
|
||||
@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<Channel>
|
||||
{
|
||||
@ -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() );
|
||||
}
|
||||
};
|
||||
|
@ -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 ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -6,13 +6,13 @@
|
||||
<parent>
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-parent</artifactId>
|
||||
<version>1.6.4-SNAPSHOT</version>
|
||||
<version>1.7-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<groupId>net.md-5</groupId>
|
||||
<artifactId>bungeecord-query</artifactId>
|
||||
<version>1.6.4-SNAPSHOT</version>
|
||||
<version>1.7-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>BungeeCord-Query</name>
|
||||
|
Loading…
Reference in New Issue
Block a user