package me.maker56.survivalgames.game.phases; import java.util.ArrayList; import java.util.Collections; import java.util.List; import me.maker56.survivalgames.SurvivalGames; import me.maker56.survivalgames.Util; import me.maker56.survivalgames.arena.Arena; import me.maker56.survivalgames.commands.messages.MessageHandler; import me.maker56.survivalgames.commands.permission.PermissionHandler; import me.maker56.survivalgames.game.Game; import me.maker56.survivalgames.game.GameState; import me.maker56.survivalgames.user.User; import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.ComponentBuilder; import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.ClickEvent.Action; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.scheduler.BukkitTask; public class VotingPhase { // STATIC VARIABLES private static ItemStack voteItem, arenaItem; private static String title; public static ItemStack getVotingOpenItemStack() { return voteItem; } public static String getVotingInventoryTitle() { return title; } public static void reinitializeDatabase() { voteItem = Util.parseItemStack(SurvivalGames.instance.getConfig().getString("Voting.Item")); arenaItem = Util.parseItemStack(SurvivalGames.instance.getConfig().getString("Voting.ArenaItem")); title = SurvivalGames.instance.getConfig().getString("Voting.InventoryTitle"); if(title.length() > 32) { title = title.substring(0, 32); } title = ChatColor.translateAlternateColorCodes('&', title); } private Game game; private BukkitTask task; private boolean running = false; private int time; public ArrayList<Arena> voteArenas = new ArrayList<Arena>(); private Inventory voteInventory; public VotingPhase(Game game) { reinitializeDatabase(); this.game = game; } public void load() { game.setState(GameState.VOTING); chooseRandomArenas(); game.setScoreboardPhase(SurvivalGames.getScoreboardManager().getNewScoreboardPhase(GameState.VOTING)); time = game.getLobbyTime(); start(); } public void start() { running = true; if(game.isVotingEnabled()) { if(voteItem != null) { generateInventory(); for(User user : game.getUsers()) { equipPlayer(user); } } } task = Bukkit.getScheduler().runTaskTimer(SurvivalGames.instance, new Runnable() { public void run() { for(User user : game.getUsers()) { user.getPlayer().setLevel(time); user.getPlayer().setExp(Util.getExpPercent((float)time, (float)game.getLobbyTime())); } if(time % 10 == 0 && time > 10) { game.sendMessage(MessageHandler.getMessage("game-voting-cooldown").replace("%0%", Util.getFormatedTime(time))); } if(time % 15 == 0 && time != 0) { sendVoteMessage(); } else if(time <= 10 && time > 0){ game.sendMessage(MessageHandler.getMessage("game-voting-cooldown").replace("%0%", Util.getFormatedTime(time))); } else if(time == 0) { for(User user : game.getUsers()) { user.getPlayer().getInventory().setItem(1, null); user.getPlayer().updateInventory(); } task.cancel(); running = false; time = game.getLobbyTime(); game.sendMessage(MessageHandler.getMessage("game-voting-end")); Arena winner = getMostVotedArena(); winner.getSpawns().get(0).getWorld().setTime(0); game.startCooldown(winner); for(Arena arena : voteArenas) { arena.setVotes(0); } voteArenas.clear(); game.getVotedUsers().clear(); return; } game.updateScoreboard(); time--; } }, 0L, 20L); } public Inventory getVotingInventory() { return voteInventory; } public void equipPlayer(User user) { user.getPlayer().getInventory().setItem(1, voteItem); user.getPlayer().updateInventory(); } public List<Arena> getArenas() { return voteArenas; } public void generateInventory() { int arenas = voteArenas.size(); int size = 9; if(arenas >= 9) { size = 9; } else if(arenas >= 18) { size = 18; } else if(arenas >= 27) { size = 27; } else if(arenas >= 36) { size = 36; } else if(arenas >= 45) { size = 45; } else if(arenas >= 54) { size = 54; } voteInventory = Bukkit.createInventory(null, size, title); int place = size / arenas; int c = 0; for(int i = 0; i < size; i++) { Arena a; try { a = voteArenas.get(i); } catch(IndexOutOfBoundsException e) { break; } if(a == null) break; ItemStack is = arenaItem.clone(); ItemMeta im = is.getItemMeta(); im.setDisplayName((i + 1) + ". �e�l" + a.getName()); is.setItemMeta(im); voteInventory.setItem(c, is); c += place; } } public int getTime() { return time; } public void setTime(int time) { this.time = time; } public Arena getMostVotedArena() { Arena mostVoted = null; int votes = 0; for (Arena arena : voteArenas) { if (arena.getVotes() > votes) { votes = arena.getVotes(); mostVoted = arena; } } if(mostVoted == null) mostVoted = voteArenas.get(0); return mostVoted; } public boolean canVote(String player) { return !game.getVotedUsers().contains(player); } public Arena vote(Player p, int id) { try { Arena a = voteArenas.get(id - 1); if(a != null) { int amount = PermissionHandler.getVotePower(p); a.setVotes(a.getVotes() + amount); game.getVotedUsers().add(p.getName()); p.sendMessage(MessageHandler.getMessage("game-success-vote").replace("%0%", a.getName())); if(amount > 1) { p.sendMessage(MessageHandler.getMessage("game-extra-vote").replace("%0%", Integer.valueOf(amount).toString())); } game.updateScoreboard(); } return a; } catch(IndexOutOfBoundsException e) { return null; } } private void sendVoteMessage() { if(game.isVotingEnabled()) { if(voteItem == null) { game.sendMessage(MessageHandler.getMessage("game-vote")); } int i = 1; for(Arena arena : voteArenas) { game.sendMessage(new ComponentBuilder("�3" + i + "�7. �6" + arena.getName() + " �7(�e" + arena.getVotes() + "�7)") .event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Click to vote for arena " + arena.getName()).create())) .event(new ClickEvent(Action.RUN_COMMAND, "/sg vote " + i)).create()); i++; } } } private void chooseRandomArenas() { List<Arena> arenas = game.getArenas(); voteArenas.clear(); Collections.shuffle(arenas); int i = 0; for(Arena a : arenas) { if(i == game.getMaxVotingArenas()) break; voteArenas.add(a); i++; } } public boolean isRunning() { return running; } public void cancelTask() { if(task != null) task.cancel(); running = false; voteArenas.clear(); time = game.getLobbyTime(); return; } }