package com.nisovin.magicspells.spells.targeted; import java.util.HashMap; import org.bukkit.Bukkit; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import com.nisovin.magicspells.MagicSpells; import com.nisovin.magicspells.events.SpellApplyDamageEvent; 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 CombustSpell extends TargetedSpell implements TargetedEntitySpell { private int fireTicks; private int fireTickDamage; private boolean preventImmunity; private boolean checkPlugins; private HashMap<Integer, CombustData> combusting = new HashMap<Integer, CombustData>(); public CombustSpell(MagicConfig config, String spellName) { super(config, spellName); fireTicks = getConfigInt("fire-ticks", 100); fireTickDamage = getConfigInt("fire-tick-damage", 1); preventImmunity = getConfigBoolean("prevent-immunity", true); checkPlugins = getConfigBoolean("check-plugins", true); } public int getDuration() { return fireTicks; } @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) { return noTarget(player); } else { boolean combusted = combust(player, target.getTarget(), target.getPower()); if (!combusted) { return noTarget(player); } sendMessages(player, target.getTarget()); return PostCastAction.NO_MESSAGES; } } return PostCastAction.HANDLE_NORMALLY; } private boolean combust(Player player, final LivingEntity target, float power) { if (target instanceof Player && checkPlugins && player != null) { // call other plugins EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(player, target, DamageCause.ENTITY_ATTACK, (double)1); Bukkit.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { return false; } } int duration = Math.round(fireTicks*power); combusting.put(target.getEntityId(), new CombustData(power)); Bukkit.getPluginManager().callEvent(new SpellApplyDamageEvent(this, player, target, fireTickDamage, DamageCause.FIRE_TICK, "")); target.setFireTicks(duration); if (player != null) { playSpellEffects(player, target); } else { playSpellEffects(EffectPosition.TARGET, target); } Bukkit.getScheduler().scheduleSyncDelayedTask(MagicSpells.plugin, new Runnable() { public void run() { CombustData data = combusting.get(target.getEntityId()); if (data != null) { combusting.remove(target.getEntityId()); } } }, duration+2); return true; } @EventHandler public void onEntityDamage(final EntityDamageEvent event) { if (event.isCancelled() || event.getCause() != DamageCause.FIRE_TICK) return; CombustData data = combusting.get(event.getEntity().getEntityId()); if (data != null) { event.setDamage(Math.round(fireTickDamage * data.power)); if (preventImmunity) { Bukkit.getScheduler().scheduleSyncDelayedTask(MagicSpells.plugin, new Runnable() { public void run() { ((LivingEntity)event.getEntity()).setNoDamageTicks(0); } }, 0); } } } private class CombustData { float power; CombustData(float power) { this.power = power; } } @Override public boolean castAtEntity(Player caster, LivingEntity target, float power) { if (!validTargetList.canTarget(caster, target)) { return false; } else { return combust(caster, target, power); } } @Override public boolean castAtEntity(LivingEntity target, float power) { if (!validTargetList.canTarget(target)) { return false; } else { return combust(null, target, power); } } }