Listas de Tabulaciones

Las listas de tabulaciones son utilizadas en Minecraft para mostrar la lista de jugadores actuales en un servidor. La SpongeAPI permite la manipulación de la lista de tabulaciones en una base por jugador.

Para obtener una TabList de jugador, simplemente necesita llamar al método Player#getTabList():

import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.entity.living.player.tab.TabList;

TabList tablist = player.getTabList();

Ahora que hemos obtenido la TabList, podemos modificar varios componentes de ella. Por ejemplo: para establecer el encabezado o pie de página de la TabList, simplemente necesitamos llamar sus métodos apropiados:

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

Podemos llamar el método TabList#setHeaderAndFooter(Text, Text) si queremos modificar ambos de una vez:

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

Nota

Si quiere modificar el encabezado y el pie de página de la lista de tabulación, es recomendable utilizar el método setHeaderAndFooter(), individualmente se puede llamar a los métodos TabList#setHeader(Text) y TabList#setFooter(Text), ya que solo envía un paquete en lugar de dos paquetes separados para el encabezado y el pie de página.

Entradas de la Lista de Tabulación

Ahora que hemos establecido el encabezado y el pie de página de la TabList, también podemos agregar nuestra propia entrada a la lista. Un ejemplo de esto se muestra a continuación:

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

Ahora desglosemos esto. Establecemos la lista asociada con la TabListEntry a nuestra TabList especificada utilizando el método TabListEntry.Builder#list(TabList). Luego establecemos el modo de juego de nuestra entrada para GameModes#SURVIVAL. El modo de juego de nuestra entrada es utilizado para determinar varias cosas. En el cliente, se utiliza para determinar si un jugador está en creativo o quizás en espectador. Si el modo de juego está en espectador, entonces su nombre también aparecerá en gris y en cursiva. Después necesitamos especificar el GameProfile con que la entrada es asociada. El GameProfile puede ser construido utilizando el método GameProfile#of() o puede ser obtenido desde un perfil real, como un jugador. Para más información, vea el artículo Administrador de Perfiles del Juego. Para aplicar la entrada a la lista de tabulación, simplemente necesitamos llamar al método TabList#addEntry(TabListEntry).

Podemos desarrollar nuestro ejemplo básico para cosas específicas como el nombre para mostrar o el estado latente de la entrada:

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

Aquí, establecemos el nombre para mostrar de nuestra entrada que aparecerá abajo de Spongie utilizando el método TabListEntry.Builder#displayName(Text). Luego, establecemos la latencia para nuestra TabListEntry para cinco barras. Vea el método TabListEntry#setLatency(int) para más información sobre como especificar otros tipos de barras para nuestra entrada.

Modificación de Entradas Actuales

Utilizando la TabList, podemos obtener actualmente entradas en la TabList para nuestra propia modificación. Para obtener una entrada específica, utilice el método TabList#getEntry(UUID). Este método devolverá Optional.empty() si el UUID especificado no puede ser encontrado. Un ejemplo se muestra a continuación:

import java.util.Optional;

Optional<TabListEntry> optional = tablist.getEntry(uuid);
if (optional.isPresent()) {
    TabListEntry entry = optional.get();
}

Con esto, podemos utilizar los métodos en TabListEntry para modificar el modo de juego, la latencia y el nombre para mostrar de la entrada:

entry.setDisplayName(Text.of("Pretender Spongie"));
entry.setLatency(1000);
entry.setGameMode(GameModes.SPECTATOR);

Alternativamente para obtener entradas, podemos también eliminar una entrada específica. Debemos simplemente llamar al método TabList#removeEntry(UUID), especificando el UUID de la entrada que deseamos eliminar. Al igual que con getEntry(UUID), esto devolverá Optional.empty() si el UUID especificado no puede ser encontrado.

Si no tenemos una entrada específica para modificar, entonces podemos iterar por medio de todas las TabListEntrys en una TabList. Solo necesitamos llamar al método TabList#getEntries() para obtener una Collection<TabListEntry> que podemos iterar.