//package be.isach.ultracosmetics.tempchests;
//
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.UUID;
//
//import org.bukkit.Bukkit;
//import org.bukkit.Location;
//import org.bukkit.Material;
//import org.bukkit.block.Block;
//import org.bukkit.block.BlockFace;
//import org.bukkit.block.BlockState;
//import org.bukkit.entity.ArmorStand;
//import org.bukkit.entity.Entity;
//import org.bukkit.entity.EntityType;
//import org.bukkit.entity.Player;
//import org.bukkit.event.EventHandler;
//import org.bukkit.event.Listener;
//import org.bukkit.event.block.BlockBreakEvent;
//import org.bukkit.event.player.PlayerInteractEvent;
//import org.bukkit.event.player.PlayerKickEvent;
//import org.bukkit.event.player.PlayerMoveEvent;
//import org.bukkit.inventory.meta.ItemMeta;
//import org.bukkit.material.Chest;
//import org.bukkit.material.EnderChest;
//import org.bukkit.metadata.FixedMetadataValue;
//import org.bukkit.scheduler.BukkitRunnable;
//import org.bukkit.util.Vector;
//
//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.util.BlockUtils;
//import be.isach.ultracosmetics.util.MathUtils;
//import be.isach.ultracosmetics.util.Particles;
//import be.isach.ultracosmetics.util.ServerVersion;
//import be.isach.ultracosmetics.util.SoundUtil;
//import be.isach.ultracosmetics.util.Sounds;
//import be.isach.ultracosmetics.util.UtilParticles;
//
///**
// * Manages the real treasure chests in the world.
// *
// * @author RadBuilder
// * @since 01-14-2016
// *
// * TODO Cleanup
// */
//@SuppressWarnings("deprecation")
//public class TreasurePlacer implements Listener {
// private Map<Location, Material> oldMaterials = new HashMap<>();
// private Map<Location, Byte> oldDatas = new HashMap<>();
// private ArrayList<Block> blocksToRestore = new ArrayList<>();
// private ArrayList<Block> chests = new ArrayList<>();
// private ArrayList<Block> chestsToRemove = new ArrayList<>();
// private final BukkitRunnable[] runnables = new BukkitRunnable[2];
// private TreasureChest instance;
// private TreasureRandomizer randomGenerator;
// private Location center;
// private Particles particleEffect;
// private int chestsLeft = 4;
// private UltraPlayer player;
// private List<Entity> items = new ArrayList<>();
// private List<Entity> holograms = new ArrayList<>();
// private boolean stopping;
// private boolean cooldown = false;
// private TreasureChestDesign design;
// private UltraCosmetics ultraCosmetics;
//
// public TreasurePlacer(TreasureRandomizer randomGenerator, UltraPlayer owner, TreasureChestDesign design2,
// UltraCosmetics ultraCosmetics, TreasureChest treasureChest) {
// this.randomGenerator = randomGenerator;
// this.instance = treasureChest;
// this.ultraCosmetics = ultraCosmetics;
// this.player = owner;
// Bukkit.getPluginManager().registerEvents(this, ultraCosmetics);
// if (owner.getCurrentMorph() != null) {
// owner.setSeeSelfMorph(false);
// }
// }
//
// public void start() {
// BukkitRunnable runnable = new BukkitRunnable() {
// int i = 5;
// public void run() {
// if (getPlayer() == null || getOwner().getCurrentTreasureChest() != instance) {
// cancel();
// return;
// }
//
// try {
// if (this.i == 0) {
// runnables[0] = new BukkitRunnable() {
// int i = 4;
//
// public void run() {
// if (i <= 0) {
// cancel();
// return;
// }
// if (getPlayer() == null || getOwner().getCurrentTreasureChest() != instance) {
// cancel();
// return;
// }
// UtilParticles.playHelix(getChestLocation(this.i, center.clone()), 0.0F, particleEffect);
// UtilParticles.playHelix(getChestLocation(this.i, center.clone()), 3.5F, particleEffect);
// runnables[1] = new BukkitRunnable() {
// public void run() {
// try {
// Block b = getChestLocation(i, center.clone()).getBlock();
// b.setType(design.getChestType().getType());
// SoundUtil.playSound(getPlayer(), Sounds.ANVIL_LAND, 1.4f, 1.5f);
// UtilParticles.display(Particles.SMOKE_LARGE, b.getLocation(), 5);
// UtilParticles.display(Particles.LAVA, b.getLocation(), 5);
// BlockFace blockFace = BlockFace.SOUTH;
// switch (i) {
// case 4:
// blockFace = BlockFace.SOUTH;
// break;
// case 3:
// blockFace = BlockFace.NORTH;
// break;
// case 2:
// blockFace = BlockFace.EAST;
// break;
// case 1:
// blockFace = BlockFace.WEST;
// break;
// }
//
// BlockState blockState = b.getState();
// if (design.getChestType() == ChestType.ENDER) {
// EnderChest enderChest = (EnderChest) b.getState().getData();
// enderChest.setFacingDirection(blockFace);
// blockState.setData(enderChest);
// } else {
// Chest chest = (Chest) b.getState().getData();
// chest.setFacingDirection(blockFace);
// blockState.setData(chest);
// }
// blockState.update();
//
// chests.add(b);
// i--;
// } catch (Exception exc) {
// clear();
// exc.printStackTrace();
// cancel();
// }
// }
// };
// runnables[1].runTaskLater(ultraCosmetics, 30L);
// }
// };
// runnables[0].runTaskTimer(ultraCosmetics, 0L, 50L);
// }
//
// Block lampBlock;
// switch (this.i) {
// case 5:
// lampBlock = getPlayer().getPlayer().getLocation().add(0.0D, -1.0D, 0.0D).getBlock();
// center = lampBlock.getLocation().add(0.5D, 1.0D, 0.5D);
// oldMaterials.put(lampBlock.getLocation(), lampBlock.getType());
// oldDatas.put(lampBlock.getLocation(), Byte.valueOf(lampBlock.getData()));
// blocksToRestore.add(lampBlock);
// lampBlock.setType(design.getCenter().getItemType());
// lampBlock.setData(design.getCenter().getData());
// break;
// case 4:
// for (Block b : getSurroundingBlocks(center.clone().add(0.0D, -1.0D, 0.0D).getBlock())) {
// oldMaterials.put(b.getLocation(), b.getType());
// oldDatas.put(b.getLocation(), b.getData());
// blocksToRestore.add(b);
// BlockUtils.treasureBlocks.add(b);
// b.setType(design.getBlocks2().getItemType());
// b.setData(design.getBlocks2().getData());
// }
// break;
// case 3:
// for (Block b : getSurroundingSurrounding(center.clone().add(0.0D, -1.0D, 0.0D).getBlock())) {
// oldMaterials.put(b.getLocation(), b.getType());
// oldDatas.put(b.getLocation(), Byte.valueOf(b.getData()));
// blocksToRestore.add(b);
// BlockUtils.treasureBlocks.add(b);
// b.setType(design.getBlocks3().getItemType());
// b.setData(design.getBlocks3().getData());
// }
// break;
// case 2:
// for (Block b : getBlock3(center.clone().add(0.0D, -1.0D, 0.0D).getBlock())) {
// oldMaterials.put(b.getLocation(), b.getType());
// oldDatas.put(b.getLocation(), Byte.valueOf(b.getData()));
// blocksToRestore.add(b);
// BlockUtils.treasureBlocks.add(b);
// BlockUtils.treasureBlocks.add(b);
// b.setType(design.getBelowChests().getItemType());
// b.setData(design.getBelowChests().getData());
// }
// break;
// case 1:
// for (Block b : getSurroundingSurrounding(center.getBlock())) {
// oldMaterials.put(b.getLocation(), b.getType());
// oldDatas.put(b.getLocation(), Byte.valueOf(b.getData()));
// blocksToRestore.add(b);
// BlockUtils.treasureBlocks.add(b);
// b.setType(design.getBarriers().getItemType());
// b.setData(design.getBarriers().getData());
// }
// break;
// default:
// break;
// }
// this.i -= 1;
// } catch (Exception exc) {
// cancel();
// exc.printStackTrace();
// forceOpen(0);
// }
// }
// };
// runnable.runTaskTimer(ultraCosmetics, 0L, 12L);
//
// Bukkit.getScheduler().runTaskLater(ultraCosmetics, new Runnable() {
// public void run() {
// if (getOwner().getCurrentTreasureChest() == instance)
// forceOpen(45);
// }
// }, 1200L);
//
// getOwner().setCurrentTreasureChest(instance);
//
// new BukkitRunnable() {
// public void run() {
// if (getPlayer() == null || getPlayer() == null || getOwner().getCurrentTreasureChest() != instance) {
// holograms.forEach(Entity::remove);
// cancel();
// return;
// }
// if (!getPlayer().getWorld().getName().equals(center.getWorld().getName()))
// getPlayer().teleport(center);
// if (getPlayer().getLocation().distance(center) > 1.5D)
// getPlayer().teleport(center);
// getPlayer().getNearbyEntities(2.0D, 2.0D, 2.0D).stream()
// .filter(ent -> (getOwner().getCurrentPet() == null) || ((ent != getOwner().getCurrentPet())
// && (!getOwner().getCurrentPet().items.contains(ent))))
// .filter(ent -> (!items.contains(ent)) && (ent != getPlayer()) && (!holograms.contains(ent)))
// .forEachOrdered(ent -> {
// Vector v = ent.getLocation().toVector().subtract(getPlayer().getLocation().toVector())
// .multiply(0.5D).add(new Vector(0.0D, 1.5D, 0.0D));
// v.setY(0);
// v.add(new Vector(0, 1, 0));
// MathUtils.applyVelocity(ent, v.add(MathUtils.getRandomCircleVector().multiply(0.2D)));
// });
// }
// }.runTaskTimer(ultraCosmetics, 0L, 1L);
// }
//
// public UltraPlayer getOwner() {
// return player;
// }
//
// public Player getPlayer() {
// return player.getBukkitPlayer();
// }
//
// public void clear() {
// for (Block b : this.blocksToRestore) {
// b.setType(this.oldMaterials.get(b.getLocation()));
// b.setData(this.oldDatas.get(b.getLocation()).byteValue());
// BlockUtils.treasureBlocks.remove(b);
// }
// if (!this.stopping) {
// Bukkit.getScheduler().runTaskLater(ultraCosmetics, new Runnable() {
// public void run() {
// for (Entity hologram : holograms)
// hologram.remove();
// for (Block b : chestsToRemove) {
// b.setType(Material.AIR);
// }
// for (Block b : chests) {
// b.setType(Material.AIR);
// }
// if (items != null)
// for (Entity ent : items)
// ent.remove();
// if (runnables[0] != null)
// runnables[0].cancel();
// if (runnables[1] != null)
// runnables[1].cancel();
// if (items != null)
// items.clear();
// if (chests != null)
// chests.clear();
// if (holograms != null)
// holograms.clear();
// if (chestsToRemove != null)
// chestsToRemove.clear();
// if (blocksToRestore != null)
// blocksToRestore.clear();
// if (ultraCosmetics.getPlayerManager().getUltraPlayer(getPlayer()) != null)
// ultraCosmetics.getPlayerManager().getUltraPlayer(getPlayer()).setCurrentTreasureChest(null);
// player = null;
// if (randomGenerator != null)
// randomGenerator.clear();
// }
// }, 30L);
// } else {
// for (Entity hologram : this.holograms)
// hologram.remove();
// for (Block b : this.chestsToRemove) {
// b.setType(Material.AIR);
// }
// for (Block b : this.chests) {
// b.setType(Material.AIR);
// }
// for (Entity ent : this.items)
// ent.remove();
// this.runnables[0].cancel();
// this.runnables[1].cancel();
// this.items.clear();
// this.chests.clear();
// this.holograms.clear();
// this.chestsToRemove.clear();
// this.blocksToRestore.clear();
// if (getPlayer() != null) {
// getOwner().setCurrentTreasureChest(null);
// }
// this.player = null;
// if (this.randomGenerator != null)
// this.randomGenerator.clear();
// this.randomGenerator = null;
// }
// }
//
// public List<Block> getSurroundingBlocks(Block b) {
// List<Block> blocks = new ArrayList<Block>();
// blocks.add(b.getRelative(BlockFace.EAST));
// blocks.add(b.getRelative(BlockFace.WEST));
// blocks.add(b.getRelative(BlockFace.NORTH));
// blocks.add(b.getRelative(BlockFace.SOUTH));
// blocks.add(b.getRelative(1, 0, 1));
// blocks.add(b.getRelative(-1, 0, -1));
// blocks.add(b.getRelative(1, 0, -1));
// blocks.add(b.getRelative(-1, 0, 1));
// return blocks;
// }
//
// @EventHandler
// public void onMove(PlayerMoveEvent event) {
// if ((event.getPlayer() == getPlayer()) && ((event.getFrom().getBlockX() != event.getTo().getBlockX())
// || (event.getFrom().getBlockY() != event.getTo().getBlockY())
// || (event.getFrom().getBlockZ() != event.getTo().getBlockZ()))) {
// event.setCancelled(true);
// event.getPlayer().teleport(event.getFrom());
// }
// }
//
// public void forceOpen(int delay) {
// int i;
// if (delay == 0) {
// this.stopping = true;
// for (i = 0; i < this.chestsLeft; i++) {
// this.randomGenerator.getRandomThing();
// getPlayer().sendMessage(MessageManager.getMessage("You-Won-Treasure-Chests").replace("%name%",
// this.randomGenerator.getName()));
// }
// } else {
// for (final Block b : this.chests) {
// UltraCosmeticsData.get().getVersionManager().getEntityUtil().playChestAnimation(b, true, design);
// this.randomGenerator.getRandomThing();
// org.bukkit.inventory.ItemStack is = this.randomGenerator.getReward().getItemStack();
// ItemMeta itemMeta = is.getItemMeta();
// itemMeta.setDisplayName(UUID.randomUUID().toString());
// is.setItemMeta(itemMeta);
//
// Entity entity = UltraCosmeticsData.get().getVersionManager().getEntityUtil().spawnItem(is,
// b.getLocation());
//
// this.items.add(entity);
// final String nameas = this.randomGenerator.getName();
// Bukkit.getScheduler().runTaskLater(ultraCosmetics, new Runnable() {
// public void run() {
// spawnHologram(b.getLocation().clone().add(0.5D,
// UltraCosmeticsData.get().getServerVersion() == ServerVersion.v1_9_R1 ? -0.7 : 0.3D,
// 0.5D), nameas);
// }
// }, 15L);
//
// this.chestsLeft -= 1;
// this.chestsToRemove.add(b);
// }
// this.chests.clear();
//
// Bukkit.getScheduler().runTaskLater(ultraCosmetics, new Runnable() {
// public void run() {
// clear();
// }
// }, delay);
// }
// }
//
// public List<Block> getSurroundingSurrounding(Block b) {
// List<Block> blocks = new ArrayList<Block>();
// blocks.add(b.getRelative(2, 0, 1));
// blocks.add(b.getRelative(2, 0, -1));
// blocks.add(b.getRelative(2, 0, 2));
// blocks.add(b.getRelative(2, 0, -2));
// blocks.add(b.getRelative(1, 0, -2));
// blocks.add(b.getRelative(1, 0, 2));
// blocks.add(b.getRelative(-1, 0, -2));
// blocks.add(b.getRelative(-1, 0, 2));
// blocks.add(b.getRelative(-2, 0, 1));
// blocks.add(b.getRelative(-2, 0, -1));
// blocks.add(b.getRelative(-2, 0, 2));
// blocks.add(b.getRelative(-2, 0, -2));
// return blocks;
// }
//
// public List<Block> getBlock3(Block b) {
// List<Block> blocks = new ArrayList<Block>();
// blocks.add(b.getRelative(-2, 0, 0));
// blocks.add(b.getRelative(2, 0, 0));
// blocks.add(b.getRelative(0, 0, 2));
// blocks.add(b.getRelative(0, 0, -2));
// return blocks;
// }
//
// @EventHandler
// public void onBreakBlock(BlockBreakEvent event) {
// if (this.blocksToRestore.contains(event.getBlock())) {
// event.setCancelled(true);
// return;
// }
// }
//
// private void spawnHologram(Location location, String s) {
// if (UltraCosmeticsData.get().getServerVersion().compareTo(ServerVersion.v1_9_R1) > 0) {
// location.setY(location.getY() - 1);
// }
// ArmorStand armorStand = (ArmorStand) location.getWorld().spawnEntity(location, EntityType.ARMOR_STAND);
// armorStand.setSmall(true);
// armorStand.setVisible(false);
// armorStand.setGravity(false);
// armorStand.setBasePlate(false);
// armorStand.setCustomName(s);
// armorStand.setCustomNameVisible(true);
// armorStand.setMetadata("C_AD_ArmorStand", new FixedMetadataValue(ultraCosmetics, "C_AD_ArmorStand"));
// this.holograms.add(armorStand);
// }
//
// @EventHandler
// public void onInter(final PlayerInteractEvent event) {
// if ((event.getClickedBlock() != null)
// && (event.getClickedBlock().getType() == Material.CHEST
// || event.getClickedBlock().getType() == Material.ENDER_CHEST
// || event.getClickedBlock().getType() == Material.TRAPPED_CHEST)
// && (this.chests.contains(event.getClickedBlock())) && (!this.cooldown)) {
// if (event.getPlayer() == getPlayer()) {
// UltraCosmeticsData.get().getVersionManager().getEntityUtil().playChestAnimation(event.getClickedBlock(),
// true, design);
// this.randomGenerator.getRandomThing();
//
// this.cooldown = true;
// Bukkit.getScheduler().runTaskLaterAsynchronously(ultraCosmetics, new Runnable() {
// public void run() {
// cooldown = false;
// }
// }, 3L);
//
// org.bukkit.inventory.ItemStack is = this.randomGenerator.getReward().getItemStack();
// ItemMeta itemMeta = is.getItemMeta();
// itemMeta.setDisplayName(UUID.randomUUID().toString());
// is.setItemMeta(itemMeta);
//
// Entity itemEntity = UltraCosmeticsData.get().getVersionManager().getEntityUtil().spawnItem(is,
// event.getClickedBlock().getLocation());
//
// this.items.add(itemEntity);
// final String nameas = this.randomGenerator.getName();
// Bukkit.getScheduler().runTaskLater(ultraCosmetics, new Runnable() {
// public void run() {
// spawnHologram(event.getClickedBlock().getLocation().add(0.5D,
// UltraCosmeticsData.get().getServerVersion() == ServerVersion.v1_9_R1 ? -0.7 : 0.3D,
// 0.5D), nameas);
// }
// }, 15L);
//
// this.chestsLeft -= 1;
// this.chests.remove(event.getClickedBlock());
// this.chestsToRemove.add(event.getClickedBlock());
// if (this.chestsLeft == 0)
// Bukkit.getScheduler().runTaskLater(ultraCosmetics, this::clear, 50L);
// }
// }
// }
//
// @EventHandler
// public void onKick(PlayerKickEvent event) {
// if ((event.getPlayer() == getPlayer()) && (event.getReason().contains("Fly"))) {
// event.setCancelled(true);
// event.getPlayer().teleport(this.center);
// }
// }
//
// public Location getChestLocation(int i, Location loc) {
// Location chestLocation = this.center.clone();
// chestLocation.setX(loc.getBlockX() + 0.5D);
// chestLocation.setY(loc.getBlockY());
// chestLocation.setZ(loc.getBlockZ() + 0.5D);
// switch (i) {
// case 1:
// chestLocation.add(2.0D, 0.0D, 0.0D);
// break;
// case 2:
// chestLocation.add(-2.0D, 0.0D, 0.0D);
// break;
// case 3:
// chestLocation.add(0.0D, 0.0D, 2.0D);
// break;
// case 4:
// chestLocation.add(0.0D, 0.0D, -2.0D);
// }
// return chestLocation;
// }
//}