package com.nisovin.magicspells.spells.instant; import java.util.ArrayList; import java.util.EnumSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import com.nisovin.magicspells.MagicSpells; import com.nisovin.magicspells.materials.MagicMaterial; import com.nisovin.magicspells.spelleffects.EffectPosition; import com.nisovin.magicspells.spells.InstantSpell; import com.nisovin.magicspells.util.MagicConfig; public class RepairSpell extends InstantSpell { private int repairAmt; private String[] toRepair; private Set<Material> ignoreItems; private Set<Material> allowedItems; private String strNothingToRepair; public RepairSpell(MagicConfig config, String spellName) { super(config, spellName); repairAmt = getConfigInt("repair-amount", 300); List<String> toRepairList = getConfigStringList("to-repair", null); if (toRepairList == null) { toRepairList = new ArrayList<String>(); } if (toRepairList.size() == 0) { toRepairList.add("held"); } Iterator<String> iter = toRepairList.iterator(); while (iter.hasNext()) { String s = iter.next(); if (!s.equals("held") && !s.equals("hotbar") && !s.equals("inventory") && !s.equals("helmet") && !s.equals("chestplate") && !s.equals("leggings") && !s.equals("boots")) { Bukkit.getServer().getLogger().severe("MagicSpells: repair: invalid to-repair option: " + s); iter.remove(); } } toRepair = new String[toRepairList.size()]; toRepair = toRepairList.toArray(toRepair); ignoreItems = EnumSet.noneOf(Material.class); List<String> list = getConfigStringList("ignore-items", null); if (list != null) { for (String s : list) { MagicMaterial m = MagicSpells.getItemNameResolver().resolveItem(s); if (m != null && m.getMaterial() != null) { ignoreItems.add(m.getMaterial()); } } } if (ignoreItems.size() == 0) ignoreItems = null; allowedItems = EnumSet.noneOf(Material.class); list = getConfigStringList("allowed-items", null); if (list != null) { for (String s : list) { MagicMaterial m = MagicSpells.getItemNameResolver().resolveItem(s); if (m != null && m.getMaterial() != null) { allowedItems.add(m.getMaterial()); } } } if (allowedItems.size() == 0) allowedItems = null; strNothingToRepair = getConfigString("str-nothing-to-repair", "Nothing to repair."); } @Override public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) { if (state == SpellCastState.NORMAL) { int repaired = 0; for (String s : toRepair) { if (s.equals("held")) { ItemStack item = player.getItemInHand(); if (item != null && isRepairable(item.getType()) && item.getDurability() > 0) { item.setDurability(newDura(item)); player.setItemInHand(item); repaired++; } } else if (s.equals("hotbar") || s.equals("inventory")) { int start, end; ItemStack[] items = player.getInventory().getContents(); if (s.equals("hotbar")) { start = 0; end = 9; } else { start = 9; end = 36; } for (int i = start; i < end; i++) { ItemStack item = items[i]; if (item != null && isRepairable(item.getType()) && item.getDurability() > 0) { item.setDurability(newDura(item)); items[i] = item; repaired++; } } player.getInventory().setContents(items); } else if (s.equals("helmet")) { ItemStack item = player.getInventory().getHelmet(); if (item != null && isRepairable(item.getType()) && item.getDurability() > 0) { item.setDurability(newDura(item)); player.getInventory().setHelmet(item); repaired++; } } else if (s.equals("chestplate")) { ItemStack item = player.getInventory().getChestplate(); if (item != null && isRepairable(item.getType()) && item.getDurability() > 0) { item.setDurability(newDura(item)); player.getInventory().setChestplate(item); repaired++; } } else if (s.equals("leggings")) { ItemStack item = player.getInventory().getLeggings(); if (item != null && isRepairable(item.getType()) && item.getDurability() > 0) { item.setDurability(newDura(item)); player.getInventory().setLeggings(item); repaired++; } } else if (s.equals("boots")) { ItemStack item = player.getInventory().getBoots(); if (item != null && isRepairable(item.getType()) && item.getDurability() > 0) { item.setDurability(newDura(item)); player.getInventory().setBoots(item); repaired++; } } } if (repaired == 0) { sendMessage(player, strNothingToRepair); return PostCastAction.ALREADY_HANDLED; } else { playSpellEffects(EffectPosition.CASTER, player); } } return PostCastAction.HANDLE_NORMALLY; } private short newDura(ItemStack item) { short dura = item.getDurability(); dura -= repairAmt; if (dura < 0) dura = 0; return dura; } private boolean isRepairable(Material material) { if (ignoreItems != null && ignoreItems.contains(material)) return false; if (allowedItems != null && !allowedItems.contains(material)) return false; String s = material.name(); return material == Material.BOW || material == Material.FLINT_AND_STEEL || material == Material.SHEARS || material == Material.FISHING_ROD || s.endsWith("HELMET") || s.endsWith("CHESTPLATE") || s.endsWith("LEGGINGS") || s.endsWith("BOOTS") || s.endsWith("AXE") || s.endsWith("HOE") || s.endsWith("PICKAXE") || s.endsWith("SPADE") || s.endsWith("SWORD"); } }