Datos del Jugador Fuera de Línea

Puede ser necesario para los complementos acceder a los datos de jugador incluso cuando el jugador está fuera de línea. Podría pensar que Sponge.getServer().getPlayer() devuelve un :javadoc:`Jugador` que puede utilizarse para esto. Pero ya que los objetos Jugador solo existen para jugadores en línea, otra solución debe ser utilizada.

Algunos complementos almacenan los datos relevantes ellos mismos y los asocian al usuario utilizando GameProfileManager. Pero escribir diferentes códigos para usuarios en línea y fuera de línea no es necesario. El ServiceManager nativamente proporciona un servicio conocido como :javadoc:`UserStorageService`el cual es capaz de devolver instancias :javadoc:`Usuario` para Jugadors que estén fuera de línea actualmente. Ya que la interfaz de Jugador se extiende a Usuario la mayoría de los métodos a los que llama para un Jugador también están disponibles.

Por ejemplo:

  • #hasPermission(String permission) está disponible para ambas instancias.

Ejemplo de Código

Aquí está un ejemplo de un método útil que puede utilizarse para obtener un Usuario:

import java.util.Optional;
import java.util.UUID;

import org.spongepowered.api.Sponge;
import org.spongepowered.api.entity.living.player.User;
import org.spongepowered.api.service.user.UserStorageService;

public Optional<User> getUser(UUID uuid) {
    Optional<Player> onlinePlayer = Sponge.getServer().getPlayer(uuid);

    if (onlinePlayer.isPresent()) {
        return onlinePlayer;
    }

    Optional<UserStorageService> userStorage = Sponge.getServiceManager().provide(UserStorageService.class);

    return userStorage.get().get(uuid);
}

Primero verifique si una instancia de Jugador existe, lo que significa que el usuario está en línea. Si es así, el objeto es devuelto. Si no, obtenga el UserStorageService desde el ServiceManager y entonces recupere el Usuario desde ahí.

Nota

El UserStorageService solo puede obtener Usuarios que estuvieron conectados previamente.

Truco

Esta solución puede utilizarse para obtener Usuarios en línea y fuera de línea. lo que hace que pueda ser utilizable de forma dinámica dentro de su complemento.