/*******************************************************************************
* Copyright 2014 Tobias Welther
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package de.tobiyas.racesandclasses.util.items;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import static org.bukkit.Material.*;
public class ItemUtils {
public static class ItemQuality{
public static final ItemQuality None = new ItemQuality("none");
public static final ItemQuality Leather = new ItemQuality("leather", new Material[]{ LEATHER_BOOTS, LEATHER_LEGGINGS, LEATHER_CHESTPLATE, LEATHER_HELMET });
public static final ItemQuality Iron = new ItemQuality("iron", new Material[]{ IRON_BOOTS, IRON_LEGGINGS, IRON_CHESTPLATE, IRON_HELMET });
public static final ItemQuality Gold = new ItemQuality("gold", new Material[]{ GOLD_BOOTS, GOLD_LEGGINGS, GOLD_CHESTPLATE, GOLD_HELMET });
public static final ItemQuality Diamond = new ItemQuality("diamond", new Material[]{ DIAMOND_BOOTS, DIAMOND_LEGGINGS, DIAMOND_CHESTPLATE, DIAMOND_HELMET });
public static final ItemQuality Chain = new ItemQuality("chain", new Material[]{ CHAINMAIL_BOOTS, CHAINMAIL_LEGGINGS, CHAINMAIL_CHESTPLATE, CHAINMAIL_HELMET });
private static final List<ItemQuality> allValues = new LinkedList<ItemQuality>();
static{
allValues.add(None);
allValues.add(Leather);
allValues.add(Iron);
allValues.add(Gold);
allValues.add(Diamond);
allValues.add(Chain);
}
private String name;
private final Collection<Material> mats;
private ItemQuality(String name){
this(name, new Material[]{});
}
private ItemQuality(String name, Material[] materials){
this(name, Arrays.asList(materials));
}
private ItemQuality(String name, Collection<Material> materials){
this.name = name;
this.mats = materials;
}
public String getName() {
return name;
}
public Collection<Material> getMats() {
return new HashSet<Material>(mats);
}
public static Collection<ItemQuality> values(){
return new HashSet<ItemQuality>(allValues);
}
/**
* Reparses the ItemStuff.
*/
public static void reparse(Map<String,String> qualityMap){
allValues.clear();
for(Map.Entry<String,String> entry : qualityMap.entrySet()){
String key = entry.getKey().toLowerCase();
String toParse = entry.getValue();
String[] vals = toParse.split(Pattern.quote(","));
Set<Material> mats = new HashSet<Material>();
if(vals != null && vals.length != 0){
for(String val : vals){
Material mat = Material.matchMaterial(val);
if(mat != null) mats.add(mat);
}
}
if(mats.size() > 0) allValues.add(new ItemQuality(key, mats));
}
allValues.add(None);
}
/**
* Resets the ItemQualities.
*
* @param toSet to set.
*/
public static void set(Map<String, Set<Material>> toSet) {
allValues.clear();
for(Map.Entry<String, Set<Material>> entry : toSet.entrySet()){
ItemQuality quality = new ItemQuality(entry.getKey(), entry.getValue());
allValues.add(quality);
}
allValues.add(None);
}
/**
* Parses the ItemQuality from a String.
*
* @param armorString to parse.
*
* @return the parsed ArmorString
*/
public static Collection<ItemQuality> parse(String armorString) {
Set<ItemQuality> set = new HashSet<ItemQuality>();
if(armorString == null || armorString.isEmpty()) return set;
if(armorString.equalsIgnoreCase("all")) return values();
String[] parts = armorString.split(Pattern.quote(","));
if(parts != null && parts.length > 0){
for(String part : parts){
ItemQuality quality = parseSingle(part);
if(quality != null) set.add(quality);
}
}
return set;
}
private static ItemQuality parseSingle(String key){
key = key.toLowerCase();
for(ItemQuality quality : allValues){
if(key.equals(quality.getName())){
return quality;
}
}
return null;
}
/**
* Loads the Default.
*/
public static void loadDefault() {
allValues.clear();
allValues.add(Chain);
allValues.add(Diamond);
allValues.add(Gold);
allValues.add(Iron);
allValues.add(Leather);
allValues.add(None);
}
}
/**
* Gets the Item Quality of a piece of armor
*
* @param stack to check
* @return
*/
public static ItemQuality getItemValue(ItemStack stack){
if(stack == null) return ItemQuality.None;
Material type = stack.getType();
for(ItemQuality quality : ItemQuality.values()){
if(quality.getMats().contains(type)) return quality;
}
return ItemQuality.None;
}
/**
* Returns the robustness of an Item.
* This is only applied for Armor.
*
* @param stack to check
* @return int representation of robustness
*/
/*public static int getArmorValueOfItem(ItemStack stack){
if(stack == null || stack.getType() == Material.AIR) return 0;
switch(stack.getType()){
//LeatherArmor stuff
case LEATHER_BOOTS: return 1;
case LEATHER_HELMET: return 1;
case LEATHER_LEGGINGS: return 2;
case LEATHER_CHESTPLATE: return 3;
//GoldArmor stuff
case GOLD_BOOTS: return 1;
case GOLD_HELMET: return 2;
case GOLD_LEGGINGS: return 3;
case GOLD_CHESTPLATE: return 5;
//ChainArmor stuff
case CHAINMAIL_BOOTS: return 1;
case CHAINMAIL_HELMET: return 2;
case CHAINMAIL_LEGGINGS: return 4;
case CHAINMAIL_CHESTPLATE: return 5;
//IronArmor stuff
case IRON_BOOTS: return 2;
case IRON_HELMET: return 2;
case IRON_LEGGINGS: return 5;
case IRON_CHESTPLATE: return 6;
//DiamondArmor stuff
case DIAMOND_BOOTS: return 3;
case DIAMOND_HELMET: return 3;
case DIAMOND_LEGGINGS: return 6;
case DIAMOND_CHESTPLATE: return 8;
default: return 0;
}
}*/
/**
* Linked to the Armor slots in Minecraft.
*/
public enum ArmorSlot{
HELMET,
CHESTPLATE,
LEGGINGS,
BOOTS,
NONE;
}
/**
* Returns the armor slot the item can be equipped to.
* Returns -1 if NO armor item.
*
* @param item
* @return
*/
public static ArmorSlot getItemSlotEquiping(ItemStack item){
if(item == null){
return ArmorSlot.NONE;
}
switch(item.getType()){
//Helmets:
case LEATHER_HELMET:
case GOLD_HELMET:
case CHAINMAIL_HELMET:
case IRON_HELMET:
case DIAMOND_HELMET: return ArmorSlot.HELMET;
//Chest:
case LEATHER_CHESTPLATE:
case GOLD_CHESTPLATE:
case CHAINMAIL_CHESTPLATE:
case IRON_CHESTPLATE:
case DIAMOND_CHESTPLATE: return ArmorSlot.CHESTPLATE;
//Legs:
case LEATHER_LEGGINGS:
case GOLD_LEGGINGS:
case CHAINMAIL_LEGGINGS:
case IRON_LEGGINGS:
case DIAMOND_LEGGINGS: return ArmorSlot.LEGGINGS;
//feet:
case LEATHER_BOOTS:
case GOLD_BOOTS:
case CHAINMAIL_BOOTS:
case IRON_BOOTS:
case DIAMOND_BOOTS: return ArmorSlot.BOOTS;
default: return ArmorSlot.NONE;
}
}
/**
* Gets the ItemStack in the Armor Inventory slot of a Player.
* Returns null if {@link ItemStack#NONE} is passed.
*
* @param player to check
* @param slot to check
*
* @return the itemStack in the slot
*/
public static ItemStack getItemInArmorSlotOfPlayer(Player player, ArmorSlot slot){
if(slot == null){
return null;
}
switch (slot) {
case BOOTS:
return player.getInventory().getBoots();
case CHESTPLATE:
return player.getInventory().getChestplate();
case HELMET:
return player.getInventory().getHelmet();
case LEGGINGS:
return player.getInventory().getLeggings();
case NONE:
default:
return null;
}
}
}