Minecraft 23w43b support
This commit is contained in:
@@ -3,8 +3,8 @@ package net.md_5.bungee;
|
||||
import lombok.Data;
|
||||
import net.md_5.bungee.api.Title;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||
import net.md_5.bungee.chat.ComponentSerializer;
|
||||
import net.md_5.bungee.protocol.DefinedPacket;
|
||||
import net.md_5.bungee.protocol.ProtocolConstants;
|
||||
import net.md_5.bungee.protocol.packet.ClearTitles;
|
||||
@@ -53,21 +53,14 @@ public class BungeeTitle implements Title
|
||||
title = new TitlePacketHolder<>( packet, packet );
|
||||
}
|
||||
|
||||
title.oldPacket.setText( ComponentSerializer.toString( text ) ); // = newPacket
|
||||
title.oldPacket.setText( text ); // = newPacket
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Title title(BaseComponent... text)
|
||||
{
|
||||
if ( title == null )
|
||||
{
|
||||
net.md_5.bungee.protocol.packet.Title packet = new net.md_5.bungee.protocol.packet.Title( Action.TITLE );
|
||||
title = new TitlePacketHolder<>( packet, packet );
|
||||
}
|
||||
|
||||
title.oldPacket.setText( ComponentSerializer.toString( text ) ); // = newPacket
|
||||
return this;
|
||||
return title( TextComponent.fromArray( text ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -78,24 +71,15 @@ public class BungeeTitle implements Title
|
||||
subtitle = new TitlePacketHolder<>( new net.md_5.bungee.protocol.packet.Title( Action.SUBTITLE ), new Subtitle() );
|
||||
}
|
||||
|
||||
String serialized = ComponentSerializer.toString( text );
|
||||
subtitle.oldPacket.setText( serialized );
|
||||
subtitle.newPacket.setText( serialized );
|
||||
subtitle.oldPacket.setText( text );
|
||||
subtitle.newPacket.setText( text );
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Title subTitle(BaseComponent... text)
|
||||
{
|
||||
if ( subtitle == null )
|
||||
{
|
||||
subtitle = new TitlePacketHolder<>( new net.md_5.bungee.protocol.packet.Title( Action.SUBTITLE ), new Subtitle() );
|
||||
}
|
||||
|
||||
String serialized = ComponentSerializer.toString( text );
|
||||
subtitle.oldPacket.setText( serialized );
|
||||
subtitle.newPacket.setText( serialized );
|
||||
return this;
|
||||
return subTitle( TextComponent.fromArray( text ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -14,6 +14,7 @@ import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import net.md_5.bungee.api.ProxyServer;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import net.md_5.bungee.api.config.ServerInfo;
|
||||
import net.md_5.bungee.api.event.ServerConnectEvent;
|
||||
import net.md_5.bungee.api.event.ServerConnectedEvent;
|
||||
@@ -278,7 +279,7 @@ public class ServerConnector extends PacketHandler
|
||||
Scoreboard serverScoreboard = user.getServerSentScoreboard();
|
||||
for ( Objective objective : serverScoreboard.getObjectives() )
|
||||
{
|
||||
user.unsafe().sendPacket( new ScoreboardObjective( objective.getName(), objective.getValue(), ScoreboardObjective.HealthDisplay.fromString( objective.getType() ), (byte) 1 ) );
|
||||
user.unsafe().sendPacket( new ScoreboardObjective( objective.getName(), ComponentSerializer.deserialize( objective.getValue() ), ScoreboardObjective.HealthDisplay.fromString( objective.getType() ), (byte) 1 ) );
|
||||
}
|
||||
for ( Score score : serverScoreboard.getScores() )
|
||||
{
|
||||
@@ -383,7 +384,10 @@ public class ServerConnector extends PacketHandler
|
||||
public void handle(Kick kick) throws Exception
|
||||
{
|
||||
ServerInfo def = user.updateAndGetNextServer( target );
|
||||
ServerKickEvent event = new ServerKickEvent( user, target, ComponentSerializer.parse( kick.getMessage() ), def, ServerKickEvent.State.CONNECTING );
|
||||
ServerKickEvent event = new ServerKickEvent( user, target, new BaseComponent[]
|
||||
{
|
||||
kick.getMessage()
|
||||
}, def, ServerKickEvent.State.CONNECTING );
|
||||
if ( event.getKickReason().toLowerCase( Locale.ROOT ).contains( "outdated" ) && def != null )
|
||||
{
|
||||
// Pre cancel the event if we are going to try another server
|
||||
|
@@ -406,13 +406,13 @@ public final class UserConnection implements ProxiedPlayer
|
||||
@Override
|
||||
public void disconnect(String reason)
|
||||
{
|
||||
disconnect0( TextComponent.fromLegacyText( reason ) );
|
||||
disconnect( TextComponent.fromLegacyText( reason ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disconnect(BaseComponent... reason)
|
||||
{
|
||||
disconnect0( reason );
|
||||
disconnect( TextComponent.fromArray( reason ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -421,7 +421,7 @@ public final class UserConnection implements ProxiedPlayer
|
||||
disconnect0( reason );
|
||||
}
|
||||
|
||||
public void disconnect0(final BaseComponent... reason)
|
||||
public void disconnect0(final BaseComponent reason)
|
||||
{
|
||||
if ( !ch.isClosing() )
|
||||
{
|
||||
@@ -430,7 +430,7 @@ public final class UserConnection implements ProxiedPlayer
|
||||
getName(), BaseComponent.toLegacyText( reason )
|
||||
} );
|
||||
|
||||
ch.close( new Kick( ComponentSerializer.toString( reason ) ) );
|
||||
ch.close( new Kick( reason ) );
|
||||
|
||||
if ( server != null )
|
||||
{
|
||||
@@ -481,7 +481,7 @@ public final class UserConnection implements ProxiedPlayer
|
||||
@Override
|
||||
public void sendMessage(ChatMessageType position, BaseComponent... message)
|
||||
{
|
||||
sendMessage( position, null, message );
|
||||
sendMessage( position, null, TextComponent.fromArray( message ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -493,7 +493,7 @@ public final class UserConnection implements ProxiedPlayer
|
||||
@Override
|
||||
public void sendMessage(UUID sender, BaseComponent... message)
|
||||
{
|
||||
sendMessage( ChatMessageType.CHAT, sender, message );
|
||||
sendMessage( ChatMessageType.CHAT, sender, TextComponent.fromArray( message ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -502,8 +502,28 @@ public final class UserConnection implements ProxiedPlayer
|
||||
sendMessage( ChatMessageType.CHAT, sender, message );
|
||||
}
|
||||
|
||||
private void sendMessage(ChatMessageType position, UUID sender, String message)
|
||||
private void sendMessage(ChatMessageType position, UUID sender, BaseComponent message)
|
||||
{
|
||||
// transform score components
|
||||
message = ChatComponentTransformer.getInstance().transform( this, true, message );
|
||||
|
||||
if ( position == ChatMessageType.ACTION_BAR && getPendingConnection().getVersion() < ProtocolConstants.MINECRAFT_1_17 )
|
||||
{
|
||||
// Versions older than 1.11 cannot send the Action bar with the new JSON formattings
|
||||
// Fix by converting to a legacy message, see https://bugs.mojang.com/browse/MC-119145
|
||||
if ( getPendingConnection().getVersion() <= ProtocolConstants.MINECRAFT_1_10 )
|
||||
{
|
||||
message = new TextComponent( BaseComponent.toLegacyText( message ) );
|
||||
} else
|
||||
{
|
||||
net.md_5.bungee.protocol.packet.Title title = new net.md_5.bungee.protocol.packet.Title();
|
||||
title.setAction( net.md_5.bungee.protocol.packet.Title.Action.ACTIONBAR );
|
||||
title.setText( message );
|
||||
sendPacketQueued( title );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ( getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_19 )
|
||||
{
|
||||
// Align with Spigot and remove client side formatting for now
|
||||
@@ -515,32 +535,7 @@ public final class UserConnection implements ProxiedPlayer
|
||||
sendPacketQueued( new SystemChat( message, position.ordinal() ) );
|
||||
} else
|
||||
{
|
||||
sendPacketQueued( new Chat( message, (byte) position.ordinal(), sender ) );
|
||||
}
|
||||
}
|
||||
|
||||
private void sendMessage(ChatMessageType position, UUID sender, BaseComponent... message)
|
||||
{
|
||||
// transform score components
|
||||
message = ChatComponentTransformer.getInstance().transform( this, true, message );
|
||||
|
||||
if ( position == ChatMessageType.ACTION_BAR && getPendingConnection().getVersion() < ProtocolConstants.MINECRAFT_1_17 )
|
||||
{
|
||||
// Versions older than 1.11 cannot send the Action bar with the new JSON formattings
|
||||
// Fix by converting to a legacy message, see https://bugs.mojang.com/browse/MC-119145
|
||||
if ( getPendingConnection().getVersion() <= ProtocolConstants.MINECRAFT_1_10 )
|
||||
{
|
||||
sendMessage( position, sender, ComponentSerializer.toString( new TextComponent( BaseComponent.toLegacyText( message ) ) ) );
|
||||
} else
|
||||
{
|
||||
net.md_5.bungee.protocol.packet.Title title = new net.md_5.bungee.protocol.packet.Title();
|
||||
title.setAction( net.md_5.bungee.protocol.packet.Title.Action.ACTIONBAR );
|
||||
title.setText( ComponentSerializer.toString( message ) );
|
||||
sendPacketQueued( title );
|
||||
}
|
||||
} else
|
||||
{
|
||||
sendMessage( position, sender, ComponentSerializer.toString( message ) );
|
||||
sendPacketQueued( new Chat( ComponentSerializer.toString( message ), (byte) position.ordinal(), sender ) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -720,25 +715,19 @@ public final class UserConnection implements ProxiedPlayer
|
||||
@Override
|
||||
public void setTabHeader(BaseComponent header, BaseComponent footer)
|
||||
{
|
||||
header = ChatComponentTransformer.getInstance().transform( this, true, header )[0];
|
||||
footer = ChatComponentTransformer.getInstance().transform( this, true, footer )[0];
|
||||
header = ChatComponentTransformer.getInstance().transform( this, true, header );
|
||||
footer = ChatComponentTransformer.getInstance().transform( this, true, footer );
|
||||
|
||||
sendPacketQueued( new PlayerListHeaderFooter(
|
||||
ComponentSerializer.toString( header ),
|
||||
ComponentSerializer.toString( footer )
|
||||
header,
|
||||
footer
|
||||
) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTabHeader(BaseComponent[] header, BaseComponent[] footer)
|
||||
{
|
||||
header = ChatComponentTransformer.getInstance().transform( this, true, header );
|
||||
footer = ChatComponentTransformer.getInstance().transform( this, true, footer );
|
||||
|
||||
sendPacketQueued( new PlayerListHeaderFooter(
|
||||
ComponentSerializer.toString( header ),
|
||||
ComponentSerializer.toString( footer )
|
||||
) );
|
||||
setTabHeader( TextComponent.fromArray( header ), TextComponent.fromArray( footer ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -183,7 +183,7 @@ public class DownstreamBridge extends PacketHandler
|
||||
switch ( objective.getAction() )
|
||||
{
|
||||
case 0:
|
||||
serverScoreboard.addObjective( new Objective( objective.getName(), objective.getValue(), objective.getType().toString() ) );
|
||||
serverScoreboard.addObjective( new Objective( objective.getName(), ComponentSerializer.toString( objective.getValue() ), objective.getType().toString() ) );
|
||||
break;
|
||||
case 1:
|
||||
serverScoreboard.removeObjective( objective.getName() );
|
||||
@@ -192,7 +192,7 @@ public class DownstreamBridge extends PacketHandler
|
||||
Objective oldObjective = serverScoreboard.getObjective( objective.getName() );
|
||||
if ( oldObjective != null )
|
||||
{
|
||||
oldObjective.setValue( objective.getValue() );
|
||||
oldObjective.setValue( ComponentSerializer.toString( objective.getValue() ) );
|
||||
oldObjective.setType( objective.getType().toString() );
|
||||
}
|
||||
break;
|
||||
@@ -254,9 +254,9 @@ public class DownstreamBridge extends PacketHandler
|
||||
{
|
||||
if ( team.getMode() == 0 || team.getMode() == 2 )
|
||||
{
|
||||
t.setDisplayName( team.getDisplayName() );
|
||||
t.setPrefix( team.getPrefix() );
|
||||
t.setSuffix( team.getSuffix() );
|
||||
t.setDisplayName( ComponentSerializer.toString( team.getDisplayName() ) );
|
||||
t.setPrefix( ComponentSerializer.toString( team.getPrefix() ) );
|
||||
t.setSuffix( ComponentSerializer.toString( team.getSuffix() ) );
|
||||
t.setFriendlyFire( team.getFriendlyFire() );
|
||||
t.setNameTagVisibility( team.getNameTagVisibility() );
|
||||
t.setCollisionRule( team.getCollisionRule() );
|
||||
@@ -620,13 +620,16 @@ public class DownstreamBridge extends PacketHandler
|
||||
public void handle(Kick kick) throws Exception
|
||||
{
|
||||
ServerInfo def = con.updateAndGetNextServer( server.getInfo() );
|
||||
ServerKickEvent event = bungee.getPluginManager().callEvent( new ServerKickEvent( con, server.getInfo(), ComponentSerializer.parse( kick.getMessage() ), def, ServerKickEvent.State.CONNECTED ) );
|
||||
ServerKickEvent event = bungee.getPluginManager().callEvent( new ServerKickEvent( con, server.getInfo(), new BaseComponent[]
|
||||
{
|
||||
kick.getMessage()
|
||||
}, def, ServerKickEvent.State.CONNECTED ) );
|
||||
if ( event.isCancelled() && event.getCancelServer() != null )
|
||||
{
|
||||
con.connectNow( event.getCancelServer(), ServerConnectEvent.Reason.KICK_REDIRECT );
|
||||
} else
|
||||
{
|
||||
con.disconnect0( event.getKickReasonComponent() ); // TODO: Prefix our own stuff.
|
||||
con.disconnect( event.getKickReasonComponent() ); // TODO: Prefix our own stuff.
|
||||
}
|
||||
server.setObsolete( true );
|
||||
throw CancelSendSignal.INSTANCE;
|
||||
|
@@ -39,7 +39,6 @@ import net.md_5.bungee.api.event.PostLoginEvent;
|
||||
import net.md_5.bungee.api.event.PreLoginEvent;
|
||||
import net.md_5.bungee.api.event.ProxyPingEvent;
|
||||
import net.md_5.bungee.api.event.ServerConnectEvent;
|
||||
import net.md_5.bungee.chat.ComponentSerializer;
|
||||
import net.md_5.bungee.http.HttpClient;
|
||||
import net.md_5.bungee.jni.cipher.BungeeCipher;
|
||||
import net.md_5.bungee.netty.ChannelWrapper;
|
||||
@@ -656,22 +655,19 @@ public class InitialHandler extends PacketHandler implements PendingConnection
|
||||
@Override
|
||||
public void disconnect(final BaseComponent... reason)
|
||||
{
|
||||
if ( canSendKickMessage() )
|
||||
{
|
||||
ch.delayedClose( new Kick( ComponentSerializer.toString( reason ) ) );
|
||||
} else
|
||||
{
|
||||
ch.close();
|
||||
}
|
||||
disconnect( TextComponent.fromArray( reason ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disconnect(BaseComponent reason)
|
||||
{
|
||||
disconnect( new BaseComponent[]
|
||||
if ( canSendKickMessage() )
|
||||
{
|
||||
reason
|
||||
} );
|
||||
ch.delayedClose( new Kick( reason ) );
|
||||
} else
|
||||
{
|
||||
ch.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -84,6 +84,8 @@ public abstract class EntityMap
|
||||
return EntityMap_1_16_2.INSTANCE_1_19_4;
|
||||
case ProtocolConstants.MINECRAFT_1_20_2:
|
||||
return EntityMap_1_16_2.INSTANCE_1_20_2;
|
||||
case ProtocolConstants.MINECRAFT_1_20_3:
|
||||
return EntityMap_1_16_2.INSTANCE_1_20_3;
|
||||
}
|
||||
throw new RuntimeException( "Version " + version + " has no entity map" );
|
||||
}
|
||||
|
@@ -21,6 +21,7 @@ class EntityMap_1_16_2 extends EntityMap
|
||||
static final EntityMap_1_16_2 INSTANCE_1_19_1 = new EntityMap_1_16_2( 0x02, 0x30 );
|
||||
static final EntityMap_1_16_2 INSTANCE_1_19_4 = new EntityMap_1_16_2( 0x03, 0x30 );
|
||||
static final EntityMap_1_16_2 INSTANCE_1_20_2 = new EntityMap_1_16_2( -1, 0x33 );
|
||||
static final EntityMap_1_16_2 INSTANCE_1_20_3 = new EntityMap_1_16_2( -1, 0x34 );
|
||||
//
|
||||
private final int spawnPlayerId;
|
||||
private final int spectateId;
|
||||
|
@@ -1,9 +1,9 @@
|
||||
package net.md_5.bungee.util;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.collect.Lists;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
@@ -34,30 +34,25 @@ public final class ChatComponentTransformer
|
||||
*/
|
||||
private static final Pattern SELECTOR_PATTERN = Pattern.compile( "^@([pares])(?:\\[([^ ]*)\\])?$" );
|
||||
|
||||
public BaseComponent[] legacyHoverTransform(ProxiedPlayer player, BaseComponent... components)
|
||||
public BaseComponent legacyHoverTransform(ProxiedPlayer player, BaseComponent next)
|
||||
{
|
||||
if ( player.getPendingConnection().getVersion() < ProtocolConstants.MINECRAFT_1_16 )
|
||||
{
|
||||
for ( int i = 0; i < components.length; i++ )
|
||||
if ( next.getHoverEvent() == null || next.getHoverEvent().isLegacy() )
|
||||
{
|
||||
BaseComponent next = components[i];
|
||||
if ( next.getHoverEvent() == null || next.getHoverEvent().isLegacy() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
next = next.duplicate();
|
||||
next.getHoverEvent().setLegacy( true );
|
||||
if ( next.getHoverEvent().getContents().size() > 1 )
|
||||
{
|
||||
Content exception = next.getHoverEvent().getContents().get( 0 );
|
||||
next.getHoverEvent().getContents().clear();
|
||||
next.getHoverEvent().getContents().add( exception );
|
||||
}
|
||||
components[i] = next;
|
||||
return next;
|
||||
}
|
||||
next = next.duplicate();
|
||||
next.getHoverEvent().setLegacy( true );
|
||||
if ( next.getHoverEvent().getContents().size() > 1 )
|
||||
{
|
||||
Content exception = next.getHoverEvent().getContents().get( 0 );
|
||||
next.getHoverEvent().getContents().clear();
|
||||
next.getHoverEvent().getContents().add( exception );
|
||||
}
|
||||
}
|
||||
|
||||
return components;
|
||||
return next;
|
||||
}
|
||||
|
||||
public static ChatComponentTransformer getInstance()
|
||||
@@ -77,7 +72,7 @@ public final class ChatComponentTransformer
|
||||
* TextComponent if the components are null or empty
|
||||
* @throws IllegalArgumentException if an entity selector pattern is present
|
||||
*/
|
||||
public BaseComponent[] transform(ProxiedPlayer player, BaseComponent... components)
|
||||
public BaseComponent transform(ProxiedPlayer player, BaseComponent components)
|
||||
{
|
||||
return transform( player, false, components );
|
||||
}
|
||||
@@ -91,40 +86,35 @@ public final class ChatComponentTransformer
|
||||
* @param player player
|
||||
* @param transformHover if the hover event should replace contents with
|
||||
* value
|
||||
* @param components the component to transform
|
||||
* @param root the component to transform
|
||||
* @return the transformed component, or an array containing a single empty
|
||||
* TextComponent if the components are null or empty
|
||||
* @throws IllegalArgumentException if an entity selector pattern is present
|
||||
*/
|
||||
public BaseComponent[] transform(ProxiedPlayer player, boolean transformHover, BaseComponent... components)
|
||||
public BaseComponent transform(ProxiedPlayer player, boolean transformHover, BaseComponent root)
|
||||
{
|
||||
if ( components == null || components.length < 1 || ( components.length == 1 && components[0] == null ) )
|
||||
if ( root == null )
|
||||
{
|
||||
return new BaseComponent[]
|
||||
{
|
||||
new TextComponent( "" )
|
||||
};
|
||||
return new TextComponent( "" );
|
||||
}
|
||||
|
||||
if ( transformHover )
|
||||
{
|
||||
components = legacyHoverTransform( player, components );
|
||||
root = legacyHoverTransform( player, root );
|
||||
}
|
||||
|
||||
for ( BaseComponent root : components )
|
||||
if ( root.getExtra() != null && !root.getExtra().isEmpty() )
|
||||
{
|
||||
if ( root.getExtra() != null && !root.getExtra().isEmpty() )
|
||||
{
|
||||
List<BaseComponent> list = Lists.newArrayList( transform( player, transformHover, root.getExtra().toArray( new BaseComponent[ 0 ] ) ) );
|
||||
root.setExtra( list );
|
||||
}
|
||||
|
||||
if ( root instanceof ScoreComponent )
|
||||
{
|
||||
transformScoreComponent( player, (ScoreComponent) root );
|
||||
}
|
||||
List<BaseComponent> list = root.getExtra().stream().map( (extra) -> transform( player, transformHover, extra ) ).collect( Collectors.toList() );
|
||||
root.setExtra( list );
|
||||
}
|
||||
return components;
|
||||
|
||||
if ( root instanceof ScoreComponent )
|
||||
{
|
||||
transformScoreComponent( player, (ScoreComponent) root );
|
||||
}
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user