Dane gracza offline

Czasami pluginy potrzebują uzyskać dane gracza, nawet wtedy kiedy jest on offline (kiedy nie ma go obecnie w grze). Może Ci się wydawać że funkcja Sponge.getServer().getPlayer() zwracająca obiekt gracza, może zostać do tego wykorzystana. Lecz, z racji iż obiekt :javadoc: Player istnieje tylko w przypadku graczy online, trzeba użyć tu innego rozwiązania.

Niektóre pluginy same przechowują potrzebne im dane i dopasowują do nich użytkownika poprzez GameProfileManager. Pisanie innego kodu dla użytkownika offline i użytkownika online nie jest potrzebne. ServiceManager natywnie dostarcza serwis znany jako UserStorageService, który potrafi zwracać instancje użytkowników User przypisanych do graczy Player, którzy są obecnie offline. Ponieważ interfejs Player``poszerza interfejs ``User, to większość metod używanych na Player jest tu również dostępna.

Na przykład:

  • #hasPermission(String permission) jest dostępne z obu instancji.

Przykład Kodu

Oto przykład własnej funkcji, która może być użyta do otrzymania obiektu User:

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

Najpierw sprawdzamy czy instancja Player istnieje dla podanego UUID. Jeśli tak, oznacza to że użytkownik jest online (dostępny) i możemy śmiało zwrócić obiekt gracza. W przypadku jeżeli obiekt gracza nie istnieje, zdobywamy serwis UserStorageService od ServiceManager a następnie wydobywamy z niego obiekt użytkownika User.

Informacja

UserStorageService może zwracać obiekty User tylko tych użytkowników, którzy byli wcześniej podłączeni.

Wskazówka

To rozwiązanie może być użyte do otrzymania obiektu użytkownika User będącego online oraz offline, co czyni je dynamicznie użytecznym w Twoim pluginie.