package com.nisovin.magicspells.spells.targeted; import org.bukkit.Bukkit; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.util.Vector; import com.nisovin.magicspells.spells.TargetedEntitySpell; import com.nisovin.magicspells.spells.TargetedSpell; import com.nisovin.magicspells.util.MagicConfig; import com.nisovin.magicspells.util.TargetInfo; public class ForcetossSpell extends TargetedSpell implements TargetedEntitySpell { private int damage; private float hForce; private float vForce; private boolean checkPlugins; private boolean powerAffectsForce; public ForcetossSpell(MagicConfig config, String spellName) { super(config, spellName); damage = getConfigInt("damage", 0); hForce = getConfigInt("horizontal-force", 20) / 10.0F; vForce = getConfigInt("vertical-force", 10) / 10.0F; checkPlugins = getConfigBoolean("check-plugins", true); powerAffectsForce = getConfigBoolean("power-affects-force", true); } @Override public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) { if (state == SpellCastState.NORMAL) { // get target TargetInfo<LivingEntity> targetInfo = getTargetedEntity(player, power); if (targetInfo == null) { return noTarget(player); } LivingEntity target = targetInfo.getTarget(); power = targetInfo.getPower(); // do damage if (damage > 0) { double damage = this.damage * power; if (target instanceof Player && checkPlugins) { EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(player, target, DamageCause.ENTITY_ATTACK, damage); Bukkit.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { return noTarget(player); } damage = event.getDamage(); } target.damage(damage); } // throw target toss(player, target, power); sendMessages(player, target); return PostCastAction.NO_MESSAGES; } return PostCastAction.HANDLE_NORMALLY; } private void toss(Player player, LivingEntity target, float power) { if (!powerAffectsForce) power = 1f; Vector v = target.getLocation().toVector().subtract(player.getLocation().toVector()) .setY(0) .normalize() .multiply(hForce*power) .setY(vForce*power); target.setVelocity(v); playSpellEffects(player, target); } @Override public boolean castAtEntity(Player caster, LivingEntity target, float power) { if (!validTargetList.canTarget(caster, target)) { return false; } else { toss(caster, target, power); return true; } } @Override public boolean castAtEntity(LivingEntity target, float power) { return false; } }