Таблисты

Таблисты используются в Minecraft для отображения списка игроков, находящихся в настоящее время на сервере. 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, мы можем изменить несколько его компонентов. Например, чтобы установить заголовок или нижний колонтитул таблицы 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 на наш указанный TabList, используя метод TabListEntry.Builder#list(TabList). Затем мы установили игровой режим нашей записи GameModes#SURVIVAL. Игровой режим нашего входа используется для определения различных вещей. На клиенте оно используется для определения творческого режима или режима наблюдателя. Если режим игры наблюдатель, то их имя также будет выделено серым цветом и выделено курсивом. Затем мы должны указать GameProfile, с которым связана запись. GameProfile может быть сконструирован с использованием метода GameProfile#of(), или он может быть получен из реального профиля, такого как игрок. Для получения дополнительной информации см. статью Игровой менеджер профилей. Чтобы применить запись к таблисту, нам просто нужно вызвать метод TabList#addEntry(TabListEntry).

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

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

Здесь мы устанавливаем отображаемое имя, чтобы наша запись появлялась под Spongie, используя метод TabListEntry.Builder#displayName(Text). Затем мы устанавливаем задержку для нашего TabListEntry на пять баров. См. метод TabListEntry#setLatency(int) для получения дополнительной информации о том, как указать другие типы баров для нашей записи.

Изменение текущих записей

Используя 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(Text.of("Pretender Spongie"));
entry.setLatency(1000);
entry.setGameMode(GameModes.SPECTATOR);

Кроме получения записей, мы также можем удалить указанную запись. Мы должны просто вызвать метод TabList#removeEntry(UUID), указав UUID записи, которую мы хотим удалить. Как с getEntry(UUID), это вернет Optional.empty(), если указанный UUID не может быть найден.

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