package com.nisovin.magicspells.spells.targeted; import org.bukkit.Location; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import com.nisovin.magicspells.spelleffects.EffectPosition; import com.nisovin.magicspells.spells.TargetedEntityFromLocationSpell; import com.nisovin.magicspells.spells.TargetedEntitySpell; import com.nisovin.magicspells.spells.TargetedSpell; import com.nisovin.magicspells.util.BlockUtils; import com.nisovin.magicspells.util.MagicConfig; import com.nisovin.magicspells.util.TargetInfo; public class GripSpell extends TargetedSpell implements TargetedEntitySpell, TargetedEntityFromLocationSpell { float locationOffset; float yOffset; String strCantGrip; public GripSpell(MagicConfig config, String spellName) { super(config, spellName); locationOffset = getConfigFloat("location-offset", 0); yOffset = getConfigFloat("y-offset", 0.5F); strCantGrip = getConfigString("str-cant-grip", ""); } @Override public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) { if (state == SpellCastState.NORMAL) { TargetInfo<LivingEntity> target = getTargetedEntity(player, power); if (target != null) { boolean ok = grip(player, target.getTarget()); if (!ok) { return noTarget(player, strCantGrip); } sendMessages(player, target.getTarget()); return PostCastAction.NO_MESSAGES; } else { return noTarget(player); } } return PostCastAction.HANDLE_NORMALLY; } private boolean grip(Player player, LivingEntity target) { Location loc = player.getLocation().add(player.getLocation().getDirection().setY(0).normalize().multiply(locationOffset)); loc.add(0, yOffset, 0); if (!BlockUtils.isSafeToStand(loc)) { return false; } playSpellEffects(player, target); return target.teleport(loc); } @Override public boolean castAtEntity(Player caster, LivingEntity target, float power) { if (validTargetList.canTarget(caster, target)) { return grip(caster, target); } else { return false; } } @Override public boolean castAtEntity(LivingEntity target, float power) { return false; } @Override public boolean castAtEntityFromLocation(Player caster, Location from, LivingEntity target, float power) { return castAtEntityFromLocation(from, target, power); } @Override public boolean castAtEntityFromLocation(Location from, LivingEntity target, float power) { if (validTargetList.canTarget(target)) { Location loc = from.clone(); loc.setX(loc.getBlockX() + .5); loc.setY(loc.getBlockY() + .5); loc.setZ(loc.getBlockZ() + .5); if (!BlockUtils.isSafeToStand(loc)) { loc.add(0, 1, 0); if (!BlockUtils.isSafeToStand(loc)) { return false; } } Location start = target.getLocation().clone(); playSpellEffects(EffectPosition.TARGET, target); target.teleport(loc); playSpellEffectsTrail(start, loc); return true; } else { return false; } } }