/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package org.arkhamnetwork.arcade.commons.utils; import java.util.UUID; import org.arkhamnetwork.arcade.commons.bar.FakeDragon; import org.arkhamnetwork.arcade.commons.storage.ArcadeHashMap; import org.arkhamnetwork.arcade.core.Arcade; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerTeleportEvent; /** * * @author devan_000 */ public class BarUtils implements Listener { private static Arcade plugin = Arcade.getInstance(); private static final ArcadeHashMap<UUID, FakeDragon> players = new ArcadeHashMap<>(); private static final ArcadeHashMap<UUID, Integer> timers = new ArcadeHashMap<>(); @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void PlayerLoggout(PlayerQuitEvent event) { quit(event.getPlayer()); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerKick(PlayerKickEvent event) { quit(event.getPlayer()); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerTeleport(final PlayerTeleportEvent event) { handleTeleport(event.getPlayer(), event.getTo().clone()); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerTeleport(final PlayerRespawnEvent event) { handleTeleport(event.getPlayer(), event.getRespawnLocation().clone()); } private void handleTeleport(final Player player, final Location loc) { if (!hasBar(player)) { return; } Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, new Runnable() { @Override public void run() { // Check if the player still has a dragon after the two // ticks! ;) if (!hasBar(player)) { return; } FakeDragon oldDragon = getDragon(player, ""); float health = oldDragon.health; String message = oldDragon.name; NMSUtil.sendNMSPacket(player, getDragon(player, "") .getDestroyPacket()); players.remove(player.getUniqueId()); FakeDragon dragon = addDragon(player, loc, message); dragon.health = health; sendDragon(dragon, player); } }, 2L); } private void quit(Player player) { removeBar(player); } public static void setMessage(String message) { final Player[] players = Arcade.getInstance().getServer() .getOnlinePlayers(); for (Player player : players) { setMessage(player, message); } } public static void setMessage(Player player, String message) { FakeDragon dragon = getDragon(player, message); dragon.name = cleanMessage(message); dragon.health = FakeDragon.MAX_HEALTH; cancelTimer(player); sendDragon(dragon, player); } public static void setMessage(String message, float percent) { final Player[] players = Arcade.getInstance().getServer() .getOnlinePlayers(); for (Player player : players) { setMessage(player, message, percent); } } public static void setMessage(Player player, String message, float percent) { FakeDragon dragon = getDragon(player, message); dragon.name = cleanMessage(message); dragon.health = (percent / 100f) * FakeDragon.MAX_HEALTH; cancelTimer(player); sendDragon(dragon, player); } public static void setMessage(String message, int seconds) { final Player[] players = Arcade.getInstance().getServer() .getOnlinePlayers(); for (Player player : players) { setMessage(player, message, seconds); } } public static void setMessage(final Player player, String message, int seconds) { FakeDragon dragon = getDragon(player, message); dragon.name = cleanMessage(message); dragon.health = FakeDragon.MAX_HEALTH; final float dragonHealthMinus = FakeDragon.MAX_HEALTH / seconds; cancelTimer(player); timers.put(player.getUniqueId(), Bukkit.getScheduler() .runTaskTimerAsynchronously(plugin, new Runnable() { @Override public void run() { FakeDragon drag = getDragon(player, ""); drag.health -= dragonHealthMinus; if (drag.health <= 1) { removeBar(player); cancelTimer(player); } else { sendDragon(drag, player); } } }, 20L, 20L).getTaskId()); sendDragon(dragon, player); } public static boolean hasBar(Player player) { return players.get(player.getUniqueId()) != null; } public static void removeBar(Player player) { if (!hasBar(player)) { return; } NMSUtil.sendNMSPacket(player, getDragon(player, "").getDestroyPacket()); players.remove(player.getUniqueId()); cancelTimer(player); } public static void setHealth(Player player, float percent) { if (!hasBar(player)) { return; } FakeDragon dragon = getDragon(player, ""); dragon.health = (percent / 100f) * FakeDragon.MAX_HEALTH; cancelTimer(player); if (percent == 0) { removeBar(player); } else { sendDragon(dragon, player); } } public static float getHealth(Player player) { if (!hasBar(player)) { return -1; } return getDragon(player, "").health; } public static String getMessage(Player player) { if (!hasBar(player)) { return ""; } return getDragon(player, "").name; } private static String cleanMessage(String message) { if (message.length() > 64) { message = message.substring(0, 63); } return message; } private static void cancelTimer(Player player) { Integer timerID = timers.remove(player.getUniqueId()); if (timerID != null) { Bukkit.getScheduler().cancelTask(timerID); } } private static void sendDragon(FakeDragon dragon, Player player) { NMSUtil.sendNMSPacket(player, dragon.getMetaPacket(dragon.getWatcher())); NMSUtil.sendNMSPacket(player, dragon.getTeleportPacket(player.getLocation().add(0, -300, 0))); } private static FakeDragon getDragon(Player player, String message) { if (hasBar(player)) { return players.get(player.getUniqueId()); } else { return addDragon(player, cleanMessage(message)); } } private static FakeDragon addDragon(Player player, String message) { FakeDragon dragon = NMSUtil.newDragon(message, player.getLocation() .add(0, -300, 0)); NMSUtil.sendNMSPacket(player, dragon.getSpawnPacket()); players.put(player.getUniqueId(), dragon); return dragon; } private static FakeDragon addDragon(Player player, Location loc, String message) { FakeDragon dragon = NMSUtil.newDragon(message, loc.add(0, -300, 0)); NMSUtil.sendNMSPacket(player, dragon.getSpawnPacket()); players.put(player.getUniqueId(), dragon); return dragon; } }