package com.github.jamesnorris.ablockalypse.event.bukkit; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.UUID; import org.bukkit.entity.Arrow; import org.bukkit.entity.Entity; import org.bukkit.entity.Fireball; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.Wolf; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; import com.github.jamesnorris.ablockalypse.Ablockalypse; import com.github.jamesnorris.ablockalypse.DataContainer; import com.github.jamesnorris.ablockalypse.aspect.ZAMob; import com.github.jamesnorris.ablockalypse.aspect.ZAPlayer; import com.github.jamesnorris.ablockalypse.enumerated.Setting; import com.github.jamesnorris.ablockalypse.threading.inherent.LastStandPickupTask; import com.github.jamesnorris.ablockalypse.utility.AblockalypseUtility; import com.github.jamesnorris.mcpath.PathNode; import com.github.jamesnorris.mcpath.Pathfinder; public class EntityDamageByEntity implements Listener { public static ArrayList<UUID> instakillids = new ArrayList<UUID>(); private DataContainer data = Ablockalypse.getData(); public static final double MIN_FIREBALL_DMG = 5, MIN_ARROW_DMG = 8, MIN_HIT_DMG = 1.5, MIN_FRIENDLY_FIRE_DMG = 1; private static final Random RAND = new Random(); /* Called when an entity damaged another entity. * Used mostly for picking someone out of last stand, changing damage, and cancelling damage. */ @EventHandler(priority = EventPriority.HIGHEST) public void EDBEE(EntityDamageByEntityEvent event) { Entity d = event.getDamager(); Entity entity = event.getEntity(); double evtdmg = event.getDamage(); if (!(entity instanceof LivingEntity) || !(d instanceof LivingEntity)) { return; } LivingEntity e = (LivingEntity) entity; LivingEntity damager = (LivingEntity) d; if (data.isZAMob(e)) { mobDamage(event, damager, e, evtdmg); } else if (e instanceof Player) { playerDamage(event, damager, e, evtdmg); } } /* Used to separate mob damage from player damage. * This is the mob version. */ public void mobDamage(EntityDamageByEntityEvent event, LivingEntity damager, LivingEntity e, double evtdmg) { ZAMob zam = data.getZAMob(e); if (damager instanceof Fireball) { Fireball f = (Fireball) damager; if (instakillids.contains(f.getUniqueId())) { event.setDamage(zam.getEntity().getHealth() * 10); } else { double dmg = 40 - zam.getHitAbsorption();// fireball damage if (dmg <= MIN_FIREBALL_DMG) { dmg = MIN_FIREBALL_DMG; } event.setDamage(dmg); } } else if (damager instanceof Arrow) { Arrow a = (Arrow) damager; if (instakillids.contains(a.getUniqueId())) { event.setDamage(zam.getEntity().getHealth() * 10); } else { double dmg = 50 - zam.getHitAbsorption();// arrow damage if (dmg <= MIN_ARROW_DMG) { dmg = MIN_ARROW_DMG; } event.setDamage(dmg); } } else if (damager instanceof Player) { Player p = (Player) damager; if (data.isZAPlayer(p)) { ZAPlayer zap = data.getZAPlayer(p); List<PathNode> nodes = new Pathfinder(e.getLocation(), p.getLocation(), AblockalypseUtility.getGoals(p.getWorld(), .891D, 1.031D, 2D, 0)).calculate((Integer) Setting.MAX_PATHFINDER_NODES.getSetting()).getNodes(); if (nodes.get(nodes.size() - 1).H > 10) { if (RAND.nextInt(99) + 1 < 5) { zam.getTargetter().panic(120); } else if (!zap.isTargettedBy(zam)) { zam.retarget(); } } if (zap.hasInstaKill()) { event.setDamage(zam.getEntity().getHealth() * 5); } else { double dmg = evtdmg - zam.getHitAbsorption();// regular hit damage if (dmg <= MIN_HIT_DMG) { dmg = MIN_HIT_DMG; } event.setDamage(dmg); } } } else if (data.isZAMob(damager) && damager instanceof Wolf) { event.setDamage((evtdmg - zam.getHitAbsorption()) / 2); } } /* Used to separate mob damage from player damage. * This is the player version. */ public void playerDamage(EntityDamageByEntityEvent event, Entity damager, Entity e, double evtdmg) { Player p = (Player) e; if (data.isZAPlayer(p)) { ZAPlayer zap = data.getZAPlayer(p); if (damager instanceof Player) { Player p2 = (Player) damager; if (data.isZAPlayer(p2)) { ZAPlayer hitter = data.getZAPlayer(p2); if (zap.isInLastStand()) { new LastStandPickupTask(hitter, zap, 20, 5, true); event.setCancelled(true); } if (!(Boolean) Setting.DEFAULT_FRIENDLY_FIRE_MODE.getSetting()) { event.setCancelled(true); } else { double dmg = evtdmg - zap.getHitAbsorption(); if (dmg < MIN_FRIENDLY_FIRE_DMG) { dmg = MIN_FRIENDLY_FIRE_DMG; } event.setDamage(dmg); } } else { event.setCancelled(true); } } else if (p.getHealth() <= (Double) Setting.LAST_STAND_HEALTH_THRESHOLD.getSetting() && !zap.isInLastStand() && !zap.isInLimbo()) { p.setHealth((Double) Setting.LAST_STAND_HEALTH_THRESHOLD.getSetting()); zap.toggleLastStand(); } else if (zap.isInLastStand()) { event.setCancelled(true); } if (damager instanceof Fireball) { if (!(Boolean) Setting.DEFAULT_FRIENDLY_FIRE_MODE.getSetting()) { event.setCancelled(true); } else { double dmg = evtdmg - zap.getHitAbsorption(); if (dmg < MIN_FIREBALL_DMG) { dmg = MIN_FIREBALL_DMG; } event.setDamage(dmg); } } } } }