玩家列表

警告

这些文档是为 SpongeAPI 7 编写的,可能已经过时。 如果你觉得你可以帮助更新它们,请提交一个 PR!

玩家列表是 Minecraft 中按下 Tab 显示的当前服务器上所有在线玩家的小窗口。SpongeAPI 允许分别对每个玩家进行玩家列表的操作。

若要得到一个玩家的 TabList ,你只需要调用 Player#getTabList() 方法:

import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.entity.living.player.tab.TabList;

TabList tablist = player.getTabList();

现在我们已经获取到了一个 TabList ,我们可以修改它的几个组成部分。例如,如果我们想要设置其页眉或页脚,我们只需要调用相应的方法:

import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;

tablist.setHeader(Component.text("The tab list header", NamedTextColor.GOLD));
tablist.setFooter(Component.text("The tab list footer", NamedTextColor.RED));

We can call the TabList#setHeaderAndFooter(Component, Component) method if we want to alter both of them at once:

tablist.setHeaderAndFooter(Component.text("header"), Component.text("footer"));

备注

If you are wanting to alter the tab list header and footer, it is recommended to use the setHeaderAndFooter() method over individually calling the TabList#setHeader(Component) and TabList#setFooter(Component) methods, as it only sends one packet instead of two separate packets for the header and the footer.

玩家列表条目

现在我们已经设置了玩家列表的页眉和页脚,我们还可以为 TabList 添加我们自己的条目。下面是一个示例:

import org.spongepowered.api.entity.living.player.gamemode.GameModes;
import org.spongepowered.api.entity.living.player.tab.TabListEntry;
import org.spongepowered.api.profile.GameProfile;

TabListEntry entry = TabListEntry.builder()
    .list(tablist)
    .gameMode(GameModes.SURVIVAL)
    .profile(gameProfile)
    .build();
tablist.addEntry(entry);

现在让我们分析一下。我们通过调用 TabListEntry.Builder#list(TabList) 方法把我们的 TabListTabListEntry 关联了起来。然后我们设置其游戏模式为 GameModes#SURVIVAL 。这一设置将决定各种事物。在客户端,它用于确定玩家是创造模式还是可能是旁观者模式。如果其为旁观者模式,那么对应的名字将显示为灰色和斜体。然后我们需要设置相关联的 GameProfileGameProfile 可以通过 GameProfile#of() 方法生成,当然你也可以获取一个真实的 GameProfile ,比如玩家。更多的信息可以参见 玩家资料管理器 。然后如果我们想要把该玩家列表条目应用于玩家列表,我们只需要调用 TabList#addEntry(TabListEntry) 方法。

我们可以通过指定诸如显示名称或玩家列表条目的延迟(Latency)之类的东西来填充我们的基本示例:

TabListEntry entry = TabListEntry.builder()
    .list(tablist)
    .displayName(Component.text("Spongie"))
    .latency(0)
    .profile(gameProfile)
    .build();
tablist.addEntry(entry);

Here, we set the display name that our entry will appear under to Spongie using the TabListEntry.Builder#displayName(Component) method. We then set the latency for our TabListEntry to five bars. See the TabListEntry#setLatency(int) method for more information on how to specify other types of bars for our entry.

修改当前玩家列表条目

通过使用 TabList ,我们可以获取并修改 TabList 中已经存在的玩家列表条目。若要获取特定条目,可以使用 TabList#getEntry(UUID) 方法。如果找不到指定的 UUID 的话,该方法将返回 Optional.empty() 。下面是一个示例:

import java.util.Optional;

Optional<TabListEntry> optional = tablist.getEntry(uuid);
if (optional.isPresent()) {
    TabListEntry entry = optional.get();
}

有了这个,我们可以使用 TabListEntry 的若干方法来修改游戏模式,延迟和显示名称:

entry.setDisplayName(Component.text("Pretender Spongie"));
entry.setLatency(1000);
entry.setGameMode(GameModes.SPECTATOR);

和获取条目相对应,我们还可以删除指定的条目。方法 TabList#removeEntry(UUID) 就是用于根据指定的 UUID 删除的。与 getEntry(UUID) 方法类似,如果找不到指定的 UUID 的话,将返回 Optional.empty()

如果我们没有一个特定的玩家列表条目,我们可以遍历 TabList 中所有的 TabListEntry 。我们只需要调用 TabList#getEntries() 方法以获取一个 Collection<TabListEntry> 就可以遍历了。