#2866: Add support for contents in Hover Event

This commit is contained in:
Mystiflow
2020-07-01 10:57:09 +10:00
committed by md_5
parent 26f538d193
commit 1d40b8a88a
9 changed files with 675 additions and 28 deletions

View File

@@ -90,7 +90,6 @@ import net.md_5.bungee.module.ModuleManager;
import net.md_5.bungee.netty.PipelineUtils;
import net.md_5.bungee.protocol.DefinedPacket;
import net.md_5.bungee.protocol.ProtocolConstants;
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.scheduler.BungeeScheduler;
@@ -707,14 +706,20 @@ public class BungeeCord extends ProxyServer
public void broadcast(BaseComponent... message)
{
getConsole().sendMessage( BaseComponent.toLegacyText( message ) );
broadcast( new Chat( ComponentSerializer.toString( message ) ) );
for ( ProxiedPlayer player : getPlayers() )
{
player.sendMessage( message );
}
}
@Override
public void broadcast(BaseComponent message)
{
getConsole().sendMessage( message.toLegacyText() );
broadcast( new Chat( ComponentSerializer.toString( message ) ) );
for ( ProxiedPlayer player : getPlayers() )
{
player.sendMessage( message );
}
}
public void addConnection(UserConnection con)

View File

@@ -450,7 +450,7 @@ public final class UserConnection implements ProxiedPlayer
public void sendMessage(ChatMessageType position, BaseComponent... message)
{
// transform score components
message = ChatComponentTransformer.getInstance().transform( this, message );
message = ChatComponentTransformer.getInstance().transform( this, true, message );
if ( position == ChatMessageType.ACTION_BAR )
{
@@ -475,7 +475,7 @@ public final class UserConnection implements ProxiedPlayer
@Override
public void sendMessage(ChatMessageType position, BaseComponent message)
{
message = ChatComponentTransformer.getInstance().transform( this, message )[0];
message = ChatComponentTransformer.getInstance().transform( this, true, message )[0];
// Action bar doesn't display the new JSON formattings, legacy works - send it using this for now
if ( position == ChatMessageType.ACTION_BAR )
@@ -663,8 +663,8 @@ public final class UserConnection implements ProxiedPlayer
@Override
public void setTabHeader(BaseComponent header, BaseComponent footer)
{
header = ChatComponentTransformer.getInstance().transform( this, header )[0];
footer = ChatComponentTransformer.getInstance().transform( this, footer )[0];
header = ChatComponentTransformer.getInstance().transform( this, true, header )[0];
footer = ChatComponentTransformer.getInstance().transform( this, true, footer )[0];
unsafe().sendPacket( new PlayerListHeaderFooter(
ComponentSerializer.toString( header ),
@@ -675,8 +675,8 @@ public final class UserConnection implements ProxiedPlayer
@Override
public void setTabHeader(BaseComponent[] header, BaseComponent[] footer)
{
header = ChatComponentTransformer.getInstance().transform( this, header );
footer = ChatComponentTransformer.getInstance().transform( this, footer );
header = ChatComponentTransformer.getInstance().transform( this, true, header );
footer = ChatComponentTransformer.getInstance().transform( this, true, footer );
unsafe().sendPacket( new PlayerListHeaderFooter(
ComponentSerializer.toString( header ),

View File

@@ -7,10 +7,12 @@ import java.util.regex.Pattern;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.ScoreComponent;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.score.Score;
import net.md_5.bungee.protocol.ProtocolConstants;
/**
* This class transforms chat components by attempting to replace transformable
@@ -32,6 +34,32 @@ public final class ChatComponentTransformer
*/
private static final Pattern SELECTOR_PATTERN = Pattern.compile( "^@([pares])(?:\\[([^ ]*)\\])?$" );
public BaseComponent[] legacyHoverTransform(ProxiedPlayer player, BaseComponent... components)
{
if ( player.getPendingConnection().getVersion() < ProtocolConstants.MINECRAFT_1_16 )
{
for ( int i = 0; i < components.length; i++ )
{
BaseComponent next = components[i];
if ( next.getHoverEvent().isLegacy() )
{
continue;
}
next = next.duplicate();
next.getHoverEvent().setLegacy( true );
if ( next.getHoverEvent().getContents().size() > 1 )
{
HoverEvent.Content exception = next.getHoverEvent().getContents().get( 0 );
next.getHoverEvent().getContents().clear();
next.getHoverEvent().getContents().add( exception );
}
components[i] = next;
}
}
return components;
}
public static ChatComponentTransformer getInstance()
{
return INSTANCE;
@@ -44,14 +72,33 @@ public final class ChatComponentTransformer
* {@link BaseComponent#getExtra()}).
*
* @param player player
* @param component the component to transform
* @param components 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, BaseComponent... component)
public BaseComponent[] transform(ProxiedPlayer player, BaseComponent... components)
{
if ( component == null || component.length < 1 || ( component.length == 1 && component[0] == null ) )
return transform( player, false, components );
}
/**
* Transform a set of components, and attempt to transform the transformable
* fields. Entity selectors <b>cannot</b> be evaluated. This will
* recursively search for all extra components (see
* {@link BaseComponent#getExtra()}).
*
* @param player player
* @param transformHover if the hover event should replace contents with
* value
* @param components 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)
{
if ( components == null || components.length < 1 || ( components.length == 1 && components[0] == null ) )
{
return new BaseComponent[]
{
@@ -59,7 +106,12 @@ public final class ChatComponentTransformer
};
}
for ( BaseComponent root : component )
if ( transformHover )
{
components = legacyHoverTransform( player, components );
}
for ( BaseComponent root : components )
{
if ( root.getExtra() != null && !root.getExtra().isEmpty() )
{
@@ -72,7 +124,7 @@ public final class ChatComponentTransformer
transformScoreComponent( player, (ScoreComponent) root );
}
}
return component;
return components;
}
/**