离线玩家数据
即使玩家离线,插件也可能需要访问玩家的数据。 你可能认为 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
使得你的插件可以使用它。