Administrador de Perfiles del Juego

Un :javadoc:`GameProfile`representa el perfil de un jugador, incluyendo datos tales como un nombre, ``UUID`` y otros datos arbitrarios conocidos como propiedades. SpongeAPI proporciona la clase GameProfileManager para obtener, crear y rellenar GameProfiles. Puede obtener una instancia del GameProfileManager utilizando el siguiente código.

import org.spongepowered.api.Sponge;
import org.spongepowered.api.profile.GameProfileManager;

GameProfileManager profileManager = Sponge.getServer().getGameProfileManager();

Recuperar GameProfiles

Es importante notar que Sponge mantiene un caché de GameProfiles para ser utilizado como un sustituto para realizar una solicitud para la Mojang API cada vez que un GameProfile es solicitado. Los métodos para recuperar GameProfiles ofrecen un segundo argumento boolean determinando si se utilizará el caché. Por defecto, el caché será utilizado cuando sea posible.

Un GameProfile puede ser buscado utilizando ya sea un UUID o un nombre de usuario. Tenga en cuenta que el mismo perfil siempre será devuelto cuando se busque por UUID, pero por los nombre de usuarios puede cambiar, esto no necesariamente puede ser el caso cuando busca por nombre de usuario.

Recuperar por nombre de usuario

import org.spongepowered.api.profile.GameProfile;

import java.util.concurrent.CompletableFuture;

CompletableFuture<GameProfile> futureGameProfile = profileManager.get("Notch");

Recuperar por UUID

import java.util.UUID;

CompletableFuture<GameProfile> futureGameProfile =
    profileManager.get(UUID.fromString("069a79f4-44e9-4726-a5be-fca90e38aaf5"));

Truco

Puede también recuperar muchos GameProfiles a la vez, utilizando GameProfileManager#getAllById(Iterable<UUID>, boolean) o GameProfileManager#getAllByName(Iterable<String>, boolean). Ambos métodos devuelven CompletableFuture<Collection<GameProfile>>.

Tenga en cuenta que cada uno de estos métodos devuelve algún tipo tipo de CompletableFuture. Esto indica que el GameProfile (o Collection<GameProfile>) puede no estar disponible inmediatamente a causa de las solicitudes pendientes a la Mojang API. Los Javadocs para CompletableFuture describen todas las capacidades de la clase, pero nos enfocaremos en el método get para el propósito de este artículo.

Para proporcionar un GameProfile de un CompletableFuture<GameProfile, puede simplemente llamar al método CompletableFuture#get.

GameProfile gameProfile = futureGameProfile.get();

Advertencia

Si el GameProfile no está disponible inmediatamente (por ejemplo si el caché no está siendo utilizado o no contiene el GameProfile), entonces get esperará a que se completa el futuro. Por esta razón, no es recomendable utilizar esto en el hilo principal ya que detendrá el servidor. Alternativamente, puede utilizar el método CompletableFuture#thenAccept(Consumer<? super T>) para especificar un Consumidor que se ejecutará al finalizar.

Creación de GameProfiles

Puede generar un nuevo GameProfile utilizando GameProfile using GameProfile#of(UUID, String). Tenga en cuenta que el nombre de usuario no necesita necesariamente corresponder con el UUID de es jugador. Además, el UUID no necesita pertenecer a un jugador válido.

GameProfile gameProfile = GameProfile.of(
        UUID.fromString("00000000-0000-0000-0000-000000000000"),
        "Herobrine");

Nota

No es obligatorio especificar el nombre del GameProfile (nulo es un argumento válido).

Llenar GameProfiles

Llenar un GameProfile completa el perfil obteniendo información como la máscara del jugador de la Mojang API. Tenga en cuenta que si datos falsos, como el nombre de usuario, están asociados con un cierto UUID, serán remplazados por los datos reales de la Mojang API.

GameProfile filledProfile = profileManager.fill(gameProfile).get();

ProfileProperties

GameProfiles pueden ser utilizados para almacenar datos arbitrarios sobre un jugador usando ProfilePropertys. Sin embargo, esto no puede ser utilizado como un almacén permanente de datos, ya que los datos no persisten a través de los reinicios del servidor. Podemos recuperar las propiedades de un GameProfile utilizando el método GameProfile#getPropertyMap(), que devuelve un Multimap. Desde allí, puede recuperar ProfilePropertys existentes o almacenados, que son representados como un par de valores clave. Para generar un nuevo ProfileProperty, simplemente llame el método ProfileProperty#of(String, String). El tercer argumento (firma) es opcional. Sin embargo, una firma válida de Mojang debe ser especificada para ciertas propiedades.

import org.spongepowered.api.profile.property.ProfileProperty;

import java.util.Collection;

profile.getPropertyMap().put(
    "key", ProfileProperty.of("foo", "bar", null));
Collection<ProfileProperty> customProperties = profile.getPropertyMap().get("key");

GameProfileCache

Puede también acceder directamente al GameProfileCache utilizado por Sponge para almacenar GameProfiles. Para hacerlo, simplemente llame al método GameProfileManager#getCache(). Utilizando el GameProfileCache, puede buscar GameProfiles, agregar GameProfiles recién construidos, y llenar perfiles con los datos almacenados en el caché.

import org.spongepowered.api.profile.GameProfileCache;

GameProfile fakeProfile =
    GameProfile.of(UUID.fromString("00000000-0000-0000-0000-000000000000"),
    "Herobrine");
GameProfileCache cache = profileManager.getCache();
cache.add(profile);

Truco

GameProfileCache#add(GameProfile) también acepta un segundo argumento boolean determinando si existen entradas de caché que deben ser sobrescritas y un tercer argumento Plazo que establece el vencimiento del GameProfile.

Si alguna vez decide que necesita eliminar un GameProfile del caché, puede llamar a GameProfileCache#remove(GameProfile). Si necesita eliminar todos los GameProfiles del caché, puede llamar a GameProfileCache#clear().

El GameProfileCache puede ser configurado también mediante complementos con el método GameProfileManager#setCache(GameProfileCache). Para recuperar el caché original, utilice el mismo método, pasando el resultado de GameProfileManager#getDefaultCache().