Offline Player Data

It may be necessary for plugins to access player data even when the player is offline. You might think that Sponge.getServer().getPlayer() returning a Player can be used for this. But since Player objects only exist for online players, another solution must be used.

Some plugins store the relevant data themselves and associate the user by using the GameProfileManager. But writing different code for offline and online users is not necessary. The ServiceManager natively provides a service known as the UserStorageService which is capable of returning User instances for Players who are currently offline. Since the Player interface extends User most methods you call on a Player are also available.

For example:

  • #hasPermission(String permission) is available from both instances.

Code Example

Here’s an example for a utility method that can be used to get a 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<UserStorageService> userStorage = Sponge.getServiceManager().provide(UserStorageService.class);
    return userStorage.get().get(uuid);
}

This code will get the UserStorageService from the ServiceManager and then retrieve the User from there.

Bemerkung

The UserStorageService can only return Users who previously were connected.

Bemerkung

This solution will not return Player instances. This makes it safe to store the returned User objects, but you will need to use the User.getPlayer() method to retrieve the online entity.