package be.isach.ultracosmetics.cosmetics.morphs; import be.isach.ultracosmetics.UltraCosmetics; import be.isach.ultracosmetics.cosmetics.type.MorphType; import be.isach.ultracosmetics.player.UltraPlayer; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.entity.Firework; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerToggleFlightEvent; import org.bukkit.inventory.meta.FireworkMeta; import java.util.ArrayList; import java.util.Set; /** * Represents an instance of an enderman morph summoned by a player. * * @author iSach * @since 08-26-2015 */ public class MorphEnderman extends Morph { private boolean cooldown; public MorphEnderman(UltraPlayer owner, UltraCosmetics ultraCosmetics) { super(owner, MorphType.ENDERMAN, ultraCosmetics); } @Override protected void onEquip() { super.onEquip(); getPlayer().setAllowFlight(true); } @EventHandler public void onPlayerToggleFligh(PlayerToggleFlightEvent event) { if (event.getPlayer() == getPlayer() && event.getPlayer().getGameMode() != GameMode.CREATIVE && !event.getPlayer().isFlying()) { if(cooldown) { event.getPlayer().setFlying(false); event.setCancelled(true); return; } cooldown = true; Bukkit.getScheduler().runTaskLaterAsynchronously(getUltraCosmetics(), new Runnable() { @Override public void run() { cooldown = false; } }, 70); Block b = event.getPlayer().getTargetBlock((Set<Material>) null, 17); Location loc = b.getLocation(); loc.setPitch(event.getPlayer().getLocation().getPitch()); loc.setYaw(event.getPlayer().getLocation().getYaw()); event.getPlayer().teleport(loc); spawnRandomFirework(b.getLocation().add(0.5, 0, 0.5)); event.getPlayer().setFlying(false); event.setCancelled(true); } } @EventHandler public void onEntityDamage(EntityDamageEvent event) { if(event.getEntity() == getPlayer() && getOwner().getCurrentMorph() == this) { event.setCancelled(true); } } @Override public void onUpdate() { } public static FireworkEffect getRandomFireworkEffect() { FireworkEffect.Builder builder = FireworkEffect.builder(); FireworkEffect effect = builder.flicker(false).trail(false).with(FireworkEffect.Type.BALL_LARGE).withColor(Color.fromRGB(0, 0, 0)).withFade(Color.fromRGB(0, 0, 0)).build(); return effect; } public void spawnRandomFirework(Location location) { final ArrayList<Firework> fireworks = new ArrayList<>(); for (int i = 0; i < 4; i++) { final Firework f = getPlayer().getWorld().spawn(location, Firework.class); FireworkMeta fm = f.getFireworkMeta(); fm.addEffect(getRandomFireworkEffect()); f.setFireworkMeta(fm); fireworks.add(f); } Bukkit.getScheduler().runTaskLater(getUltraCosmetics(), () -> { for (Firework f : fireworks) f.detonate(); }, 2); } @Override public void onClear() { if (getPlayer().getGameMode() != GameMode.CREATIVE) { getPlayer().setAllowFlight(false); } } }