package me.asofold.bpl.simplyvanish.inventories;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import me.asofold.bpl.simplyvanish.SimplyVanish;
import me.asofold.bpl.simplyvanish.config.Settings;
import me.asofold.bpl.simplyvanish.config.VanishConfig;
import me.asofold.bpl.simplyvanish.util.Utils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
public class InventoryUtil {
/**
* Show inventory based on settings.
* @param viewer
* @param settings
*/
public static void showInventory(final CommandSender viewer, final VanishConfig cfg, final String playerName, final Settings settings){
if (settings.allowRealPeek && viewer instanceof Player && SimplyVanish.hasPermission(viewer, "simplyvanish.inventories.peek.real")){
final Player player = (Player) viewer;
Bukkit.getScheduler().scheduleSyncDelayedTask(SimplyVanish.getPluginInstance(), new Runnable() {
@Override
public void run() {
final Player other = Bukkit.getPlayerExact(playerName);
if (other == null){
Utils.send(viewer, SimplyVanish.msgLabel + ChatColor.RED + "Not available: " +playerName);
return;
}
if (player.getOpenInventory() != null) player.closeInventory();
final Inventory inv = other.getInventory();
prepareInventoryOpen(player, inv, cfg); // TODO
// TODO: trigger OpenInv if modifiable !
player.openInventory(inv);
}
});
}
else{
final Player other = Bukkit.getPlayerExact(playerName);
if (other == null){
Utils.send(viewer, SimplyVanish.msgLabel + ChatColor.RED + "Not available: " +playerName);
return;
}
List<ItemStack> items = new LinkedList<ItemStack>();
for (ItemStack stack : other.getInventory().getContents()){
if (stack != null) items.add(stack);
}
StringBuilder b = new StringBuilder();
b.append("Inventory(" + other.getName() + "): ");
addItemDescr(items, b);
viewer.sendMessage(b.toString());
}
}
/**
* Set the preventInventoryAction flag according to permissions.
* @param player
* @param inventory
* @param cfg
*/
public static void prepareInventoryOpen(Player player, Inventory inventory, VanishConfig cfg) {
if (SimplyVanish.hasPermission(player, "simplyvanish.inventories.manipulate")) cfg.preventInventoryAction = false;
else if (inventory == player.getInventory()) cfg.preventInventoryAction = false;
else cfg.preventInventoryAction = true;
}
/**
* Get String with sorted item descriptions.
* @param items
* @return
*/
public static String getItemDescr(Collection<ItemStack> items){
StringBuilder builder = new StringBuilder();
addItemDescr(items, builder);
return builder.toString();
}
/**
* Add verbalized and sorted item descriptions.
* @param items
* @param builder
*/
public static void addItemDescr(Collection<ItemStack> items, StringBuilder builder) {
if (items.isEmpty()) return;
List<String> keys = new ArrayList<String>(items.size()); // will rather be shorter.
Map<String, Integer> dropList = new HashMap<String, Integer>();
for ( ItemStack stack:items){
if (stack == null) continue;
if (stack.getTypeId() == 0) continue;
int d ;
if ( stack.getType().isBlock()) d = stack.getData().getData();
else d = stack.getDurability();
String key;
key = getShortestItemName(stack.getTypeId(), d).toLowerCase();
Map<Enchantment, Integer> enchantments = stack.getEnchantments();
if ( enchantments != null) {
if ( !enchantments.isEmpty()){
List<String> es = new ArrayList<String>(enchantments.size());
for ( Enchantment e : enchantments.keySet()){
es.add(e.getName()+"@"+enchantments.get(e));
}
Collections.sort(es);
key+="(";
for (String s : es){
key +=s+",";
}
key+=")";
}
}
Integer n = dropList.get(key);
if ( n != null) dropList.put(key, n+stack.getAmount());
else{
dropList.put(key, stack.getAmount());
keys.add(key);
}
}
Collections.sort(keys);
for ( String key : keys){
builder.append(key+" x"+dropList.get(key)+", ");
}
}
public static final String getShortestItemName(final int id, final int data) {
try{
final Material mat = Material.getMaterial(id);
if (mat == null){
if (data == 0) return "" + id;
else return "" + id + ":" + data;
}
if (data == 0) return mat.toString();
else return mat.toString() + ":" + data;
}
catch (Throwable t){
if (data == 0) return "" + id;
else return "" + id + ":" + data;
}
}
}