package com.nisovin.magicspells.spells.instant;
import java.util.HashSet;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.util.Vector;
import com.nisovin.magicspells.MagicSpells;
import com.nisovin.magicspells.spelleffects.EffectPosition;
import com.nisovin.magicspells.spells.InstantSpell;
import com.nisovin.magicspells.util.MagicConfig;
public class LeapSpell extends InstantSpell {
private double forwardVelocity;
private double upwardVelocity;
private boolean cancelDamage;
private boolean clientOnly;
private HashSet<Player> jumping;
public LeapSpell(MagicConfig config, String spellName) {
super(config, spellName);
forwardVelocity = getConfigInt("forward-velocity", 40) / 10D;
upwardVelocity = getConfigInt("upward-velocity", 15) / 10D;
cancelDamage = getConfigBoolean("cancel-damage", true);
clientOnly = getConfigBoolean("client-only", true);
if (cancelDamage) {
jumping = new HashSet<Player>();
}
}
@Override
public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) {
if (state == SpellCastState.NORMAL) {
Vector v = player.getLocation().getDirection();
v.setY(0).normalize().multiply(forwardVelocity*power).setY(upwardVelocity*power);
if (clientOnly) {
MagicSpells.getVolatileCodeHandler().setClientVelocity(player, v);
} else {
player.setVelocity(v);
}
if (cancelDamage) {
jumping.add(player);
}
playSpellEffects(EffectPosition.CASTER, player);
}
return PostCastAction.HANDLE_NORMALLY;
}
@EventHandler
public void onEntityDamage(EntityDamageEvent event) {
if (event.isCancelled()) return;
if (cancelDamage && event.getCause() == DamageCause.FALL && event.getEntity() instanceof Player && jumping.contains((Player)event.getEntity())) {
event.setCancelled(true);
jumping.remove((Player)event.getEntity());
playSpellEffects(EffectPosition.TARGET, event.getEntity().getLocation());
}
}
}