diff --git a/src/main/java/com/lishid/openinv/commands/OpenEnderPluginCommand.java b/src/main/java/com/lishid/openinv/commands/OpenEnderPluginCommand.java index 364c3dd..c7cfdaf 100644 --- a/src/main/java/com/lishid/openinv/commands/OpenEnderPluginCommand.java +++ b/src/main/java/com/lishid/openinv/commands/OpenEnderPluginCommand.java @@ -18,6 +18,7 @@ package com.lishid.openinv.commands; import java.util.HashMap; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -54,7 +55,6 @@ public class OpenEnderPluginCommand implements CommandExecutor { } Player player = (Player) sender; - boolean offline = false; // History management String history = openEnderHistory.get(player); @@ -64,10 +64,7 @@ public class OpenEnderPluginCommand implements CommandExecutor { openEnderHistory.put(player, history); } - // Target selecting - Player target; - - String name = ""; + final String name; // Read from history if target is not named if (args.length < 1) { @@ -83,36 +80,60 @@ public class OpenEnderPluginCommand implements CommandExecutor { name = args[0]; } - target = this.plugin.getServer().getPlayer(name); - + final String playername = player.getName(); + Player target = plugin.getServer().getPlayer(name); + // Targeted player was not found online, start asynchron lookup in files if (target == null) { - // Try loading the player's data - target = OpenInv.playerLoader.loadPlayer(name); - - if (target == null) { - sender.sendMessage(ChatColor.RED + "Player " + name + " not found!"); - return true; - } + sender.sendMessage(ChatColor.GREEN + "Starting inventory lookup."); + plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { + @Override + public void run() { + // Try loading the player's data asynchronly + final Player target = OpenInv.playerLoader.loadPlayer(name); + // Back to synchron to send messages and display inventory + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + Player player = Bukkit.getPlayer(playername); + // If sender is no longer online after loading the target. Abort! + if (player == null) { + return; + } + openInventory(player, target); + } + }); + } + }); + } else { + openInventory(player, target); } - if (target != sender && !OpenInv.hasPermission(sender, Permissions.PERM_ENDERCHEST_ALL)) { - sender.sendMessage(ChatColor.RED + "You do not have permission to access other player's enderchest"); - return true; + return true; + } + + private void openInventory(Player player, Player target) { + if (target == null) { + player.sendMessage(ChatColor.RED + "Player not found!"); + return; + } + + if (target != player && !OpenInv.hasPermission(player, Permissions.PERM_ENDERCHEST_ALL)) { + player.sendMessage(ChatColor.RED + "You do not have permission to access other player's enderchest"); + return; } // Record the target - history = target.getName(); - openEnderHistory.put(player, history); + openEnderHistory.put(player, target.getName()); // Create the inventory ISpecialEnderChest chest = OpenInv.enderChests.get(target.getName().toLowerCase()); if (chest == null) { - chest = InternalAccessor.Instance.newSpecialEnderChest(target, !offline); + chest = InternalAccessor.Instance.newSpecialEnderChest(target, target.isOnline()); } // Open the inventory player.openInventory(chest.getBukkitInventory()); - return true; + return; } } diff --git a/src/main/java/com/lishid/openinv/commands/OpenInvPluginCommand.java b/src/main/java/com/lishid/openinv/commands/OpenInvPluginCommand.java index 678febc..8491b9a 100644 --- a/src/main/java/com/lishid/openinv/commands/OpenInvPluginCommand.java +++ b/src/main/java/com/lishid/openinv/commands/OpenInvPluginCommand.java @@ -18,6 +18,7 @@ package com.lishid.openinv.commands; import java.util.HashMap; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -53,7 +54,6 @@ public class OpenInvPluginCommand implements CommandExecutor { } Player player = (Player) sender; - boolean offline = false; // History management String history = openInvHistory.get(player); @@ -63,62 +63,81 @@ public class OpenInvPluginCommand implements CommandExecutor { openInvHistory.put(player, history); } - // Target selecting - Player target; - - String name = ""; + final String name; // Read from history if target is not named if (args.length < 1) { name = history; - } - else { + } else { name = args[0]; } - target = this.plugin.getServer().getPlayer(name); - + final String playername = player.getName(); + Player target = plugin.getServer().getPlayer(name); + // Targeted player was not found online, start asynchron lookup in files if (target == null) { - // Try loading the player's data - target = OpenInv.playerLoader.loadPlayer(name); + sender.sendMessage(ChatColor.GREEN + "Starting inventory lookup."); + plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { + @Override + public void run() { + // Try loading the player's data asynchronly + final Player target = OpenInv.playerLoader.loadPlayer(name); + // Back to synchron to send messages and display inventory + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + Player player = Bukkit.getPlayer(playername); + // If sender is no longer online after loading the target. Abort! + if (player == null) { + return; + } + openInventory(player, target); + } + }); + } + }); + } else { + openInventory(player, target); + } + return true; + } - if (target == null) { - sender.sendMessage(ChatColor.RED + "Player " + name + " not found!"); - return true; - } + private void openInventory(Player player, Player target) { + if (target == null) { + player.sendMessage(ChatColor.RED + "Player not found!"); + return; } // Permissions checks if (!OpenInv.hasPermission(player, Permissions.PERM_OVERRIDE) && OpenInv.hasPermission(target, Permissions.PERM_EXEMPT)) { - sender.sendMessage(ChatColor.RED + target.getDisplayName() + "'s inventory is protected!"); - return true; + player.sendMessage(ChatColor.RED + target.getDisplayName() + "'s inventory is protected!"); + return; } // Crosswork check if ((!OpenInv.hasPermission(player, Permissions.PERM_CROSSWORLD) && !OpenInv.hasPermission(player, Permissions.PERM_OVERRIDE)) && target.getWorld() != player.getWorld()) { - sender.sendMessage(ChatColor.RED + target.getDisplayName() + " is not in your world!"); - return true; + player.sendMessage(ChatColor.RED + target.getDisplayName() + " is not in your world!"); + return; } // Self-open check if (!OpenInv.hasPermission(player, Permissions.PERM_OPENSELF) && target.equals(player)) { - sender.sendMessage(ChatColor.RED + "You're not allowed to openinv yourself."); - return true; + player.sendMessage(ChatColor.RED + "You're not allowed to openinv yourself."); + return; } // Record the target - history = target.getName(); - openInvHistory.put(player, history); + openInvHistory.put(player, target.getName()); // Create the inventory ISpecialPlayerInventory inv = OpenInv.inventories.get(target.getName().toLowerCase()); if (inv == null) { - inv = InternalAccessor.Instance.newSpecialPlayerInventory(target, !offline); + inv = InternalAccessor.Instance.newSpecialPlayerInventory(target, target.isOnline()); } // Open the inventory player.openInventory(inv.getBukkitInventory()); - return true; + return; } }