离线玩家数据

即使玩家离线,插件也可能需要访问玩家的数据。 你可能认为 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<UserStorageService> userStorage = Sponge.getServiceManager().provide(UserStorageService.class);
    return userStorage.get().get(uuid);
}

这段代码将从 ServiceManager 取得 UserStorageService 对象,然后从中获取 User 对象。

注解

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

注解

此方案不会返回 Player 实例。这样可以安全地存储返回的 User 对象,但您需要使用 User.getPlayer() 方法来获取在线的玩家实体。