package com.nisovin.magicspells.spells.targeted; import java.util.ArrayList; import java.util.List; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import com.nisovin.magicspells.MagicSpells; import com.nisovin.magicspells.Spell; 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 ModifyCooldownSpell extends TargetedSpell implements TargetedEntitySpell { List<Spell> spells; List<String> spellNames; float seconds; float multiplier; public ModifyCooldownSpell(MagicConfig config, String spellName) { super(config, spellName); spellNames = getConfigStringList("spells", null); seconds = getConfigFloat("seconds", 1f); multiplier = getConfigFloat("multiplier", 0f); } @Override public void initialize() { spells = new ArrayList<Spell>(); if (spellNames != null) { for (String spellName : spellNames) { Spell spell = MagicSpells.getSpellByInternalName(spellName); if (spell != null) { spells.add(spell); } else { MagicSpells.error("Invalid spell '" + spellName + "' on ModifyCooldownSpell + '" + internalName + "'"); } } } if (spells.size() == 0) { MagicSpells.error("ModifyCooldownSpell '" + internalName + "' has no spells!"); } } @Override public PostCastAction castSpell(Player player, SpellCastState state, float power, String[] args) { if (state == SpellCastState.NORMAL) { TargetInfo<Player> target = getTargetedPlayer(player, power); if (target == null) { return noTarget(player); } modifyCooldowns(target.getTarget(), target.getPower()); } return PostCastAction.HANDLE_NORMALLY; } void modifyCooldowns(Player player, float power) { float sec = seconds * power; float mult = multiplier * (1f / power); for (Spell spell : spells) { float cd = spell.getCooldown(player); if (cd > 0) { cd -= sec; if (mult > 0) cd *= mult; if (cd < 0) cd = 0; spell.setCooldown(player, cd, false); } } } @Override public boolean castAtEntity(Player caster, LivingEntity target, float power) { if (target instanceof Player) { modifyCooldowns((Player)target, power); playSpellEffects(caster, target); return true; } else { return false; } } @Override public boolean castAtEntity(LivingEntity target, float power) { if (target instanceof Player) { modifyCooldowns((Player)target, power); playSpellEffects(EffectPosition.TARGET, target); return true; } else { return false; } } }