package com.nisovin.magicspells.spells.targeted;
import java.util.HashMap;
import java.util.Iterator;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import com.nisovin.magicspells.MagicSpells;
import com.nisovin.magicspells.Spell;
import com.nisovin.magicspells.spelleffects.EffectPosition;
import com.nisovin.magicspells.spells.TargetedLocationSpell;
import com.nisovin.magicspells.spells.TargetedSpell;
import com.nisovin.magicspells.spells.instant.MarkSpell;
import com.nisovin.magicspells.util.MagicConfig;
import com.nisovin.magicspells.util.MagicLocation;
public class RemoveMarksSpell extends TargetedSpell implements TargetedLocationSpell {
float radius;
boolean pointBlank;
String markSpellName;
MarkSpell markSpell;
public RemoveMarksSpell(MagicConfig config, String spellName) {
super(config, spellName);
radius = getConfigFloat("radius", 10);
pointBlank = getConfigBoolean("point-blank", false);
markSpellName = getConfigString("mark-spell", "mark");
}
@Override
public void initialize() {
super.initialize();
Spell spell = MagicSpells.getSpellByInternalName(markSpellName);
if (spell != null && spell instanceof MarkSpell) {
markSpell = (MarkSpell)spell;
} else {
MagicSpells.error("Failed to get mark spell for '" + internalName + "' spell");
}
}
@Override
public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) {
if (state == SpellCastState.NORMAL) {
Location loc = null;
if (pointBlank) {
loc = player.getLocation();
} else {
Block b = getTargetedBlock(player, power);
if (b != null && b.getType() != Material.AIR) {
loc = b.getLocation();
}
}
if (loc == null) {
return noTarget(player);
}
removeMarks(player, loc, power);
}
return PostCastAction.HANDLE_NORMALLY;
}
void removeMarks(Player caster, Location loc, float power) {
float rad = radius * power;
float radSq = rad * rad;
HashMap<String, MagicLocation> marks = markSpell.getMarks();
Iterator<String> iter = marks.keySet().iterator();
while (iter.hasNext()) {
MagicLocation l = marks.get(iter.next());
if (l.getWorld().equals(loc.getWorld().getName())) {
if (l.getLocation().distanceSquared(loc) < radSq) {
iter.remove();
}
}
}
markSpell.setMarks(marks);
if (caster != null) {
playSpellEffects(EffectPosition.CASTER, caster);
}
playSpellEffects(EffectPosition.TARGET, loc);
}
@Override
public boolean castAtLocation(Player caster, Location target, float power) {
removeMarks(caster, target, power);
return true;
}
@Override
public boolean castAtLocation(Location target, float power) {
removeMarks(null, target, power);
return true;
}
}