package com.nisovin.magicspells.spells.buff; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import com.nisovin.magicspells.events.SpellApplyDamageEvent; import com.nisovin.magicspells.events.SpellTargetEvent; import com.nisovin.magicspells.spells.BuffSpell; import com.nisovin.magicspells.spells.SpellDamageSpell; import com.nisovin.magicspells.util.MagicConfig; public class ResistSpell extends BuffSpell { List<String> spellDamageTypes; List<DamageCause> normalDamageTypes; float multiplier; Map<String, Float> buffed = new HashMap<String, Float>(); public ResistSpell(MagicConfig config, String spellName) { super(config, spellName); spellDamageTypes = getConfigStringList("spell-damage-types", null); List<String> list = getConfigStringList("normal-damage-types", null); multiplier = getConfigFloat("multiplier", 0.5F); if (list != null) { normalDamageTypes = new ArrayList<DamageCause>(); for (String s : list) { for (DamageCause cause : DamageCause.values()) { if (cause.name().equalsIgnoreCase(s)) { normalDamageTypes.add(cause); break; } } } if (normalDamageTypes.size() == 0) normalDamageTypes = null; } } @Override public boolean castBuff(Player player, float power, String[] args) { buffed.put(player.getName(), power); return true; } @EventHandler public void onSpellDamage(SpellApplyDamageEvent event) { if (spellDamageTypes != null && event.getSpell() instanceof SpellDamageSpell && event.getTarget() instanceof Player && isActive((Player)event.getTarget())) { SpellDamageSpell spell = (SpellDamageSpell)event.getSpell(); if (spell.getSpellDamageType() != null && spellDamageTypes.contains(spell.getSpellDamageType())) { Player player = (Player)event.getTarget(); float power = multiplier; if (multiplier < 1) { power *= (1 / buffed.get(player.getName())); } else if (multiplier > 1) { power *= buffed.get(player.getName()); } event.applyDamageModifier(power); addUseAndChargeCost(player); } } } @EventHandler(ignoreCancelled = true) public void onEntityDamage(EntityDamageEvent event) { if (normalDamageTypes != null && normalDamageTypes.contains(event.getCause()) && event.getEntity() instanceof Player && isActive((Player)event.getEntity())) { Player player = (Player)event.getEntity(); float mult = multiplier; if (multiplier < 1) { mult *= (1 / buffed.get(player.getName())); } else if (multiplier > 1) { mult *= buffed.get(player.getName()); } event.setDamage(event.getDamage() * mult); addUseAndChargeCost(player); } } @Override public boolean isActive(Player player) { return buffed.containsKey(player.getName()); } @Override protected void turnOffBuff(Player player) { buffed.remove(player.getName()); } @Override protected void turnOff() { buffed.clear(); } }