玩家列表
玩家列表是 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) 方法把我们的 TabList
和 TabListEntry 关联了起来。然后我们设置其游戏模式为 GameModes#SURVIVAL 。这一设置将决定各种事物。在客户端,它用于确定玩家是创造模式还是可能是旁观者模式。如果其为旁观者模式,那么对应的名字将显示为灰色和斜体。然后我们需要设置相关联的 GameProfile
。 GameProfile
可以通过 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>
就可以遍历了。