package com.leontg77.uhc;
import static com.leontg77.uhc.Main.plugin;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.World.Environment;
import org.bukkit.WorldType;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Score;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.Team;
import com.leontg77.uhc.listeners.ArenaListener;
import com.leontg77.uhc.utils.PlayerUtils;
import com.leontg77.uhc.utils.ScatterUtils;
import com.leontg77.uhc.worlds.WorldManager;
/**
* PvP Arena class.
* <p>
* This class contains methods for enabling/disabling the arena, removing and adding players, giving the kit, scores and getting the players in the arena.
*
* @see {@link Scoreboards}
* @author LeonTG77
*/
public class Arena {
private static Arena instance = new Arena();
private Game game = Game.getInstance();
private boolean enabled = false;
public Scoreboard board = Bukkit.getScoreboardManager().getMainScoreboard();
public Objective arenaKills = board.getObjective("arenaKills");
public HashMap<Player, Integer> killstreak = new HashMap<Player, Integer>();
private ArrayList<Player> players = new ArrayList<Player>();
private ArrayList<Long> seeds = new ArrayList<Long>();
private BukkitRunnable kitcycle;
private BukkitRunnable resetwarner;
private BukkitRunnable reset;
/**
* Gets the instance of the class.
*
* @return The instance.
*/
public static Arena getInstance() {
return instance;
}
/**
* Setup the arena class.
*/
public void setup() {
if (board.getObjective("arenaKills") == null) {
arenaKills = board.registerNewObjective("arenaKills", "dummy");
}
seeds.add(-281289493347827785l);
seeds.add(-3703739705758069691l);
seeds.add(-4092363856954762791l);
seeds.add(8563798513411452931l);
seeds.add(3543701468968612620l);
seeds.add(8171481896432811161l);
seeds.add(-2686161525319484628l);
seeds.add(6333008698316655937l);
arenaKills.setDisplayName("�4Arena �8- �7Use /a to join");
if (Game.getInstance().arenaBoard()) {
arenaKills.setDisplaySlot(DisplaySlot.SIDEBAR);
}
plugin.getLogger().info("The arena has been setup.");
}
/**
* Enable the arena
*/
public void enable() {
Bukkit.getServer().getPluginManager().registerEvents(new ArenaListener(), plugin);
this.enabled = true;
if (game.pregameBoard()) {
Scoreboards.getInstance().setScore("�a ", 9);
Scoreboards.getInstance().setScore("�8� �cArena:", 8);
Scoreboards.getInstance().setScore("�8� �7/a ", 7);
}
if (game.arenaBoard()) {
PlayerUtils.broadcast(Main.PREFIX + "The arena board has been enabled.");
arenaKills.setDisplaySlot(DisplaySlot.SIDEBAR);
game.setPregameBoard(false);
game.setArenaBoard(true);
setScore("�8� �a�lPvE", 1);
setScore("�8� �a�lPvE", 0);
}
resetwarner = new BukkitRunnable() {
public void run() {
}
};
kitcycle = new BukkitRunnable() {
public void run() {
}
};
reset = new BukkitRunnable() {
public void run() {
}
};
resetwarner.runTaskTimer(Main.plugin, 1, 1);
kitcycle.runTaskTimer(Main.plugin, 1, 1);
reset.runTaskTimer(Main.plugin, 1, 1);
}
/**
* Disable the arena
*/
public void disable() {
HandlerList.unregisterAll(new ArenaListener());
this.enabled = false;
for (Player player : getPlayers()) {
User user = User.get(player);
user.reset();
if (player.isDead()) {
player.spigot().respawn();
}
board.resetScores(player.getName());
player.teleport(Main.getSpawn());
}
if (game.pregameBoard()) {
Scoreboards.getInstance().resetScore("�a ");
Scoreboards.getInstance().resetScore("�8� �cArena:");
Scoreboards.getInstance().resetScore("�8� �7/a ");
}
if (game.arenaBoard()) {
for (String entry : board.getEntries()) {
resetScore(entry);
}
PlayerUtils.broadcast(Main.PREFIX + "The arena board has been disabled.");
Scoreboards.getInstance().kills.setDisplaySlot(DisplaySlot.SIDEBAR);
game.setArenaBoard(false);
}
killstreak.clear();
players.clear();
resetwarner.cancel();
kitcycle.cancel();
reset.cancel();
resetwarner = null;
kitcycle = null;
reset = null;
}
public void reset() {
final boolean wasEnabled = isEnabled();
if (wasEnabled) {
disable();
}
PlayerUtils.broadcast(Main.PREFIX + "The arena is resetting, lag incoming.");
WorldManager manager = WorldManager.getInstance();
World world = Bukkit.getServer().getWorld("arena");
manager.deleteWorld(world);
manager.createWorld("arena", 200, seeds.get(new Random().nextInt(seeds.size())), Environment.NORMAL, WorldType.NORMAL);
PlayerUtils.broadcast(Main.PREFIX + "World reset done, setting up world options...");
world.setGameRuleValue("doDaylightCycle", "false");
world.setTime(6000);
PlayerUtils.broadcast(Main.PREFIX + "Options setup, pregenning arena world.");
}
/**
* Check if the arena is enabled.
*
* @return True if the arena is enabled, false otherwise.
*/
public boolean isEnabled() {
return enabled;
}
/**
* Get a list of players in the arena.
*
* @return A list of players in the arena.
*/
public List<Player> getPlayers() {
return players;
}
/**
* Check if the arena contains a player.
*
* @param player the player.
* @return <code>True</code> if the player is in the arena, <code>false</code> otherwise.
*/
public boolean hasPlayer(Player player) {
return players.contains(player);
}
/**
* Adds the given player to the arena.
*
* @param player the player.
*/
public void addPlayer(Player player) {
Location loc;
try {
loc = ScatterUtils.getScatterLocations(Bukkit.getWorld("arena"), (int) Bukkit.getWorld("arena").getWorldBorder().getSize() / 3, 1).get(0);
} catch (Exception e) {
player.sendMessage(ChatColor.RED + "Could not teleport you to the arena.");
return;
}
player.sendMessage(Main.PREFIX + "You joined the arena.");
killstreak.put(player, 0);
players.add(player);
giveKit(player);
loc.setY(loc.getWorld().getHighestBlockYAt(loc) + 2);
player.teleport(loc);
player.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 100, 7));
}
/**
* Removes the given player from the arena.
*
* @param player The player.
* @param death If the removal was caused by dying
*/
public void removePlayer(Player player, boolean death) {
players.remove(player);
if (death) {
return;
}
player.sendMessage(Main.PREFIX + "You left the arena.");
Team team = Teams.getInstance().getTeam(player);
if (killstreak.containsKey(player) && killstreak.get(player) > 4) {
PlayerUtils.broadcast(Main.PREFIX + "�6" + player.getName() + "'s �7killstreak of �a" + Arena.getInstance().killstreak.get(player) + " �7was shut down from leaving the arena");
}
for (Player p : Arena.getInstance().getPlayers()) {
p.sendMessage("�8� " + (team == null ? "�f" : team.getPrefix()) + player.getName() + " �fdied from leaving the arena");
}
killstreak.put(player, 0);
User user = User.get(player);
user.reset();
if (player.isDead()) {
player.spigot().respawn();
}
board.resetScores(player.getName());
player.teleport(Main.getSpawn());
}
/**
* Gives the arena kit to the given player.
*
* @param player the player.
*/
private void giveKit(Player player) {
User user = User.get(player);
ItemStack sword = new ItemStack(Material.IRON_SWORD);
ItemStack bow = new ItemStack(Material.BOW);
ItemStack cobble = new ItemStack(Material.COBBLESTONE, 64);
ItemStack bucket = new ItemStack(Material.WATER_BUCKET);
ItemStack pickaxe = new ItemStack(Material.IRON_PICKAXE);
pickaxe.addEnchantment(Enchantment.DIG_SPEED, 2);
ItemStack axe = new ItemStack(Material.IRON_AXE);
axe.addEnchantment(Enchantment.DIG_SPEED, 2);
ItemStack shovel = new ItemStack(Material.IRON_SPADE);
shovel.addEnchantment(Enchantment.DIG_SPEED, 2);
ItemStack gapple = new ItemStack(Material.GOLDEN_APPLE);
ItemStack food = new ItemStack(Material.COOKED_BEEF, 32);
ItemStack helmet = new ItemStack(Material.IRON_HELMET);
ItemStack chestplate = new ItemStack(Material.IRON_CHESTPLATE);
ItemStack leggings = new ItemStack(Material.IRON_LEGGINGS);
ItemStack boots = new ItemStack(Material.IRON_BOOTS);
player.getInventory().setItem(user.getFile().getInt("hotbar.sword", 0), sword);
player.getInventory().setItem(user.getFile().getInt("hotbar.bow", 1), bow);
player.getInventory().setItem(user.getFile().getInt("hotbar.bucket", 2), bucket);
player.getInventory().setItem(user.getFile().getInt("hotbar.pickaxe", 3), pickaxe);
player.getInventory().setItem(user.getFile().getInt("hotbar.cobble", 4), cobble);
player.getInventory().setItem(user.getFile().getInt("hotbar.gapple", 5), gapple);
player.getInventory().setItem(user.getFile().getInt("hotbar.shovel", 6), shovel);
player.getInventory().setItem(user.getFile().getInt("hotbar.axe", 7), axe);
player.getInventory().setItem(user.getFile().getInt("hotbar.food", 8), food);
player.getInventory().setItem(27, new ItemStack (Material.ARROW, 64));
player.getInventory().addItem(new ItemStack (Material.WORKBENCH, 16));
player.getInventory().addItem(new ItemStack (Material.ENCHANTMENT_TABLE, 4));
player.getInventory().setHelmet(helmet);
player.getInventory().setChestplate(chestplate);
player.getInventory().setLeggings(leggings);
player.getInventory().setBoots(boots);
}
/**
* Sets the score of the given player.
*
* @param player the player setting it for.
* @param newScore the new score.
*/
public void setScore(String player, int newScore) {
Score score = arenaKills.getScore(player);
score.setScore(newScore);
}
/**
* Gets the given score for the given string.
*
* @param string the wanted string.
* @return The score of the string.
*/
public int getScore(String string) {
return arenaKills.getScore(string).getScore();
}
/**
* Reset the score of the given string.
*
* @param string the string resetting.
*/
public void resetScore(String string) {
board.resetScores(string);
}
}