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.EntityRegainHealthEvent;
import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
import com.nisovin.magicspells.spelleffects.EffectPosition;
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 HealSpell extends TargetedSpell implements TargetedEntitySpell {
private double healAmount;
private boolean cancelIfFull;
private boolean checkPlugins;
private String strMaxHealth;
private ValidTargetChecker checker;
public HealSpell(MagicConfig config, String spellName) {
super(config, spellName);
healAmount = getConfigFloat("heal-amount", 10);
cancelIfFull = getConfigBoolean("cancel-if-full", true);
strMaxHealth = getConfigString("str-max-health", "%t is already at max health.");
checkPlugins = getConfigBoolean("check-plugins", true);
checker = new ValidTargetChecker() {
@Override
public boolean isValidTarget(LivingEntity entity) {
return entity.getHealth() < entity.getMaxHealth();
}
};
}
@Override
public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) {
if (state == SpellCastState.NORMAL) {
TargetInfo<LivingEntity> targetInfo = getTargetedEntity(player, power, checker);
if (targetInfo == null) {
return noTarget(player);
}
LivingEntity target = targetInfo.getTarget();
power = targetInfo.getPower();
if (cancelIfFull && target.getHealth() == target.getMaxHealth()) {
return noTarget(player, formatMessage(strMaxHealth, "%t", getTargetName(target)));
} else {
boolean healed = heal(player, target, power);
if (!healed) {
return noTarget(player);
}
sendMessages(player, target);
return PostCastAction.NO_MESSAGES;
}
}
return PostCastAction.HANDLE_NORMALLY;
}
private boolean heal(Player player, LivingEntity target, float power) {
double health = target.getHealth();
double amt = healAmount * power;
if (checkPlugins) {
EntityRegainHealthEvent evt = new EntityRegainHealthEvent(target, amt, RegainReason.CUSTOM);
Bukkit.getPluginManager().callEvent(evt);
if (evt.isCancelled()) {
return false;
}
amt = evt.getAmount();
}
health += amt;
if (health > target.getMaxHealth()) health = target.getMaxHealth();
target.setHealth(health);
playSpellEffects(EffectPosition.TARGET, target);
if (player != null) {
playSpellEffects(EffectPosition.CASTER, player);
playSpellEffectsTrail(player.getLocation(), target.getLocation());
}
return true;
}
@Override
public boolean castAtEntity(Player caster, LivingEntity target, float power) {
if (validTargetList.canTarget(caster, target) && target.getHealth() < target.getMaxHealth()) {
return heal(caster, target, power);
} else {
return false;
}
}
@Override
public boolean castAtEntity(LivingEntity target, float power) {
if (validTargetList.canTarget(target) && target.getHealth() < target.getMaxHealth()) {
return heal(null, target, power);
} else {
return false;
}
}
@Override
public boolean isBeneficialDefault() {
return true;
}
@Override
public ValidTargetChecker getValidTargetChecker() {
return checker;
}
}