package com.nisovin.magicspells.spells.instant; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; import com.nisovin.magicspells.MagicSpells; import com.nisovin.magicspells.Subspell; import com.nisovin.magicspells.spelleffects.EffectPosition; import com.nisovin.magicspells.spells.InstantSpell; import com.nisovin.magicspells.spells.TargetedLocationSpell; import com.nisovin.magicspells.util.MagicConfig; import com.nisovin.magicspells.util.Util; public class ItemBombSpell extends InstantSpell implements TargetedLocationSpell { float velocity; float verticalAdjustment; int rotationOffset; float yOffset; ItemStack item; String itemName; int itemNameDelay; int delay; Subspell spell; public ItemBombSpell(MagicConfig config, String spellName) { super(config, spellName); velocity = getConfigFloat("velocity", 1); verticalAdjustment = getConfigFloat("vertical-adjustment", 0.5F); rotationOffset = getConfigInt("rotation-offset", 0); yOffset = getConfigFloat("y-offset", 1F); item = Util.getItemStackFromString(getConfigString("item", "stone")); itemName = getConfigString("item-name", null); itemNameDelay = getConfigInt("item-name-delay", 1); delay = getConfigInt("delay", 100); spell = new Subspell(getConfigString("spell", "")); if (item == null) { MagicSpells.error("Invalid item on ItemBombSpell " + internalName); } if (itemName != null) { itemName = ChatColor.translateAlternateColorCodes('&', itemName); } } @Override public void initialize() { super.initialize(); if (!spell.process()) { MagicSpells.error("Invalid spell on ItemBombSpell " + internalName); } } @Override public PostCastAction castSpell(final Player player, SpellCastState state, final float power, String[] args) { if (state == SpellCastState.NORMAL) { Location l = player.getLocation().add(0, yOffset, 0); spawnItem(player, l, power); } return PostCastAction.HANDLE_NORMALLY; } private void spawnItem(final Player player, Location l, final float power) { Vector v = getVector(l, power); final Item i = l.getWorld().dropItem(l, item); i.teleport(l); i.setVelocity(v); i.setPickupDelay(delay * 2); if (itemName != null) { MagicSpells.scheduleDelayedTask(new Runnable() { public void run() { i.setCustomName(itemName); i.setCustomNameVisible(true); } }, itemNameDelay); } MagicSpells.scheduleDelayedTask(new Runnable() { public void run() { Location l = i.getLocation(); i.remove(); playSpellEffects(EffectPosition.TARGET, l); spell.castAtLocation(player, l, power); } }, delay); if (player != null) { playSpellEffects(EffectPosition.CASTER, player); } else { playSpellEffects(EffectPosition.CASTER, l); } } private Vector getVector(Location loc, float power) { Vector v = loc.getDirection(); if (verticalAdjustment != 0) { v.setY(v.getY() + verticalAdjustment); } if (rotationOffset != 0) { Util.rotateVector(v, rotationOffset); } v.normalize().multiply(velocity); return v; } @Override public boolean castAtLocation(Player caster, Location target, float power) { spawnItem(caster, target, power); return true; } @Override public boolean castAtLocation(Location target, float power) { spawnItem(null, target, power); return true; } }