package de.tobiyas.racesandclasses.util.items;
import java.util.Arrays;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import de.tobiyas.util.formating.ParseUtils;
public class WandItem {
/**
* The Material to use.
*/
private final Material material;
/**
* THe Damage value to search.
* -1 for any.
*/
private final short damage;
/**
* The ItemName to search.
*/
private final String itemName;
/**
* THe lore line to search.
*/
private final String loreLine;
public WandItem(Material material, short damage, String itemName, String loreLine) {
super();
this.material = material;
this.damage = damage;
this.itemName = itemName == null ? "" : ChatColor.translateAlternateColorCodes('&', itemName);
this.loreLine = loreLine == null ? "" : ChatColor.translateAlternateColorCodes('&', loreLine);
}
public Material getMaterial() {
return material;
}
public short getDamage() {
return damage;
}
public String getItemName() {
return itemName;
}
public String getLoreLine() {
return loreLine;
}
/**
* Generates a demo item. Not good to use!
* @return the item.
*/
public ItemStack generateItem(){
ItemStack item = new ItemStack(material);
if(damage >= 0) item.setDurability(damage);
if(itemName.isEmpty() && loreLine.isEmpty()) return item;
ItemMeta meta = item.getItemMeta();
if(meta == null) return item;
meta.setDisplayName(itemName);
meta.setLore(Arrays.asList(loreLine));
item.setItemMeta(meta);
return item;
}
/**
* If this is the item passed.
* @param item to check.
* @return true if is item.
*/
public boolean isItem(ItemStack item){
if(item == null) return false;
if(material != item.getType()) return false;
if(damage >= 0 && item.getDurability() != damage) return false;
//early out if no name / lore:
if(itemName.isEmpty() && loreLine.isEmpty()) return true;
//Problem fix for no Meta:
ItemMeta meta = item.getItemMeta();
if(meta == null) return false;
//Check for name:
String name = meta.hasDisplayName() ? meta.getDisplayName() : "";
if(!name.equals(itemName)) return false;
//Check for display:
if(!loreLine.isEmpty() && !meta.hasLore()) return false;
boolean found = false;
for(String line : meta.getLore()){
if(loreLine.equals(line)) found = true;
}
if(!found) return false;
return true;
}
/**
* Generates the
* @param line to split.
* @return the generated item or null if not parseable.
*/
public static WandItem generateFrom(String line){
if(line == null || line.isEmpty()) return null;
String[] split = line.split("##");
if(split.length == 0 || split[0].isEmpty()) return null;
Material material = ParseUtils.parseMaterial(split, 0, null);
if(material == null) return null;
short damage = ParseUtils.parseShort(split, 1, (short) -1);
String name = ParseUtils.parseString(split, 2, "");
String displayLine = ParseUtils.parseString(split, 3, "");
return new WandItem(material, damage, name, displayLine);
}
}