package tv.mineinthebox.essentials.events.entity; import java.util.Iterator; import java.util.LinkedList; import java.util.Random; import org.bukkit.DyeColor; import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.BlockFace; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.scheduler.BukkitRunnable; import tv.mineinthebox.essentials.xEssentials; public class EntityBleedEvent implements Listener { private final Random rand = new Random(); private final int range = 4; private final xEssentials pl; public EntityBleedEvent(xEssentials pl) { this.pl = pl; } @SuppressWarnings("deprecation") @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled=true) public void onBleed(EntityDamageEvent e) { if(e.isCancelled()) { return; } LinkedList<Location> list = new LinkedList<Location>(); for(int i = 0; i < e.getDamage()*3; i++) { Location loc = e.getEntity().getLocation(); loc.setX(loc.getX()-(range/2)); loc.setY(loc.getY()-(range/2)); loc.setZ(loc.getZ()-(range/2)); int x = rand.nextInt(range); int z = rand.nextInt(range); Location newloc = loc.add(x, 5, z); Location newloc2 = newloc.clone(); newloc2.setY(newloc.getY()-4); //Location loca = newloc.getWorld().getHighestBlockAt(newloc).getRelative(BlockFace.DOWN).getLocation(); for(Entity entity : e.getEntity().getNearbyEntities(14, 120, 14)) { if(entity instanceof Player) { if(newloc2.getBlock().getType() != Material.AIR && !newloc2.getBlock().getType().isTransparent() && !newloc2.getBlock().isLiquid()) { Player p = (Player) entity; p.getWorld().playEffect(newloc2.getBlock().getRelative(BlockFace.UP).getLocation(), Effect.STEP_SOUND, Material.REDSTONE_WIRE); p.sendBlockChange(newloc2, Material.STAINED_GLASS, DyeColor.RED.getWoolData()); //Item item = newloc.getWorld().dropItemNaturally(newloc, new ItemStack(Material.STAINED_GLASS, 64, DyeColor.RED.getWoolData())); //item.setMetadata("bleed", new FixedMetadataValue(xEssentials.getPlugin(), e.getEntity().getUniqueId())); list.add(newloc2); } } } } BleedRegen regen = new BleedRegen(list, pl); regen.startRegen(); } } class BleedRegen { private final LinkedList<Location> list; private final xEssentials pl; public BleedRegen(LinkedList<Location> list, xEssentials pl) { this.list = list; this.pl = pl; } public void startRegen() { new BukkitRunnable() { private Iterator<Location> it; public Iterator<Location> getIterator() { if(!(it instanceof Iterator)) { this.it = list.iterator(); } return it; } @Override public void run() { if(getIterator().hasNext()) { Location loc = getIterator().next(); loc.getBlock().getState().update(true); getIterator().remove(); } else { list.clear(); cancel(); } } }.runTaskTimer(pl, 0L, 80L); } }