Tab 清單

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

若要得到一个玩家的 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 org.spongepowered.api.text.Text;
import org.spongepowered.api.text.format.TextColors;

tablist.setHeader(Text.of(TextColors.GOLD, "The tab list header"));
tablist.setFooter(Text.of(TextColors.RED, "The tab list footer"));

如果我们想要同时改变它们俩,我们可以调用 TabList#setHeaderAndFooter(Text, Text) 方法:

tablist.setHeaderAndFooter(Text.of("header"), Text.of("footer"));

備註

如果你想要自定义页眉和页脚,我们十分建议你直接调用 setHeaderAndFooter() 方法而不是分开调用 TabList#setHeader(Text)TabList#setFooter(Text) 方法。因为后者需要发送两个数据包,而前者只需要发送一个。

玩家列表条目

现在我们已经设置了玩家列表的页眉和页脚,我们还可以为 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(Text.of("Spongie"))
    .latency(0)
    .profile(gameProfile)
    .build();
tablist.addEntry(entry);

在这里,我们使用 TabListEntry.Builder#displayName(Text) 方法设置我们的玩家列表条目的显示名称为 Spongie 。然后我们将我们的 TabListEntry 的延迟设置为五个条(Bar)。参阅 TabListEntry#setLatency(int) 方法以获取指定其他类型的条的更多信息。

修改当前玩家列表条目

通过使用 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(Text.of("Pretender Spongie"));
entry.setLatency(1000);
entry.setGameMode(GameModes.SPECTATOR);

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

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