//package mineplex.core.treasure; // //import java.util.ArrayList; //import java.util.LinkedList; //import java.util.List; //import java.util.concurrent.TimeUnit; // //import org.bukkit.Bukkit; //import org.bukkit.Location; //import org.bukkit.Material; //import org.bukkit.entity.ArmorStand; //import org.bukkit.entity.LivingEntity; //import org.bukkit.entity.Player; //import org.bukkit.event.EventHandler; //import org.bukkit.event.Listener; //import org.bukkit.event.player.PlayerInteractEvent; //import org.bukkit.event.player.PlayerMoveEvent; //import org.bukkit.event.player.PlayerQuitEvent; // //import mineplex.core.common.util.C; //import mineplex.core.common.util.F; //import mineplex.core.common.util.UtilAction; //import mineplex.core.common.util.UtilAlg; //import mineplex.core.common.util.UtilEnt; //import mineplex.core.common.util.UtilEvent; //import mineplex.core.common.util.UtilEvent.ActionType; //import mineplex.core.common.util.UtilMath; //import mineplex.core.common.util.UtilServer; //import mineplex.core.common.util.UtilText; //import mineplex.core.common.util.UtilTime; //import mineplex.core.gadget.types.GadgetType; //import mineplex.core.reward.Reward; //import mineplex.core.reward.RewardData; //import mineplex.core.reward.rewards.GadgetReward; //import mineplex.core.reward.rewards.TitleReward; //import mineplex.core.reward.rewards.TreasureShardReward; //import mineplex.core.treasure.animation.TreasureAnimation; //import mineplex.core.treasure.animation.TreasureRewardAnimation; //import mineplex.core.treasure.reward.RewardRarity; //import mineplex.core.treasure.types.Treasure; //import mineplex.core.treasure.util.TreasureUtil; //import mineplex.core.updater.UpdateType; //import mineplex.core.updater.event.UpdateEvent; // //public class TreasureSession implements Listener //{ // // private static final double CHEST_RADIUS = 3.5; // private static final long TIMEOUT = TimeUnit.MINUTES.toMillis(1); // // private final Player _player; // private final TreasureLocation _treasureLocation; // private final Treasure _treasure; // private final TreasureAnimation _animation; // private final List _rewardAnimations; // private final List _rewards; // private final List _rewardData; // private final List _openedChests; // private final long _start; // // TreasureSession(Player player, TreasureLocation treasureLocation, Treasure treasure) // { // _player = player; // _treasureLocation = treasureLocation; // _treasure = treasure; // _animation = treasure.getAnimations(treasureLocation); // _rewardAnimations = new ArrayList<>(); // _rewards = Treasure.getRewardManager().getRewards(player, treasure); // _rewardData = new ArrayList<>(treasure.getRewardsPerChest()); // _openedChests = new ArrayList<>(treasure.getRewardsPerChest()); // _start = System.currentTimeMillis(); // } // // public void register() // { // _rewards.forEach(reward -> reward.giveReward(_player, _rewardData::add)); // _animation.setRunning(true); // UtilServer.RegisterEvents(this); // } // // @EventHandler // public void chestInteract(PlayerInteractEvent event) // { // if (!UtilEvent.isAction(event, ActionType.R_BLOCK)) // { // return; // } // // Player player = event.getPlayer(); // Location location = event.getClickedBlock().getLocation(); // // boolean found = false; // // for (Location chestLocation : _treasureLocation.getChestLocations()) // { // if (!chestLocation.getBlock().equals(location.getBlock())) // { // continue; // } // // found = true; // break; // } // // if (!found) // { // return; // } // // event.setCancelled(true); // // if (!_player.equals(player) || _openedChests.contains(location) || isDone()) // { // return; // } // // RewardData rewardData = _rewardData.get(_openedChests.size()); // Reward reward = _rewards.get(_openedChests.size()); // RewardRarity rarity = rewardData.getRarity(); // TreasureRewardAnimation rewardAnimation = TreasureRewardAnimation.getAnimationFor(_treasure, _treasureLocation, location.clone().add(0.5, 1, 0.5), rewardData); // // _openedChests.add(location); // // Material material = event.getClickedBlock().getType(); // // if (material == Material.CHEST || material == Material.TRAPPED_CHEST || material == Material.ENDER_CHEST) // { // TreasureUtil.playChestOpen(location, true); // } // // if (rarity.ordinal() >= RewardRarity.RARE.ordinal()) // { // boolean an = UtilText.startsWithVowel(rewardData.getFriendlyName()); // // String message = F.name(player.getName()) + " found " + (an ? "an" : "a") + " " + F.name(rarity.getColor() + rarity.getName()) + " " + F.name(rewardData.getFriendlyName()); // // Reward actualReward = reward; // String type = null; // // if (reward instanceof TreasureShardReward) // { // actualReward = ((TreasureShardReward) reward).getOtherReward(); // } // // // Add reward type to chat where possible // if (actualReward instanceof GadgetReward) // { // GadgetType gadgetType = ((GadgetReward) actualReward).getGadget().getGadgetType(); // // // Don't set type if the reward contains the first word in the gadget's singular name. // // This will catch "arrow" from "arrow trail", "death" from "death effect", etc. // // It's possible this will have some false positives. // if (rewardData.getFriendlyName().toLowerCase().contains(gadgetType.getSingularType().toLowerCase().split(" ")[0])) // { // type = null; // } // else // { // type = gadgetType.getSingularType(); // } // } // else if (actualReward instanceof TitleReward) // { // type = "Title"; // } // // if (type != null && !rewardData.getFriendlyName().toLowerCase().contains(type.toLowerCase())) // { // message += C.cGray + " (" + C.cAqua + type + C.cGray + ")"; // } // // message += C.cGray + "."; // // Bukkit.broadcastMessage(F.main(_treasureLocation.getManager().getName(), message)); // } // // if (rewardAnimation != null) // { // _rewardAnimations.add(rewardAnimation); // rewardAnimation.setRunning(true); // } // // if (isDone()) // { // UtilServer.runSyncLater(this::cleanup, 5 * 20); // } // } // // @EventHandler // public void playerQuit(PlayerQuitEvent event) // { // if (!event.getPlayer().equals(getPlayer())) // { // return; // } // // cleanup(); // } // // public void cleanup() // { // UtilServer.Unregister(this); // _animation.cleanup(); // _rewardAnimations.forEach(TreasureRewardAnimation::cleanup); // _treasureLocation.cleanup(); // } // // @EventHandler // public void updateAnimation(UpdateEvent event) // { // if (event.getType() != UpdateType.TICK) // { // return; // } // // _rewardAnimations.stream() // .filter(TreasureAnimation::isRunning) // .forEach(TreasureAnimation::run); // // if (_animation.isRunning()) // { // _animation.run(); // } // } // // @EventHandler // public void updateEntities(UpdateEvent event) // { // if (event.getType() != UpdateType.FAST) // { // return; // } // // pushEntitiesAway(); // } // // void pushEntitiesAway() // { // for (LivingEntity entity : UtilEnt.getInRadius(_treasureLocation.getChest(), CHEST_RADIUS).keySet()) // { // if (entity.equals(_player) || entity instanceof ArmorStand || _animation.getEntities().contains(entity)) // { // continue; // } // // UtilAction.velocity(entity, UtilAlg.getTrajectory(_treasureLocation.getChest(), entity.getLocation()).setY(1)); // } // } // // @EventHandler // public void playerMove(PlayerMoveEvent event) // { // Player player = event.getPlayer(); // // if (!player.equals(getPlayer())) // { // return; // } // // if (UtilMath.offset2dSquared(player.getLocation(), _treasureLocation.getChest()) > CHEST_RADIUS * CHEST_RADIUS) // { // event.setTo(_treasureLocation.getChest()); // } // } // // @EventHandler // public void updateTimeout(UpdateEvent event) // { // if (event.getType() != UpdateType.SLOW || !UtilTime.elapsed(_start, TIMEOUT)) // { // return; // } // // getPlayer().sendMessage(F.main(_treasureLocation.getManager().getName(), "You took too long opening your chest. I picked your rewards for you:")); // // for (RewardData rewardData : _rewardData) // { // getPlayer().sendMessage(F.main(_treasureLocation.getManager().getName(), rewardData.getHeader() + " : " + rewardData.getFriendlyName())); // } // // cleanup(); // } // // public Player getPlayer() // { // return _player; // } // // public Treasure getTreasure() // { // return _treasure; // } // // public List getRewards() // { // return _rewards; // } // // boolean hasFailed() // { // return _rewards == null; // } // // private boolean isDone() // { // return _openedChests.size() == _treasure.getRewardsPerChest(); // } //}