package com.nisovin.magicspells.spells.instant;
import java.util.Random;
import org.bukkit.Bukkit;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Snowball;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector;
import com.nisovin.magicspells.events.SpellTargetEvent;
import com.nisovin.magicspells.spelleffects.EffectPosition;
import com.nisovin.magicspells.spells.InstantSpell;
import com.nisovin.magicspells.spells.SpellDamageSpell;
import com.nisovin.magicspells.util.MagicConfig;
public class FreezeSpell extends InstantSpell implements SpellDamageSpell {
private int snowballs;
private double horizSpread;
private double vertSpread;
private int damage;
private String spellDamageType;
private int slowAmount;
private int slowDuration;
private float identifier;
public FreezeSpell(MagicConfig config, String spellName) {
super(config, spellName);
snowballs = getConfigInt("snowballs", 15);
horizSpread = getConfigInt("horizontal-spread", 15) / 10.0;
vertSpread = getConfigInt("vertical-spread", 15) / 10.0;
damage = getConfigInt("damage", 3);
spellDamageType = getConfigString("spell-damage-type", "");
slowAmount = getConfigInt("slow-amount", 3);
slowDuration = getConfigInt("slow-duration", 40);
identifier = (float)Math.random() * 20F;
}
@Override
public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) {
if (state == SpellCastState.NORMAL) {
Random rand = new Random();
Vector mod;
for (int i = 0; i < snowballs; i++) {
Snowball snowball = player.launchProjectile(Snowball.class);
snowball.setFallDistance(identifier); // tag the snowballs
mod = new Vector((rand.nextDouble() - .5) * horizSpread, (rand.nextDouble() - .5) * vertSpread, (rand.nextDouble() - .5) * horizSpread);
snowball.setVelocity(snowball.getVelocity().add(mod));
}
playSpellEffects(EffectPosition.CASTER, player);
}
return PostCastAction.HANDLE_NORMALLY;
}
@EventHandler(priority=EventPriority.LOWEST)
public void onEntityDamage(EntityDamageByEntityEvent event) {
if (damage <= 0 || event.isCancelled() || !(event.getEntity() instanceof LivingEntity)) return;
if (!(event.getDamager() instanceof Snowball) || event.getDamager().getFallDistance() != identifier) return;
LivingEntity entity = (LivingEntity)event.getEntity();
if (validTargetList.canTarget(entity)) {
float power = 1;
SpellTargetEvent e = new SpellTargetEvent(this, (Player)((Snowball)event.getDamager()).getShooter(), entity, power);
Bukkit.getPluginManager().callEvent(e);
if (e.isCancelled()) {
event.setCancelled(true);
} else {
event.setDamage(damage * e.getPower());
}
} else {
event.setCancelled(true);
}
}
@EventHandler(priority=EventPriority.HIGHEST, ignoreCancelled=true)
public void onEntityDamage2(EntityDamageByEntityEvent event) {
if (slowAmount <= 0 || slowDuration <= 0) return;
if (!(event.getDamager() instanceof Snowball) || event.getDamager().getFallDistance() != identifier) return;
((LivingEntity)event.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.SLOW, slowDuration, slowAmount), true);
}
@Override
public String getSpellDamageType() {
return spellDamageType;
}
}