package com.nisovin.magicspells.spells.targeted;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import com.nisovin.magicspells.MagicSpells;
import com.nisovin.magicspells.events.SpellTargetLocationEvent;
import com.nisovin.magicspells.materials.MagicMaterial;
import com.nisovin.magicspells.spelleffects.EffectPosition;
import com.nisovin.magicspells.spells.TargetedLocationSpell;
import com.nisovin.magicspells.spells.TargetedSpell;
import com.nisovin.magicspells.util.MagicConfig;
public class TransmuteSpell extends TargetedSpell implements TargetedLocationSpell {
List<MagicMaterial> blockTypes;
MagicMaterial transmuteType;
BlockFace[] checkDirs = new BlockFace[] { BlockFace.DOWN, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST };
boolean checkAll = false;
public TransmuteSpell(MagicConfig config, String spellName) {
super(config, spellName);
List<String> list = getConfigStringList("transmutable-types", null);
blockTypes = new ArrayList<MagicMaterial>();
if (list != null && list.size() > 0) {
for (String s : list) {
MagicMaterial m = MagicSpells.getItemNameResolver().resolveBlock(s);
if (m != null) {
blockTypes.add(m);
}
}
} else {
blockTypes.add(MagicSpells.getItemNameResolver().resolveBlock("iron_block"));
}
transmuteType = MagicSpells.getItemNameResolver().resolveBlock(getConfigString("transmute-type", "gold_block"));
}
@Override
public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) {
if (state == SpellCastState.NORMAL) {
Block block = getTargetedBlock(player, power);
if (block == null) {
return noTarget(player);
} else {
SpellTargetLocationEvent event = new SpellTargetLocationEvent(this, player, block.getLocation(), power);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return noTarget(player);
} else {
block = event.getTargetLocation().getBlock();
}
}
if (!canTransmute(block)) {
return noTarget(player);
}
transmuteType.setBlock(block);
playSpellEffects(player, block.getLocation().add(0.5, 0.5, 0.5));
}
return PostCastAction.HANDLE_NORMALLY;
}
@Override
public boolean castAtLocation(Player caster, Location target, float power) {
Block block = target.getBlock();
if (canTransmute(block)) {
transmuteType.setBlock(block);
playSpellEffects(caster, block.getLocation().add(0.5, 0.5, 0.5));
return true;
} else {
Vector v = target.getDirection();
block = target.clone().add(v).getBlock();
if (canTransmute(block)) {
transmuteType.setBlock(block);
playSpellEffects(caster, block.getLocation().add(0.5, 0.5, 0.5));
return true;
}
}
return false;
}
@Override
public boolean castAtLocation(Location target, float power) {
Block block = target.getBlock();
if (canTransmute(block)) {
transmuteType.setBlock(block);
playSpellEffects(EffectPosition.TARGET, block.getLocation().add(0.5, 0.5, 0.5));
return true;
}
return false;
}
private boolean canTransmute(Block block) {
for (MagicMaterial m : blockTypes) {
if (m.equals(block)) return true;
}
return false;
}
}