Skip to content

Commit

Permalink
Simplify packet registration
Browse files Browse the repository at this point in the history
  • Loading branch information
md-5 committed Feb 26, 2019
1 parent 6d6fbb5 commit 9133a6f
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 87 deletions.
128 changes: 42 additions & 86 deletions protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
package net.md_5.bungee.protocol;

import com.google.common.base.Preconditions;
import com.google.common.collect.Iterables;
import gnu.trove.map.TIntObjectMap;
import gnu.trove.map.TObjectIntMap;
import gnu.trove.map.hash.TIntObjectHashMap;
import gnu.trove.map.hash.TObjectIntHashMap;
import java.lang.reflect.Constructor;
import java.util.Arrays;
import java.util.List;
import lombok.Data;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import net.md_5.bungee.protocol.packet.BossBar;
import net.md_5.bungee.protocol.packet.Chat;
import net.md_5.bungee.protocol.packet.ClientSettings;
Expand Down Expand Up @@ -65,21 +62,18 @@ public enum Protocol
KeepAlive.class,
map( ProtocolConstants.MINECRAFT_1_8, 0x00 ),
map( ProtocolConstants.MINECRAFT_1_9, 0x1F ),
map( ProtocolConstants.MINECRAFT_1_12, 0x1F ),
map( ProtocolConstants.MINECRAFT_1_13, 0x21 )
);
TO_CLIENT.registerPacket(
Login.class,
map( ProtocolConstants.MINECRAFT_1_8, 0x01 ),
map( ProtocolConstants.MINECRAFT_1_9, 0x23 ),
map( ProtocolConstants.MINECRAFT_1_12, 0x23 ),
map( ProtocolConstants.MINECRAFT_1_13, 0x25 )
);
TO_CLIENT.registerPacket(
Chat.class,
map( ProtocolConstants.MINECRAFT_1_8, 0x02 ),
map( ProtocolConstants.MINECRAFT_1_9, 0x0F ),
map( ProtocolConstants.MINECRAFT_1_12, 0x0F ),
map( ProtocolConstants.MINECRAFT_1_13, 0x0E )
);
TO_CLIENT.registerPacket(
Expand All @@ -92,23 +86,19 @@ public enum Protocol
);
TO_CLIENT.registerPacket(
BossBar.class,
map( ProtocolConstants.MINECRAFT_1_9, 0x0C ),
map( ProtocolConstants.MINECRAFT_1_12, 0x0C ),
map( ProtocolConstants.MINECRAFT_1_13, 0x0C )
map( ProtocolConstants.MINECRAFT_1_9, 0x0C )
);
TO_CLIENT.registerPacket(
PlayerListItem.class, // PlayerInfo
map( ProtocolConstants.MINECRAFT_1_8, 0x38 ),
map( ProtocolConstants.MINECRAFT_1_9, 0x2D ),
map( ProtocolConstants.MINECRAFT_1_12, 0x2D ),
map( ProtocolConstants.MINECRAFT_1_12_1, 0x2E ),
map( ProtocolConstants.MINECRAFT_1_13, 0x30 )
);
TO_CLIENT.registerPacket(
TabCompleteResponse.class,
map( ProtocolConstants.MINECRAFT_1_8, 0x3A ),
map( ProtocolConstants.MINECRAFT_1_9, 0x0E ),
map( ProtocolConstants.MINECRAFT_1_12, 0x0E ),
map( ProtocolConstants.MINECRAFT_1_13, 0x10 )
);
TO_CLIENT.registerPacket(
Expand Down Expand Up @@ -147,14 +137,12 @@ public enum Protocol
PluginMessage.class,
map( ProtocolConstants.MINECRAFT_1_8, 0x3F ),
map( ProtocolConstants.MINECRAFT_1_9, 0x18 ),
map( ProtocolConstants.MINECRAFT_1_12, 0x18 ),
map( ProtocolConstants.MINECRAFT_1_13, 0x19 )
);
TO_CLIENT.registerPacket(
Kick.class,
map( ProtocolConstants.MINECRAFT_1_8, 0x40 ),
map( ProtocolConstants.MINECRAFT_1_9, 0x1A ),
map( ProtocolConstants.MINECRAFT_1_12, 0x1A ),
map( ProtocolConstants.MINECRAFT_1_13, 0x1B )
);
TO_CLIENT.registerPacket(
Expand All @@ -177,7 +165,6 @@ public enum Protocol
EntityStatus.class,
map( ProtocolConstants.MINECRAFT_1_8, 0x1A ),
map( ProtocolConstants.MINECRAFT_1_9, 0x1B ),
map( ProtocolConstants.MINECRAFT_1_12, 0x1B ),
map( ProtocolConstants.MINECRAFT_1_13, 0x1C )
);
TO_CLIENT.registerPacket(
Expand All @@ -198,8 +185,7 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_8, 0x01 ),
map( ProtocolConstants.MINECRAFT_1_9, 0x02 ),
map( ProtocolConstants.MINECRAFT_1_12, 0x03 ),
map( ProtocolConstants.MINECRAFT_1_12_1, 0x02 ),
map( ProtocolConstants.MINECRAFT_1_13, 0x02 )
map( ProtocolConstants.MINECRAFT_1_12_1, 0x02 )
);
TO_SERVER.registerPacket(
TabCompleteRequest.class,
Expand All @@ -214,8 +200,7 @@ public enum Protocol
map( ProtocolConstants.MINECRAFT_1_8, 0x15 ),
map( ProtocolConstants.MINECRAFT_1_9, 0x04 ),
map( ProtocolConstants.MINECRAFT_1_12, 0x05 ),
map( ProtocolConstants.MINECRAFT_1_12_1, 0x04 ),
map( ProtocolConstants.MINECRAFT_1_13, 0x04 )
map( ProtocolConstants.MINECRAFT_1_12_1, 0x04 )
);
TO_SERVER.registerPacket(
PluginMessage.class,
Expand Down Expand Up @@ -294,8 +279,8 @@ public enum Protocol
/*========================================================================*/
public static final int MAX_PACKET_ID = 0xFF;
/*========================================================================*/
public final DirectionData TO_SERVER = new DirectionData( this, ProtocolConstants.Direction.TO_SERVER );
public final DirectionData TO_CLIENT = new DirectionData( this, ProtocolConstants.Direction.TO_CLIENT );
final DirectionData TO_SERVER = new DirectionData( this, ProtocolConstants.Direction.TO_SERVER );
final DirectionData TO_CLIENT = new DirectionData( this, ProtocolConstants.Direction.TO_CLIENT );

public static void main(String[] args)
{
Expand Down Expand Up @@ -331,7 +316,7 @@ private static void dump(int version, DirectionData data)
}
}

@RequiredArgsConstructor
@Data
private static class ProtocolData
{

Expand All @@ -340,7 +325,7 @@ private static class ProtocolData
private final Constructor<? extends DefinedPacket>[] packetConstructors = new Constructor[ MAX_PACKET_ID ];
}

@RequiredArgsConstructor
@Data
private static class ProtocolMapping
{

Expand All @@ -354,66 +339,32 @@ private static ProtocolMapping map(int protocol, int id)
return new ProtocolMapping( protocol, id );
}

@RequiredArgsConstructor
public static class DirectionData
static final class DirectionData
{

private final Protocol protocolPhase;
private final TIntObjectMap<ProtocolData> protocols = new TIntObjectHashMap<>();
{
for ( int protocol : ProtocolConstants.SUPPORTED_VERSION_IDS )
{
protocols.put( protocol, new ProtocolData( protocol ) );
}
}
private final TIntObjectMap<List<Integer>> linkedProtocols = new TIntObjectHashMap<>();
{
linkedProtocols.put( ProtocolConstants.MINECRAFT_1_8, Arrays.asList(
ProtocolConstants.MINECRAFT_1_9,
ProtocolConstants.MINECRAFT_1_12,
ProtocolConstants.MINECRAFT_1_13
) );
linkedProtocols.put( ProtocolConstants.MINECRAFT_1_9, Arrays.asList(
ProtocolConstants.MINECRAFT_1_9_1,
ProtocolConstants.MINECRAFT_1_9_2,
ProtocolConstants.MINECRAFT_1_9_4
) );
linkedProtocols.put( ProtocolConstants.MINECRAFT_1_9_4, Arrays.asList(
ProtocolConstants.MINECRAFT_1_10,
ProtocolConstants.MINECRAFT_1_11,
ProtocolConstants.MINECRAFT_1_11_1
) );
linkedProtocols.put( ProtocolConstants.MINECRAFT_1_12, Arrays.asList(
ProtocolConstants.MINECRAFT_1_12_1
) );
linkedProtocols.put( ProtocolConstants.MINECRAFT_1_12_1, Arrays.asList(
ProtocolConstants.MINECRAFT_1_12_2
) );
linkedProtocols.put( ProtocolConstants.MINECRAFT_1_13, Arrays.asList(
ProtocolConstants.MINECRAFT_1_13_1,
ProtocolConstants.MINECRAFT_1_13_2
) );
}

//
private final Protocol protocolPhase;
@Getter
private final ProtocolConstants.Direction direction;

private ProtocolData getProtocolData(int version)
public DirectionData(Protocol protocolPhase, ProtocolConstants.Direction direction)
{
ProtocolData protocol = protocols.get( version );
if ( protocol == null && ( protocolPhase != Protocol.GAME ) )
this.protocolPhase = protocolPhase;
this.direction = direction;

for ( int protocol : ProtocolConstants.SUPPORTED_VERSION_IDS )
{
protocol = Iterables.getFirst( protocols.valueCollection(), null );
protocols.put( protocol, new ProtocolData( protocol ) );
}
return protocol;
}

public final DefinedPacket createPacket(int id, int version)
{
ProtocolData protocolData = getProtocolData( version );
ProtocolData protocolData = protocols.get( version );
if ( protocolData == null )
{
throw new BadPacketException( "Unsupported protocol version" );
throw new BadPacketException( "Unsupported protocol version " + version );
}
if ( id > MAX_PACKET_ID )
{
Expand All @@ -430,33 +381,38 @@ public final DefinedPacket createPacket(int id, int version)
}
}

protected final void registerPacket(Class<? extends DefinedPacket> packetClass, ProtocolMapping... mappings)
private void registerPacket(Class<? extends DefinedPacket> packetClass, ProtocolMapping... mappings)
{
try
{
Constructor<? extends DefinedPacket> constructor = packetClass.getDeclaredConstructor();
for ( ProtocolMapping mapping : mappings )

int mappingIndex = 0;
ProtocolMapping mapping = mappings[mappingIndex];
for ( int protocol : ProtocolConstants.SUPPORTED_VERSION_IDS )
{
ProtocolData data = protocols.get( mapping.protocolVersion );
data.packetMap.put( packetClass, mapping.packetID );
data.packetConstructors[mapping.packetID] = constructor;
if ( protocol < mapping.protocolVersion )
{
// This is a new packet, skip it till we reach the next protocol
continue;
}

List<Integer> links = linkedProtocols.get( mapping.protocolVersion );
if ( links != null )
if ( mapping.protocolVersion < protocol && mappingIndex + 1 < mappings.length )
{
links: for ( int link : links )
// Mapping is non current, but the next one may be ok
ProtocolMapping nextMapping = mappings[mappingIndex + 1];
if ( nextMapping.protocolVersion == protocol )
{
// Check for manual mappings
for ( ProtocolMapping m : mappings )
{
if ( m == mapping ) continue;
if ( m.protocolVersion == link ) continue links;
List<Integer> innerLinks = linkedProtocols.get( m.protocolVersion );
if ( innerLinks != null && innerLinks.contains( link ) ) continue links;
}
registerPacket( packetClass, map( link, mapping.packetID ) );
Preconditions.checkState( nextMapping.packetID != mapping.packetID, "Duplicate packet mapping (%s, %s)", mapping.protocolVersion, nextMapping.protocolVersion );

mapping = nextMapping;
mappingIndex++;
}
}

ProtocolData data = protocols.get( protocol );
data.packetMap.put( packetClass, mapping.packetID );
data.packetConstructors[mapping.packetID] = constructor;
}
} catch ( NoSuchMethodException ex )
{
Expand All @@ -467,7 +423,7 @@ protected final void registerPacket(Class<? extends DefinedPacket> packetClass,
final int getId(Class<? extends DefinedPacket> packet, int version)
{

ProtocolData protocolData = getProtocolData( version );
ProtocolData protocolData = protocols.get( version );
if ( protocolData == null )
{
throw new BadPacketException( "Unsupported protocol version" );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ public class ProtocolConstants
"1.12.x",
"1.13.x"
);
public static final List<Integer> SUPPORTED_VERSION_IDS = Arrays.asList( ProtocolConstants.MINECRAFT_1_8,
public static final List<Integer> SUPPORTED_VERSION_IDS = Arrays.asList(
ProtocolConstants.MINECRAFT_1_8,
ProtocolConstants.MINECRAFT_1_9,
ProtocolConstants.MINECRAFT_1_9_1,
ProtocolConstants.MINECRAFT_1_9_2,
Expand Down

0 comments on commit 9133a6f

Please sign in to comment.