离线玩家数据

即使玩家离线,插件也可能需要访问玩家的数据。 你可能认为 Sponge.getServer().getPlayer() 返回的 Player 可以解决这个问题。但事实并非如此。由于 Player 仅仅代表一个在线的玩家,因此我们需要寻求另外的解决方案。

一些插件自己存储相关数据,并通过使用 GameProfileManager 来关联用户。但是实际上,我们不必为离线和在线用户编写不同的代码。 ServiceManager 本身提供一个名为 UserStorageService 的服务,它能够在 Player 离线时返回 User 的实例。因为 Player 接口继承了 User ,所以大多数调用 Player 的方法都可以使用。

例如:

  • 两个接口都支持 #hasPermission(String permission) 方法。

代码示例

这里是一个可以用于获取 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);
}

首先,我们检查一个 Player 实例是否存在,这意味着用户是否在线。如果是,则返回该对象,否则从 ServiceManager 获取 UserStorageService ,然后从那里获取到一个 User

注解

UserStorageService 只能返回之前曾经进入过服务器的 User

小技巧

这一解决方案可以用于动态地获取在线和离线的 User 使得你的插件可以使用它。