package com.nisovin.magicspells.spells.instant; 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.util.Vector; import com.nisovin.magicspells.events.SpellTargetEvent; import com.nisovin.magicspells.spelleffects.EffectPosition; import com.nisovin.magicspells.spells.InstantSpell; import com.nisovin.magicspells.util.MagicConfig; public class ForcepushSpell extends InstantSpell { private int radius; private int force; private int yForce; private int maxYForce; public ForcepushSpell(MagicConfig config, String spellName) { super(config, spellName); radius = getConfigInt("range", 3); force = getConfigInt("pushback-force", 30); yForce = getConfigInt("additional-vertical-force", 15); maxYForce = getConfigInt("max-vertical-force", 20); } @Override public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) { if (state == SpellCastState.NORMAL) { knockback(player, radius, power); } return PostCastAction.HANDLE_NORMALLY; } public void knockback(Player player, int range, float basePower) { Vector p = player.getLocation().toVector(); List<Entity> entities = player.getNearbyEntities(range, range, range); Vector e, v; for (Entity entity : entities) { if (entity instanceof LivingEntity && validTargetList.canTarget(player, (LivingEntity)entity)) { LivingEntity target = (LivingEntity)entity; float power = basePower; SpellTargetEvent event = new SpellTargetEvent(this, player, target, power); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { continue; } else { if (target != event.getTarget() && target.getWorld().equals(event.getTarget().getWorld())) { target = event.getTarget(); } power = event.getPower(); } e = target.getLocation().toVector(); v = e.subtract(p).normalize().multiply(force/10.0*power); if (force != 0) { v.setY(v.getY() + (yForce/10.0*power)); } else { v.setY(yForce/10.0*power); } if (v.getY() > (maxYForce/10.0)) { v.setY(maxYForce/10.0); } target.setVelocity(v); playSpellEffects(EffectPosition.TARGET, target); } } playSpellEffects(EffectPosition.CASTER, player); } }