package com.nisovin.magicspells.spells.targeted;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import com.nisovin.magicspells.events.SpellTargetLocationEvent;
import com.nisovin.magicspells.spelleffects.EffectPosition;
import com.nisovin.magicspells.spells.TargetedLocationSpell;
import com.nisovin.magicspells.spells.TargetedSpell;
import com.nisovin.magicspells.util.MagicConfig;
import com.nisovin.magicspells.util.TargetInfo;
public class LightningSpell extends TargetedSpell implements TargetedLocationSpell {
private boolean requireEntityTarget;
private boolean checkPlugins;
private double additionalDamage;
private boolean noDamage;
public LightningSpell(MagicConfig config, String spellName) {
super(config, spellName);
requireEntityTarget = getConfigBoolean("require-entity-target", false);
checkPlugins = getConfigBoolean("check-plugins", true);
additionalDamage = getConfigFloat("additional-damage", 0);
noDamage = getConfigBoolean("no-damage", false);
}
@Override
public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) {
if (state == SpellCastState.NORMAL) {
Block target = null;
LivingEntity entityTarget = null;
if (requireEntityTarget) {
TargetInfo<LivingEntity> targetInfo = getTargetedEntity(player, power);
if (targetInfo != null) {
entityTarget = targetInfo.getTarget();
power = targetInfo.getPower();
}
if (entityTarget != null && entityTarget instanceof Player && checkPlugins) {
EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(player, entityTarget, DamageCause.ENTITY_ATTACK, 1 + additionalDamage);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
entityTarget = null;
}
}
if (entityTarget != null) {
target = entityTarget.getLocation().getBlock();
if (additionalDamage > 0) {
entityTarget.damage(additionalDamage * power, player);
}
} else {
return noTarget(player);
}
} else {
try {
target = getTargetedBlock(player, power);
} catch (IllegalStateException e) {
target = null;
}
if (target != null) {
SpellTargetLocationEvent event = new SpellTargetLocationEvent(this, player, target.getLocation(), power);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
target = null;
} else {
target = event.getTargetLocation().getBlock();
power = event.getPower();
}
}
}
if (target != null) {
lightning(target.getLocation());
playSpellEffects(player, target.getLocation());
if (entityTarget != null) {
sendMessages(player, entityTarget);
return PostCastAction.NO_MESSAGES;
}
} else {
return noTarget(player);
}
}
return PostCastAction.HANDLE_NORMALLY;
}
private void lightning(Location target) {
if (noDamage) {
target.getWorld().strikeLightningEffect(target);
} else {
target.getWorld().strikeLightning(target);
}
}
@Override
public boolean castAtLocation(Player caster, Location target, float power) {
lightning(target);
playSpellEffects(caster, target);
return true;
}
@Override
public boolean castAtLocation(Location target, float power) {
lightning(target);
playSpellEffects(EffectPosition.CASTER, target);
return true;
}
}