package net.knarcraft.hungerarena; import com.sk89q.worldedit.bukkit.WorldEditPlugin; import net.knarcraft.hungerarena.Listeners.BlockStorage; import net.knarcraft.hungerarena.Listeners.Boundaries; import net.knarcraft.hungerarena.Listeners.ChatListener; import net.knarcraft.hungerarena.Listeners.DeathListener; import net.knarcraft.hungerarena.Listeners.FreezeListener; import net.knarcraft.hungerarena.Listeners.JoinAndQuitListener; import net.knarcraft.hungerarena.Listeners.PvP; import net.knarcraft.hungerarena.Listeners.SignsAndBeds; import net.knarcraft.hungerarena.Listeners.SignsAndBedsOld; import net.knarcraft.hungerarena.Listeners.SpectatorListener; import net.knarcraft.hungerarena.Listeners.SpectatorListenerOld; import net.knarcraft.hungerarena.Listeners.TeleportListener; import net.knarcraft.hungerarena.Listeners.WorldChange; import net.knarcraft.hungerarena.Listeners.spawnsListener; import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Color; import org.bukkit.FireworkEffect; import org.bukkit.FireworkEffect.Type; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.command.CommandExecutor; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.EntityType; import org.bukkit.entity.Firework; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.FireworkMeta; import org.bukkit.material.MaterialData; import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Objective; import org.bukkit.scoreboard.Score; import org.bukkit.scoreboard.Scoreboard; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Random; import java.util.Set; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; public class HungerArena extends JavaPlugin { static Logger log; public final HashMap> Playing = new HashMap<>(); public final HashMap> Ready = new HashMap<>(); public final HashMap> Dead = new HashMap<>(); public final HashMap MatchRunning = new HashMap<>(); public final HashMap canJoin = new HashMap<>(); public final HashMap open = new HashMap<>(); private final HashMap countDownTimer = new HashMap<>(); public final HashMap> Quit = new HashMap<>(); public final HashMap> Out = new HashMap<>(); public final HashMap> Watching = new HashMap<>(); public final HashMap Kills = new HashMap<>(); public final HashMap> NeedConfirm = new HashMap<>(); public final HashMap> location = new HashMap<>(); public final HashMap> inArena = new HashMap<>(); //public final HashMap> Frozen = new HashMap<>(); public final HashMap maxPlayers = new HashMap<>(); public final HashMap setting = new HashMap<>(); public final HashMap gp = new HashMap<>(); public final ArrayList Tele = new ArrayList<>(); public final ArrayList needInv = new ArrayList<>(); public final HashMap worldNames = new HashMap<>(); public final Map arenas = new HashMap<>(); public final Map arenaPlayers = new HashMap<>(); public final HashMap scoreboards = new HashMap<>(); final Listener DeathListener = new DeathListener(this); Listener SpectatorListener = null; Listener SpectatorListenerOld = null; final Listener FreezeListener = new FreezeListener(this); final Listener JoinAndQuitListener = new JoinAndQuitListener(this); final Listener ChatListener = new ChatListener(this); final Listener Chests = new Chests(this); final Listener PvP = new PvP(this); final Listener CommandBlock = new CommandBlock(this); Listener Teleport = new TeleportListener(this); SignsAndBeds SignsAndBeds = null; SignsAndBedsOld SignsAndBedsOld = null; final Listener BlockStorage = new BlockStorage(this); //Listener WinGames = new WinGamesListener(this); final Listener WorldChange = new WorldChange(this); final Listener Boundaries = new Boundaries(this); final Listener spawnsListener = new spawnsListener(this); final CommandExecutor HaCommands = new HaCommands(this); final CommandExecutor SponsorCommands = new SponsorCommands(this); final CommandExecutor SpawnsCommand = new SpawnsCommand(this); public boolean exists; public boolean restrictedWorlds; public FileConfiguration config; public FileConfiguration spawns = null; public File spawnsFile = null; public FileConfiguration data = null; public File dataFile = null; public FileConfiguration management = null; public File managementFile = null; public FileConfiguration MyChests = null; public File ChestsFile = null; public final ArrayList Reward = new ArrayList<>(); public final ArrayList Cost = new ArrayList<>(); public final ArrayList Fee = new ArrayList<>(); public final ArrayList ChestPay = new ArrayList<>(); public boolean vault = false; public boolean eco = false; public Economy econ = null; int i = 0; int v = 0; int arenaId = 0; final File PFilePath = new File(getDataFolder(), "/inventories"); public void onEnable() { log = this.getLogger(); getConfig().options().copyDefaults(true); getConfig().options().copyHeader(true); saveDefaultConfig(); saveConfig(); config = getConfig(); spawns = getSpawns(); data = getData(); data.options().copyDefaults(true); if (!new File(this.getDataFolder(), "Data.yml").exists()) { this.saveData(); } management = this.getManagement(); management.options().copyDefaults(true); if (!new File(this.getDataFolder(), "commandAndBlockManagement.yml").exists()) { this.saveManagement(); } MyChests = this.getChests(); MyChests.options().copyDefaults(true); if (!new File(this.getDataFolder(), "Chests.yml").exists()) { this.saveChests(); } getServer().getPluginManager().registerEvents(DeathListener, this); getServer().getPluginManager().registerEvents(FreezeListener, this); getServer().getPluginManager().registerEvents(JoinAndQuitListener, this); getServer().getPluginManager().registerEvents(ChatListener, this); getServer().getPluginManager().registerEvents(Chests, this); getServer().getPluginManager().registerEvents(PvP, this); getServer().getPluginManager().registerEvents(CommandBlock, this); try { Class.forName("org.bukkit.Tag"); SignsAndBeds = new SignsAndBeds(this); getServer().getPluginManager().registerEvents(SignsAndBeds, this); SpectatorListener = new SpectatorListener(this); getServer().getPluginManager().registerEvents(SpectatorListener, this); getLogger().info("Events 1.13+ enabled!"); } catch (NoClassDefFoundError | ClassNotFoundException exp) { SignsAndBedsOld = new SignsAndBedsOld(this); getServer().getPluginManager().registerEvents(SignsAndBedsOld, this); SpectatorListenerOld = new SpectatorListenerOld(this); getServer().getPluginManager().registerEvents(SpectatorListenerOld, this); getLogger().info("Events 1.12- enabled!"); } getServer().getPluginManager().registerEvents(BlockStorage, this); //getServer().getPluginManager().registerEvents(WinGames, this); getServer().getPluginManager().registerEvents(WorldChange, this); getServer().getPluginManager().registerEvents(Boundaries, this); getServer().getPluginManager().registerEvents(spawnsListener, this); getCommand("Ha").setExecutor(HaCommands); getCommand("Sponsor").setExecutor(SponsorCommands); getCommand("Startpoint").setExecutor(SpawnsCommand); if (!PFilePath.exists()) { PFilePath.mkdirs(); } for (File file : PFilePath.listFiles()) { String filename = file.getName(); int lastIndex = filename.lastIndexOf('.'); filename = filename.substring(0, Math.max(lastIndex, 0)); needInv.add(filename); } i = 1; this.reloadSpawnPoints(true); if (setupEconomy()) { log.info("Found Vault! Hooking in for economy!"); } if (config.getDouble("config.version") != 1.4) { config.set("config.version", 1.4); config.set("rewardEco.enabled", false); config.set("rewardEco.reward", 100); } if (config.getBoolean("rewardEco.enabled", true) || config.getBoolean("sponsorEco.enabled", true) || config.getBoolean("EntryFee.eco", true)) { if (vault) { log.info("Economy hook deployed."); eco = true; } else { log.info("You want economy support... yet you either don't have Vault or don't have an economy plugin. Sorry, can't give you it."); } } if (!eco) { if (vault) { log.info("We see that you have Vault on your server. To set economy support to true, enable it in the config."); } } try { List RewardItemList = new ArrayList<>(); List SponsorItemList = new ArrayList<>(); List EntryfeeItemList = new ArrayList<>(); List PayForChests = new ArrayList<>(); for (String rewards : config.getStringList("Reward")) { String[] rinfo = rewards.split(","); Material NewMat = getNewMaterial(rinfo[0], 0); if (NewMat != null) { Reward.add(new ItemStack(NewMat, Integer.parseInt(rinfo[1]))); RewardItemList.add(NewMat.name() + "," + Integer.parseInt(rinfo[1])); } } config.set("Reward", RewardItemList); for (String scost : config.getStringList("Sponsor_Cost")) { String[] sinfo = scost.split(","); Material NewMat = getNewMaterial(sinfo[0], 0); if (NewMat != null) { Cost.add(new ItemStack(NewMat, Integer.parseInt(sinfo[1]))); SponsorItemList.add(NewMat.name() + "," + Integer.parseInt(sinfo[1])); } } config.set("Sponsor_Cost", SponsorItemList); if (config.getBoolean("EntryFee.enabled")) { for (String fee : config.getStringList("EntryFee.fee")) { String[] finfo = fee.split(","); Material NewMat = getNewMaterial(finfo[0], 0); if (NewMat != null) { Fee.add(new ItemStack(NewMat, Integer.parseInt(finfo[1]))); EntryfeeItemList.add(NewMat.name() + "," + Integer.parseInt(finfo[1])); } } config.set("EntryFee.fee", EntryfeeItemList); } if (config.getBoolean("ChestPay.enabled")) { for (String paychests : config.getStringList("ChestPay.items")) { String[] rew = paychests.split(","); Material NewMat = getNewMaterial(rew[0], 0); if (NewMat != null) { ChestPay.add(new ItemStack(NewMat, Integer.parseInt(rew[1]))); PayForChests.add(NewMat.name() + "," + Integer.parseInt(rew[1])); } } config.set("ChestPay.items", PayForChests); } ArrayList newList = new ArrayList<>(); for (String block : management.getStringList("blocks.whitelist")) { Material NewMat = getNewMaterial(block, 0); if (NewMat != null) { newList.add(NewMat.name()); } } management.set("blocks.whitelist", newList); this.saveManagement(); } catch (Exception e) { log.warning("Could not add a reward/sponsor/entry cost or whitelist/blacklist! One of them is wrong!"); } try { String spt = config.getString("spawnsTool"); if (!spt.trim().toLowerCase().contains("[a-z]")) { config.set("spawnsTool", getNewMaterial(spt, 0).name()); } } catch (Exception e) { } restrictedWorlds = config.getBoolean("Restricted"); saveConfig(); scoreboardInit(); log.info("Enabled v" + getDescription().getVersion()); } public Material getNewMaterial(String base, int data) { Material NewMat = null; if (Material.getMaterial(base) != null) { NewMat = Material.getMaterial(base); } else if (base.replaceAll("[0-9]", "").equals("")) { NewMat = findOldMaterial(Integer.parseInt(base), (byte) data); } else { try { NewMat = Material.getMaterial(base, true); } catch (NoSuchMethodError n) { } } return NewMat; } public Material findOldMaterial(int typeId, byte dataValue) { for (Material i : EnumSet.allOf(Material.class)) { try { if (i.getId() == typeId) { return Bukkit.getUnsafe().fromLegacy(new MaterialData(i, dataValue)); } } catch (IllegalArgumentException | NoSuchMethodError e) { try { if (i.getId() == typeId) { return new MaterialData(i, dataValue).getItemType(); } } catch (IllegalArgumentException ee) { } } } return null; } public void onDisable() { log.info("Disabled v" + getDescription().getVersion()); } public void reloadSpawnPoints(boolean verbose) { if (spawns.getConfigurationSection("Spawns") != null) { Map temp = spawns.getConfigurationSection("Spawns").getValues(false); for (Entry entry : temp.entrySet()) { if (spawns.getConfigurationSection("Spawns." + entry.getKey()) != null) { Integer a = Integer.parseInt(entry.getKey()); worldNames.put(a, "none_meaning_this_is_not_a_map"); location.computeIfAbsent(a, k -> new HashMap<>()); Map temp2 = spawns.getConfigurationSection("Spawns." + entry.getKey()).getValues(false); for (Map.Entry e : temp2.entrySet()) { if (spawns.get("Spawns." + entry.getKey() + "" + e.getKey()) != null) { String[] coords = ((String) spawns.get("Spawns." + entry.getKey() + "" + e.getKey())).split(","); Integer s = Integer.parseInt(e.getKey()); location.get(a).put(s, new Location(getServer().getWorld(coords[0]), Double.parseDouble(coords[1]), Double.parseDouble(coords[2]), Double.parseDouble(coords[3]))); worldNames.put(a, coords[0]); } } } } } for (int arenaId : location.keySet()) { if (location.get(arenaId).size() != 0) { if (verbose) { log.info("Loaded " + location.get(arenaId).size() + " tribute spawns for arena " + arenaId + "!"); } Playing.put(arenaId, new ArrayList<>()); Ready.put(arenaId, new ArrayList<>()); Dead.put(arenaId, new ArrayList<>()); MatchRunning.put(arenaId, null); Quit.put(arenaId, new ArrayList<>()); Out.put(arenaId, new ArrayList<>()); Watching.put(arenaId, new ArrayList<>()); NeedConfirm.put(arenaId, new ArrayList<>()); inArena.put(arenaId, new ArrayList<>()); Arena arena = arenas.get(arenaId); for (ArenaPlayer arenaPlayer : arenaPlayers.values()) { if (arenaPlayer.getArena() == arena) { arenaPlayer.setFrozen(false); } } canJoin.put(arenaId, false); maxPlayers.put(arenaId, location.get(arenaId).size()); open.put(arenaId, true); } } } public WorldEditPlugin hookWE() { Plugin wPlugin = getServer().getPluginManager().getPlugin("WorldEdit"); if ((!(wPlugin instanceof WorldEditPlugin))) { return null; } return (WorldEditPlugin) wPlugin; } public boolean setupEconomy() { if (getServer().getPluginManager().getPlugin("Vault") == null) { return false; } RegisteredServiceProvider rsp = getServer().getServicesManager().getRegistration(Economy.class); if (rsp == null) { return false; } econ = rsp.getProvider(); vault = true; return true; } public void reloadSpawns() { if (spawnsFile == null) { spawnsFile = new File(getDataFolder(), "spawns.yml"); } if (!spawnsFile.exists()) { this.saveResource("spawns.yml", false); } spawns = YamlConfiguration.loadConfiguration(spawnsFile); InputStream defaultSpawnsConfigStream = this.getResource("spawns.yml"); if (defaultSpawnsConfigStream != null) { YamlConfiguration defaultSpawnsConfig = loadConfigStream(defaultSpawnsConfigStream); if (defaultSpawnsConfig != null) { spawns.addDefaults(defaultSpawnsConfig); spawns.options().copyDefaults(true); saveSpawns(); } } String spawnsSet = spawns.getString("Spawns_set"); if (spawnsSet != null && (spawnsSet.equalsIgnoreCase("false") || spawnsSet.equalsIgnoreCase("true"))) { //Move the spawns_set value to spawns_set.0, and unset Spawns_set spawns.set("Spawns_set", null); spawns.set("Spawns_set.0", spawnsSet); String spawnCoordinatesValue = spawns.getString("Spawn_coordinates"); spawns.set("Spawn_coordinates", null); spawns.set("Spawn_coordinates.0", spawnCoordinatesValue); if (spawns.getConfigurationSection("Spawns") != null) { Set spawnConfigKeys = spawns.getConfigurationSection("Spawns").getValues(false).keySet(); for (String entry : spawnConfigKeys) { if (spawns.getString("Spawns_set_" + entry) != null) { spawns.set("Spawns_set." + entry, spawns.getString("Spawns_set_" + entry)); spawns.set("Spawns_set_" + entry, null); } if (spawns.getString("Spawn_coordinates_" + entry) != null) { spawns.set("Spawn_coordinates." + entry, spawns.getString("Spawn_coordinates_" + entry)); spawns.set("Spawn_coordinates_" + entry, null); } } } saveSpawns(); } } public FileConfiguration getSpawns() { if (spawns == null) { this.reloadSpawns(); } return spawns; } public void saveSpawns() { if (spawns == null || spawnsFile == null) { return; } try { getSpawns().save(spawnsFile); } catch (IOException ex) { this.getLogger().log(Level.SEVERE, "Could not save config to " + spawnsFile, ex); } } public void reloadData() { if (dataFile == null) { dataFile = new File(getDataFolder(), "Data.yml"); } if (!dataFile.exists()) { this.saveResource("Data.yml", false); } data = YamlConfiguration.loadConfiguration(dataFile); InputStream defaultConfigStream = this.getResource("Data.yml"); if (defaultConfigStream != null) { YamlConfiguration defaultConfig = loadConfigStream(defaultConfigStream); if (defaultConfig != null) { data.addDefaults(defaultConfig); data.options().copyDefaults(true); saveData(); } } } public FileConfiguration getData() { if (data == null) { this.reloadData(); } return data; } public void saveData() { if (data == null || dataFile == null) { return; } try { getData().save(dataFile); } catch (IOException ex) { this.getLogger().log(Level.SEVERE, "Could not save config to " + dataFile, ex); } } public void reloadManagement() { if (managementFile == null) { managementFile = new File(getDataFolder(), "commandAndBlockManagement.yml"); } if (!managementFile.exists()) { this.saveResource("commandAndBlockManagement.yml", false); } management = YamlConfiguration.loadConfiguration(managementFile); InputStream defaultConfigStream = this.getResource("commandAndBlockManagement.yml"); if (defaultConfigStream != null) { YamlConfiguration defaultConfig = loadConfigStream(defaultConfigStream); if (defaultConfig != null) { management.addDefaults(defaultConfig); management.options().copyHeader(true); management.options().copyDefaults(true); saveManagement(); } } } public FileConfiguration getManagement() { if (management == null) { this.reloadManagement(); } return management; } public void saveManagement() { if (management == null || managementFile == null) { return; } try { getManagement().save(managementFile); } catch (IOException ex) { this.getLogger().log(Level.SEVERE, "Could not save config to " + managementFile, ex); } } public void reloadChests() { if (ChestsFile == null) { ChestsFile = new File(getDataFolder(), "Chests.yml"); } MyChests = YamlConfiguration.loadConfiguration(ChestsFile); } public FileConfiguration getChests() { if (MyChests == null) { this.reloadChests(); } return MyChests; } public void saveChests() { if (MyChests == null || ChestsFile == null) { return; } try { getChests().save(ChestsFile); } catch (IOException ex) { this.getLogger().log(Level.SEVERE, "Could not save config to " + ChestsFile, ex); } } File PFile = null; FileConfiguration PConfig = null; public void reloadPFile(String pname) { if (PFile == null) { PFile = new File(PFilePath, pname + ".yml"); } PConfig = YamlConfiguration.loadConfiguration(PFile); InputStream defaultConfigStream = this.getResource("Player.yml"); if (defaultConfigStream != null) { YamlConfiguration defaultConfig = loadConfigStream(defaultConfigStream); if (defaultConfig != null) { this.PConfig.setDefaults(defaultConfig); } } } private YamlConfiguration loadConfigStream(InputStream defaultConfigStream) { Reader defaultConfigReader = null; YamlConfiguration defaultConfig = null; if (defaultConfigStream != null) { defaultConfigReader = new java.io.InputStreamReader(defaultConfigStream, StandardCharsets.UTF_8); } if (defaultConfigReader != null) { defaultConfig = YamlConfiguration.loadConfiguration(defaultConfigReader); } else { log.warning("A default resource in the plugin jar could not be read."); } try { if (defaultConfigReader != null) { defaultConfigReader.close(); } } catch (IOException e) { log.warning("An error occured while trying to close the resource file."); } return defaultConfig; } public FileConfiguration getPConfig(String pname) { PFile = null; this.reloadPFile(pname); return PConfig; } public void savePFile(String pname) { if (PConfig.getString("player").equals(pname)) { try { this.PConfig.save(PFile); } catch (IOException ex) { this.getLogger().log(Level.SEVERE, "Could not save config to " + PFile, ex); } } else { this.getLogger().log(Level.SEVERE, "Could not save config to " + pname + ".yml ! It's not this players inventory!?"); } } @SuppressWarnings("unchecked") public void restoreInventory(Player p, String pname) { for (int u : Playing.keySet()) { if (Playing.get(u) != null) { if (Playing.get(u).contains(pname)) { Playing.get(u).remove(pname); p.sendMessage(ChatColor.AQUA + "You have left the game!"); if (config.getBoolean("broadcastAll")) { p.getServer().broadcastMessage(ChatColor.RED + pname + " Left Arena " + u + "!"); } else { for (UUID gn : Playing.get(u)) { Player g = getServer().getPlayer(gn); g.sendMessage(ChatColor.RED + pname + " Quit!"); } } if (canJoin.get(u)) { p.getScoreboard().clearSlot(DisplaySlot.SIDEBAR); scoreboards.remove(p.getName()); Kills.remove(p.getName()); } } } if (Ready.get(u) != null) { Ready.get(u).remove(pname); } } if (new File(PFilePath, pname + ".yml").exists()) { FileConfiguration pinfo = this.getPConfig(pname); if ((pinfo.getString("player").equals(pname)) && (this.needInv.contains(pname))) { try { ItemStack[] pinv = null; Object o = pinfo.get("inv"); if (o instanceof ItemStack[]) { pinv = (ItemStack[]) o; } else if (o instanceof List) { pinv = ((List) o).toArray(new ItemStack[0]); } p.getInventory().setContents(pinv); p.updateInventory(); ItemStack[] parmor = null; o = pinfo.get("armor"); if (o instanceof ItemStack[]) { parmor = (ItemStack[]) o; } else if (o instanceof List) { parmor = ((List) o).toArray(new ItemStack[0]); } p.getInventory().setArmorContents(parmor); p.updateInventory(); p.sendMessage(ChatColor.GOLD + "[HA] " + ChatColor.GREEN + "Your inventory has been restored!"); new File(PFilePath, pname + ".yml").delete(); while (needInv.contains(pname)) { needInv.remove(pname); } } catch (Exception e) { p.sendMessage(ChatColor.RED + "Something went wrong when trying to restore your inv, please contact an administrator."); this.getLogger().warning("Error occured when trying to restore the inv of " + pname + ":"); System.out.println(e); } } } if (p.hasMetadata("HA-Location")) { p.removeMetadata("HA-Location", this); } } public void winner(final Integer a) { if (Playing.get(a).size() == 1) { String[] Spawncoords; if (spawns.getString("Spawn_coordinates." + a) != null) { Spawncoords = spawns.getString("Spawn_coordinates." + a).split(","); } else { Spawncoords = spawns.getString("Spawn_coordinates.0").split(","); } World spawnw = getServer().getWorld(Spawncoords[3]); double spawnx = Double.parseDouble(Spawncoords[0]); double spawny = Double.parseDouble(Spawncoords[1]); double spawnz = Double.parseDouble(Spawncoords[2]); Location Spawn = new Location(spawnw, spawnx, spawny, spawnz); for (i = 0; i < Playing.get(a).size(); i++) { UUID winnerId = Playing.get(a).get(i); final Player winner = getServer().getPlayer(winnerId); //TODO: Figure out exactly what needs to be done in this case if (winner == null) { continue; } String winnerName = winner.getName(); if (canJoin.get(a)) { getServer().broadcastMessage(ChatColor.GREEN + winnerName + " is the victor of this Hunger Games!"); } winner.getInventory().clear(); winner.getInventory().setBoots(null); winner.getInventory().setChestplate(null); winner.getInventory().setHelmet(null); winner.getInventory().setLeggings(null); winner.setLevel(0); for (PotionEffect pe : winner.getActivePotionEffects()) { PotionEffectType potion = pe.getType(); winner.removePotionEffect(potion); } Tele.add(winner); needInv.add(winnerName); winner.teleport(Spawn); this.restoreInventory(winner, winnerName); if (canJoin.get(a)) { winner.getScoreboard().clearSlot(DisplaySlot.SIDEBAR); scoreboards.remove(winner.getName()); Kills.remove(winner.getName()); //////////////////////////////////////////////////////// //////////////////// FIREWORKS /////////////////////// //////////////////////////////////////////////////////// for (i = 0; i < 10; i++) { Bukkit.getScheduler().runTaskLater(this, () -> { //Spawn the Fireworks, get the FireworkMeta. Firework fw = (Firework) winner.getWorld().spawnEntity(winner.getLocation(), EntityType.FIREWORK); FireworkMeta fwm = fw.getFireworkMeta(); //Our random generator Random r = new Random(); //Get the type int rt = r.nextInt(4) + 1; Type type = Type.BALL; if (rt == 1) { type = Type.BALL; } if (rt == 2) { type = Type.BALL_LARGE; } if (rt == 3) { type = Type.BURST; } if (rt == 4) { type = Type.CREEPER; } if (rt == 5) { type = Type.STAR; } //Get our random colours int r1i = r.nextInt(17) + 1; int r2i = r.nextInt(17) + 1; Color c1 = getColor(r1i); Color c2 = getColor(r2i); //Create our effect with this FireworkEffect effect = FireworkEffect.builder().flicker(r.nextBoolean()).withColor(c1).withFade(c2).with(type).trail(r.nextBoolean()).build(); //Then apply the effect to the meta fwm.addEffect(effect); //Generate some random power and set it int rp = r.nextInt(2) + 1; fwm.setPower(rp); //Then apply this to our rocket fw.setFireworkMeta(fwm); }, 20 + i * 20L); } //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// if (!config.getBoolean("rewardEco.enabled")) { for (ItemStack Rewards : Reward) { winner.getInventory().addItem(Rewards); } } else { for (ItemStack Rewards : Reward) { winner.getInventory().addItem(Rewards); } econ.depositPlayer(winner, config.getDouble("rewardEco.reward")); } } if (deathtime.get(a) != null) { getServer().getScheduler().cancelTask(deathtime.get(a)); deathtime.put(a, null); } if (graceSchedulerIds.get(a) != null) { getServer().getScheduler().cancelTask(graceSchedulerIds.get(a)); graceSchedulerIds.put(a, null); } if (start.get(a) != null) { getServer().getScheduler().cancelTask(start.get(a)); start.put(a, null); } } Playing.get(a).clear(); Quit.get(a).clear(); Dead.get(a).clear(); //Show spectators for (UUID s1 : Watching.get(a)) { Player spectator = getServer().getPlayer(s1); spectator.setAllowFlight(false); spectator.teleport(Spawn); for (Player online : getServer().getOnlinePlayers()) { online.showPlayer(this, spectator); } } if (config.getBoolean("Auto_Restart")) { Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this, () -> Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), "ha restart " + a), 220L); } MatchRunning.put(a, null); } } private Color getColor(int i) { if (i == 1) { return Color.AQUA; } else if (i == 2) { return Color.BLACK; } else if (i == 3) { return Color.BLUE; } else if (i == 4) { return Color.FUCHSIA; } else if (i == 5) { return Color.GRAY; } else if (i == 6) { return Color.GREEN; } else if (i == 7) { return Color.LIME; } else if (i == 8) { return Color.MAROON; } else if (i == 9) { return Color.NAVY; } else if (i == 10) { return Color.OLIVE; } else if (i == 11) { return Color.ORANGE; } else if (i == 12) { return Color.PURPLE; } else if (i == 13) { return Color.RED; } else if (i == 14) { return Color.SILVER; } else if (i == 15) { return Color.TEAL; } else if (i == 16) { return Color.WHITE; } else { return Color.YELLOW; } } private void scoreboardInit() { Bukkit.getScheduler().scheduleSyncRepeatingTask(this, () -> { Collection online = getServer().getOnlinePlayers(); for (Player pl : online) { updateScoreboard(pl); } }, 20L, 10L); } public void updateScoreboard(Player p) { if (getArena(p) != null || isSpectating(p)) { if (getArena(p) != null) { arenaId = getArena(p).getArenaId(); } else if (getSpectating(p) != null) { arenaId = getSpectating(p).getArenaId(); } if (scoreboards.get(p.getName()) != null && scoreboards.get(p.getName()).getObjective("HA") != null) { Scoreboard sb = scoreboards.get(p.getName()); Objective obj = sb.getObjective("HA"); if (obj != null) { Score kills = obj.getScore(ChatColor.RED + "Kills"); Score players = obj.getScore(ChatColor.RED + "Players"); Score spectators = obj.getScore(ChatColor.RED + "Spectators"); Score allkills = obj.getScore(ChatColor.RED + "Deaths"); players.setScore(Playing.get(arenaId).size()); if (Kills.containsKey(p.getName())) { kills.setScore(Kills.get(p.getName())); } if (Kills.containsKey("__SuM__")) { allkills.setScore(Kills.get("__SuM__")); } if (Watching.get(arenaId) != null) { spectators.setScore(Watching.get(arenaId).size()); } if (config.getInt("DeathMatch") != 0) { if (timetodeath.get(arenaId) != null) { if (timetodeath.get(arenaId) > 0) { int ttd = timetodeath.get(arenaId) - timetodeath.get(arenaId) / 60 * 60; String secs = String.valueOf((ttd < 10) ? "0" + ttd : ttd); obj.setDisplayName(ChatColor.GREEN + "HA - DMTime: " + ChatColor.AQUA + timetodeath.get(arenaId) / 60 + ":" + secs); } else { obj.setDisplayName(ChatColor.GREEN + "HA - " + ChatColor.RED + "DEATHMATCH"); } } } else { obj.setDisplayName(ChatColor.GREEN + "HungerArena"); } p.setScoreboard(sb); } } } } public final HashMap graceSchedulerIds = new HashMap<>(); public final HashMap start = new HashMap<>(); public final HashMap deathtime = new HashMap<>(); public final HashMap timetodeath = new HashMap<>(); public void startGames(final int arenaId) { if ((MatchRunning.get(arenaId) != null) && (MatchRunning.get(arenaId).equals("true"))) { return; } final String msg = ChatColor.translateAlternateColorCodes('&', config.getString("Start_Message")); for (UUID gn : Playing.get(arenaId)) { Scoreboard scoreboard = getServer().getScoreboardManager().getNewScoreboard(); Objective sobj; try { sobj = scoreboard.registerNewObjective("HA", "HAData", ChatColor.GREEN + "HA - Starting"); } catch (NoSuchMethodError e) { sobj = scoreboard.registerNewObjective("HA", "HAData"); sobj.setDisplayName(ChatColor.GREEN + "HA - Starting"); } Score skills = sobj.getScore(ChatColor.RED + "Kills"); skills.setScore(0); Score sdeaths = sobj.getScore(ChatColor.RED + "Spectators"); sdeaths.setScore(0); Score splayers = sobj.getScore(ChatColor.RED + "Players"); splayers.setScore(0); Score allkills = sobj.getScore(ChatColor.RED + "Deaths"); allkills.setScore(0); sobj.setDisplaySlot(DisplaySlot.SIDEBAR); Bukkit.getPlayer(gn).setScoreboard(scoreboard); scoreboards.put(Bukkit.getPlayer(gn).getName(), Bukkit.getPlayer(gn).getScoreboard()); } getServer().dispatchCommand(Bukkit.getConsoleSender(), "ha Refill " + arenaId); MatchRunning.put(arenaId, "true"); if (start.get(arenaId) != null) { getServer().getScheduler().cancelTask(start.get(arenaId)); } if (config.getString("Countdown").equalsIgnoreCase("true")) { displayCountDown(arenaId, msg); } else { Arena arena = arenas.get(arenaId); setTorch(arenaId, true); for (ArenaPlayer arenaPlayer : arenaPlayers.values()) { if (arenaPlayer.getArena() == arena) { arenaPlayer.setFrozen(false); } } if (config.getBoolean("broadcastAll")) { getServer().broadcastMessage(msg); } else { for (UUID gn : Playing.get(arenaId)) { Player g = getServer().getPlayer(gn); g.sendMessage(msg); } } } canJoin.put(arenaId, true); } private void broadCastArenaStartingSoon(int arenaId) { if (!config.getBoolean("broadcastAll")) { //Broadcast that a game is starting soon to all players in the arena for (ArenaPlayer player : arenas.get(arenaId).getArenaPlayers()) { player.getPlayer().sendMessage(ChatColor.AQUA + "Game starting in: " + countDownTimer.get(arenaId)); } } else if (!restrictedWorlds) { //Broadcast that a game is starting soon to all players getServer().broadcastMessage(ChatColor.AQUA + "Game " + arenaId + " starting in: " + countDownTimer.get(arenaId)); } else { //Broadcast to all players in the arena world that a game is starting soon for (String worldName : worldNames.values()) { World world = getServer().getWorld(worldName); //If the world doesn't exist, skip it if (world == null) { continue; } for (Player worldPlayer : world.getPlayers()) { worldPlayer.sendMessage(String.valueOf(countDownTimer.get(arenaId))); } } } } private void announceGracePeriod(int arenaId) { Arena arena = arenas.get(arenaId); arena.setGracePeriod(config.getInt("Grace_Period")); if (this.graceSchedulerIds.get(arenaId) == null) { return; } int taskId = getServer().getScheduler().scheduleSyncRepeatingTask(this, () -> { //Reduce grace period by one arena.setGracePeriod(arena.getGracePeriod() - 1); int gracePeriod = arena.getGracePeriod(); boolean broadcastAll = config.getBoolean("broadcastAll"); String gracePeriodMessage = null; if (gracePeriod == 30 || gracePeriod == 15 || (gracePeriod < 11 && gracePeriod > 0)) { //Print when 30 seconds left, 15 seconds left, and count down from 10 gracePeriodMessage = ChatColor.GREEN + "Grace period ends in " + gracePeriod + " seconds!"; } else if (gracePeriod <= 0) { //Print when the grace period expires gracePeriodMessage = ChatColor.GREEN + "Grace period is over, FIGHT!"; } if (gracePeriodMessage != null) { if (broadcastAll) { //Broadcast to all players getServer().broadcastMessage(gracePeriodMessage); } else { //Broadcast to all players in the arena's world for (Player player : arena.getWorld().getPlayers()) { player.sendMessage(gracePeriodMessage); } } } //Cancel the scheduler if the grace period is over if (gracePeriod <= 0) { getServer().getScheduler().cancelTask(graceSchedulerIds.get(arenaId)); graceSchedulerIds.put(arenaId, null); } }, 20L, 20L); graceSchedulerIds.put(arenaId, taskId); } private void displayCountDown(int arenaId, String msg) { countDownTimer.put(arenaId, (config.getInt("Countdown_Timer") != 0 ? config.getInt("Countdown_Timer") : 10)); start.put(arenaId, getServer().getScheduler().scheduleSyncRepeatingTask(this, () -> { if (countDownTimer.get(arenaId) > 0) { broadCastArenaStartingSoon(arenaId); } countDownTimer.put(arenaId, countDownTimer.get(arenaId) - 1); if (countDownTimer.get(arenaId) == -1) { for (UUID gn : Playing.get(arenaId)) { Scoreboard scoreboard = getServer().getScoreboardManager().getNewScoreboard(); Objective sobj; try { sobj = scoreboard.registerNewObjective("HA", "HAData", ChatColor.GREEN + "HA - Starting"); } catch (NoSuchMethodError e) { sobj = scoreboard.registerNewObjective("HA", "HAData"); sobj.setDisplayName(ChatColor.GREEN + "HA - Starting"); } Score sKills = sobj.getScore(ChatColor.RED + "Kills"); sKills.setScore(0); Score sDeaths = sobj.getScore(ChatColor.RED + "Spectators"); sDeaths.setScore(0); Score sPlayers = sobj.getScore(ChatColor.RED + "Players"); sPlayers.setScore(0); Score allKills = sobj.getScore(ChatColor.RED + "Deaths"); allKills.setScore(0); sobj.setDisplaySlot(DisplaySlot.SIDEBAR); Bukkit.getPlayer(gn).setScoreboard(scoreboard); scoreboards.put(Bukkit.getPlayer(gn).getName(), Bukkit.getPlayer(gn).getScoreboard()); } Arena arena = arenas.get(arenaId); for (ArenaPlayer arenaPlayer : arenaPlayers.values()) { if (arenaPlayer.getArena() == arena) { arenaPlayer.setFrozen(false); } } if (config.getBoolean("broadcastAll")) { getServer().broadcastMessage(msg); } else { for (UUID gn : Playing.get(arenaId)) { Player g = getServer().getPlayer(gn); g.sendMessage(msg); } } if (config.getInt("Grace_Period") != 0) { announceGracePeriod(arenaId); } if (config.getInt("DeathMatch") != 0) { int death = config.getInt("DeathMatch"); timetodeath.put(arenaId, death * 60); if (deathtime.get(arenaId) == null) { deathtime.put(arenaId, getServer().getScheduler().scheduleSyncRepeatingTask(Bukkit.getPluginManager().getPlugin("HungerArena"), () -> { timetodeath.put(arenaId, timetodeath.get(arenaId) - 1); if (timetodeath.get(arenaId) % 300 == 0) { if (config.getBoolean("broadcastAll")) { for (Player wp : location.get(arenaId).get(1).getWorld().getPlayers()) { if (timetodeath.get(arenaId) != 0) { wp.sendMessage(ChatColor.YELLOW + String.valueOf(timetodeath.get(arenaId) / 60) + ChatColor.RED + " mins till the death match!"); } } } else { for (UUID gn : Playing.get(arenaId)) { Player g = getServer().getPlayer(gn); g.sendMessage(ChatColor.YELLOW + String.valueOf(timetodeath.get(arenaId)) + ChatColor.RED + " mins till the death match!"); } } } if (timetodeath.get(arenaId) <= 0) { int i = 1; for (UUID playing : Playing.get(arenaId)) { Player tribute = getServer().getPlayer(playing); Location pLoc = null; if (tribute.hasMetadata("HA-Location")) { List l = tribute.getMetadata("HA-Location"); if (l != null && l.size() != 0) { try { pLoc = (Location) l.get(0).value(); } catch (Exception e) { } } if (pLoc != null) { tribute.teleport(pLoc); //random } else { tribute.teleport(location.get(arenaId).get(i)); //row } } i += 1; for (PotionEffect pe : tribute.getActivePotionEffects()) { PotionEffectType potion = pe.getType(); tribute.removePotionEffect(potion); } if (tribute.getAllowFlight()) { tribute.setAllowFlight(false); } } if (config.getBoolean("broadcastAll")) { for (Player wp : location.get(arenaId).get(1).getWorld().getPlayers()) { wp.sendMessage(ChatColor.RED + "The final battle has begun! " + Playing.get(arenaId).size() + " tributes will be facing off!"); } } else { for (UUID gn : Playing.get(arenaId)) { Player g = getServer().getPlayer(gn); g.sendMessage(ChatColor.RED + "The final battle has begun! " + Playing.get(arenaId).size() + " tributes will be facing off!"); } } stopTaskDelayed(deathtime.get(arenaId)); deathtime.put(arenaId, null); } }, 20L, 20L)); } } setTorch(arenaId, true); stopTaskDelayed(start.get(arenaId)); } }, 20L, 20L)); } private void stopTaskDelayed(final int task) { Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> Bukkit.getScheduler().cancelTask(task), 10L); } public Arena getArena(Player player) { ArenaPlayer arenaPlayer = arenaPlayers.get(player.getUniqueId()); if (arenaPlayer != null) { return arenaPlayer.getArena(); } return null; } public Arena getSpectating(Player player) { ArenaPlayer arenaPlayer = arenaPlayers.get(player.getUniqueId()); if (arenaPlayer != null && arenaPlayer.isWatching()) { return arenaPlayer.getArena(); } return null; } public boolean isSpectating(Player p) { return getSpectating(p) != null; } public void setTorch(int arenaId, boolean set) { if (spawns.getString("Start_torch." + arenaId) != null) { String[] torchCoordinates = spawns.getString("Start_torch." + arenaId).split(","); double torchX = Double.parseDouble(torchCoordinates[0]); double torchY = Double.parseDouble(torchCoordinates[1]); double torchZ = Double.parseDouble(torchCoordinates[2]); String torchWorldName = torchCoordinates[3]; World torchWorld = getServer().getWorld(torchWorldName); Location torchLocation = new Location(torchWorld, torchX, torchY, torchZ); if (set) { torchLocation.getBlock().setType(Material.REDSTONE_TORCH); } else { torchLocation.getBlock().setType(Material.AIR); } } } }