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