package com.nisovin.magicspells.spells.targeted; import java.util.ArrayList; import java.util.List; import org.bukkit.ChatColor; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import com.nisovin.magicspells.MagicSpells; import com.nisovin.magicspells.spelleffects.EffectPosition; import com.nisovin.magicspells.spells.TargetedEntitySpell; import com.nisovin.magicspells.spells.TargetedSpell; import com.nisovin.magicspells.util.MagicConfig; import com.nisovin.magicspells.util.TargetInfo; import com.nisovin.magicspells.util.Util; public class CaptureSpell extends TargetedSpell implements TargetedEntitySpell { boolean powerAffectsQuantity; boolean addToInventory; String itemName; List<String> itemLore; public CaptureSpell(MagicConfig config, String spellName) { super(config, spellName); powerAffectsQuantity = getConfigBoolean("power-affects-quantity", true); addToInventory = getConfigBoolean("add-to-inventory", false); itemName = getConfigString("item-name", null); itemLore = getConfigStringList("item-lore", null); if (itemName != null) { itemName = ChatColor.translateAlternateColorCodes('&', itemName); } if (itemLore != null) { for (int i = 0; i < itemLore.size(); i++) { itemLore.set(i, ChatColor.translateAlternateColorCodes('&', itemLore.get(i))); } } } @Override public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) { if (state == SpellCastState.NORMAL) { TargetInfo<LivingEntity> target = getTargetedEntity(player, power, getValidTargetChecker()); if (target == null) { return noTarget(player); } boolean ok = capture(player, target.getTarget(), target.getPower()); if (!ok) { return noTarget(player); } sendMessages(player, target.getTarget()); return PostCastAction.NO_MESSAGES; } return PostCastAction.HANDLE_NORMALLY; } @Override public ValidTargetChecker getValidTargetChecker() { return new ValidTargetChecker() { @Override public boolean isValidTarget(LivingEntity entity) { return (!(entity instanceof Player) && entity.getType().isSpawnable()); } }; } boolean capture(Player caster, LivingEntity target, float power) { ItemStack item = Util.getEggItemForEntityType(target.getType()); if (item != null) { if (powerAffectsQuantity) { int q = Math.round(power); if (q > 1) { item.setAmount(q); } } String entityName = MagicSpells.getEntityNames().get(target.getType()); if (itemName != null || itemLore != null) { if (entityName == null) entityName = "unknown"; ItemMeta meta = item.getItemMeta(); if (itemName != null) { meta.setDisplayName(itemName.replace("%name%", entityName)); } if (itemLore != null) { List<String> lore = new ArrayList<String>(); for (String l : itemLore) { lore.add(l.replace("%name%", entityName)); } meta.setLore(lore); } item.setItemMeta(meta); } target.remove(); boolean added = false; if (addToInventory && caster != null) { added = Util.addToInventory(caster.getInventory(), item, true, false); } if (!added) { target.getWorld().dropItem(target.getLocation().add(0, 1, 0), item).setItemStack(item); } if (caster != null) { playSpellEffects(caster, target.getLocation()); } else { playSpellEffects(EffectPosition.TARGET, target.getLocation()); } return true; } return false; } @Override public boolean castAtEntity(Player caster, LivingEntity target, float power) { if (!target.getType().isSpawnable()) return false; if (!validTargetList.canTarget(caster, target)) return false; return capture(caster, target, power); } @Override public boolean castAtEntity(LivingEntity target, float power) { if (!target.getType().isSpawnable()) return false; if (!validTargetList.canTarget(target)) return false; return capture(null, target, power); } }