離線玩家資料
即使玩家离线,插件也可能需要访问玩家的数据。 你可能认为 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()
方法来获取在线的玩家实体。