package com.walrusone.skywars.menus; import java.util.ArrayList; import java.util.List; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import com.google.common.collect.Lists; import com.walrusone.skywars.SkyWarsReloaded; import com.walrusone.skywars.game.Game; import com.walrusone.skywars.game.GamePlayer; import com.walrusone.skywars.game.Game.GameState; import com.walrusone.skywars.utilities.IconMenu; import com.walrusone.skywars.utilities.Messaging; public class SpecGameMenu { private static final int menuSlotsPerRow = 9; private static final int menuSize = 81; private static final String menuName = new Messaging.MessageFormatter().format("menu.spectategame-menu-title"); public SpecGameMenu(final GamePlayer gamePlayer) { List<Game> availableGames = SkyWarsReloaded.getGC().getGames(); int rowCount = menuSlotsPerRow; while (rowCount < availableGames.size() && rowCount < menuSize) { rowCount += menuSlotsPerRow; } SkyWarsReloaded.getIC().create(gamePlayer.getP(), menuName, rowCount, new IconMenu.OptionClickEventHandler() { @Override public void onOptionClick(IconMenu.OptionClickEvent event) { if (!SkyWarsReloaded.getCfg().spectatingEnabled()) { return; } if (gamePlayer.inGame()) { event.getPlayer().sendMessage(new Messaging.MessageFormatter().format("error.no-spectate-other-worlds")); return; } Game game = SkyWarsReloaded.getGC().getGame(Integer.parseInt(ChatColor.stripColor(event.getName()))); if (game == null) { return; } if (game.getState() == GameState.ENDING) { return; } if (!gamePlayer.getP().hasPermission("swr.spectate")) { event.getPlayer().sendMessage(new Messaging.MessageFormatter().format("error.no-spectate-perm")); return; } event.setWillClose(true); event.setWillDestroy(true); if (gamePlayer.getP() != null) { SkyWarsReloaded.getInvC().add(gamePlayer.getP()); Location location = game.getSpawn(); if (game.getState() == GameState.PREGAME) { gamePlayer.spectateMode(true, game, location.add(0, 4, 0), false); } else if (game.getState() == GameState.PLAYING) { gamePlayer.spectateMode(true, game, location, false); } } } }); ArrayList<Game> games = SkyWarsReloaded.getGC().getGames(); for (int iii = 0; iii < games.size(); iii++) { if (iii >= menuSize) { break; } Game game = games.get(iii); List<String> loreList = Lists.newLinkedList(); loreList.add(ChatColor.RED + "" + ChatColor.BOLD + game.getMapName().toUpperCase()); loreList.add((new Messaging.MessageFormatter().format("menu.spectate-game-header") + " " + game.getPlayers().size() + "/" + game.getNumberOfSpawns())); for (GamePlayer gPlayer: game.getPlayers()) { if (gPlayer.getP() != null) { loreList.add(ChatColor.WHITE + gPlayer.getP().getName()); } } Material gameIcon = Material.REDSTONE_BLOCK; String gameNumber = String.valueOf(game.getGameNumber()); if (game.getState() == GameState.PREGAME) { gameIcon = Material.EMERALD_BLOCK; } else if (game.getState() == GameState.ENDING) { gameIcon = Material.LAPIS_BLOCK; } if (gamePlayer.getP() != null) { SkyWarsReloaded.getIC().setOption( gamePlayer.getP(), iii, new ItemStack(gameIcon, 1), gameNumber, loreList.toArray(new String[loreList.size()])); } } if (gamePlayer.getP() != null) { SkyWarsReloaded.getIC().show(gamePlayer.getP()); } final GamePlayer player = gamePlayer; SkyWarsReloaded.get().getServer().getScheduler().scheduleSyncDelayedTask(SkyWarsReloaded.get(), new Runnable() { @Override public void run() { updateSpectateMenu(player); } }, 40); } public void updateSpectateMenu(final GamePlayer gamePlayer) { if (!SkyWarsReloaded.getIC().has(gamePlayer.getP()) || gamePlayer.isSpectating() || !SkyWarsReloaded.getIC().getMenu(gamePlayer.getP()).getName().equalsIgnoreCase(menuName)) { return; } else { ArrayList<Game> games = SkyWarsReloaded.getGC().getGames(); for (int iii = 0; iii < games.size(); iii++) { if (iii >= menuSize) { break; } Game game = games.get(iii); List<String> loreList = Lists.newLinkedList(); loreList.add(ChatColor.RED + "" + ChatColor.BOLD + game.getMapName().toUpperCase()); loreList.add((new Messaging.MessageFormatter().format("menu.spectate-game-header") + " " + game.getPlayers().size() + "/" + game.getNumberOfSpawns())); for (GamePlayer gPlayer: game.getPlayers()) { if (gPlayer.getP() != null) { loreList.add(ChatColor.WHITE + gPlayer.getP().getName()); } } Material gameIcon = Material.REDSTONE_BLOCK; String gameNumber = String.valueOf(game.getGameNumber()); if (game.getState() == GameState.PREGAME) { gameIcon = Material.EMERALD_BLOCK; } else if (game.getState() == GameState.ENDING) { gameIcon = Material.LAPIS_BLOCK; } if (gamePlayer.getP() != null) { SkyWarsReloaded.getIC().setOption( gamePlayer.getP(), iii, new ItemStack(gameIcon, 1), gameNumber, loreList.toArray(new String[loreList.size()])); } } if (gamePlayer.getP() != null) { SkyWarsReloaded.getIC().update(gamePlayer.getP()); } final GamePlayer player = gamePlayer; SkyWarsReloaded.get().getServer().getScheduler().scheduleSyncDelayedTask(SkyWarsReloaded.get(), new Runnable() { @Override public void run() { updateSpectateMenu(player); } }, 40); } } }