package de.steamwar.lobby.jumpandrun; import de.steamwar.lobby.LobbySystem; import de.steamwar.lobby.listener.BasicListener; import de.steamwar.lobby.listener.PlayerSpawn; import de.steamwar.lobby.util.Leaderboard; import de.steamwar.sql.UserConfig; import net.md_5.bungee.api.ChatMessageType; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; import java.text.SimpleDateFormat; import java.util.*; public class JumpAndRun extends BasicListener { public static final String JUMP_AND_RUN_CONFIG = "jump_and_run"; private static final String BAR_EMPTY = "||||||||||||||||||||||||||||||"; public static List points = new ArrayList<>(); public static List actualPoints = new ArrayList<>(); private static final Map CURRENT_POS = new HashMap<>(); private static final Map FAILS = new HashMap<>(); private static final Map START = new HashMap<>(); private static final Map CLICKED = new HashMap<>(); private static final Map CLICKED_COUNT = new HashMap<>(); private static final Leaderboard LEADERBOARD = new Leaderboard(LobbySystem.getEntityServer(false), JUMP_AND_RUN_CONFIG, new Location(Bukkit.getWorlds().get(0), 2338.5, 42.5, 1231.5), 5); { Bukkit.getScheduler().runTaskTimer(LobbySystem.getPlugin(), () -> { Set toReset = new HashSet<>(); CURRENT_POS.forEach((player, index) -> { if (System.currentTimeMillis() - CLICKED.getOrDefault(player, 0L) > 500) { CLICKED.remove(player); CLICKED_COUNT.remove(player); } else { CLICKED_COUNT.put(player, CLICKED_COUNT.getOrDefault(player, -1) + 1); } Location location = player.getLocation(); Vector point = points.get(index); if (index < points.size() - 1) { Vector nextPoint = points.get(index + 1); double y = Math.min(point.getY(), nextPoint.getY()) - 2; if (location.getY() < y) { location.setX(point.getX()); location.setY(point.getY()); location.setZ(point.getZ()); player.teleport(location); player.playSound(location, Sound.ENTITY_ENDERMAN_TELEPORT, 1, 1); FAILS.put(player, FAILS.getOrDefault(player, 0) + 1); } } int count = CLICKED_COUNT.getOrDefault(player, -1); if (count >= 0) { if (count > 60) { toReset.add(player); return; } count = Math.min(count / 2, 30); LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_CANCEL", player, ChatMessageType.ACTION_BAR, "§e" + BAR_EMPTY.substring(0, count) + "§7" + BAR_EMPTY.substring(count)); } else { long time = System.currentTimeMillis() - START.get(player); SimpleDateFormat format = new SimpleDateFormat(LobbySystem.getMessage().parse("JUMP_AND_RUN_TIME", player), Locale.ROOT); String parsed = format.format(new Date(time)); LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_PROGRESS", player, ChatMessageType.ACTION_BAR, index + 1, points.size(), FAILS.get(player), parsed); } }); toReset.forEach(player -> { reset(player); player.teleport(Bukkit.getWorlds().get(0).getSpawnLocation().clone().add(0.5, 0, 0.5)); }); }, 1, 1); } public static boolean isPlayerInJumpAndRun(Player player) { return CURRENT_POS.containsKey(player); } @EventHandler public void onPlayerMove(PlayerMoveEvent event) { Location location = event.getTo(); Location checkLocation = location.clone(); checkLocation.setY(checkLocation.getY() - 0.1); if (checkLocation.getBlock().getType() == Material.AIR) { return; } int index = CURRENT_POS.getOrDefault(event.getPlayer(), -1) + 1; if (index >= points.size()) { return; } Vector point = points.get(index); if (location.getY() < point.getY()) { return; } if (location.toVector().distanceSquared(point) >= 12.25) { return; } CURRENT_POS.put(event.getPlayer(), index); event.getPlayer().playSound(event.getPlayer().getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 0.4F, 1); if (index < points.size() - 1) { event.getPlayer().setCompassTarget(points.get(index + 1).toLocation(location.getWorld())); } if (index == 0) { event.getPlayer().setAllowFlight(false); event.getPlayer().getInventory().clear(); event.getPlayer().updateInventory(); event.getPlayer().getInventory().setItem(4, new ItemStack(Material.COMPASS, 1)); FAILS.put(event.getPlayer(), 0); START.put(event.getPlayer(), System.currentTimeMillis()); } if (index == points.size() - 1) { long time = System.currentTimeMillis() - START.get(event.getPlayer()); SimpleDateFormat format = new SimpleDateFormat(LobbySystem.getMessage().parse("JUMP_AND_RUN_TIME", event.getPlayer()), Locale.ROOT); String parsed = format.format(new Date(time)); LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_FINISHED", event.getPlayer(), parsed, FAILS.get(event.getPlayer())); updateJumpAndRunTime(event.getPlayer(), time); reset(event.getPlayer()); } } private void updateJumpAndRunTime(Player player, long time) { String jumpAndRunTimeConfig = UserConfig.getConfig(player.getUniqueId(), JUMP_AND_RUN_CONFIG); if (jumpAndRunTimeConfig == null) { UserConfig.updatePlayerConfig(player.getUniqueId(), JUMP_AND_RUN_CONFIG, time + ""); } else { long jumpAndRunTime = Long.parseLong(jumpAndRunTimeConfig); if (time < jumpAndRunTime) { SimpleDateFormat format = new SimpleDateFormat(LobbySystem.getMessage().parse("JUMP_AND_RUN_TIME", player), Locale.ROOT); String parsed = format.format(new Date(jumpAndRunTime - time)); LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_PERSONAL_BEST", player, parsed); UserConfig.updatePlayerConfig(player.getUniqueId(), JUMP_AND_RUN_CONFIG, time + ""); LEADERBOARD.update(); } } } @EventHandler public void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); CURRENT_POS.remove(player); START.remove(player); FAILS.remove(player); CLICKED.remove(player); CLICKED_COUNT.remove(player); } @EventHandler public void onPlayerInteract(PlayerInteractEvent event) { if (event.getItem() == null) return; if (event.getItem().getType() != Material.COMPASS) return; if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) return; event.setCancelled(true); CLICKED.put(event.getPlayer(), System.currentTimeMillis()); } public static void reset(Player player) { // PlayerSpawn.giveItems(player); // player.setAllowFlight(true); CURRENT_POS.remove(player); START.remove(player); FAILS.remove(player); CLICKED.remove(player); CLICKED_COUNT.remove(player); } }