diff --git a/pom.xml b/pom.xml index 7a41e464..358e270e 100644 --- a/pom.xml +++ b/pom.xml @@ -72,7 +72,7 @@ unknown - 1.18.32 + 1.18.36 1.8 1.8 UTF-8 diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/DefinedPacket.java b/protocol/src/main/java/net/md_5/bungee/protocol/DefinedPacket.java index f3f690c4..58e261b7 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/DefinedPacket.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/DefinedPacket.java @@ -15,6 +15,7 @@ import java.util.Arrays; import java.util.BitSet; import java.util.EnumSet; import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.function.BiConsumer; import lombok.RequiredArgsConstructor; @@ -69,6 +70,15 @@ public abstract class DefinedPacket buf.writeBytes( b ); } + public static T readStringMapKey(ByteBuf buf, Map map) + { + String string = readString( buf ); + T result = map.get( string ); + Preconditions.checkArgument( result != null, "Unknown string key %s", string ); + + return result; + } + public static String readString(ByteBuf buf) { return readString( buf, Short.MAX_VALUE ); diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/ProtocolConstants.java b/protocol/src/main/java/net/md_5/bungee/protocol/ProtocolConstants.java index 6e8af8f3..34fcb040 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/ProtocolConstants.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/ProtocolConstants.java @@ -49,7 +49,7 @@ public class ProtocolConstants public static final int MINECRAFT_1_21 = 767; public static final int MINECRAFT_1_21_2 = 768; public static final int MINECRAFT_1_21_4 = 769; - public static final int MINECRAFT_1_21_5 = 1073742055; + public static final int MINECRAFT_1_21_5 = 1073742056; public static final List SUPPORTED_VERSIONS; public static final List SUPPORTED_VERSION_IDS; diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Team.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Team.java index 7a14e6a6..c5d13549 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Team.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Team.java @@ -1,6 +1,8 @@ package net.md_5.bungee.protocol.packet; +import com.google.common.collect.ImmutableMap; import io.netty.buffer.ByteBuf; +import java.util.Map; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -26,8 +28,8 @@ public class Team extends DefinedPacket private Either displayName; private Either prefix; private Either suffix; - private String nameTagVisibility; - private String collisionRule; + private NameTagVisibility nameTagVisibility; + private CollisionRule collisionRule; private int color; private byte friendlyFire; private String[] players; @@ -60,10 +62,18 @@ public class Team extends DefinedPacket displayName = readEitherBaseComponent( buf, protocolVersion, false ); } friendlyFire = buf.readByte(); - nameTagVisibility = readString( buf ); - if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_9 ) + if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_21_5 ) { - collisionRule = readString( buf ); + nameTagVisibility = NameTagVisibility.values()[readVarInt( buf )]; + collisionRule = CollisionRule.values()[readVarInt( buf )]; + } else + { + nameTagVisibility = readStringMapKey( buf, NameTagVisibility.BY_NAME ); + + if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_9 ) + { + collisionRule = readStringMapKey( buf, CollisionRule.BY_NAME ); + } } color = ( protocolVersion >= ProtocolConstants.MINECRAFT_1_13 ) ? readVarInt( buf ) : buf.readByte(); if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_13 ) @@ -97,10 +107,17 @@ public class Team extends DefinedPacket writeEitherBaseComponent( suffix, buf, protocolVersion ); } buf.writeByte( friendlyFire ); - writeString( nameTagVisibility, buf ); - if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_9 ) + if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_21_5 ) { - writeString( collisionRule, buf ); + writeVarInt( nameTagVisibility.ordinal(), buf ); + writeVarInt( collisionRule.ordinal(), buf ); + } else + { + writeString( nameTagVisibility.getKey(), buf ); + if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_9 ) + { + writeString( collisionRule.getKey(), buf ); + } } if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_13 ) @@ -128,4 +145,76 @@ public class Team extends DefinedPacket { handler.handle( this ); } + + public enum NameTagVisibility + { + + ALWAYS( "always" ), + NEVER( "never" ), + HIDE_FOR_OTHER_TEAMS( "hideForOtherTeams" ), + HIDE_FOR_OWN_TEAM( "hideForOwnTeam" ); + // + private final String key; + // + private static final Map BY_NAME; + + static + { + NameTagVisibility[] values = NameTagVisibility.values(); + ImmutableMap.Builder builder = ImmutableMap.builderWithExpectedSize( values.length ); + + for ( NameTagVisibility e : values ) + { + builder.put( e.key, e ); + } + + BY_NAME = builder.build(); + } + + private NameTagVisibility(String name) + { + this.key = name; + } + + public String getKey() + { + return this.key; + } + } + + public enum CollisionRule + { + + ALWAYS( "always" ), + NEVER( "never" ), + PUSH_OTHER_TEAMS( "pushOtherTeams" ), + PUSH_OWN_TEAM( "pushOwnTeam" ); + // + private final String key; + // + private static final Map BY_NAME; + + static + { + CollisionRule[] values = CollisionRule.values(); + ImmutableMap.Builder builder = ImmutableMap.builderWithExpectedSize( values.length ); + + for ( CollisionRule e : values ) + { + builder.put( e.key, e ); + } + + BY_NAME = builder.build(); + } + + private CollisionRule(String name) + { + this.key = name; + } + + public String getKey() + { + return this.key; + } + } } diff --git a/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java b/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java index d518d05f..97be9203 100644 --- a/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java +++ b/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java @@ -283,8 +283,8 @@ public class DownstreamBridge extends PacketHandler t.setPrefix( team.getPrefix().getLeftOrCompute( ComponentSerializer::toString ) ); t.setSuffix( team.getSuffix().getLeftOrCompute( ComponentSerializer::toString ) ); t.setFriendlyFire( team.getFriendlyFire() ); - t.setNameTagVisibility( team.getNameTagVisibility() ); - t.setCollisionRule( team.getCollisionRule() ); + t.setNameTagVisibility( team.getNameTagVisibility().getKey() ); + t.setCollisionRule( team.getCollisionRule().getKey() ); t.setColor( team.getColor() ); } if ( team.getPlayers() != null )