package de.jaschastarke.minecraft.limitedcreative.limits; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.inventory.ItemStack; import org.bukkit.material.MaterialData; import de.jaschastarke.bukkit.lib.configuration.ConfigurableList; import de.jaschastarke.bukkit.lib.configuration.IToGeneric; import de.jaschastarke.bukkit.lib.configuration.command.ITabComplete; import de.jaschastarke.bukkit.lib.configuration.command.ListConfigValue; import de.jaschastarke.bukkit.lib.items.ItemUtils; import de.jaschastarke.bukkit.lib.items.MaterialDataNotRecognizedException; import de.jaschastarke.bukkit.lib.items.MaterialNotRecognizedException; import de.jaschastarke.configuration.InvalidValueException; public class BlackList extends ArrayList<BlackList.Blacklisted> implements ConfigurableList<BlackList.Blacklisted>, IToGeneric, ITabComplete { private static final long serialVersionUID = -3701659163474405152L; public static class Blacklisted { private String stringRep; private MaterialData md; private boolean hasData = false; public Blacklisted(String rep) throws InvalidValueException { stringRep = rep; try { md = ItemUtils.parseMaterial(rep); hasData = rep.contains(ItemUtils.MATERIAL_DATA_SEP); } catch (MaterialNotRecognizedException e) { throw new InvalidValueException("Invalid Material: " + rep, e); } catch (MaterialDataNotRecognizedException e) { throw new InvalidValueException("Invalid Material with Data: " + rep, e); } } public Blacklisted(Material m) { md = new MaterialData(m); stringRep = m.toString(); } public Blacklisted(MaterialData md) { this.md = md; stringRep = md.getItemType().toString() + ItemUtils.MATERIAL_DATA_SEP + Integer.toString(md.getData()); } public boolean matches(ItemStack item) { if (hasData) { return md.equals(item.getData()); } else { return item.getType().equals(md.getItemType()); } } public boolean matches(Block block) { if (hasData) { return md.equals(new MaterialData(block.getType(), block.getData())); } else { return block.getType().equals(md.getItemType()); } } public String toString() { return stringRep; } } public BlackList() { } public BlackList(List<?> list) { if (list != null) { for (Object el : list) { if (el instanceof Blacklisted) { add((Blacklisted) el); } else { try { if (el != null) addSetting(el.toString()); } catch (InvalidValueException e) { System.err.println(e.getCause().getMessage()); } } } } } public boolean contains(String e) { for (Blacklisted bl : this) { if (bl.toString().equalsIgnoreCase(e)) return true; } return false; } public boolean isListed(ItemStack item) { for (Blacklisted bl : this) { if (bl.matches(item)) return true; } return false; } public boolean isListed(Block block) { for (Blacklisted bl : this) { if (bl.matches(block)) return true; } return false; } @Override // ConfigurableList, not List<E> public boolean addSetting(String e) throws InvalidValueException { if (!contains(e)) { return add(new Blacklisted(e)); } return false; } @Override // ConfigurableList, not List<E> public boolean removeSetting(String e) { Iterator<Blacklisted> it = iterator(); while (it.hasNext()) { if (it.next().toString().equalsIgnoreCase(e)) { it.remove(); return true; } } return false; } public List<String> toStringList() { List<String> list = new ArrayList<String>(size()); for (Blacklisted bl : this) { list.add(bl.toString()); } return list; } @Override public List<String> toGeneric() { return toStringList(); } @Override public void clearSettings() { clear(); } @Override public List<String> tabComplete(String[] args, String[] chain) { if (args.length > 0 && chain.length > 0) { List<String> hints = new ArrayList<String>(); String action = chain[chain.length - 1]; if (action.equalsIgnoreCase(ListConfigValue.ADD)) { for (Material m : Material.values()) { if (m.name().toLowerCase().startsWith(args[0].toLowerCase())) { hints.add(m.name()); } } } else if (action.equalsIgnoreCase(ListConfigValue.REMOVE)) { for (Blacklisted bl : this) { if (bl.toString().toLowerCase().startsWith(args[0].toLowerCase())) { hints.add(bl.toString()); } } } return hints; } return null; } }