#2866: Add support for contents in Hover Event
This commit is contained in:
@@ -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)
|
||||
|
@@ -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 ),
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user