package eu.thog.uhcrun.game; import com.connorlinfoot.titleapi.TitleAPI; import eu.thog.uhcrun.UHCRun; import eu.thog.uhcrun.compatibility.Status; import eu.thog.uhcrun.game.team.Team; import eu.thog.uhcrun.game.team.TeamList; import eu.thog.uhcrun.game.team.TeamSelector; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.DyeColor; import org.bukkit.Location; import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.UUID; /** * This file is a part of the UHCRun Project CodeBase * Created by Thog * (C) Copyright Thomas Guillemard 2016 * All rights reserved. */ public class TeamGame extends AbstractGame { private final int personsPerTeam; private TeamList teams = new TeamList(); private TeamSelector teamSelector; public TeamGame(UHCRun plugin, int nbByTeam) { super(plugin, plugin.getProperties()); this.personsPerTeam = nbByTeam; try { this.teamSelector = new TeamSelector(this); } catch (IllegalAccessException e) { e.printStackTrace(); } plugin.getServer().getPluginManager().registerEvents(teamSelector, plugin); // Register team registerTeam("Blanc", ChatColor.WHITE, DyeColor.WHITE); registerTeam("Orange", ChatColor.GOLD, DyeColor.ORANGE); registerTeam("Bleu Clair", ChatColor.BLUE, DyeColor.LIGHT_BLUE); registerTeam("Bleu Foncé", ChatColor.DARK_BLUE, DyeColor.BLUE); registerTeam("Cyan", ChatColor.AQUA, DyeColor.CYAN); registerTeam("Jaune", ChatColor.YELLOW, DyeColor.YELLOW); registerTeam("Rose", ChatColor.LIGHT_PURPLE, DyeColor.PINK); registerTeam("Vert Foncé", ChatColor.DARK_GREEN, DyeColor.GREEN); registerTeam("Rouge", ChatColor.RED, DyeColor.RED); registerTeam("Violet", ChatColor.DARK_PURPLE, DyeColor.PURPLE); registerTeam("Gris", ChatColor.GRAY, DyeColor.GRAY); registerTeam("Noir", ChatColor.BLACK, DyeColor.BLACK); } protected void registerTeam(String name, ChatColor chatColor, DyeColor color) { teams.add(new Team(this, name, color, chatColor)); } @Override public void startGame() { if (this.getOnlineInGamePlayers().size() <= personsPerTeam) { return; } for (UUID id : this.getOnlineInGamePlayers().keySet()) { Player player = Bukkit.getPlayer(id); if (player == null) { continue; } if (getPlayerTeam(id) == null) { for (Team team : teams) { if (!team.isFull() && !team.isLocked()) { team.join(id); break; } } if (getPlayerTeam(id) == null) { player.kickPlayer(ChatColor.RED + "Aucune team était apte à vous reçevoir, vous avez été réenvoyé dans le lobby."); } } } super.startGame(); } @Override protected void teleport() { Iterator<Location> locationIterator = spawnPoints.iterator(); List<Team> toRemove = new ArrayList<>(); for (Team team : teams) { if (!locationIterator.hasNext() || team.isEmpty()) { toRemove.add(team); for (UUID player : team.getPlayersUUID()) { Player p = server.getPlayer(player); if (p != null) { p.kickPlayer(ChatColor.RED + "Plus de place dans la partie."); } gamePlayers.remove(player); } continue; } Location location = locationIterator.next(); for (UUID player : team.getPlayersUUID()) { Player p = server.getPlayer(player); if (p == null) { gamePlayers.remove(player); } else { p.teleport(location); } } } teams.removeAll(toRemove); toRemove.clear(); } @Override public void teleportDeathMatch() { Iterator<Location> locationIterator = spawnPoints.iterator(); List<Team> toRemove = new ArrayList<>(); for (Team team : teams) { if (!locationIterator.hasNext()) { toRemove.add(team); for (UUID player : team.getPlayersUUID()) { Player p = server.getPlayer(player); if (p != null) { p.kickPlayer(ChatColor.RED + "Plus de place dans la partie."); } gamePlayers.remove(player); } continue; } Location location = locationIterator.next(); for (UUID player : team.getPlayersUUID()) { Player p = server.getPlayer(player); if (p == null) { gamePlayers.remove(player); } else { p.teleport(new Location(location.getWorld(), location.getX() * 4 / 10, 150.0, location.getZ() * 4 / 10)); } } } teams.removeAll(toRemove); toRemove.clear(); } @Override public void checkStump(final Player player) { server.getScheduler().runTaskLater(plugin, () -> { List<Team> toRemove = new ArrayList<>(); Team team = teams.getTeam(player.getUniqueId()); if (team == null) { return; } int left = team.removePlayer(player.getUniqueId()); if (left == 0) { server.broadcastMessage(ChatColor.GOLD + "L'équipe " + team.getChatColor() + team.getTeamName() + ChatColor.GOLD + " a été éliminée !"); teams.remove(team); left = teams.size(); if (left == 1) { win(teams.get(0)); return; } else if (left < 1) { handleGameEnd(); return; } else { server.broadcastMessage(ChatColor.YELLOW + "Il reste encore " + ChatColor.AQUA + teams.size() + ChatColor.YELLOW + " équipes en jeu."); } } // Security check for (Team t : teams) { int players1 = 0; if (!t.isEmpty()) { for (UUID id : t.getPlayersUUID()) { if (server.getPlayer(id) != null) { players1++; } } } if (players1 == 0) { server.broadcastMessage(ChatColor.GOLD + "L'équipe " + t.getChatColor() + t.getTeamName() + ChatColor.GOLD + " a été éliminée !"); toRemove.add(t); left = teams.size(); if (left == 2) { win(teams.get(0)); } else if (left < 2) { handleGameEnd(); } else { server.broadcastMessage(ChatColor.YELLOW + "Il reste encore " + ChatColor.AQUA + teams.size() + ChatColor.YELLOW + " équipes en jeu."); } } } teams.removeAll(toRemove); }, 2L); } private void win(final Team team) { try { server.broadcastMessage(ChatColor.GOLD + "" + ChatColor.BOLD + "Victoire de l'équipe " + team.getChatColor() + team.getTeamName() + ChatColor.GOLD + "" + ChatColor.BOLD + " !"); for (Player user : server.getOnlinePlayers()) { TitleAPI.sendTitle(user, 5, 70, 5, ChatColor.GOLD + "Victoire !", "Bravo à l'équipe " + team.getChatColor() + team.getTeamName()); } } catch (Exception ignored) { } for (final UUID playerID : team.getPlayersUUID()) { final Player player = server.getPlayer(playerID); if (player == null) { continue; } this.effectsOnWinner(player); } handleGameEnd(); } @Override public void stumpPlayer(Player player, boolean logout) { if (logout && !this.getStatus().equals(Status.IN_GAME)) { Team team = teams.getTeam(player.getUniqueId()); if (team != null) { team.remove(player.getUniqueId()); } } super.stumpPlayer(player, logout); } public Team getPlayerTeam(UUID uniqueId) { return teams.getTeam(uniqueId); } public TeamList getTeams() { return teams; } public int getPersonsPerTeam() { return personsPerTeam; } }