Таблисты

Предупреждение

Эти документы были написаны для SpongeAPI 7 и, вероятно, устаревшие. Если вы чувствуете, что вы можете помочь обновить их, пожалуйста, отправьте PR!

Tab lists are used in Minecraft to display the list of players currently on a server. SpongeAPI allows for manipulation of the tab list on a per-player basis.

Чтобы получить 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, мы можем изменить несколько его компонентов. Например, чтобы установить заголовок или нижний колонтитул таблицы 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);

Now let’s break this down. We set the list associated with the TabListEntry to our specified TabList using the TabListEntry.Builder#list(TabList) method. We then set the game mode of our entry to GameModes#SURVIVAL. The game mode of our entry is used to determine various things. On the client, it is used to determine if a player is in creative or perhaps a spectator. If the game mode is spectator, then their name will also appear gray and italicized. We then need to specify the GameProfile that the entry is associated with. The GameProfile may be constructed using the GameProfile#of() method, or it can be obtained from a real profile, such as a player. For more information, see the Игровой менеджер профилей article. To apply the entry to the tab list, we simply need to call the TabList#addEntry(TabListEntry) method.

Мы можем конкретизировать наш базовый пример, указав такие вещи, как отображаемое имя или латентность записи:

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). Этот метод вернет Optional.empty(), если указанный UUID не может быть найден. Пример показан ниже:

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);

As an alternative to getting entries, we can also remove a specified entry. We must simply call the TabList#removeEntry(UUID) method, specifying the UUID of the entry that we wish to remove. As with getEntry(UUID), this will return Optional.empty() if the specified UUID cannot be found.

Если у нас нет определенной записи для изменения, мы можем перебирать все TabListEntry в TabList. Нам просто нужно вызвать метод TabList#getEntries(), чтобы получить Collection<TabListEntry> для выполнения итерации.