#3559: Fix serialisation of certain scoreboard packets < 1.13
This commit is contained in:
parent
65d8edf62d
commit
bd009ca52d
@ -73,6 +73,11 @@ public abstract class DefinedPacket
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Either<String, BaseComponent> readEitherBaseComponent(ByteBuf buf, int protocolVersion, boolean string)
|
||||||
|
{
|
||||||
|
return ( string ) ? Either.left( readString( buf ) ) : Either.right( readBaseComponent( buf, protocolVersion ) );
|
||||||
|
}
|
||||||
|
|
||||||
public static BaseComponent readBaseComponent(ByteBuf buf, int protocolVersion)
|
public static BaseComponent readBaseComponent(ByteBuf buf, int protocolVersion)
|
||||||
{
|
{
|
||||||
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_20_3 )
|
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_20_3 )
|
||||||
@ -89,6 +94,17 @@ public abstract class DefinedPacket
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void writeEitherBaseComponent(Either<String, BaseComponent> message, ByteBuf buf, int protocolVersion)
|
||||||
|
{
|
||||||
|
if ( message.isLeft() )
|
||||||
|
{
|
||||||
|
writeString( message.getLeft(), buf );
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
writeBaseComponent( message.getRight(), buf, protocolVersion );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void writeBaseComponent(BaseComponent message, ByteBuf buf, int protocolVersion)
|
public static void writeBaseComponent(BaseComponent message, ByteBuf buf, int protocolVersion)
|
||||||
{
|
{
|
||||||
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_20_3 )
|
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_20_3 )
|
||||||
|
34
protocol/src/main/java/net/md_5/bungee/protocol/Either.java
Normal file
34
protocol/src/main/java/net/md_5/bungee/protocol/Either.java
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package net.md_5.bungee.protocol;
|
||||||
|
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||||
|
public final class Either<L, R>
|
||||||
|
{
|
||||||
|
|
||||||
|
private final L left;
|
||||||
|
private final R right;
|
||||||
|
|
||||||
|
public boolean isLeft()
|
||||||
|
{
|
||||||
|
return this.left != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isRight()
|
||||||
|
{
|
||||||
|
return this.right != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <L, R> Either<L, R> left(L left)
|
||||||
|
{
|
||||||
|
return new Either<>( left, null );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <L, R> Either<L, R> right(R right)
|
||||||
|
{
|
||||||
|
return new Either<>( null, right );
|
||||||
|
}
|
||||||
|
}
|
@ -9,6 +9,7 @@ import lombok.NoArgsConstructor;
|
|||||||
import net.md_5.bungee.api.chat.BaseComponent;
|
import net.md_5.bungee.api.chat.BaseComponent;
|
||||||
import net.md_5.bungee.protocol.AbstractPacketHandler;
|
import net.md_5.bungee.protocol.AbstractPacketHandler;
|
||||||
import net.md_5.bungee.protocol.DefinedPacket;
|
import net.md_5.bungee.protocol.DefinedPacket;
|
||||||
|
import net.md_5.bungee.protocol.Either;
|
||||||
import net.md_5.bungee.protocol.ProtocolConstants;
|
import net.md_5.bungee.protocol.ProtocolConstants;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@ -19,7 +20,7 @@ public class ScoreboardObjective extends DefinedPacket
|
|||||||
{
|
{
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
private BaseComponent value;
|
private Either<String, BaseComponent> value;
|
||||||
private HealthDisplay type;
|
private HealthDisplay type;
|
||||||
/**
|
/**
|
||||||
* 0 to create, 1 to remove, 2 to update display text.
|
* 0 to create, 1 to remove, 2 to update display text.
|
||||||
@ -33,12 +34,13 @@ public class ScoreboardObjective extends DefinedPacket
|
|||||||
action = buf.readByte();
|
action = buf.readByte();
|
||||||
if ( action == 0 || action == 2 )
|
if ( action == 0 || action == 2 )
|
||||||
{
|
{
|
||||||
value = readBaseComponent( buf, protocolVersion );
|
|
||||||
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_13 )
|
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_13 )
|
||||||
{
|
{
|
||||||
|
value = readEitherBaseComponent( buf, protocolVersion, false );
|
||||||
type = HealthDisplay.values()[readVarInt( buf )];
|
type = HealthDisplay.values()[readVarInt( buf )];
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
|
value = readEitherBaseComponent( buf, protocolVersion, true );
|
||||||
type = HealthDisplay.fromString( readString( buf ) );
|
type = HealthDisplay.fromString( readString( buf ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -51,7 +53,7 @@ public class ScoreboardObjective extends DefinedPacket
|
|||||||
buf.writeByte( action );
|
buf.writeByte( action );
|
||||||
if ( action == 0 || action == 2 )
|
if ( action == 0 || action == 2 )
|
||||||
{
|
{
|
||||||
writeBaseComponent( value, buf, protocolVersion );
|
writeEitherBaseComponent( value, buf, protocolVersion );
|
||||||
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_13 )
|
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_13 )
|
||||||
{
|
{
|
||||||
writeVarInt( type.ordinal(), buf );
|
writeVarInt( type.ordinal(), buf );
|
||||||
|
@ -8,6 +8,7 @@ import lombok.NoArgsConstructor;
|
|||||||
import net.md_5.bungee.api.chat.BaseComponent;
|
import net.md_5.bungee.api.chat.BaseComponent;
|
||||||
import net.md_5.bungee.protocol.AbstractPacketHandler;
|
import net.md_5.bungee.protocol.AbstractPacketHandler;
|
||||||
import net.md_5.bungee.protocol.DefinedPacket;
|
import net.md_5.bungee.protocol.DefinedPacket;
|
||||||
|
import net.md_5.bungee.protocol.Either;
|
||||||
import net.md_5.bungee.protocol.ProtocolConstants;
|
import net.md_5.bungee.protocol.ProtocolConstants;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@ -22,9 +23,9 @@ public class Team extends DefinedPacket
|
|||||||
* 0 - create, 1 remove, 2 info update, 3 player add, 4 player remove.
|
* 0 - create, 1 remove, 2 info update, 3 player add, 4 player remove.
|
||||||
*/
|
*/
|
||||||
private byte mode;
|
private byte mode;
|
||||||
private BaseComponent displayName;
|
private Either<String, BaseComponent> displayName;
|
||||||
private BaseComponent prefix;
|
private Either<String, BaseComponent> prefix;
|
||||||
private BaseComponent suffix;
|
private Either<String, BaseComponent> suffix;
|
||||||
private String nameTagVisibility;
|
private String nameTagVisibility;
|
||||||
private String collisionRule;
|
private String collisionRule;
|
||||||
private int color;
|
private int color;
|
||||||
@ -49,11 +50,14 @@ public class Team extends DefinedPacket
|
|||||||
mode = buf.readByte();
|
mode = buf.readByte();
|
||||||
if ( mode == 0 || mode == 2 )
|
if ( mode == 0 || mode == 2 )
|
||||||
{
|
{
|
||||||
displayName = readBaseComponent( buf, protocolVersion );
|
|
||||||
if ( protocolVersion < ProtocolConstants.MINECRAFT_1_13 )
|
if ( protocolVersion < ProtocolConstants.MINECRAFT_1_13 )
|
||||||
{
|
{
|
||||||
prefix = readBaseComponent( buf, protocolVersion );
|
displayName = readEitherBaseComponent( buf, protocolVersion, true );
|
||||||
suffix = readBaseComponent( buf, protocolVersion );
|
prefix = readEitherBaseComponent( buf, protocolVersion, true );
|
||||||
|
suffix = readEitherBaseComponent( buf, protocolVersion, true );
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
displayName = readEitherBaseComponent( buf, protocolVersion, false );
|
||||||
}
|
}
|
||||||
friendlyFire = buf.readByte();
|
friendlyFire = buf.readByte();
|
||||||
nameTagVisibility = readString( buf );
|
nameTagVisibility = readString( buf );
|
||||||
@ -64,8 +68,8 @@ public class Team extends DefinedPacket
|
|||||||
color = ( protocolVersion >= ProtocolConstants.MINECRAFT_1_13 ) ? readVarInt( buf ) : buf.readByte();
|
color = ( protocolVersion >= ProtocolConstants.MINECRAFT_1_13 ) ? readVarInt( buf ) : buf.readByte();
|
||||||
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_13 )
|
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_13 )
|
||||||
{
|
{
|
||||||
prefix = readBaseComponent( buf, protocolVersion );
|
prefix = readEitherBaseComponent( buf, protocolVersion, false );
|
||||||
suffix = readBaseComponent( buf, protocolVersion );
|
suffix = readEitherBaseComponent( buf, protocolVersion, false );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( mode == 0 || mode == 3 || mode == 4 )
|
if ( mode == 0 || mode == 3 || mode == 4 )
|
||||||
@ -86,11 +90,11 @@ public class Team extends DefinedPacket
|
|||||||
buf.writeByte( mode );
|
buf.writeByte( mode );
|
||||||
if ( mode == 0 || mode == 2 )
|
if ( mode == 0 || mode == 2 )
|
||||||
{
|
{
|
||||||
writeBaseComponent( displayName, buf, protocolVersion );
|
writeEitherBaseComponent( displayName, buf, protocolVersion );
|
||||||
if ( protocolVersion < ProtocolConstants.MINECRAFT_1_13 )
|
if ( protocolVersion < ProtocolConstants.MINECRAFT_1_13 )
|
||||||
{
|
{
|
||||||
writeBaseComponent( prefix, buf, protocolVersion );
|
writeEitherBaseComponent( prefix, buf, protocolVersion );
|
||||||
writeBaseComponent( suffix, buf, protocolVersion );
|
writeEitherBaseComponent( suffix, buf, protocolVersion );
|
||||||
}
|
}
|
||||||
buf.writeByte( friendlyFire );
|
buf.writeByte( friendlyFire );
|
||||||
writeString( nameTagVisibility, buf );
|
writeString( nameTagVisibility, buf );
|
||||||
@ -102,8 +106,8 @@ public class Team extends DefinedPacket
|
|||||||
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_13 )
|
if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_13 )
|
||||||
{
|
{
|
||||||
writeVarInt( color, buf );
|
writeVarInt( color, buf );
|
||||||
writeBaseComponent( prefix, buf, protocolVersion );
|
writeEitherBaseComponent( prefix, buf, protocolVersion );
|
||||||
writeBaseComponent( suffix, buf, protocolVersion );
|
writeEitherBaseComponent( suffix, buf, protocolVersion );
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
buf.writeByte( color );
|
buf.writeByte( color );
|
||||||
|
@ -35,6 +35,7 @@ import net.md_5.bungee.netty.ChannelWrapper;
|
|||||||
import net.md_5.bungee.netty.HandlerBoss;
|
import net.md_5.bungee.netty.HandlerBoss;
|
||||||
import net.md_5.bungee.netty.PacketHandler;
|
import net.md_5.bungee.netty.PacketHandler;
|
||||||
import net.md_5.bungee.protocol.DefinedPacket;
|
import net.md_5.bungee.protocol.DefinedPacket;
|
||||||
|
import net.md_5.bungee.protocol.Either;
|
||||||
import net.md_5.bungee.protocol.PacketWrapper;
|
import net.md_5.bungee.protocol.PacketWrapper;
|
||||||
import net.md_5.bungee.protocol.Protocol;
|
import net.md_5.bungee.protocol.Protocol;
|
||||||
import net.md_5.bungee.protocol.ProtocolConstants;
|
import net.md_5.bungee.protocol.ProtocolConstants;
|
||||||
@ -279,7 +280,12 @@ public class ServerConnector extends PacketHandler
|
|||||||
Scoreboard serverScoreboard = user.getServerSentScoreboard();
|
Scoreboard serverScoreboard = user.getServerSentScoreboard();
|
||||||
for ( Objective objective : serverScoreboard.getObjectives() )
|
for ( Objective objective : serverScoreboard.getObjectives() )
|
||||||
{
|
{
|
||||||
user.unsafe().sendPacket( new ScoreboardObjective( objective.getName(), ComponentSerializer.deserialize( objective.getValue() ), ScoreboardObjective.HealthDisplay.fromString( objective.getType() ), (byte) 1 ) );
|
user.unsafe().sendPacket( new ScoreboardObjective(
|
||||||
|
objective.getName(),
|
||||||
|
( user.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_13 ) ? Either.right( ComponentSerializer.deserialize( objective.getValue() ) ) : Either.left( objective.getValue() ),
|
||||||
|
ScoreboardObjective.HealthDisplay.fromString( objective.getType() ),
|
||||||
|
(byte) 1 )
|
||||||
|
);
|
||||||
}
|
}
|
||||||
for ( Score score : serverScoreboard.getScores() )
|
for ( Score score : serverScoreboard.getScores() )
|
||||||
{
|
{
|
||||||
|
@ -183,7 +183,7 @@ public class DownstreamBridge extends PacketHandler
|
|||||||
switch ( objective.getAction() )
|
switch ( objective.getAction() )
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
serverScoreboard.addObjective( new Objective( objective.getName(), ComponentSerializer.toString( objective.getValue() ), objective.getType().toString() ) );
|
serverScoreboard.addObjective( new Objective( objective.getName(), ( objective.getValue().isLeft() ) ? objective.getValue().getLeft() : ComponentSerializer.toString( objective.getValue().getRight() ), objective.getType().toString() ) );
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
serverScoreboard.removeObjective( objective.getName() );
|
serverScoreboard.removeObjective( objective.getName() );
|
||||||
@ -192,7 +192,7 @@ public class DownstreamBridge extends PacketHandler
|
|||||||
Objective oldObjective = serverScoreboard.getObjective( objective.getName() );
|
Objective oldObjective = serverScoreboard.getObjective( objective.getName() );
|
||||||
if ( oldObjective != null )
|
if ( oldObjective != null )
|
||||||
{
|
{
|
||||||
oldObjective.setValue( ComponentSerializer.toString( objective.getValue() ) );
|
oldObjective.setValue( ( objective.getValue().isLeft() ) ? objective.getValue().getLeft() : ComponentSerializer.toString( objective.getValue().getRight() ) );
|
||||||
oldObjective.setType( objective.getType().toString() );
|
oldObjective.setType( objective.getType().toString() );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user