package be.isach.ultracosmetics.cosmetics.gadgets; import be.isach.ultracosmetics.UltraCosmetics; import be.isach.ultracosmetics.UltraCosmeticsData; import be.isach.ultracosmetics.config.MessageManager; import be.isach.ultracosmetics.player.UltraPlayer; import be.isach.ultracosmetics.cosmetics.type.GadgetType; import be.isach.ultracosmetics.util.*; import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Location; import org.bukkit.entity.Sheep; import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerShearEntityEvent; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * Represents an instance of a explosive sheep gadget summoned by a player. * * @author iSach * @since 08-08-2015 */ public class GadgetExplosiveSheep extends Gadget { public static final List<GadgetExplosiveSheep> EXPLOSIVE_SHEEP = new ArrayList<>(); private ArrayList<Sheep> sheepArrayList = new ArrayList<>(); public GadgetExplosiveSheep(UltraPlayer owner, UltraCosmetics ultraCosmetics) { super(owner, GadgetType.EXPLOSIVESHEEP, ultraCosmetics); } @Override void onRightClick() { Location loc = getPlayer().getLocation().add(getPlayer().getEyeLocation().getDirection().multiply(0.5)); loc.setY(getPlayer().getLocation().getBlockY() + 1); Sheep s = getPlayer().getWorld().spawn(loc, Sheep.class); s.setNoDamageTicks(100000); sheepArrayList.add(s); UltraCosmeticsData.get().getVersionManager().getEntityUtil().clearPathfinders(s); EXPLOSIVE_SHEEP.add(this); new SheepColorRunnable(7, true, s, this); } @Override void onLeftClick() { } @Override protected boolean checkRequirements(PlayerInteractEvent event) { if (GadgetExplosiveSheep.EXPLOSIVE_SHEEP.size() > 0) { getPlayer().sendMessage(MessageManager.getMessage("Gadgets.ExplosiveSheep.Already-Active")); return false; } return true; } @EventHandler public void onShear(PlayerShearEntityEvent event) { if (sheepArrayList.contains(event.getEntity())) event.setCancelled(true) ; } @EventHandler public void onShear(EntityDamageEvent event) { if (sheepArrayList.contains(event.getEntity())) event.setCancelled(true); } @Override public void onUpdate() { } @Override public void onClear() { try { for (Sheep sheep : sheepArrayList) { sheep.remove(); } } catch (Exception exc) { exc.printStackTrace(); } EXPLOSIVE_SHEEP.remove(this); HandlerList.unregisterAll(this); } class SheepColorRunnable extends BukkitRunnable { private boolean red; private double time; private Sheep s; private GadgetExplosiveSheep gadgetExplosiveSheep; public SheepColorRunnable(double time, boolean red, Sheep s, GadgetExplosiveSheep gadgetExplosiveSheep) { this.red = red; this.time = time; this.s = s; this.runTaskLater(UltraCosmeticsData.get().getPlugin(), (int) time); this.gadgetExplosiveSheep = gadgetExplosiveSheep; } @Override public void run() { if (getOwner() == null || getPlayer() == null) { cancel(); return; } if (red) s.setColor(DyeColor.RED); else s.setColor(DyeColor.WHITE); SoundUtil.playSound(s.getLocation(), Sounds.NOTE_STICKS, 1.4f, 1.5f); red = !red; time -= 0.2; if (time < 0.5) { SoundUtil.playSound(s.getLocation(), Sounds.EXPLODE, 1.4f, 1.5f); UtilParticles.display(Particles.EXPLOSION_HUGE, s.getLocation()); for (int i = 0; i < 50; i++) { if (getOwner() == null || getPlayer() == null) { return; } final Sheep sheep = getPlayer().getWorld().spawn(s.getLocation(), Sheep.class); try { sheep.setColor(DyeColor.values()[MathUtils.randomRangeInt(0, 15)]); } catch (Exception exc) { exc.printStackTrace(); } Random r = new Random(); MathUtils.applyVelocity(sheep, new Vector(r.nextDouble() - 0.5, r.nextDouble() / 2, r.nextDouble() - 0.5).multiply(2).add(new Vector(0, 0.8, 0))); sheep.setBaby(); sheep.setAgeLock(true); sheep.setNoDamageTicks(120); sheepArrayList.add(sheep); UltraCosmeticsData.get().getVersionManager().getEntityUtil().clearPathfinders(sheep); UltraCosmeticsData.get().getVersionManager().getEntityUtil().makePanic(sheep); Bukkit.getScheduler().runTaskLater(getUltraCosmetics(), () -> { UtilParticles.display(Particles.LAVA, sheep.getLocation(), 5); sheep.remove(); EXPLOSIVE_SHEEP.remove(gadgetExplosiveSheep); }, 110); } sheepArrayList.remove(s); s.remove(); cancel(); } else { Bukkit.getScheduler().cancelTask(getTaskId()); new SheepColorRunnable(time, red, s, gadgetExplosiveSheep); } } } }