package be.isach.ultracosmetics.cosmetics.gadgets;
import be.isach.ultracosmetics.UltraCosmetics;
import be.isach.ultracosmetics.player.UltraPlayer;
import be.isach.ultracosmetics.cosmetics.type.GadgetType;
import org.bukkit.*;
import org.bukkit.entity.EnderPearl;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
/**
* Represents an instance of a ethereal pearl gadget summoned by a player.
*
* @author iSach
* @since 08-03-2015
*/
public class GadgetEtherealPearl extends Gadget implements Listener {
private EnderPearl pearl;
public GadgetEtherealPearl(UltraPlayer owner, UltraCosmetics ultraCosmetics) {
super(owner, GadgetType.ETHEREALPEARL, ultraCosmetics);
}
@Override
public void onClear() {
if (pearl != null) {
pearl.remove();
}
}
@Override
void onRightClick() {
if (getOwner().getCurrentMount() != null) {
getOwner().removeMount();
}
if (getPlayer().getVehicle() instanceof EnderPearl) {
getPlayer().getVehicle().remove();
}
EnderPearl pearl = getPlayer().launchProjectile(EnderPearl.class);
pearl.setVelocity(getPlayer().getEyeLocation().getDirection().multiply(1.53d));
pearl.setPassenger(getPlayer());
getPlayer().teleport(getPlayer().getLocation().add(0, 5, 0));
if (!getPlayer().getAllowFlight()) {
getPlayer().setAllowFlight(true);
}
}
@EventHandler
public void onDamage(EntityDamageEvent event) {
if (event.getEntity() instanceof Player && event.getEntity() == getPlayer()) {
event.setCancelled(true);
}
}
@EventHandler
public void onToggleSneak(PlayerToggleSneakEvent event) {
if (pearl != null && event.getPlayer().getName().equals(getPlayer().getName())) {
getPlayer().eject();
if (getPlayer().getGameMode() != GameMode.CREATIVE) {
getPlayer().setAllowFlight(false);
}
spawnRandomFirework(getPlayer().getLocation());
pearl.remove();
}
}
public FireworkEffect getRandomFireworkEffect() {
FireworkEffect.Builder builder = FireworkEffect.builder();
FireworkEffect effect = builder.flicker(false).trail(false).with(FireworkEffect.Type.BALL_LARGE).withColor(Color.fromRGB(100, 0, 100)).withFade(Color.fromRGB(30, 0, 30)).build();
return effect;
}
public void spawnRandomFirework(Location location) {
final ArrayList<Firework> fireworks = new ArrayList<>();
Bukkit.getScheduler().runTask(getUltraCosmetics(), () -> {
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(), () -> fireworks.forEach(Firework::detonate), 2);
}
@EventHandler
public void onItemFrameBreak(HangingBreakByEntityEvent event) {
if (pearl == event.getRemover()
|| event.getRemover() == getPlayer()) {
event.setCancelled(true);
}
}
@EventHandler
public void onProjectileHit(ProjectileHitEvent event) {
if (event.getEntity() instanceof EnderPearl) {
if (pearl == event.getEntity()) {
event.getEntity().remove();
pearl = null;
}
}
}
@Override
public void onUpdate() {
if (pearl != null && pearl.isValid()) {
getPlayer().eject();
pearl.setPassenger(getPlayer());
if (getPlayer().isOnGround()) {
pearl.remove();
pearl = null;
}
} else {
getPlayer().eject();
if (getPlayer().getGameMode() != GameMode.CREATIVE) {
getPlayer().setAllowFlight(false);
}
pearl = null;
spawnRandomFirework(getPlayer().getLocation());
}
}
@Override
void onLeftClick() {
}
}