/** * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ package tntrun.arena.handlers; import java.io.IOException; import java.util.ArrayList; import java.util.Random; import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.FireworkEffect; import org.bukkit.FireworkEffect.Type; import org.bukkit.Location; import org.bukkit.Sound; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Firework; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.FireworkMeta; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Objective; import org.bukkit.scoreboard.Scoreboard; import tntrun.TNTRun; import tntrun.arena.Arena; import tntrun.arena.structure.Kits; import tntrun.utils.ActionBar; import tntrun.utils.Bars; import tntrun.utils.Shop; import tntrun.utils.Stats; import tntrun.utils.TitleMsg; import tntrun.messages.Messages; public class GameHandler { private TNTRun plugin; private Arena arena; public int lostPlayers = 0; public GameHandler(TNTRun plugin, Arena arena) { this.plugin = plugin; this.arena = arena; count = arena.getStructureManager().getCountdown(); } private Scoreboard scoreboard = buildScoreboard(); // arena leave handler private int leavetaskid; public void startArenaAntiLeaveHandler() { leavetaskid = Bukkit.getScheduler().scheduleSyncRepeatingTask( plugin, new Runnable() { @Override public void run() { for (Player player : arena.getPlayersManager().getPlayersCopy()) { if (!arena.getStructureManager().isInArenaBounds(player.getLocation())) { arena.getPlayerHandler().leavePlayer(player, Messages.playerlefttoplayer, Messages.playerlefttoothers); } } for (Player player : arena.getPlayersManager().getSpectatorsCopy()) { if (!arena.getStructureManager().isInArenaBounds(player.getLocation())) { arena.getPlayerHandler().leavePlayer(player, "", ""); } } } }, 0, 1 ); } public void stopArenaAntiLeaveHandler() { Bukkit.getScheduler().cancelTask(leavetaskid); } // arena start handler (running status updater) int runtaskid; public static int count; public void runArenaCountdown() { count = arena.getStructureManager().getCountdown(); arena.getStatusManager().setStarting(true); runtaskid = Bukkit.getScheduler().scheduleSyncRepeatingTask( plugin, new Runnable() { @Override public void run() { // check if countdown should be stopped for some various reasons if (arena.getPlayersManager().getPlayersCount() < arena.getStructureManager().getMinPlayers()) { for (Player player : arena.getPlayersManager().getPlayers()) { Bars.setBar(player, Bars.waiting, arena.getPlayersManager().getPlayersCount(), 0, arena.getPlayersManager().getPlayersCount() * 100 / arena.getStructureManager().getMinPlayers(), plugin); createWaitingScoreBoard(); } stopArenaCountdown(); } else // start arena if countdown is 0 if (count == 0) { stopArenaCountdown(); startArena(); } else if(count == 5) { String message = Messages.arenacountdown; message = message.replace("{COUNTDOWN}", String.valueOf(count)); for (Player player : arena.getPlayersManager().getPlayers()) { player.teleport(arena.getStructureManager().getSpawnPoint()); TNTRun.getInstance().sound.NOTE_PLING(player, 1, 999); Messages.sendMessage(player, message); TitleMsg.sendFullTitle(player, TitleMsg.starting.replace("{COUNT}", count + ""), TitleMsg.substarting.replace("{COUNT}", count + ""), 0, 40, 20, plugin); } } else if (count < 11) { String message = Messages.arenacountdown; message = message.replace("{COUNTDOWN}", String.valueOf(count)); for (Player player : arena.getPlayersManager().getPlayers()) { Messages.sendMessage(player, message); TNTRun.getInstance().sound.NOTE_PLING(player, 1, 999); TitleMsg.sendFullTitle(player, TitleMsg.starting.replace("{COUNT}", count + ""), TitleMsg.substarting.replace("{COUNT}", count + ""), 0, 40, 20, plugin); } } else if (count % 10 == 0) { String message = Messages.arenacountdown; message = message.replace("{COUNTDOWN}", String.valueOf(count)); for (Player all : arena.getPlayersManager().getPlayers()) { Messages.sendMessage(all, message); TNTRun.getInstance().sound.NOTE_PLING(all, 1, 999); TitleMsg.sendFullTitle(all, TitleMsg.starting.replace("{COUNT}", count + ""), TitleMsg.substarting.replace("{COUNT}", count + ""), 0, 40, 20, plugin); } } if(count == 5) { for (Player player : arena.getPlayersManager().getPlayers()) { player.teleport(arena.getStructureManager().getSpawnPoint()); TNTRun.getInstance().sound.NOTE_PLING(player, 1, 999); } } // scoreboard createWaitingScoreBoard(); // sending bars for (Player player : arena.getPlayersManager().getPlayers()) { player.setLevel(count); Bars.setBar(player, Bars.starting, 0, count, count * 100 / arena.getStructureManager().getCountdown(), plugin); } count--; } }, 0, 20 ); } public void stopArenaCountdown() { arena.getStatusManager().setStarting(false); count = arena.getStructureManager().getCountdown(); Bukkit.getScheduler().cancelTask(runtaskid); } // main arena handler private int timelimit; private int arenahandler; private int playingtask; Random rnd = new Random(); @SuppressWarnings("deprecation") public void startArena() { arena.getStatusManager().setRunning(true); String message = Messages.arenastarted; message = message.replace("{TIMELIMIT}", String.valueOf(arena.getStructureManager().getTimeLimit())); for (Player player : arena.getPlayersManager().getPlayers()) { player.closeInventory(); Stats.addPlayedGames(player, 1); player.setAllowFlight(true); Messages.sendMessage(player, message); TNTRun.getInstance().sound.ENDER_DRAGON(player, 1, 999); String[] ids1 = plugin.getConfig().getString("items.shop.ID").split(":"); String[] ids2 = plugin.getConfig().getString("items.vote.ID").split(":"); String[] ids3 = plugin.getConfig().getString("items.info.ID").split(":"); String[] ids4 = plugin.getConfig().getString("items.stats.ID").split(":"); player.getInventory().remove(Integer.parseInt(ids1[0])); player.getInventory().remove(Integer.parseInt(ids2[0])); player.getInventory().remove(Integer.parseInt(ids3[0])); player.getInventory().remove(Integer.parseInt(ids4[0])); if (Shop.pitems.containsKey(player)) { ArrayList<ItemStack> items = Shop.pitems.get(player); Shop.pitems.remove(player); Shop.bought.remove(player); if(items != null){ for (ItemStack item : items) { player.getInventory().addItem(item); } } player.updateInventory(); } TitleMsg.sendFullTitle(player, TitleMsg.start, TitleMsg.substart, 20, 20, 20, plugin); } plugin.signEditor.modifySigns(arena.getArenaName()); Kits kits = arena.getStructureManager().getKits(); if (kits.getKits().size() > 0) { String[] kitnames = kits.getKits().toArray(new String[kits.getKits().size()]); for (Player player : arena.getPlayersManager().getPlayers()) { kits.giveKit(kitnames[rnd.nextInt(kitnames.length)], player); } } resetScoreboard(); createPlayingScoreBoard(); timelimit = arena.getStructureManager().getTimeLimit() * 20; // timelimit is in ticks arenahandler = Bukkit.getScheduler().scheduleSyncRepeatingTask( plugin, new Runnable() { @Override public void run() { // stop arena if player count is 0 if (arena.getPlayersManager().getPlayersCount() == 0) { // stop arena stopArena(); return; } // kick all players if time is out if (timelimit < 0) { for (Player player : arena.getPlayersManager().getPlayersCopy()) { arena.getPlayerHandler().leavePlayer(player,Messages.arenatimeout, ""); } return; } // handle players for (Player player : arena.getPlayersManager().getPlayersCopy()) { // Xp level player.setLevel(timelimit/20); // update bar Bars.setBar(player, Bars.playing, arena.getPlayersManager().getPlayersCount(), timelimit / 20, timelimit * 5 / arena.getStructureManager().getTimeLimit(), plugin); // handle player handlePlayer(player); } // update bars for spectators too for (Player player : arena.getPlayersManager().getSpectators()) { Bars.setBar(player, Bars.playing, arena.getPlayersManager().getPlayersCount(), timelimit / 20, timelimit * 5 / arena.getStructureManager().getTimeLimit(), plugin); } // decrease timelimit timelimit--; } }, 0, 1 ); } public void stopArena() { resetScoreboard(); for (Player player : arena.getPlayersManager().getAllParticipantsCopy()) { arena.getPlayerHandler().leavePlayer(player, "", ""); } lostPlayers = 0; arena.getStatusManager().setRunning(false); Bukkit.getScheduler().cancelTask(arenahandler); Bukkit.getScheduler().cancelTask(playingtask); plugin.signEditor.modifySigns(arena.getArenaName()); if (arena.getStatusManager().isArenaEnabled()) { startArenaRegen(); } } // player handlers public void handlePlayer(final Player player) { Location plloc = player.getLocation(); Location plufloc = plloc.clone().add(0, -1, 0); // remove block under player feet arena.getStructureManager().getGameZone().destroyBlock(plufloc); // check for win if (arena.getPlayersManager().getPlayersCount() == 1) { // last player won startEnding(player); return; } // check for lose if (arena.getStructureManager().getLoseLevel().isLooseLocation(plloc)) { // if we have the spectate spawn than we will move player to spectators, otherwise we will remove him from arena if (arena.getStructureManager().getSpectatorSpawnVector() != null) { arena.getPlayerHandler().spectatePlayer(player, Messages.playerlosttoplayer, Messages.playerlosttoothers); } else { arena.getPlayerHandler().leavePlayer(player, Messages.playerlosttoplayer, Messages.playerlosttoothers); } return; } } public Scoreboard buildScoreboard() { Scoreboard scoreboard = Bukkit.getScoreboardManager().getNewScoreboard(); Objective o = scoreboard.registerNewObjective("TNTRun", "waiting"); o.setDisplaySlot(DisplaySlot.SIDEBAR); o.setDisplayName("§6§lTNTRUN"); return scoreboard; } public void createWaitingScoreBoard() { if(!plugin.getConfig().getBoolean("special.UseScoreboard")){ return; } resetScoreboard(); Objective o = scoreboard.getObjective(DisplaySlot.SIDEBAR); try{ int size = plugin.getConfig().getStringList("scoreboard.waiting").size(); for(String s : plugin.getConfig().getStringList("scoreboard.waiting")){ s = s.replace("&", "§"); s = s.replace("{ARENA}", arena.getArenaName()); s = s.replace("{PS}", arena.getPlayersManager().getAllParticipantsCopy().size() + ""); s = s.replace("{MPS}", arena.getStructureManager().getMaxPlayers() + ""); s = s.replace("{COUNT}", count + ""); o.getScore(s).setScore(size); size--; } for (Player p : arena.getPlayersManager().getPlayers()) { p.setScoreboard(scoreboard); } }catch (NullPointerException ex){ } } public void resetScoreboard() { for (String entry : new ArrayList<String>(scoreboard.getEntries())) { scoreboard.resetScores(entry); } } public void createPlayingScoreBoard() { if(!plugin.getConfig().getBoolean("special.UseScoreboard")){ return; } playingtask = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() { public void run() { resetScoreboard(); Objective o = scoreboard.getObjective(DisplaySlot.SIDEBAR); int size = plugin.getConfig().getStringList("scoreboard.playing").size(); for(String s : plugin.getConfig().getStringList("scoreboard.playing")){ s = s.replace("&", "§"); s = s.replace("{ARENA}", arena.getArenaName()); s = s.replace("{PS}", arena.getPlayersManager().getAllParticipantsCopy().size() + ""); s = s.replace("{MPS}", arena.getStructureManager().getMaxPlayers() + ""); s = s.replace("{LOST}", lostPlayers + ""); s = s.replace("{LIMIT}", timelimit/20 + ""); o.getScore(s).setScore(size); size--; } for(Player p : arena.getPlayersManager().getPlayers()){ if(!plugin.getConfig().getBoolean("special.UseActionBar")){ return; } if (ActionBar.getVersion().contains("1_7")) { Bukkit.getLogger().info("[TNTRun] Action bar for " + ActionBar.getVersion() + " is not supported, disabling Action Bar"); plugin.getConfig().set("special.UseActionBar", false); plugin.saveConfig(); return; } ActionBar bar = new ActionBar(); bar.sendActionBar(p, Messages.getdoublejumpsaction.replace("&", "§").replace("{DB}", plugin.getConfig().getInt("doublejumps." + p.getName()) + "")); } } }, 0, 20); } private void startArenaRegen() { if(arena.getStatusManager().isArenaRegenerating()){ return; } // set arena is regenerating status arena.getStatusManager().setRegenerating(true); // modify signs plugin.signEditor.modifySigns(arena.getArenaName()); // schedule gamezone regen int delay = arena.getStructureManager().getGameZone().regen(); // regen finished Bukkit.getScheduler().scheduleSyncDelayedTask( arena.plugin, new Runnable() { @Override public void run() { // set not regenerating status arena.getStatusManager().setRegenerating(false); // modify signs plugin.signEditor.modifySigns(arena.getArenaName()); } }, delay ); } public void startEnding(final Player player){ Stats.addWins(player, 1); for(Player all : Bukkit.getOnlinePlayers()){ TitleMsg.sendFullTitle(player, TitleMsg.win, TitleMsg.subwin, 20, 60, 20, plugin); String message = Messages.playerwonbroadcast; message = message.replace("{PLAYER}", player.getName()); message = message.replace("{ARENA}", arena.getArenaName()); all.sendMessage(message.replace("&", "§")); } for(Player p : arena.getPlayersManager().getAllParticipantsCopy()){ TNTRun.getInstance().sound.ENDER_DRAGON(p, 5, 999); p.setAllowFlight(true); p.setFlying(true); p.teleport(arena.getStructureManager().getSpawnPoint()); p.getInventory().clear(); } Bukkit.getScheduler().cancelTask(arenahandler); Bukkit.getScheduler().cancelTask(playingtask); final int endtask = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable(){ @Override public void run() { Firework f = player.getWorld().spawn(arena.getStructureManager().getSpawnPoint(), Firework.class); FireworkMeta fm = f.getFireworkMeta(); fm.addEffect(FireworkEffect.builder() .withColor(Color.GREEN).withColor(Color.RED) .withColor(Color.PURPLE) .with(Type.BALL_LARGE) .withFlicker() .build()); fm.setPower(1); f.setFireworkMeta(fm); } }, 0, 10); Bukkit.getScheduler().runTaskLater(plugin, new Runnable(){ public void run(){ try{ Bukkit.getScheduler().cancelTask(endtask); arena.getPlayerHandler().leaveWinner(player, Messages.playerwontoplayer); stopArena(); final ConsoleCommandSender console = Bukkit.getConsoleSender(); if(plugin.getConfig().getStringList("commandsonwin") == null){ return; } for(String commands : plugin.getConfig().getStringList("commandsonwin")){ Bukkit.dispatchCommand(console, commands.replace("{PLAYER}", player.getName())); } }catch (NullPointerException ex){ } } }, 160); } }