package cx.sfy.TheBridge.game; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Color; import org.bukkit.FireworkEffect; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Firework; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.FireworkMeta; import org.bukkit.inventory.meta.LeatherArmorMeta; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import cx.sfy.TheBridge.Main; import cx.sfy.TheBridge.database.PlayerStat; import cx.sfy.TheBridge.hologram.TruenoHologram; import cx.sfy.TheBridge.hologram.TruenoHologramAPI; import cx.sfy.TheBridge.team.TeamFour; import cx.sfy.TheBridge.utils.CenterMessage; import cx.sfy.TheBridge.utils.ItemBuilder; import cx.sfy.TheBridge.utils.Utils; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.Random; public class GameFour { private Main plugin; private HashMap teams; private HashMap teamPlayer; private ArrayList players; private ArrayList spects; private HashMap pd = new HashMap(); private HashMap goals = new HashMap(); private HashMap kills = new HashMap(); private ArrayList build = new ArrayList(); private ArrayList placed = new ArrayList(); private ArrayList holograms = new ArrayList(); private Location lobby; private Location spect; private String name; private String mode; private int min; private int max; private int teamSize; private int starting; private int prestart; private BukkitTask start; private FState state; public GameFour(Main plugin, String name, int min, int max, int teamSize, int starting, int prestart, Location lobby, Location spect, Location buildMin, Location buildMax, Location spawnRed, Location spawnBlue, Location spawnGreen, Location spawnYellow, Location respawnRed, Location respawnBlue, Location respawnGreen, Location respawnYellow, ArrayList portalRed, ArrayList portalBlue, ArrayList portalGreen, ArrayList portalYellow, Location hRed, Location hBlue, Location hGreen, Location hYellow) { this.plugin = plugin; this.name = name; this.starting = starting; this.prestart = prestart; this.mode = teamSize + "v" + teamSize + "v" + teamSize + "v" + teamSize; this.max = max; this.min = min; this.lobby = lobby; this.spect = spect; this.teamSize = teamSize; this.teamPlayer = new HashMap<>(); this.teams = new HashMap<>(); this.players = new ArrayList<>(); this.spects = new ArrayList<>(); int gn = Math.min(buildMin.getBlockX(), buildMax.getBlockX()); int gn2 = Math.max(buildMin.getBlockX(), buildMax.getBlockX()); int gn3 = Math.min(buildMin.getBlockZ(), buildMax.getBlockZ()); int gn4 = Math.max(buildMin.getBlockZ(), buildMax.getBlockZ()); int gn5 = Math.min(buildMin.getBlockY(), buildMax.getBlockY()); int gn6 = Math.max(buildMin.getBlockY(), buildMax.getBlockY()); for (int i = gn; i <= gn2; ++i) { for (int j = gn5; j <= gn6; ++j) { for (int k = gn3; k <= gn4; ++k) { Location location3 = new Location(buildMin.getWorld(), (double) i, (double) j, (double) k); build.add(location3); } } } this.teams.put(ChatColor.BLUE, new TeamFour(this, ChatColor.BLUE, Color.BLUE, plugin.getConfig().getString("names.blue"), spawnBlue, respawnBlue, portalBlue, hBlue)); this.teams.put(ChatColor.RED, new TeamFour(this, ChatColor.RED, Color.RED, plugin.getConfig().getString("names.red"), spawnRed, respawnRed, portalRed, hRed)); this.teams.put(ChatColor.GREEN, new TeamFour(this, ChatColor.GREEN, Color.GREEN, plugin.getConfig().getString("names.green"), spawnGreen, respawnGreen, portalGreen, hGreen)); this.teams.put(ChatColor.YELLOW, new TeamFour(this, ChatColor.YELLOW, Color.YELLOW, plugin.getConfig().getString("names.yellow"), spawnYellow, respawnYellow, portalYellow, hYellow)); setState(FState.WAITING); updateSign(); } public void checkCancel() { if (isState(FState.STARTING) && players.size() <= getMin()) { if (start != null) { start.cancel(); } setState(FState.WAITING); starting = 30; updateSign(); for (Player on : players) { updateSB(on); } } } public void updateSB(Player p) { plugin.getSB().update(p); } public void updateSign() { plugin.getSIM().updateGameFourSign(this); } public String getMode() { return mode; } public boolean checkWin(TeamFour win, TeamFour death, Player e) { if (getTeamsAlive() <= 1 && !isState(FState.FINISH)) { setState(FState.FINISH); updateSign(); DecimalFormat df = new DecimalFormat("#.##"); for (Player w : win.getTeamPlayers()) { PlayerStat.getPlayerStat(w).addFourWins(); } for (Player p : players) { plugin.getNMS().sendTitle(p, 0, 60, 0, plugin.getLang().get("titles.winFour.title").replaceAll("", win.getLifeString()) .replaceAll("", win.getTeamName()).replaceAll("", win.getColor() + ""), plugin.getLang().get("titles.winFour.subtitle").replaceAll("", win.getLifeString()) .replaceAll("", win.getTeamName()).replaceAll("", win.getColor() + "")); for (String msg : plugin.getLang().getList("messages.winFour")) { CenterMessage.sendCenteredMessage(p, msg.replaceAll("&", "§").replaceAll("", e.getName()) .replaceAll("", df.format(e.getHealth())).replaceAll("", win.getTeamName()) .replaceAll("", String.valueOf(goals.get(e))) .replaceAll("", (goals.get(e) > 1) ? "es" : "") .replaceAll("", teams.get(ChatColor.RED).getTeamName()) .replaceAll("", teams.get(ChatColor.RED).getLifeString()) .replaceAll("", teams.get(ChatColor.BLUE).getTeamName()) .replaceAll("", teams.get(ChatColor.BLUE).getLifeString()) .replaceAll("", teams.get(ChatColor.YELLOW).getTeamName()) .replaceAll("", teams.get(ChatColor.YELLOW).getLifeString()) .replaceAll("", teams.get(ChatColor.GREEN).getTeamName()).replaceAll("", "❤") .replaceAll("", teams.get(ChatColor.GREEN).getLifeString()) .replaceAll("", (death.getTeamName() == null) ? "Stole" : death.getTeamName()) .replaceAll("", (win.getColor() == null) ? ChatColor.WHITE + "" : win.getColor() + "")); } } new BukkitRunnable() { @Override public void run() { for (TruenoHologram th : holograms) { th.delete(); } for (Player p : spect.getWorld().getPlayers()) { if (pd.containsKey(p)) { for (Player on : Bukkit.getOnlinePlayers()) { on.showPlayer(p); p.showPlayer(on); } plugin.getGM().removePlayerFourGames(p); } else { p.teleport(plugin.getMainLobby()); } } } }.runTaskLater(plugin, 20 * 10); new BukkitRunnable() { @Override public void run() { plugin.getGM().resetFourGame(getName()); } }.runTaskLater(plugin, 20 * 12); return true; } return false; } public void celebrateGoal(TeamFour team, TeamFour death, Player e) { DecimalFormat df = new DecimalFormat("#.##"); addGoal(e); PlayerStat.getPlayerStat(e).addFourGoals(); firework(getSpect(), team.getFColor()); e.teleport(team.getTeamRespawn()); if (getTeamsAlive() == 2) { death.removeLife(1); if (death.getLife() == 0) { death.killTeam(); if (checkWin(team, death, e)) { return; } for (Player p : players) { plugin.getNMS().sendTitle(p, 0, 20, 0, plugin.getLang().get("titles.goalFinal.title").replaceAll("", e.getName()) .replaceAll("", "❤").replaceAll("", team.getTeamName()) .replaceAll("", death.getTeamName()) .replaceAll("", team.getColor() + ""), plugin.getLang().get("titles.goalFinal.subtitle").replaceAll("", e.getName()) .replaceAll("", "❤").replaceAll("", team.getTeamName()) .replaceAll("", death.getTeamName()) .replaceAll("", team.getColor() + "")); } } else { for (Player p : players) { plugin.getNMS().sendTitle(p, 0, 20, 0, plugin.getLang().get("titles.goalNormal.title").replaceAll("", e.getName()) .replaceAll("", "❤").replaceAll("", team.getTeamName()) .replaceAll("", death.getTeamName()) .replaceAll("", team.getColor() + ""), plugin.getLang().get("titles.goalNormal.subtitle").replaceAll("", e.getName()) .replaceAll("", "â�¤").replaceAll("", team.getTeamName()) .replaceAll("", death.getTeamName()) .replaceAll("", team.getColor() + "")); } } for (Player p : players) { updateSB(p); for (String msg : plugin.getLang().getList("messages.final")) { CenterMessage.sendCenteredMessage(p, msg.replaceAll("&", "§").replaceAll("", death.getTeamName()) .replaceAll("", String.valueOf(goals.get(e))) .replaceAll("", (goals.get(e) > 1) ? "es" : "") .replaceAll("", team.getTeamName()) .replaceAll("", "" + team.getColor()).replaceAll("", e.getName()) .replaceAll("", df.format(e.getHealth())) .replaceAll("", team.getTeamName()) .replaceAll("", teams.get(ChatColor.RED).getTeamName()) .replaceAll("", teams.get(ChatColor.RED).getLifeString()) .replaceAll("", teams.get(ChatColor.BLUE).getTeamName()) .replaceAll("", teams.get(ChatColor.BLUE).getLifeString()) .replaceAll("", teams.get(ChatColor.YELLOW).getTeamName()) .replaceAll("", teams.get(ChatColor.YELLOW).getLifeString()) .replaceAll("", teams.get(ChatColor.GREEN).getTeamName()) .replaceAll("", teams.get(ChatColor.GREEN).getLifeString()) .replaceAll("", "❤")); } } } else { team.addLife(1); death.removeLife(1); if (death.getLife() == 0) { death.killTeam(); if (checkWin(team, death, e)) { return; } for (Player p : players) { plugin.getNMS().sendTitle(p, 0, 20, 0, plugin.getLang().get("titles.goalFinal.title").replaceAll("", e.getName()) .replaceAll("", "❤").replaceAll("", team.getTeamName()) .replaceAll("", death.getTeamName()) .replaceAll("", team.getColor() + ""), plugin.getLang().get("titles.goalFinal.subtitle").replaceAll("", e.getName()) .replaceAll("", "❤").replaceAll("", team.getTeamName()) .replaceAll("", death.getTeamName()) .replaceAll("", team.getColor() + "")); } } else { for (Player p : players) { plugin.getNMS().sendTitle(p, 0, 20, 0, plugin.getLang().get("titles.goalNormal.title").replaceAll("", e.getName()) .replaceAll("", "❤").replaceAll("", team.getTeamName()) .replaceAll("", death.getTeamName()) .replaceAll("", team.getColor() + ""), plugin.getLang().get("titles.goalNormal.subtitle").replaceAll("", e.getName()) .replaceAll("", "❤").replaceAll("", team.getTeamName()) .replaceAll("", death.getTeamName()) .replaceAll("", team.getColor() + "")); } } for (Player p : players) { updateSB(p); for (String msg : plugin.getLang().getList("messages.stole")) { CenterMessage.sendCenteredMessage(p, msg.replaceAll("&", "§").replaceAll("", death.getTeamName()) .replaceAll("", String.valueOf(goals.get(e))) .replaceAll("", (goals.get(e) > 1) ? "es" : "") .replaceAll("", "" + team.getColor()) .replaceAll("", team.getTeamName()).replaceAll("", e.getName()) .replaceAll("", df.format(e.getHealth())) .replaceAll("", teams.get(ChatColor.RED).getTeamName()) .replaceAll("", teams.get(ChatColor.RED).getLifeString()) .replaceAll("", teams.get(ChatColor.BLUE).getTeamName()) .replaceAll("", teams.get(ChatColor.BLUE).getLifeString()) .replaceAll("", teams.get(ChatColor.YELLOW).getTeamName()) .replaceAll("", teams.get(ChatColor.YELLOW).getLifeString()) .replaceAll("", teams.get(ChatColor.GREEN).getTeamName()) .replaceAll("", teams.get(ChatColor.GREEN).getLifeString()) .replaceAll("", "❤")); } } } } public void firework(Location loc, Color c1) { Firework fa = (Firework) loc.getWorld().spawn( loc.clone().add(new Random().nextInt(5) + 1, new Random().nextInt(1) + 1, new Random().nextInt(5) + 1), Firework.class); FireworkMeta fam = fa.getFireworkMeta(); FireworkEffect.Type tipo = FireworkEffect.Type.STAR; Color c2 = Color.WHITE; FireworkEffect ef = FireworkEffect.builder().withColor(c1).withFade(c2).with(tipo).build(); fam.addEffect(ef); fam.setPower(0); fa.setFireworkMeta(fam); new BukkitRunnable() { @Override public void run() { Firework fa = (Firework) loc.getWorld().spawn(loc.clone().add(new Random().nextInt(5) + 1, new Random().nextInt(1) + 1, new Random().nextInt(5) + 1), Firework.class); FireworkMeta fam = fa.getFireworkMeta(); FireworkEffect.Type tipo = FireworkEffect.Type.STAR; Color c2 = Color.WHITE; FireworkEffect ef = FireworkEffect.builder().withColor(c1).withFade(c2).with(tipo).build(); fam.addEffect(ef); fam.setPower(0); fa.setFireworkMeta(fam); } }.runTaskLater(plugin, 2); } public void addPlayer(Player p) { pd.put(p, new PlayerData(p)); Utils.setCleanPlayer(p); players.add(p); kills.put(p, 0); goals.put(p, 0); p.teleport(getLobby()); if (isState(FState.WAITING) || isState(FState.STARTING)) { new BukkitRunnable() { @Override public void run() { givePlayerItems(p); } }.runTaskLater(plugin, 20); for (Player on : players) { on.sendMessage(plugin.getLang().get("messages.join").replaceAll("", p.getName()) .replaceAll("", String.valueOf(players.size())) .replaceAll("", String.valueOf(getMax()))); on.playSound(on.getLocation(), Sound.valueOf(plugin.getSounds().get("sounds.game.join")), 1.0f, 1.0f); updateSB(on); } } updateSign(); } public void removePlayer(Player p) { Utils.setCleanPlayer(p); pd.get(p).restore(); removeAllPlayerTeam(p); players.remove(p); if (isState(FState.WAITING) || isState(FState.STARTING)) { for (Player on : players) { on.sendMessage(plugin.getLang().get("messages.quit").replaceAll("", p.getName()) .replaceAll("", String.valueOf(players.size())) .replaceAll("", String.valueOf(getMax()))); on.playSound(on.getLocation(), Sound.valueOf(plugin.getSounds().get("sounds.game.quit")), 1.0f, 1.0f); updateSB(on); } } else { if (getTeamsAlive() == 1) { checkWin(getLastTeam(), getTeamPlayer(p), getLastTeam().getTeamPlayers().get(0)); } } updateSign(); checkCancel(); } public void updateGame() { if (isState(FState.WAITING) && players.size() >= getMin()) { setState(FState.STARTING); updateSign(); for (Player p : players) { p.setGameMode(GameMode.ADVENTURE); } } if (isState(FState.STARTING)) { for (Player p : players) { updateSB(p); } if (starting == 240 || starting == 180 || starting == 120) { for (Player p : players) { p.sendMessage(plugin.getLang().get(p, "messages.starting") .replaceAll("