diff --git a/src/com/lishid/openinv/commands/OpenEnderPluginCommand.java b/src/com/lishid/openinv/commands/OpenEnderPluginCommand.java index 364c3dd..92a29c4 100644 --- a/src/com/lishid/openinv/commands/OpenEnderPluginCommand.java +++ b/src/com/lishid/openinv/commands/OpenEnderPluginCommand.java @@ -17,12 +17,16 @@ package com.lishid.openinv.commands; import java.util.HashMap; +import java.util.UUID; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; import com.lishid.openinv.OpenInv; import com.lishid.openinv.Permissions; @@ -53,8 +57,7 @@ public class OpenEnderPluginCommand implements CommandExecutor { return true; } - Player player = (Player) sender; - boolean offline = false; + final Player player = (Player) sender; // History management String history = openEnderHistory.get(player); @@ -64,55 +67,74 @@ 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) { - if (history != null && history != "") { - name = history; - } - else { - sender.sendMessage(ChatColor.RED + "OpenEnder history is empty!"); - return true; - } + name = history; } else { name = args[0]; } - target = this.plugin.getServer().getPlayer(name); + sender.sendMessage(ChatColor.GREEN + "Starting inventory lookup."); + final UUID senderID = player.getUniqueId(); + new BukkitRunnable() { + @Override + public void run() { + final OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(name); + if (Bukkit.getPlayer(senderID) == null) { + return; + } + if (offlinePlayer == null || !offlinePlayer.hasPlayedBefore()) { + player.sendMessage(ChatColor.RED + "Player not found!"); + return; + } + new BukkitRunnable() { + @Override + public void run() { + if (Bukkit.getPlayer(senderID) == null) { + return; + } + openInventory(player, offlinePlayer.getUniqueId()); + } + }.runTask(plugin); + } + }.runTaskAsynchronously(plugin); + + return true; + } + + private void openInventory(Player player, UUID uuid) { + + Player target = this.plugin.getServer().getPlayer(uuid); if (target == null) { // Try loading the player's data - target = OpenInv.playerLoader.loadPlayer(name); + target = OpenInv.playerLoader.loadPlayer(uuid); if (target == null) { - sender.sendMessage(ChatColor.RED + "Player " + name + " not found!"); - return true; + player.sendMessage(ChatColor.RED + "Player not found!"); + return; } } - 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; + + 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; } } diff --git a/src/com/lishid/openinv/commands/OpenInvPluginCommand.java b/src/com/lishid/openinv/commands/OpenInvPluginCommand.java index 4457cde..71e7527 100644 --- a/src/com/lishid/openinv/commands/OpenInvPluginCommand.java +++ b/src/com/lishid/openinv/commands/OpenInvPluginCommand.java @@ -17,12 +17,16 @@ package com.lishid.openinv.commands; import java.util.HashMap; +import java.util.UUID; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; import com.lishid.openinv.OpenInv; import com.lishid.openinv.Permissions; @@ -52,8 +56,7 @@ public class OpenInvPluginCommand implements CommandExecutor { return true; } - Player player = (Player) sender; - boolean offline = false; + final Player player = (Player) sender; // History management String history = openInvHistory.get(player); @@ -63,10 +66,7 @@ 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) { @@ -76,51 +76,76 @@ public class OpenInvPluginCommand implements CommandExecutor { name = args[0]; } - target = this.plugin.getServer().getPlayer(name); + sender.sendMessage(ChatColor.GREEN + "Starting inventory lookup."); + final UUID senderID = player.getUniqueId(); + new BukkitRunnable() { + @Override + public void run() { + final OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(name); + if (Bukkit.getPlayer(senderID) == null) { + return; + } + if (offlinePlayer == null || !offlinePlayer.hasPlayedBefore()) { + player.sendMessage(ChatColor.RED + "Player not found!"); + return; + } + new BukkitRunnable() { + @Override + public void run() { + if (Bukkit.getPlayer(senderID) == null) { + return; + } + openInventory(player, offlinePlayer.getUniqueId()); + } + }.runTask(plugin); + } + }.runTaskAsynchronously(plugin); + + return true; + } + + private void openInventory(Player player, UUID uuid) { + + Player target = this.plugin.getServer().getPlayer(uuid); if (target == null) { - if (target == null) { - // Try loading the player's data - target = OpenInv.playerLoader.loadPlayer(name); + // Try loading the player's data + target = OpenInv.playerLoader.loadPlayer(uuid); - if (target == null) { - sender.sendMessage(ChatColor.RED + "Player " + name + " not found!"); - return true; - } + 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; } } diff --git a/src/com/lishid/openinv/internal/IPlayerDataManager.java b/src/com/lishid/openinv/internal/IPlayerDataManager.java index ce0ed2f..ec2af50 100644 --- a/src/com/lishid/openinv/internal/IPlayerDataManager.java +++ b/src/com/lishid/openinv/internal/IPlayerDataManager.java @@ -16,8 +16,11 @@ package com.lishid.openinv.internal; +import java.util.UUID; + import org.bukkit.entity.Player; public interface IPlayerDataManager { public Player loadPlayer(String name); + public Player loadPlayer(UUID uuid); } diff --git a/src/com/lishid/openinv/internal/v1_8_R1/PlayerDataManager.java b/src/com/lishid/openinv/internal/v1_8_R1/PlayerDataManager.java index 589af46..beb0fb9 100644 --- a/src/com/lishid/openinv/internal/v1_8_R1/PlayerDataManager.java +++ b/src/com/lishid/openinv/internal/v1_8_R1/PlayerDataManager.java @@ -101,4 +101,29 @@ public class PlayerDataManager implements IPlayerDataManager { return found; } + + /* (non-Javadoc) + * @see com.lishid.openinv.internal.IPlayerDataManager#loadPlayer(java.util.UUID) + */ + @Override + public Player loadPlayer(UUID uuid) { + OfflinePlayer player = Bukkit.getOfflinePlayer(uuid); + if (player == null || !player.hasPlayedBefore()) { + return null; + } + GameProfile profile = new GameProfile(uuid, player.getName()); + MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); + // Create an entity to load the player data + EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), profile, new PlayerInteractManager(server.getWorldServer(0))); + + // Get the bukkit entity + Player target = (entity == null) ? null : entity.getBukkitEntity(); + if (target != null) { + // Load data + target.loadData(); + // Return the entity + return target; + } + return null; + } } diff --git a/src/com/lishid/openinv/internal/v1_8_R1/SpecialPlayerInventory.java b/src/com/lishid/openinv/internal/v1_8_R1/SpecialPlayerInventory.java index c162c93..42ae052 100644 --- a/src/com/lishid/openinv/internal/v1_8_R1/SpecialPlayerInventory.java +++ b/src/com/lishid/openinv/internal/v1_8_R1/SpecialPlayerInventory.java @@ -82,7 +82,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP public ItemStack[] getContents() { ItemStack[] C = new ItemStack[getSize()]; System.arraycopy(items, 0, C, 0, items.length); - System.arraycopy(items, 0, C, items.length, armor.length); + System.arraycopy(armor, 0, C, items.length, armor.length); return C; } diff --git a/src/plugin.yml b/src/plugin.yml index 17f97a2..c6a2147 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: OpenInv main: com.lishid.openinv.OpenInv -version: 2.2.5 +version: 2.2.6 author: lishid description: > This plugin allows you to open a player's inventory as a chest and interact with it in real time.