package pw.yumc.MiaoLobby; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import pw.yumc.MiaoLobby.config.Config; import pw.yumc.MiaoLobby.event.PreLobbyTpEvent; import pw.yumc.YumCore.bukkit.Log; import pw.yumc.YumCore.bukkit.P; import pw.yumc.YumCore.bukkit.compatible.C; import java.security.SecureRandom; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author 喵♂呜 * @since 2016/12/25 0025 */ public class Util { private final static SecureRandom random = new SecureRandom(); private static MiaoLobby plugin = P.getPlugin(); private static Config config = plugin.config; private static Map tasks = new HashMap<>(); public static void delayTp(final Player player) { if (tasks.containsKey(player.getName())) { Log.sender(player, config.TPing); return; } tasks.put(player.getName(), new BukkitRunnable() { int delay = config.AutoTPDelay; @Override public void run() { if (player.isOnline()) { if (delay > 0) { C.ActionBar.send(player, String.format(plugin.config.TPDelay, delay)); delay--; return; } random(player); } this.cancel(); } }.runTaskTimerAsynchronously(plugin, 0, 20)); } public static void delayTpTargetEvent(final Player player) { PreLobbyTpEvent event = new PreLobbyTpEvent(player); Bukkit.getPluginManager().callEvent(event); if (!event.isCancelled()) { delayTp(player); } } public static void cancel(Player player) { if (player != null) { BukkitTask task = tasks.remove(player.getName()); if (task != null) { task.cancel(); } } } public static void connect(final Player p, final String server) { final ByteArrayDataOutput out = ByteStreams.newDataOutput(); try { out.writeUTF("Connect"); out.writeUTF(server); } catch (final Exception ignored) { } p.sendPluginMessage(plugin, "BungeeCord", out.toByteArray()); } public static void random(final Player player) { new BukkitRunnable() { final List servers = new ArrayList<>(config.Servers); int i = 0; @Override public void run() { if (servers.isEmpty()) { if (config.ReTry) { servers.addAll(config.Servers); return; } C.ActionBar.send(player, config.Unavailable); player.sendMessage(config.Unavailable); } else if (player.isOnline()) { final String serverName = servers.remove(random.nextInt(servers.size())); C.ActionBar.send(player, String.format(i > 0 ? config.TimeOut : config.Message, serverName)); connect(player, serverName); i++; return; } Util.cancel(player); this.cancel(); } }.runTaskTimerAsynchronously(plugin, 0, config.WaitTime); } }