lishid / OpenInv

Open anyone's inventory as a chest, real-time!
GNU General Public License v3.0
119 stars 94 forks source link

API for offline players doesn't work #77

Closed NotJustPizza closed 7 years ago

NotJustPizza commented 7 years ago

I'm trying to get inventory of online and offline players using OpenInv API, but it only works for online players. When I'm trying to get inventory of offline player I'm getting null :/

(getting openinv instance in main plugin class)

 openinv = (OpenInv) getServer().getPluginManager().getPlugin("OpenInv");

{trying to get player inv by uuid)

UUID uuid = UUID.fromString(uuid_string);
Player player = Bukkit.getOfflinePlayer(uuid).getPlayer();

ISpecialPlayerInventory openinv_inv = openinv.getSpecialInventory(player, player.isOnline()); //null point exeption
Inventory inv = openinv_inv.getBukkitInventory();

Note: opeinv.getInventory() also works only for online players

(probably not related, because this code works for online players, but I'm executing it as async task)

Bukkit.getScheduler().runTaskAsynchronously(this, new Runnable() {
    @Override
    public void run() {
        //code
    }
});
Jikoo commented 7 years ago

Well, yeah, you're using OfflinePlayer#getPlayer to obtain your Player object. That returns null for offline players.

Player player = openInv.loadPlayer(Bukkit.getOfflinePlayer(uuid));

If you want to support name input as well:

Player player = openInv.loadPlayer(openInv.matchPlayer(uuidString));
Jikoo commented 7 years ago

I also strongly recommend you only load the player async, then manipulate the inventory on the main thread. You're opening yourself to concurrency issues otherwise.

NotJustPizza commented 7 years ago

Thank you, but I don't want to manipulate inventories for now, only read them :)