package me.maker56.survivalgames.game.phases; import java.sql.Date; import me.maker56.survivalgames.SurvivalGames; import me.maker56.survivalgames.Util; import me.maker56.survivalgames.arena.chest.Chest; import me.maker56.survivalgames.commands.messages.MessageHandler; import me.maker56.survivalgames.commands.permission.Permission; import me.maker56.survivalgames.commands.permission.PermissionHandler; import me.maker56.survivalgames.database.sql.DatabaseManager; import me.maker56.survivalgames.database.sql.DatabaseTask; import me.maker56.survivalgames.database.sql.DatabaseThread; import me.maker56.survivalgames.game.Game; import me.maker56.survivalgames.game.GameState; import me.maker56.survivalgames.user.User; import me.maker56.survivalgames.user.UserManager; import org.bukkit.Bukkit; import org.bukkit.Effect; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Damageable; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitTask; public class IngamePhase { private Game game; public BukkitTask task; private boolean running; private int time; private UserManager um = SurvivalGames.userManger; private boolean braodcastWin = SurvivalGames.instance.getConfig().getBoolean("broadcast-win"); private boolean lightningOD = SurvivalGames.instance.getConfig().getBoolean("Lightning.on-death"); private boolean lightningFP = SurvivalGames.instance.getConfig().getBoolean("Lightning.on-few-players"); private int lightningFPc = SurvivalGames.instance.getConfig().getInt("Lightning.few-players"); private int lightningFPt = SurvivalGames.instance.getConfig().getInt("Lightning.few-players-time"); private BukkitTask lTask; public boolean grace = false; private int period; // GAME STATISTIC private long start = System.currentTimeMillis(); private int players; // GAME STATISTIC END private BukkitTask deathmatch, chestrefill, gracetask; public IngamePhase(Game game) { this.game = game; this.period = game.getCurrentArena().getGracePeriod(); this.time = game.getCurrentArena().getAutomaticlyDeathmatchTime(); } public void load() { game.setScoreboardPhase(SurvivalGames.getScoreboardManager().getNewScoreboardPhase(GameState.INGAME)); start(); } public void start() { game.setState(GameState.INGAME); game.sendMessage(MessageHandler.getMessage("game-start").replace("%0%", Integer.valueOf(game.getPlayingUsers()).toString())); running = true; game.redefinePlayerNavigatorInventory(); players = game.getPlayingUsers(); game.getCurrentArena().getMinimumLocation().getWorld().setTime(0); if(game.getCurrentArena().chestRefill()) { chestrefill = Bukkit.getScheduler().runTaskLater(SurvivalGames.instance, new Runnable() { public void run() { long time = game.getCurrentArena().getMinimumLocation().getWorld().getTime(); if(time >= 18000 && time <= 18200) { for(Chest c : game.getRegisteredChests()) { c.getLocation().getWorld().playEffect(c.getLocation(), Effect.MOBSPAWNER_FLAMES, 1); c.getLocation().getWorld().playSound(c.getLocation(), Sound.LEVEL_UP, 4.0F, 1.0F); } game.getRegisteredChests().clear(); game.sendMessage(MessageHandler.getMessage("game-chestrefill")); } } }, 18001); } if(period != 0) { game.sendMessage(MessageHandler.getMessage("game-grace-period").replace("%0%", Integer.valueOf(period).toString())); grace = true; gracetask = Bukkit.getScheduler().runTaskLater(SurvivalGames.instance, new Runnable() { public void run() { game.sendMessage(MessageHandler.getMessage("game-grace-period-ended")); grace = false; startTask(); } }, period * 20); } else { startTask(); } } private void startTask() { if(lightningFP) { startLightningTask(); } task = Bukkit.getScheduler().runTaskTimer(SurvivalGames.instance, new Runnable() { public void run() { if(game.getCurrentArena().isDeathmatchEnabled()) { if(time % 600 == 0 && time > 300) { game.sendMessage(MessageHandler.getMessage("game-deathmatch-cooldown").replace("%0%", Util.getFormatedTime(time))); } else if(time <= 300 && time % 60 == 0 && time > 60) { game.sendMessage(MessageHandler.getMessage("game-deathmatch-cooldown").replace("%0%", Util.getFormatedTime(time))); } else if(time <= 60 && time % 10 == 0 && time > 10) { game.sendMessage(MessageHandler.getMessage("game-deathmatch-cooldown").replace("%0%", Util.getFormatedTime(time))); } else if(time <= 10 && time > 0) { game.sendMessage(MessageHandler.getMessage("game-deathmatch-cooldown").replace("%0%", Util.getFormatedTime(time))); } else if(time == 0) { cancelTask(); cancelLightningTask(); game.startDeathmatch(); return; } } game.updateScoreboard(); time--; } }, 0L, 20L); } public void killUser(User user, User killer, boolean leave, boolean spectate) { int remain = game.getUsers().size() - 1; // STATISTIC user.getStatistics().addPlayed(); user.getStatistics().addDeath(); if(leave) { game.sendMessage(MessageHandler.getMessage("game-player-left").replace("%0%", user.getName())); } else { if(killer == null) { game.sendMessage(MessageHandler.getMessage("game-player-die-damage").replace("%0%", user.getName())); } else { // STATISTIC killer.getStatistics().addKill(); game.sendMessage(MessageHandler.getMessage("game-player-die-killer").replace("%0%", user.getName()).replace("%1%", killer.getName())); double killMoney = game.getCurrentArena().getMoneyOnKill(); if(killMoney > 0 && SurvivalGames.econ != null) { SurvivalGames.econ.depositPlayer(killer.getName(), killMoney); killer.sendMessage(MessageHandler.getMessage("arena-money-kill").replace("%0%", Double.valueOf(killMoney).toString()).replace("%1%", user.getName())); } // KILL STATISTIC DatabaseThread.addTask(new DatabaseTask("INSERT INTO `" + DatabaseManager.tablePrefix + "kills` " + "(`player`, `victim`, `health`, `time`) " + "VALUES ('" + killer.getPlayer().getUniqueId().toString() + "'," + "'" + user.getPlayer().getUniqueId().toString() + "'," + "'" + (int)((Damageable)killer.getPlayer()).getHealth() + "'," + "'" + new Date(System.currentTimeMillis()) + "')")); // KILL STATISTIC END } } game.sendMessage(MessageHandler.getMessage("game-remainplayers").replace("%0%", Integer.valueOf(remain).toString())); if(lightningOD) user.getPlayer().getWorld().strikeLightningEffect(user.getPlayer().getLocation()); for(ItemStack is : user.getPlayer().getInventory().getContents()) { if(is == null || is.getType() == Material.AIR) continue; user.getPlayer().getWorld().dropItemNaturally(user.getPlayer().getLocation(), is); } for(ItemStack is : user.getPlayer().getInventory().getArmorContents()) { if(is == null || is.getType() == Material.AIR) continue; user.getPlayer().getWorld().dropItemNaturally(user.getPlayer().getLocation(), is); } final Player p = user.getPlayer(); um.leaveGame(p); game.setDeathAmount(game.getDeathAmount() + 1); game.updateScoreboard(); if(remain == 1) { User winner = game.getUsers().get(0); // STATISTIC winner.getStatistics().addWin(); winner.getStatistics().addPlayed(); if(braodcastWin) { Bukkit.broadcastMessage(MessageHandler.getMessage("game-win").replace("%0%", winner.getName()).replace("%1%", game.getCurrentArena().getName()).replace("%2%", game.getName())); } winner.sendMessage(MessageHandler.getMessage("game-win-winner-message").replace("%0%", game.getCurrentArena().getName())); double winMoney = game.getCurrentArena().getMoneyOnWin(); if(winMoney > 0 && SurvivalGames.econ != null) { SurvivalGames.econ.depositPlayer(winner.getName(), winMoney); winner.sendMessage(MessageHandler.getMessage("arena-money-win").replace("%0%", Double.valueOf(winMoney).toString())); } // GAME STATISTIC DatabaseThread.addTask(new DatabaseTask("INSERT INTO `" + DatabaseManager.tablePrefix + "games` " + "(`arena`, `duration`, `end`, `players`, `winner`) " + "VALUES ('" + game.getCurrentArena().getName() + "'," + "'" + (System.currentTimeMillis() - start) / 1000 + "'," + "'" + new Date(System.currentTimeMillis()) + "'," + "'" + players + "'," + "'" + winner.getPlayer().getUniqueId().toString() + "')")); // GAME STATISTIC END game.startFinish(); } else { if(spectate) { if(PermissionHandler.hasPermission(p, Permission.SPECTATE)) { Bukkit.getScheduler().scheduleSyncDelayedTask(SurvivalGames.instance, new Runnable() { public void run() { um.joinGameAsSpectator(p, game.getName()); } }, 2L); } } if(remain == game.getCurrentArena().getPlayerDeathmatchAmount() && game.getCurrentArena().isDeathmatchEnabled()) startDeathmatchTask(); } } public void startDeathmatchTask() { if(game.getDeathmatch() != null) return; cancelTask(); deathmatch = Bukkit.getScheduler().runTaskTimer(SurvivalGames.instance, new Runnable() { int time = 60; public void run() { if(time % 10 == 0 && time > 10) { game.sendMessage(MessageHandler.getMessage("game-deathmatch-cooldown").replace("%0%", Util.getFormatedTime(time))); } else if(time <= 10 && time > 0) { game.sendMessage(MessageHandler.getMessage("game-deathmatch-cooldown").replace("%0%", Util.getFormatedTime(time))); } else if(time == 0) { cancelDeathmatchTask(); cancelLightningTask(); game.startDeathmatch(); return; } time--; } }, 0L, 20L); } public int getTime() { return time; } public void startLightningTask() { lTask = Bukkit.getScheduler().runTaskTimer(SurvivalGames.instance, new Runnable() { public void run() { if(game.getPlayingUsers() <= lightningFPc && !game.getCurrentArena().isDeathmatchEnabled()) { for(User user : game.getUsers()) { user.getPlayer().getWorld().strikeLightningEffect(user.getPlayer().getLocation()); } } } }, lightningFPt * 20L, lightningFPt * 20L); } public void cancelLightningTask() { if(lTask != null) lTask.cancel(); } public void cancelTask() { if(task != null) task.cancel(); if(chestrefill != null) chestrefill.cancel(); if(gracetask != null) gracetask.cancel(); } public void cancelDeathmatchTask() { if(deathmatch != null) deathmatch.cancel(); } public boolean isRunning() { return running; } }