Adventure 4.3.0: Player list header/footer
This commit is contained in:
@@ -66,7 +66,9 @@ dependencies {
|
||||
|
||||
implementation 'it.unimi.dsi:fastutil:8.4.1'
|
||||
implementation 'net.kyori:event-method-asm:4.0.0-SNAPSHOT'
|
||||
implementation 'net.kyori:adventure-nbt:4.0.0-SNAPSHOT'
|
||||
|
||||
implementation(platform("net.kyori:adventure-bom:${adventureVersion}"))
|
||||
implementation("net.kyori:adventure-nbt")
|
||||
|
||||
implementation 'org.asynchttpclient:async-http-client:2.12.1'
|
||||
|
||||
|
@@ -45,6 +45,7 @@ import com.velocitypowered.proxy.protocol.StateRegistry;
|
||||
import com.velocitypowered.proxy.protocol.packet.Chat;
|
||||
import com.velocitypowered.proxy.protocol.packet.ClientSettings;
|
||||
import com.velocitypowered.proxy.protocol.packet.Disconnect;
|
||||
import com.velocitypowered.proxy.protocol.packet.HeaderAndFooter;
|
||||
import com.velocitypowered.proxy.protocol.packet.KeepAlive;
|
||||
import com.velocitypowered.proxy.protocol.packet.PluginMessage;
|
||||
import com.velocitypowered.proxy.protocol.packet.ResourcePackRequest;
|
||||
@@ -61,6 +62,7 @@ import java.net.InetSocketAddress;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
@@ -105,6 +107,8 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
|
||||
private @Nullable VelocityServerConnection connectionInFlight;
|
||||
private @Nullable PlayerSettings settings;
|
||||
private @Nullable ModInfo modInfo;
|
||||
private Component playerListHeader = Component.empty();
|
||||
private Component playerListFooter = Component.empty();
|
||||
private final VelocityTabList tabList;
|
||||
private final VelocityServer server;
|
||||
private ClientConnectionPhase connectionPhase;
|
||||
@@ -116,9 +120,9 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
|
||||
@Nullable InetSocketAddress virtualHost, boolean onlineMode) {
|
||||
this.server = server;
|
||||
if (connection.getProtocolVersion().compareTo(ProtocolVersion.MINECRAFT_1_8) >= 0) {
|
||||
this.tabList = new VelocityTabList(connection);
|
||||
this.tabList = new VelocityTabList(this);
|
||||
} else {
|
||||
this.tabList = new VelocityTabListLegacy(connection);
|
||||
this.tabList = new VelocityTabListLegacy(this);
|
||||
}
|
||||
this.profile = profile;
|
||||
this.connection = connection;
|
||||
@@ -301,6 +305,33 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component getPlayerListHeader() {
|
||||
return this.playerListHeader;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component getPlayerListFooter() {
|
||||
return this.playerListFooter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendPlayerListHeader(@NonNull final Component header) {
|
||||
this.sendPlayerListHeaderAndFooter(header, this.playerListFooter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendPlayerListFooter(@NonNull final Component footer) {
|
||||
this.sendPlayerListHeaderAndFooter(this.playerListHeader, footer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendPlayerListHeaderAndFooter(final Component header, final Component footer) {
|
||||
this.playerListHeader = Objects.requireNonNull(header, "header");
|
||||
this.playerListFooter = Objects.requireNonNull(footer, "footer");
|
||||
this.connection.write(HeaderAndFooter.create(header, footer, this.getProtocolVersion()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showTitle(net.kyori.adventure.title.@NonNull Title title) {
|
||||
GsonComponentSerializer serializer = ProtocolUtils.getJsonChatSerializer(this
|
||||
@@ -363,6 +394,7 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
|
||||
this.profile = profile.withProperties(Preconditions.checkNotNull(properties));
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public void setHeaderAndFooter(net.kyori.text.Component header, net.kyori.text.Component footer) {
|
||||
tabList.setHeaderAndFooter(header, footer);
|
||||
|
@@ -8,6 +8,7 @@ import com.velocitypowered.proxy.connection.MinecraftSessionHandler;
|
||||
import com.velocitypowered.proxy.protocol.MinecraftPacket;
|
||||
import com.velocitypowered.proxy.protocol.ProtocolUtils;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||
|
||||
public class HeaderAndFooter implements MinecraftPacket {
|
||||
@@ -51,15 +52,8 @@ public class HeaderAndFooter implements MinecraftPacket {
|
||||
return handler.handle(this);
|
||||
}
|
||||
|
||||
public static HeaderAndFooter create(net.kyori.text.Component header,
|
||||
net.kyori.text.Component footer) {
|
||||
return new HeaderAndFooter(
|
||||
net.kyori.text.serializer.gson.GsonComponentSerializer.INSTANCE.serialize(header),
|
||||
net.kyori.text.serializer.gson.GsonComponentSerializer.INSTANCE.serialize(footer));
|
||||
}
|
||||
|
||||
public static HeaderAndFooter create(net.kyori.adventure.text.Component header,
|
||||
net.kyori.adventure.text.Component footer, ProtocolVersion protocolVersion) {
|
||||
public static HeaderAndFooter create(Component header,
|
||||
Component footer, ProtocolVersion protocolVersion) {
|
||||
GsonComponentSerializer serializer = ProtocolUtils.getJsonChatSerializer(protocolVersion);
|
||||
return new HeaderAndFooter(serializer.serialize(header), serializer.serialize(footer));
|
||||
}
|
||||
|
@@ -5,6 +5,7 @@ import com.velocitypowered.api.proxy.player.TabList;
|
||||
import com.velocitypowered.api.proxy.player.TabListEntry;
|
||||
import com.velocitypowered.api.util.GameProfile;
|
||||
import com.velocitypowered.proxy.connection.MinecraftConnection;
|
||||
import com.velocitypowered.proxy.connection.client.ConnectedPlayer;
|
||||
import com.velocitypowered.proxy.protocol.packet.HeaderAndFooter;
|
||||
import com.velocitypowered.proxy.protocol.packet.PlayerListItem;
|
||||
import java.util.ArrayList;
|
||||
@@ -15,31 +16,39 @@ import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import net.kyori.text.Component;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.serializer.legacytext3.LegacyText3ComponentSerializer;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
public class VelocityTabList implements TabList {
|
||||
|
||||
protected final ConnectedPlayer player;
|
||||
protected final MinecraftConnection connection;
|
||||
protected final Map<UUID, VelocityTabListEntry> entries = new ConcurrentHashMap<>();
|
||||
|
||||
public VelocityTabList(MinecraftConnection connection) {
|
||||
this.connection = connection;
|
||||
public VelocityTabList(final ConnectedPlayer player) {
|
||||
this.player = player;
|
||||
this.connection = player.getConnection();
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public void setHeaderAndFooter(net.kyori.text.Component header,
|
||||
net.kyori.text.Component footer) {
|
||||
Preconditions.checkNotNull(header, "header");
|
||||
Preconditions.checkNotNull(footer, "footer");
|
||||
this.player.sendPlayerListHeaderAndFooter(
|
||||
LegacyText3ComponentSerializer.get().deserialize(header),
|
||||
LegacyText3ComponentSerializer.get().deserialize(footer)
|
||||
);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public void setHeaderAndFooter(Component header, Component footer) {
|
||||
Preconditions.checkNotNull(header, "header");
|
||||
Preconditions.checkNotNull(footer, "footer");
|
||||
connection.write(HeaderAndFooter.create(header, footer));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setHeaderAndFooter(net.kyori.adventure.text.Component header,
|
||||
net.kyori.adventure.text.Component footer) {
|
||||
Preconditions.checkNotNull(header, "header");
|
||||
Preconditions.checkNotNull(footer, "footer");
|
||||
connection.write(HeaderAndFooter.create(header, footer, connection.getProtocolVersion()));
|
||||
this.player.sendPlayerListHeaderAndFooter(header, footer);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -3,7 +3,7 @@ package com.velocitypowered.proxy.tablist;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.velocitypowered.api.proxy.player.TabListEntry;
|
||||
import com.velocitypowered.api.util.GameProfile;
|
||||
import com.velocitypowered.proxy.connection.MinecraftConnection;
|
||||
import com.velocitypowered.proxy.connection.client.ConnectedPlayer;
|
||||
import com.velocitypowered.proxy.protocol.packet.PlayerListItem;
|
||||
import com.velocitypowered.proxy.protocol.packet.PlayerListItem.Item;
|
||||
import java.util.Collections;
|
||||
@@ -18,14 +18,16 @@ public class VelocityTabListLegacy extends VelocityTabList {
|
||||
|
||||
private final Map<String, UUID> nameMapping = new ConcurrentHashMap<>();
|
||||
|
||||
public VelocityTabListLegacy(MinecraftConnection connection) {
|
||||
super(connection);
|
||||
public VelocityTabListLegacy(final ConnectedPlayer player) {
|
||||
super(player);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public void setHeaderAndFooter(net.kyori.text.Component header, net.kyori.text.Component footer) {
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public void setHeaderAndFooter(Component header, Component footer) {
|
||||
}
|
||||
|
Reference in New Issue
Block a user