package com.nisovin.magicspells.spells.buff;
import java.util.HashMap;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import com.nisovin.magicspells.MagicSpells;
import com.nisovin.magicspells.spelleffects.EffectPosition;
import com.nisovin.magicspells.spells.BuffSpell;
import com.nisovin.magicspells.util.MagicConfig;
public class FlamewalkSpell extends BuffSpell {
private int range;
private int fireTicks;
private int tickInterval;
private boolean targetPlayers;
private boolean checkPlugins;
private HashMap<String, Float> flamewalkers;
private Burner burner;
public FlamewalkSpell(MagicConfig config, String spellName) {
super(config, spellName);
range = getConfigInt("range", 8);
fireTicks = getConfigInt("fire-ticks", 80);
tickInterval = getConfigInt("tick-interval", 100);
targetPlayers = getConfigBoolean("target-players", false);
checkPlugins = getConfigBoolean("check-plugins", true);
flamewalkers = new HashMap<String, Float>();
}
@Override
public boolean castBuff(Player player, float power, String[] args) {
flamewalkers.put(player.getName(), power);
if (burner == null) {
burner = new Burner();
}
return true;
}
@Override
public void turnOffBuff(Player player) {
flamewalkers.remove(player.getName());
if (flamewalkers.size() == 0 && burner != null) {
burner.stop();
burner = null;
}
}
@Override
protected void turnOff() {
flamewalkers.clear();
if (burner != null) {
burner.stop();
burner = null;
}
}
private class Burner implements Runnable {
int taskId;
String[] strArr = new String[0];
public Burner() {
taskId = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(MagicSpells.plugin, this, tickInterval, tickInterval);
}
public void stop() {
Bukkit.getServer().getScheduler().cancelTask(taskId);
}
public void run() {
for (String s : flamewalkers.keySet().toArray(strArr)) {
Player player = Bukkit.getServer().getPlayer(s);
float power = flamewalkers.get(s);
if (player != null) {
if (isExpired(player)) {
turnOff(player);
continue;
}
playSpellEffects(EffectPosition.DELAYED, player);
List<Entity> entities = player.getNearbyEntities(range, range, range);
for (Entity entity : entities) {
if (entity instanceof Player) {
if (entity != player && targetPlayers) {
if (checkPlugins) {
EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(player, entity, DamageCause.ENTITY_ATTACK, (double)1);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
continue;
}
}
}
} else if (!(entity instanceof LivingEntity)) {
continue;
}
entity.setFireTicks(Math.round(fireTicks*power));
playSpellEffects(EffectPosition.TARGET, entity);
playSpellEffectsTrail(player.getLocation(), entity.getLocation());
addUse(player);
chargeUseCost(player);
}
}
}
}
}
@Override
public boolean isActive(Player player) {
return flamewalkers.containsKey(player.getName());
}
}