package be.isach.ultracosmetics.cosmetics.gadgets;
import be.isach.ultracosmetics.UltraCosmetics;
import be.isach.ultracosmetics.config.MessageManager;
import be.isach.ultracosmetics.player.UltraPlayer;
import be.isach.ultracosmetics.cosmetics.type.GadgetType;
import be.isach.ultracosmetics.util.Cuboid;
import be.isach.ultracosmetics.util.MathUtils;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Chicken;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Item;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.entity.EntityUnleashEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.util.Vector;
import java.util.ArrayList;
import java.util.List;
/**
* Represents an instance of a parachute gadget summoned by a player.
*
* @author iSach
* @since 10-12-2015
*/
public class GadgetParachute extends Gadget {
List<Chicken> chickens = new ArrayList<>();
boolean active;
public GadgetParachute(UltraPlayer owner, UltraCosmetics ultraCosmetics) {
super(owner, GadgetType.PARACHUTE, ultraCosmetics);
}
@Override
void onRightClick() {
Location loc = getPlayer().getLocation();
getPlayer().teleport(loc.clone().add(0, 35, 0));
getPlayer().setVelocity(new Vector(0, 0, 0));
for (int i = 0; i < 20; i++) {
Chicken chicken = (Chicken) getPlayer().getWorld().spawnEntity(getPlayer().getLocation().add(MathUtils.randomDouble(0, 0.5), 3, MathUtils.randomDouble(0, 0.5)), EntityType.CHICKEN);
chickens.add(chicken);
chicken.setLeashHolder(getPlayer());
}
Bukkit.getScheduler().runTaskLaterAsynchronously(getUltraCosmetics(), () -> active = true, 5);
}
@Override
void onLeftClick() {
}
private void killParachute() {
for (Chicken chicken : chickens) {
chicken.setLeashHolder(null);
chicken.remove();
}
MathUtils.applyVelocity(getPlayer(), new Vector(0, 0.15, 0));
active = false;
}
@EventHandler
public void onLeashBreak(EntityUnleashEvent event) {
if (chickens.contains(event.getEntity())) {
event.getEntity().getNearbyEntities(1, 1, 1).stream().filter(ent -> ent instanceof Item
&& ((Item) ent).getItemStack().getType() == Material.LEASH).forEachOrdered(Entity::remove);
}
}
@Override
protected boolean checkRequirements(PlayerInteractEvent event) {
Location loc1 = getPlayer().getLocation().add(2, 28, 2);
Location loc2 = getPlayer().getLocation().clone().add(-2, 40, -2);
Cuboid checkCuboid = new Cuboid(loc1, loc2);
if (!checkCuboid.isEmpty()) {
getPlayer().sendMessage(MessageManager.getMessage("Gadgets.Rocket.Not-Enough-Space"));
return false;
}
return true;
}
@SuppressWarnings("deprecation")
@Override
public void onUpdate() {
if (active) {
if (!getPlayer().isOnGround() && getPlayer().getVelocity().getY() < -0.3)
MathUtils.applyVelocity(getPlayer(), getPlayer().getVelocity().add(new Vector(0, 0.1, 0)), true);
if (getPlayer().isOnGround())
killParachute();
}
}
@Override
public void onClear() {
killParachute();
HandlerList.unregisterAll(this);
}
}