diff --git a/SpectatorPlus/plugin.yml b/SpectatorPlus/plugin.yml index a1a674f..0807ef3 100644 --- a/SpectatorPlus/plugin.yml +++ b/SpectatorPlus/plugin.yml @@ -1,26 +1,26 @@ -name: SpectatorPlus -main: com.pgcraft.spectatorplus.SpectatorPlus -version: '1.8' -description: "Lets players spectate other competitors in events, games, etc. when they're not playing. Allows them to fly but stops them helping other players. Do [/spec help] for help!" -author: pgmann -commands: - spectate: - description: 'See [/spec help] for help' - usage: 'Do /spectate help to see the plugin help' - aliases: spec -permissions: - spectate.*: - description: Allows you to spectate and stops players spectating you - children: - spectate.use: true - spectate.hide: true - default: false - spectate.use: - description: Allows you to spectate - default: op - spectate.hide: - description: Stops players spectating you - default: false - spectate.set: - description: Allows you to set the spectator lobby +name: SpectatorPlus +main: com.pgcraft.spectatorplus.SpectatorPlus +version: '1.8' +description: "Lets players spectate other competitors in events, games, etc. when they're not playing. Allows them to fly but stops them helping other players. Do [/spec help] for help!" +author: pgmann +commands: + spectate: + description: 'See [/spec help] for help' + usage: 'Do /spectate help to see the plugin help' + aliases: spec +permissions: + spectate.*: + description: Allows you to spectate and stops players spectating you + children: + spectate.use: true + spectate.hide: true + default: false + spectate.use: + description: Allows you to spectate + default: op + spectate.hide: + description: Stops players spectating you + default: false + spectate.admin: + description: Allows you to set the spectator lobby default: op \ No newline at end of file diff --git a/SpectatorPlus/spectators.yml b/SpectatorPlus/spectators.yml new file mode 100644 index 0000000..79425fd --- /dev/null +++ b/SpectatorPlus/spectators.yml @@ -0,0 +1 @@ +# List of all players in spectator mode diff --git a/SpectatorPlus/src/com/pgcraft/spectatorplus/ConfigAccessor.java b/SpectatorPlus/src/com/pgcraft/spectatorplus/ConfigAccessor.java index a331595..fbe4aa9 100644 --- a/SpectatorPlus/src/com/pgcraft/spectatorplus/ConfigAccessor.java +++ b/SpectatorPlus/src/com/pgcraft/spectatorplus/ConfigAccessor.java @@ -1,92 +1,98 @@ -/* -* Copyright (C) 2012 -* -* Permission is hereby granted, free of charge, to any person obtaining a copy -* of this software and associated documentation files (the "Software"), to deal -* in the Software without restriction, including without limitation the rights -* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -* copies of the Software, and to permit persons to whom the Software is -* furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. -* -* Thanks to author of this class! All credit goes to them. -*/ -package com.pgcraft.spectatorplus; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.logging.Level; - -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.plugin.java.JavaPlugin; - -public class ConfigAccessor { - - private final String fileName; - private final JavaPlugin plugin; - - private File configFile; - private FileConfiguration fileConfiguration; - - public ConfigAccessor(JavaPlugin plugin, String fileName) { - if (plugin == null) { - throw new IllegalArgumentException("plugin cannot be null"); - } - this.plugin = plugin; - this.fileName = fileName; - File dataFolder = plugin.getDataFolder(); - if (dataFolder == null) { - throw new IllegalStateException(); - } - this.configFile = new File(plugin.getDataFolder(), fileName+".yml"); - } - - public void reloadConfig() { - fileConfiguration = YamlConfiguration.loadConfiguration(configFile); - - // Look for defaults in the jar - InputStream defConfigStream = plugin.getResource(fileName+".yml"); - if (defConfigStream != null) { - YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream); - fileConfiguration.setDefaults(defConfig); - } - } - - public FileConfiguration getConfig() { - if (fileConfiguration == null) { - this.reloadConfig(); - } - return fileConfiguration; - } - - public void saveConfig() { - if (fileConfiguration == null || configFile == null) { - return; - } else { - try { - getConfig().save(configFile); - } catch (IOException ex) { - plugin.getLogger().log(Level.SEVERE, "Could not save config to " + configFile, ex); - } - } - } - - public void saveDefaultConfig() { - if (!configFile.exists()) { - this.plugin.saveResource(fileName+".yml", false); - } - } - +/* +* Copyright (C) 2012 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Thanks to author of this class! All credit goes to them. +*/ +package com.pgcraft.spectatorplus; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.logging.Level; + +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.java.JavaPlugin; + +public class ConfigAccessor { + + private final String fileName; + private final JavaPlugin plugin; + + private File configFile; + private FileConfiguration fileConfiguration; + + public ConfigAccessor(JavaPlugin plugin, String fileName) { + if (plugin == null) { + throw new IllegalArgumentException("plugin cannot be null"); + } + this.plugin = plugin; + this.fileName = fileName; + File dataFolder = plugin.getDataFolder(); + if (dataFolder == null) { + throw new IllegalStateException(); + } + this.configFile = new File(plugin.getDataFolder(), fileName+".yml"); + } + + public void reloadConfig() { + fileConfiguration = YamlConfiguration.loadConfiguration(configFile); + + // Look for defaults in the jar + InputStream defConfigStream = plugin.getResource(fileName+".yml"); + if (defConfigStream != null) { + YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream); + fileConfiguration.setDefaults(defConfig); + } + } + + public FileConfiguration getConfig() { + if (fileConfiguration == null) { + this.reloadConfig(); + } + return fileConfiguration; + } + + public void saveConfig() { + if (fileConfiguration == null || configFile == null) { + return; + } else { + try { + getConfig().save(configFile); + } catch (IOException ex) { + plugin.getLogger().log(Level.SEVERE, "Could not save config to " + configFile, ex); + } + } + } + + public void saveDefaultConfig() { + if (!configFile.exists()) { + this.plugin.saveResource(fileName+".yml", false); + } + } + + public void saveDefaultConfig(boolean force) { + if (force) { + this.plugin.saveResource(fileName+".yml", true); + } + } + } \ No newline at end of file diff --git a/SpectatorPlus/src/com/pgcraft/spectatorplus/SpectateListener.java b/SpectatorPlus/src/com/pgcraft/spectatorplus/SpectateListener.java index fae79a4..2d51adc 100644 --- a/SpectatorPlus/src/com/pgcraft/spectatorplus/SpectateListener.java +++ b/SpectatorPlus/src/com/pgcraft/spectatorplus/SpectateListener.java @@ -1,280 +1,293 @@ -package com.pgcraft.spectatorplus; - -import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockDamageEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityTargetEvent; -import org.bukkit.event.entity.FoodLevelChangeEvent; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerDropItemEvent; -import org.bukkit.event.player.PlayerGameModeChangeEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.event.player.PlayerPickupItemEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.meta.SkullMeta; -import org.bukkit.potion.PotionEffectType; - -public class SpectateListener implements Listener { - private SpectatorPlus plugin; // pointer to your main class, unrequired if you don't need methods from the main class - - public SpectateListener(SpectatorPlus plugin) { - this.plugin = plugin; - } - @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { - // On player join - hide spectators from the joining player - plugin.user.put(event.getPlayer().getName(), new PlayerObject()); - if (plugin.scoreboard) {event.getPlayer().setScoreboard(plugin.board);} - for (Player target : plugin.getServer().getOnlinePlayers()) { - if (plugin.user.get(target.getName()).spectating == true) { - event.getPlayer().hidePlayer(target); - } - } - } - @EventHandler - public void onChatSend(AsyncPlayerChatEvent event) { - if (plugin.specchat) { - if (plugin.user.get(event.getPlayer().getName()).spectating) { - event.setCancelled(true); - for (Player player : plugin.getServer().getOnlinePlayers()) { - if(plugin.user.get(player.getName()).spectating) { - player.sendMessage(ChatColor.GRAY + "[SPEC] " + event.getPlayer().getDisplayName() + ": " + event.getMessage()); - } - } - plugin.console.sendMessage(ChatColor.GRAY + "[SPEC] " + event.getPlayer().getDisplayName() + ": " + event.getMessage()); - } - } - } - @EventHandler - public void onBlockPlace(BlockPlaceEvent event) { - // On block place - cancel if the player is a spectator - if (plugin.user.get(event.getPlayer().getName()).spectating == true) { - event.setCancelled(true); - if(plugin.output) {event.getPlayer().sendMessage(plugin.prefix + "You cannot place blocks while in spectate mode!");} - } - } - @EventHandler - public void onEntityDamageEvent(EntityDamageByEntityEvent event) { - // On entity hit - are they a spectator or were they hit by a spectator? - if (event.getDamager() instanceof Player && event.getEntity() instanceof Player) { - if (plugin.user.get(((Player) event.getDamager()).getName()).spectating || plugin.user.get(((Player) event.getEntity()).getName()).spectating) { - event.setCancelled(true); - } - // Manage spectators damaging mobs - } else if (event.getEntity() instanceof Player == false && event.getDamager() instanceof Player) { - if (plugin.user.get(((Player) event.getDamager()).getName()).spectating == true) { - event.setCancelled(true); - } - // Manage mobs damaging spectators - } else if (event.getEntity() instanceof Player && event.getDamager() instanceof Player == false) { - if (plugin.user.get(((Player) event.getEntity()).getName()).spectating == true) { - event.setCancelled(true); - } - } - // Otherwise both entities are mobs, ignore the event. - } - @EventHandler - public void onBlockBreak(BlockBreakEvent event) { - // On block break - Cancel if the player is a spectator. Fires only when the block is fully broken - if (plugin.user.get(event.getPlayer().getName()).spectating == true) { - event.setCancelled(true); - if(plugin.output) {event.getPlayer().sendMessage(plugin.prefix + "You cannot break blocks while in spectate mode!");} - } - // Set up mode - if(plugin.modeSetup(event.getPlayer(), event.getBlock()) == true) { - event.setCancelled(true); - } - } - @EventHandler(priority=EventPriority.HIGHEST) - public void onGamemodeChange(PlayerGameModeChangeEvent event) { - if (plugin.user.get(event.getPlayer().getName()).spectating && !event.getNewGameMode().equals(GameMode.ADVENTURE)) { - event.setCancelled(true); - event.getPlayer().setAllowFlight(true); - } - } - @EventHandler(priority=EventPriority.HIGHEST) - public void onPlayerMove(PlayerMoveEvent event) { - if (plugin.user.get(event.getPlayer().getName()).spectating == true) { - event.getPlayer().setAllowFlight(true); - event.getPlayer().setGameMode(GameMode.ADVENTURE); - } - } - @EventHandler - public void onPlayerDropItem(PlayerDropItemEvent event) { - // On player drop item - Cancel if the player is a spectator - if (plugin.user.get(event.getPlayer().getName()).spectating == true) { - event.setCancelled(true); - } - } - @EventHandler - public void onPlayerPickupItem(PlayerPickupItemEvent event) { - // On player pickup item - Cancel if the player is a spectator - if (plugin.user.get(event.getPlayer().getName()).spectating == true) { - event.setCancelled(true); - } - } - @EventHandler - public void onEntityTarget(EntityTargetEvent event) { - // On entity target - Stop mobs targeting spectators - if (event.getTarget() != null && event.getTarget() instanceof Player && plugin.user.get(((Player) event.getTarget()).getName()).spectating) { - event.setCancelled(true); - } - } - @EventHandler - public void onBlockDamage(BlockDamageEvent event) { - // On block damage - Cancels the block damage animation - if (plugin.user.get(event.getPlayer().getName()).spectating == true) { - event.setCancelled(true); - if(plugin.output) {event.getPlayer().sendMessage(plugin.prefix + "You cannot break blocks while in spectate mode!");} - } - // Set up mode - if (plugin.modeSetup(event.getPlayer(), event.getBlock()) == true) { - event.setCancelled(true); - } - } - @EventHandler - public void onEntityDamage(EntityDamageEvent event) { - // On block damage - Cancels the block damage animation - if (event.getEntity() instanceof Player && plugin.user.get(((Player) event.getEntity()).getName()).spectating == true) { - event.setCancelled(true); - event.getEntity().setFireTicks(0); - } - if (event.getEntity() instanceof Player && plugin.user.get(((Player) event.getEntity()).getName()).teleporting == true) { - event.setCancelled(true); - event.getEntity().setFireTicks(0); - } - } - @EventHandler - public void onFoodLevelChange(FoodLevelChangeEvent event) { - // On food loss - Cancels the food loss - if (event.getEntityType() == EntityType.PLAYER && plugin.user.get(event.getEntity().getName()).spectating == true) { - event.setCancelled(true); - plugin.getServer().getPlayer(event.getEntity().getName()).setFoodLevel(20); - } - } - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { - Player spectator = event.getPlayer(); - if (plugin.scoreboard) { - plugin.team.removePlayer(spectator); - } - for (Player target : plugin.getServer().getOnlinePlayers()) { - target.showPlayer(event.getPlayer()); // show the leaving player to everyone - event.getPlayer().showPlayer(target); // show the leaving player everyone - } - if (plugin.user.get(spectator.getName()).spectating) { - plugin.user.get(spectator.getName()).spectating = false; - spectator.setGameMode(plugin.getServer().getDefaultGameMode()); - plugin.spawnPlayer(spectator); - event.getPlayer().removePotionEffect(PotionEffectType.HEAL); - plugin.loadPlayerInv(spectator); - plugin.user.remove(spectator.getName()); - } - } - @EventHandler - public void onPlayerInteract(PlayerInteractEvent event) { - if (plugin.user.get(event.getPlayer().getName()).spectating == true && event.getMaterial() == Material.COMPASS && (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK)) { - String mode = plugin.setup.getConfig().getString("mode"); - if (mode.equals("arena")) { - int region = plugin.user.get(event.getPlayer().getName()).arenaNum; - plugin.tpPlayer(event.getPlayer(), region); - } else { - plugin.tpPlayer(event.getPlayer(), 0); - } - } - if (plugin.user.get(event.getPlayer().getName()).spectating == true && event.getMaterial() == Material.WATCH && (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK)) { - event.setCancelled(true); - plugin.arenaSelect(event.getPlayer()); - } - // Cancel chest opening, doors, anything when the player right clicks. - if (plugin.user.get(event.getPlayer().getName()).spectating == true) { - event.setCancelled(true); - } - } - @EventHandler - public void onPlayerRespawn(PlayerRespawnEvent event) { - if(plugin.death) { - // prevent murdering clients! (force close bug if spec mode is enabled instantly) - new AfterRespawnTask(event.getPlayer(), plugin).runTaskLater(plugin, 20); - } - } - @EventHandler - public void onInventoryClick(InventoryClickEvent event) { - if (plugin.user.get(event.getWhoClicked().getName()).spectating == true) { - if (event.getCurrentItem() != null && event.getCurrentItem().getType() == Material.SKULL_ITEM && event.getCurrentItem().getDurability() == 3) { - ItemStack playerhead = event.getCurrentItem(); - SkullMeta meta = (SkullMeta)playerhead.getItemMeta(); - Player skullOwner = plugin.getServer().getPlayer(meta.getOwner()); - event.getWhoClicked().closeInventory(); - if (skullOwner != null && skullOwner.isOnline() && !plugin.user.get(skullOwner.getName()).spectating) { - event.getWhoClicked().teleport(skullOwner); - if(plugin.output) {((Player)event.getWhoClicked()).sendMessage(plugin.prefix + "Teleported you to " + ChatColor.RED + skullOwner.getName());} - } else { - if (skullOwner == null) { - OfflinePlayer offlineSkullOwner = plugin.getServer().getOfflinePlayer(meta.getOwner()); - ((Player) event.getWhoClicked()).sendMessage(plugin.prefix + ChatColor.RED + offlineSkullOwner.getName() + ChatColor.GOLD + " is offline!"); - } else if (skullOwner.getAllowFlight() == true) { - ((Player) event.getWhoClicked()).sendMessage(plugin.prefix + ChatColor.RED + skullOwner.getName() + ChatColor.GOLD + " is currently spectating!"); - } - } - } - //manage arenaSelect choice - if (event.getCurrentItem() != null && event.getCurrentItem().getType() == Material.BOOK) { - ItemStack arenaBook = event.getCurrentItem(); - ItemMeta meta = (ItemMeta)arenaBook.getItemMeta(); - String chosenArena = meta.getDisplayName(); - event.getWhoClicked().closeInventory(); - - if (arenaBook != null) { - // find out the arena id # - for (int i=1; i user = new HashMap(); - String basePrefix = ChatColor.BLUE + "Spectator" + ChatColor.DARK_BLUE + "Plus"; - String prefix = ChatColor.GOLD + "[" + basePrefix + ChatColor.GOLD + "] "; - ConsoleCommandSender console; - ConfigAccessor setup,toggles; - - // manage toggles - boolean compass; - boolean clock; - boolean specchat; - boolean scoreboard; - boolean output; - boolean death; - - ScoreboardManager manager; - Scoreboard board; - Team team; - - @Override - public void onEnable() { - setup = new ConfigAccessor(this, "setup"); - toggles = new ConfigAccessor(this, "toggles"); - - setup.saveDefaultConfig(); - toggles.saveDefaultConfig(); - - compass = toggles.getConfig().getBoolean("compass", true); - clock = toggles.getConfig().getBoolean("arenaclock", true); - specchat = toggles.getConfig().getBoolean("specchat", true); - scoreboard = toggles.getConfig().getBoolean("colouredtablist", true); - output = toggles.getConfig().getBoolean("outputmessages", true); - death = toggles.getConfig().getBoolean("deathspec", false); - - console = getServer().getConsoleSender(); - if (scoreboard) { - manager = Bukkit.getScoreboardManager(); - board = manager.getNewScoreboard(); - team = board.registerNewTeam("spec"); - team.setPrefix(ChatColor.DARK_GRAY + "[" + ChatColor.GRAY + "Spec" + ChatColor.DARK_GRAY + "] " + ChatColor.GRAY); - } - - for (Player player : getServer().getOnlinePlayers()) { - user.put(player.getName(), new PlayerObject()); - } - getServer().getPluginManager().registerEvents(new SpectateListener(this), this); - if(output) {console.sendMessage(prefix + "Version " + ChatColor.RED + "1.8" + ChatColor.GOLD + " is enabled!");} - this.getCommand("spectate").setExecutor(commands); - this.getCommand("spec").setExecutor(commands); - } - @Override - public void onDisable() { - if(output) {console.sendMessage(prefix + "Disabling...");} - for (Player player : getServer().getOnlinePlayers()) { - for (Player target : getServer().getOnlinePlayers()) { - target.showPlayer(player); - } - if (user.get(player.getName()).spectating) { - player.removePotionEffect(PotionEffectType.HEAL); - player.setAllowFlight(false); - player.setGameMode(getServer().getDefaultGameMode()); - player.getInventory().clear(); - if (scoreboard) { - team.removePlayer(player); - } - loadPlayerInv(player); - spawnPlayer(player); - user.get(player.getName()).spectating = false; - } - } - } - @Override - public void onLoad() { - - } - - // -------------- - // CUSTOM METHODS - // -------------- - - // custom method to spawn the player in the lobby - void spawnPlayer(Player player) { - player.setFireTicks(0); - if (setup.getConfig().getBoolean("active") == true) { - Location where = new Location(getServer().getWorld(setup.getConfig().getString("world")), setup.getConfig().getDouble("xPos"), setup.getConfig().getDouble("yPos"), setup.getConfig().getDouble("zPos")); - Location aboveWhere = new Location(getServer().getWorld(setup.getConfig().getString("world")), setup.getConfig().getDouble("xPos"), setup.getConfig().getDouble("yPos") + 1, setup.getConfig().getDouble("zPos")); - Location belowWhere = new Location(getServer().getWorld(setup.getConfig().getString("world")), setup.getConfig().getDouble("xPos"), setup.getConfig().getDouble("yPos") - 1, setup.getConfig().getDouble("zPos")); - if (where.getBlock().getType() != Material.AIR || aboveWhere.getBlock().getType() != Material.AIR || (belowWhere.getBlock().getType() == Material.AIR || belowWhere.getBlock().getType() == Material.LAVA || belowWhere.getBlock().getType() == Material.WATER)) { - while (where.getBlock().getType() != Material.AIR || aboveWhere.getBlock().getType() != Material.AIR || (belowWhere.getBlock().getType() == Material.AIR || belowWhere.getBlock().getType() == Material.LAVA || belowWhere.getBlock().getType() == Material.WATER)) { - where.setY(where.getY()+1); - aboveWhere.setY(aboveWhere.getY()+1); - belowWhere.setY(belowWhere.getY()+1); - if (where.getY() > getServer().getWorld(setup.getConfig().getString("world")).getHighestBlockYAt(where)) { - where.setY(where.getY()-2); - aboveWhere.setY(aboveWhere.getY()-2); - belowWhere.setY(belowWhere.getY()-2); - } - } - } - user.get(player.getName()).teleporting = true; - player.teleport(where); - - user.get(player.getName()).teleporting = false; - } else { - player.performCommand("spawn"); - } - } - - // player head inventory method - void tpPlayer(Player spectator, int region) { - Inventory gui = null; - for (Player player : getServer().getOnlinePlayers()) { - if (setup.getConfig().getString("mode").equals("any")) { - if (gui == null) gui = Bukkit.getServer().createInventory(spectator, 27, ChatColor.BLACK + "Teleporter"); - if (player.hasPermission("spectate.hide") == false && user.get(player.getName()).spectating == false) { - ItemStack playerhead = new ItemStack(Material.SKULL_ITEM, 1, (short) 3); - SkullMeta meta = (SkullMeta)playerhead.getItemMeta(); - meta.setOwner(player.getName()); - meta.setDisplayName(player.getName()); - playerhead.setItemMeta(meta); - gui.addItem(playerhead); - } - } else if (setup.getConfig().getString("mode").equals("arena")) { - if (region == 0) { - if(output) {spectator.sendMessage(prefix + "Pick an arena first using the clock!");} - return; - } else { - if (gui == null) gui = Bukkit.getServer().createInventory(spectator, 27, ChatColor.BLACK + "Arena " + ChatColor.ITALIC + setup.getConfig().getString("arena." + region + ".name")); - Location where = player.getLocation(); - int pos1y = setup.getConfig().getInt("arena." + region + ".1.y"); - int pos2y = setup.getConfig().getInt("arena." + region + ".2.y"); - int pos1x = setup.getConfig().getInt("arena." + region + ".1.x"); - int pos2x = setup.getConfig().getInt("arena." + region + ".2.x"); - int pos1z = setup.getConfig().getInt("arena." + region + ".1.z"); - int pos2z = setup.getConfig().getInt("arena." + region + ".2.z"); - // pos1 should have the highest co-ords of the arena, pos2 the lowest - if (player.hasPermission("spectate.hide") == false && user.get(player.getName()).spectating == false) { - if (Math.floor(where.getY()) < Math.floor(pos1y) && Math.floor(where.getY()) > Math.floor(pos2y)) { - if (Math.floor(where.getX()) < pos1x && Math.floor(where.getX()) > pos2x) { - if (Math.floor(where.getZ()) < pos1z && Math.floor(where.getZ()) > pos2z) { - ItemStack playerhead = new ItemStack(Material.SKULL_ITEM, 1, (short) 3); - SkullMeta meta = (SkullMeta)playerhead.getItemMeta(); - meta.setOwner(player.getName()); - meta.setDisplayName(player.getName()); - playerhead.setItemMeta(meta); - gui.addItem(playerhead); - } - } - } - } - } - } - } - spectator.openInventory(gui); - } - - void arenaSelect(Player spectator) { - Inventory gui = Bukkit.getServer().createInventory(spectator, 27, basePrefix); - for (int i=1; i 0 && args[0].equals("on")) { - if (args.length == 1) { - enableSpectate((Player) sender, sender); - } else if (getServer().getPlayer(args[1]) != null) { - enableSpectate(getServer().getPlayer(args[1]), sender); - } else { - sender.sendMessage(prefix + ChatColor.RED + args[1] + ChatColor.GOLD + " isn't online"); - } - } else if (args.length > 0 && args[0].equals("off")) { - if (args.length == 1) { - disableSpectate((Player) sender, sender); - } else if (getServer().getPlayer(args[1]) != null) { - disableSpectate(getServer().getPlayer(args[1]), sender); - } else { - sender.sendMessage(prefix + ChatColor.RED + args[1] + ChatColor.GOLD + " isn't online"); - } - } else if (args.length == 1 && args[0].equals("lobby")) { - if (sender.hasPermission("spectate.set")) { - spectator.sendMessage(prefix + "Usage: " + ChatColor.RED + "/spectate lobby "); - } else { - spectator.sendMessage(prefix + "You do not have permission to change the mode!"); - } - } else if (args.length == 2 && args[0].equals("lobby") && args[1].equals("set")) { - if (sender.hasPermission("spectate.set")) { - Location where = spectator.getLocation(); - setup.getConfig().set("xPos", Math.floor(where.getX())+0.5); - setup.getConfig().set("yPos", Math.floor(where.getY())); - setup.getConfig().set("zPos", Math.floor(where.getZ())+0.5); - setup.getConfig().set("world", where.getWorld().getName()); - setup.getConfig().set("active", true); - setup.saveConfig(); - spectator.sendMessage(prefix + "Location saved! Players will be teleported here when they spectate"); - } else { - spectator.sendMessage(prefix + "You do not have permission to set the lobby location!"); - } - } else if (args.length == 2 && args[0].equals("lobby") && (args[1].equals("del") || args[1].equals("delete"))) { - if (sender.hasPermission("spectate.set")) { - setup.getConfig().set("xPos", 0); - setup.getConfig().set("yPos", 0); - setup.getConfig().set("zPos", 0); - setup.getConfig().set("world", null); - setup.getConfig().set("active", false); - setup.saveConfig(); - spectator.sendMessage(prefix + "Spectator lobby location removed! Players will be teleported to spawn when they spectate"); - } else { - spectator.sendMessage(prefix + "You do not have permission to set the lobby location!"); - } - } else if (args.length == 1 && args[0].equals("mode")) { - if (sender.hasPermission("spectate.set")) { - spectator.sendMessage(prefix + "Usage: " + ChatColor.RED + "/spectate mode "); - } else { - spectator.sendMessage(prefix + "You do not have permission to change the mode!"); - } - } else if (args.length > 1 && args[0].equals("mode") && args[1].equals("any")) { - if (sender.hasPermission("spectate.set")) { - setup.getConfig().set("mode", "any"); - setup.saveConfig(); - spectator.sendMessage(prefix + "Mode set to " + ChatColor.RED + "any"); - } else { - spectator.sendMessage(prefix + "You do not have permission to change the mode!"); - } - } else if (args.length > 1 && args[0].equals("mode") && args[1].equals("arena")) { - if (sender.hasPermission("spectate.set")) { - setup.getConfig().set("mode", "arena"); - setup.saveConfig(); - spectator.sendMessage(prefix + "Mode set to " + ChatColor.RED + "arena" + ChatColor.GOLD + ". Only players in arena regions can be teleported to by spectators."); - } else { - spectator.sendMessage(prefix + "You do not have permission to change the mode!"); - } - } else if ((args.length == 1 && args[0].equals("arena")) || (args.length == 2 && args[0].equals("arena") && args[1].equals("add"))) { - if (sender.hasPermission("spectate.set")) { - spectator.sendMessage(prefix + "Usage: " + ChatColor.RED + "/spectate arena /reset/lobby /list>"); - } else { - spectator.sendMessage(prefix + "You do not have permission to change the mode!"); - } - } else if (args.length == 3 && args[0].equals("arena") && args[1].equals("add")) { - if (sender.hasPermission("spectate.set")) { - user.get(spectator.getName()).arenaName = args[2]; - spectator.sendMessage(prefix + "Punch point " + ChatColor.RED + "#1" + ChatColor.GOLD + " - a corner of the arena"); - user.get(spectator.getName()).setup = 1; - } else { - spectator.sendMessage(prefix + "You do not have permission to change the mode!"); - } - } else if (args.length == 2 && args[0].equals("arena") && args[1].equals("list")) { - if (sender.hasPermission("spectate.set")) { - spectator.sendMessage(ChatColor.GOLD + " ~~ " + ChatColor.RED + "Arenas" + ChatColor.GOLD + " ~~ "); - for (int i=1; i 0 && args[0].equals("on")) { - if (args.length == 1) { - sender.sendMessage(prefix + "Usage: /spec on "); - } else if (getServer().getPlayer(args[1]) != null) { - enableSpectate(getServer().getPlayer(args[1]), sender); - } else { - sender.sendMessage(prefix + ChatColor.RED + args[1] + ChatColor.GOLD + " isn't online"); - } - } else if (args.length > 0 && args[0].equals("off")) { - if (args.length == 1) { - sender.sendMessage(prefix + "Usage: /spec off "); - } else if (getServer().getPlayer(args[1]) != null) { - disableSpectate(getServer().getPlayer(args[1]), sender); - } else { - sender.sendMessage(prefix + ChatColor.RED + args[1] + ChatColor.GOLD + " isn't online"); - } - } else if (args.length == 1 && args[0].equals("mode")) { - sender.sendMessage(prefix + "Usage: " + ChatColor.RED + "/spectate mode "); - } else if (args.length > 1 && args[0].equals("mode") && args[1].equals("any")) { - setup.getConfig().set("mode", "any"); - setup.saveConfig(); - sender.sendMessage(prefix + "Mode set to " + ChatColor.RED + "any"); - } else if (args.length > 1 && args[0].equals("mode") && args[1].equals("arena")) { - setup.getConfig().set("mode", "arena"); - setup.saveConfig(); - sender.sendMessage(prefix + "Mode set to " + ChatColor.RED + "arena" + ChatColor.GOLD + ". Only players in arena regions can be teleported to by spectators."); - } else { - printHelp(sender); - } - } - } - return true; // return true: to stop usage showing - } // end of onCommand - }; - void printHelp(CommandSender sender) { - sender.sendMessage(ChatColor.GOLD + " ~~ " + ChatColor.BLUE + "Spectator" + ChatColor.DARK_BLUE + "Plus" + ChatColor.GOLD + " ~~ "); - sender.sendMessage(ChatColor.RED + "/spectate [player]" + ChatColor.GOLD + ": Enables/disables spectator mode [for a certain player]"); - if (sender instanceof Player) { - sender.sendMessage(ChatColor.RED + "/spectate arena /reset/lobby /list>" + ChatColor.GOLD + ": Adds/deletes arenas"); - sender.sendMessage(ChatColor.RED + "/spectate lobby " + ChatColor.GOLD + ": Adds/deletes the spectator lobby"); - } - sender.sendMessage(ChatColor.RED + "/spectate mode " + ChatColor.GOLD + ": Sets who players can teleport to"); - } - void disableSpectate(Player spectator, CommandSender sender) { - if (user.get(spectator.getName()).spectating) { - // show them to everyone - for (Player target : getServer().getOnlinePlayers()) { - target.showPlayer(spectator); - } - - // teleport to spawn - spawnPlayer(spectator); - - // allow interaction - user.get(spectator.getName()).spectating = false; - spectator.setGameMode(getServer().getDefaultGameMode()); - spectator.setAllowFlight(false); - spectator.removePotionEffect(PotionEffectType.HEAL); - loadPlayerInv(spectator); - - //remove from spec team - if (scoreboard) { - team.removePlayer(spectator); - } - - if (sender instanceof Player && spectator.getName().equals(sender.getName())) { - if(output) {spectator.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "disabled");} - } else if (sender instanceof Player && !spectator.getName().equals(sender.getName())) { - if(output) {spectator.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "disabled" + ChatColor.GOLD + " by " + ChatColor.RED + ((Player) sender).getDisplayName());} - sender.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "disabled" + ChatColor.GOLD + " for " + ChatColor.RED + spectator.getDisplayName()); - } else { - if(output) {spectator.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "disabled" + ChatColor.GOLD + " by " + ChatColor.DARK_RED + "Console");} - sender.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "disabled" + ChatColor.GOLD + " for " + ChatColor.RED + spectator.getDisplayName()); - } - - } else { - // Spectate mode wasn't on - if (sender instanceof Player && spectator.getName().equals(sender.getName())) { - spectator.sendMessage(prefix + "You aren't spectating!"); - } else { - sender.sendMessage(prefix + ChatColor.RED + spectator.getDisplayName() + ChatColor.GOLD + " isn't spectating!"); - } - } - } - void enableSpectate(Player spectator, CommandSender sender) { - if (user.get(spectator.getName()).spectating) { - // Spectate mode wasn't on - if (sender instanceof Player && spectator.getName().equals(sender.getName())) { - spectator.sendMessage(prefix + "You are already spectating!"); - } else { - sender.sendMessage(prefix + ChatColor.RED + spectator.getDisplayName() + ChatColor.GOLD + " is already spectating!"); - } - } else { - // teleport them to the global lobby - spawnPlayer(spectator); - // hide them from everyone - for (Player target : getServer().getOnlinePlayers()) { - target.hidePlayer(spectator); - } - // gamemode and inventory - spectator.setGameMode(GameMode.ADVENTURE); - savePlayerInv(spectator); - spectator.setAllowFlight(true); - spectator.setFoodLevel(20); - // disable interaction - user.get(spectator.getName()).spectating = true; - PotionEffect heal = new PotionEffect(PotionEffectType.HEAL, Integer.MAX_VALUE, 1000, true); - spectator.addPotionEffect(heal); - // give them compass if toggle on - if (compass) { - ItemStack compass = new ItemStack(Material.COMPASS, 1); - ItemMeta compassMeta = (ItemMeta)compass.getItemMeta(); - compassMeta.setDisplayName(ChatColor.BLUE + "Teleporter"); - compass.setItemMeta(compassMeta); - spectator.getInventory().addItem(compass); - } - // give them clock (only for arena mode and if toggle is on) - if (clock) { - String mode = setup.getConfig().getString("mode"); - if (mode.equals("arena")) { - ItemStack book = new ItemStack(Material.WATCH, 1); - ItemMeta bookMeta = (ItemMeta)book.getItemMeta(); - bookMeta.setDisplayName(ChatColor.DARK_RED + "Arena chooser"); - book.setItemMeta(bookMeta); - spectator.getInventory().addItem(book); - } - } - // set the prefix in the tab list if the toggle is on - if (scoreboard) { - team.addPlayer(spectator); - } - // manage messages if spectator was enabled - if (sender instanceof Player && spectator.getName().equals(sender.getName())) { - if(output) {spectator.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "enabled");} - } else if (sender instanceof Player && !spectator.getName().equals(sender.getName())) { - if(output) {spectator.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "enabled" + ChatColor.GOLD + " by " + ChatColor.RED + ((Player) sender).getDisplayName());} - sender.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "enabled" + ChatColor.GOLD + " for " + ChatColor.RED + spectator.getDisplayName()); - } else { - if(output) {spectator.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "enabled" + ChatColor.GOLD + " by " + ChatColor.DARK_RED + "Console");} - sender.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "enabled" + ChatColor.GOLD + " for " + ChatColor.RED + spectator.getDisplayName()); - } - } - } - boolean modeSetup(Player player, Block block) { - if (user.get(player.getName()).setup == 2) { - user.get(player.getName()).pos2 = block.getLocation(); - user.get(player.getName()).setup = 0; - - Location lowPos, hiPos; - lowPos = new Location(user.get(player.getName()).pos1.getWorld(), 0, 0, 0); - hiPos = new Location(user.get(player.getName()).pos1.getWorld(), 0, 0, 0); - // yPos - if (Math.floor(user.get(player.getName()).pos1.getY()) > Math.floor(user.get(player.getName()).pos2.getY())) { - hiPos.setY(Math.floor(user.get(player.getName()).pos1.getY())); - lowPos.setY(Math.floor(user.get(player.getName()).pos2.getY())); - } else { - lowPos.setY(Math.floor(user.get(player.getName()).pos1.getY())); - hiPos.setY(Math.floor(user.get(player.getName()).pos2.getY())); - } - // xPos - if (Math.floor(user.get(player.getName()).pos1.getX()) > Math.floor(user.get(player.getName()).pos2.getX())) { - hiPos.setX(Math.floor(user.get(player.getName()).pos1.getX())); - lowPos.setX(Math.floor(user.get(player.getName()).pos2.getX())); - } else { - lowPos.setX(Math.floor(user.get(player.getName()).pos1.getX())); - hiPos.setX(Math.floor(user.get(player.getName()).pos2.getX())); - } - // zPos - if (Math.floor(user.get(player.getName()).pos1.getZ()) > Math.floor(user.get(player.getName()).pos2.getZ())) { - hiPos.setZ(Math.floor(user.get(player.getName()).pos1.getZ())); - lowPos.setZ(Math.floor(user.get(player.getName()).pos2.getZ())); - } else { - lowPos.setZ(Math.floor(user.get(player.getName()).pos1.getZ())); - hiPos.setZ(Math.floor(user.get(player.getName()).pos2.getZ())); - } - - setup.getConfig().set("arena." + setup.getConfig().getInt("nextarena") + ".1.y", Math.floor(hiPos.getY())); - setup.getConfig().set("arena." + setup.getConfig().getInt("nextarena") + ".1.x", Math.floor(hiPos.getX())); - setup.getConfig().set("arena." + setup.getConfig().getInt("nextarena") + ".1.z", Math.floor(hiPos.getZ())); - setup.getConfig().set("arena." + setup.getConfig().getInt("nextarena") + ".2.y", Math.floor(lowPos.getY())); - setup.getConfig().set("arena." + setup.getConfig().getInt("nextarena") + ".2.x", Math.floor(lowPos.getX())); - setup.getConfig().set("arena." + setup.getConfig().getInt("nextarena") + ".2.z", Math.floor(lowPos.getZ())); - setup.getConfig().set("arena." + setup.getConfig().getInt("nextarena") + ".name", user.get(player.getName()).arenaName); - setup.getConfig().set("nextarena", setup.getConfig().getInt("nextarena") + 1); - setup.saveConfig(); - player.sendMessage(prefix + "Arena " + ChatColor.RED + user.get(player.getName()).arenaName + " (#" + (setup.getConfig().getInt("nextarena")-1) + ")" + ChatColor.GOLD + " successfully set up!"); - return true; - } else { - if (user.get(player.getName()).setup == 1) { - user.get(player.getName()).pos1 = block.getLocation(); - player.sendMessage(prefix + "Punch point " + ChatColor.RED + "#2" + ChatColor.GOLD + " - the opposite corner of the arena"); - user.get(player.getName()).setup = 2; - return true; - } else { - return false; - } - } - } - void lobbySetup(Player player, String arenaName) { - int arenaNum = 0; - for (int i=1; i user = new HashMap(); + String basePrefix = ChatColor.BLUE + "Spectator" + ChatColor.DARK_BLUE + "Plus"; + String prefix = ChatColor.GOLD + "[" + basePrefix + ChatColor.GOLD + "] "; + double version = 1.9; // Plugin version + ConsoleCommandSender console; + ConfigAccessor setup,toggles,specs; + + // Manage toggles + boolean compass; + boolean clock; + boolean specChat; + boolean scoreboard; + boolean output; + boolean death; + boolean seeSpecs; + boolean blockCmds; + boolean adminBypass; + + ScoreboardManager manager; + Scoreboard board; + Team team; + + @Override + public void onEnable() { + setup = new ConfigAccessor(this, "setup"); + toggles = new ConfigAccessor(this, "toggles"); + specs = new ConfigAccessor(this, "spectators"); + + setup.saveDefaultConfig(); + toggles.saveDefaultConfig(); + specs.saveDefaultConfig(); + + console = getServer().getConsoleSender(); + + // Fix config if from previous version + if (toggles.getConfig().getDouble("version") getServer().getWorld(setup.getConfig().getString("world")).getHighestBlockYAt(where)) { + where.setY(where.getY()-2); + aboveWhere.setY(aboveWhere.getY()-2); + belowWhere.setY(belowWhere.getY()-2); + } + } + } + user.get(player.getName()).teleporting = true; + player.teleport(where); + + user.get(player.getName()).teleporting = false; + } else { + player.performCommand("spawn"); + } + } + + // player head inventory method + void tpPlayer(Player spectator, int region) { + Inventory gui = null; + for (Player player : getServer().getOnlinePlayers()) { + if (setup.getConfig().getString("mode").equals("any")) { + if (gui == null) gui = Bukkit.getServer().createInventory(spectator, 27, ChatColor.BLACK + "Teleporter"); + if (player.hasPermission("spectate.hide") == false && user.get(player.getName()).spectating == false) { + ItemStack playerhead = new ItemStack(Material.SKULL_ITEM, 1, (short) 3); + SkullMeta meta = (SkullMeta)playerhead.getItemMeta(); + meta.setOwner(player.getName()); + meta.setDisplayName(player.getName()); + playerhead.setItemMeta(meta); + gui.addItem(playerhead); + } + } else if (setup.getConfig().getString("mode").equals("arena")) { + if (region == 0) { + if(output) {spectator.sendMessage(prefix + "Pick an arena first using the clock!");} + return; + } else { + if (gui == null) gui = Bukkit.getServer().createInventory(spectator, 27, ChatColor.BLACK + "Arena " + ChatColor.ITALIC + setup.getConfig().getString("arena." + region + ".name")); + Location where = player.getLocation(); + int pos1y = setup.getConfig().getInt("arena." + region + ".1.y"); + int pos2y = setup.getConfig().getInt("arena." + region + ".2.y"); + int pos1x = setup.getConfig().getInt("arena." + region + ".1.x"); + int pos2x = setup.getConfig().getInt("arena." + region + ".2.x"); + int pos1z = setup.getConfig().getInt("arena." + region + ".1.z"); + int pos2z = setup.getConfig().getInt("arena." + region + ".2.z"); + // pos1 should have the highest co-ords of the arena, pos2 the lowest + if (player.hasPermission("spectate.hide") == false && user.get(player.getName()).spectating == false) { + if (Math.floor(where.getY()) < Math.floor(pos1y) && Math.floor(where.getY()) > Math.floor(pos2y)) { + if (Math.floor(where.getX()) < pos1x && Math.floor(where.getX()) > pos2x) { + if (Math.floor(where.getZ()) < pos1z && Math.floor(where.getZ()) > pos2z) { + ItemStack playerhead = new ItemStack(Material.SKULL_ITEM, 1, (short) 3); + SkullMeta meta = (SkullMeta)playerhead.getItemMeta(); + meta.setOwner(player.getName()); + meta.setDisplayName(player.getName()); + playerhead.setItemMeta(meta); + gui.addItem(playerhead); + } + } + } + } + } + } + } + spectator.openInventory(gui); + } + + void arenaSelect(Player spectator) { + Inventory gui = Bukkit.getServer().createInventory(spectator, 27, basePrefix); + for (int i=1; i 0 && args[0].equals("on")) { + if (args.length == 1) { + enableSpectate((Player) sender, sender); + } else if (getServer().getPlayer(args[1]) != null) { + enableSpectate(getServer().getPlayer(args[1]), sender); + } else { + sender.sendMessage(prefix + ChatColor.RED + args[1] + ChatColor.GOLD + " isn't online"); + } + } else if(args.length > 0 && args[0].equals("reload")) { + setup.reloadConfig(); + toggles.reloadConfig(); + sender.sendMessage(prefix+"Config reloaded!"); + } else if (args.length > 0 && (args[0].equals("p")||args[0].equals("player"))) { + // For the player who issued the command... + if (sender instanceof Player) { + if (user.get(sender.getName()).spectating) { + if (args.length>1) { + if (getServer().getPlayer(args[1])!=null&&!user.get(getServer().getPlayer(args[1]).getName()).spectating) { + choosePlayer((Player) sender, getServer().getPlayer(args[1])); + } else { + sender.sendMessage(prefix+ChatColor.WHITE+args[1]+ChatColor.GOLD+" isn't online!"); + } + } else { + sender.sendMessage(prefix+"Specify the player you want to spectate: /spec p "); + } + } else { + sender.sendMessage(prefix+"You aren't spectating!"); + } + } else { + sender.sendMessage(prefix+"Cannot be executed from the console!"); + } + // TODO add argument to allow the console to teleport spectators to players. + } else if (args.length > 0 && args[0].equals("off")) { + if (args.length == 1) { + disableSpectate((Player) sender, sender); + } else if (getServer().getPlayer(args[1]) != null) { + disableSpectate(getServer().getPlayer(args[1]), sender); + } else { + sender.sendMessage(prefix + ChatColor.RED + args[1] + ChatColor.GOLD + " isn't online"); + } + } else if (args.length == 1 && args[0].equals("lobby")) { + if (sender.hasPermission("spectate.admin")) { + spectator.sendMessage(prefix + "Usage: " + ChatColor.RED + "/spectate lobby "); + } else { + spectator.sendMessage(prefix + "You do not have permission to change the mode!"); + } + } else if (args.length == 2 && args[0].equals("lobby") && args[1].equals("set")) { + if (sender.hasPermission("spectate.admin")) { + Location where = spectator.getLocation(); + setup.getConfig().set("xPos", Math.floor(where.getX())+0.5); + setup.getConfig().set("yPos", Math.floor(where.getY())); + setup.getConfig().set("zPos", Math.floor(where.getZ())+0.5); + setup.getConfig().set("world", where.getWorld().getName()); + setup.getConfig().set("active", true); + setup.saveConfig(); + spectator.sendMessage(prefix + "Location saved! Players will be teleported here when they spectate"); + } else { + spectator.sendMessage(prefix + "You do not have permission to set the lobby location!"); + } + } else if (args.length == 2 && args[0].equals("lobby") && (args[1].equals("del") || args[1].equals("delete"))) { + if (sender.hasPermission("spectate.admin")) { + setup.getConfig().set("xPos", 0); + setup.getConfig().set("yPos", 0); + setup.getConfig().set("zPos", 0); + setup.getConfig().set("world", null); + setup.getConfig().set("active", false); + setup.saveConfig(); + spectator.sendMessage(prefix + "Spectator lobby location removed! Players will be teleported to spawn when they spectate"); + } else { + spectator.sendMessage(prefix + "You do not have permission to set the lobby location!"); + } + } else if (args.length == 1 && args[0].equals("mode")) { + if (sender.hasPermission("spectate.admin")) { + spectator.sendMessage(prefix + "Usage: " + ChatColor.RED + "/spectate mode "); + } else { + spectator.sendMessage(prefix + "You do not have permission to change the mode!"); + } + } else if (args.length > 1 && args[0].equals("mode") && args[1].equals("any")) { + if (sender.hasPermission("spectate.admin")) { + setup.getConfig().set("mode", "any"); + setup.saveConfig(); + spectator.sendMessage(prefix + "Mode set to " + ChatColor.RED + "any"); + } else { + spectator.sendMessage(prefix + "You do not have permission to change the mode!"); + } + } else if (args.length > 1 && args[0].equals("mode") && args[1].equals("arena")) { + if (sender.hasPermission("spectate.admin")) { + setup.getConfig().set("mode", "arena"); + setup.saveConfig(); + spectator.sendMessage(prefix + "Mode set to " + ChatColor.RED + "arena" + ChatColor.GOLD + ". Only players in arena regions can be teleported to by spectators."); + } else { + spectator.sendMessage(prefix + "You do not have permission to change the mode!"); + } + } else if ((args.length == 1 && args[0].equals("arena")) || (args.length == 2 && args[0].equals("arena") && args[1].equals("add"))) { + if (sender.hasPermission("spectate.admin")) { + spectator.sendMessage(prefix + "Usage: " + ChatColor.RED + "/spectate arena /reset/lobby /list>"); + } else { + spectator.sendMessage(prefix + "You do not have permission to change the mode!"); + } + } else if (args.length == 3 && args[0].equals("arena") && args[1].equals("add")) { + if (sender.hasPermission("spectate.admin")) { + user.get(spectator.getName()).arenaName = args[2]; + spectator.sendMessage(prefix + "Punch point " + ChatColor.RED + "#1" + ChatColor.GOLD + " - a corner of the arena"); + user.get(spectator.getName()).setup = 1; + } else { + spectator.sendMessage(prefix + "You do not have permission to change the mode!"); + } + } else if (args.length == 2 && args[0].equals("arena") && args[1].equals("list")) { + if (sender.hasPermission("spectate.admin")) { + spectator.sendMessage(ChatColor.GOLD + " ~~ " + ChatColor.RED + "Arenas" + ChatColor.GOLD + " ~~ "); + for (int i=1; i 0 && args[0].equals("on")) { + if (args.length == 1) { + sender.sendMessage(prefix + "Usage: /spec on "); + } else if (getServer().getPlayer(args[1]) != null) { + enableSpectate(getServer().getPlayer(args[1]), sender); + } else { + sender.sendMessage(prefix + ChatColor.RED + args[1] + ChatColor.GOLD + " isn't online"); + } + } else if (args.length > 0 && args[0].equals("off")) { + if (args.length == 1) { + sender.sendMessage(prefix + "Usage: /spec off "); + } else if (getServer().getPlayer(args[1]) != null) { + disableSpectate(getServer().getPlayer(args[1]), sender); + } else { + sender.sendMessage(prefix + ChatColor.RED + args[1] + ChatColor.GOLD + " isn't online"); + } + } else if (args.length == 1 && args[0].equals("mode")) { + sender.sendMessage(prefix + "Usage: " + ChatColor.RED + "/spectate mode "); + } else if (args.length > 1 && args[0].equals("mode") && args[1].equals("any")) { + setup.getConfig().set("mode", "any"); + setup.saveConfig(); + sender.sendMessage(prefix + "Mode set to " + ChatColor.RED + "any"); + } else if (args.length > 1 && args[0].equals("mode") && args[1].equals("arena")) { + setup.getConfig().set("mode", "arena"); + setup.saveConfig(); + sender.sendMessage(prefix + "Mode set to " + ChatColor.RED + "arena" + ChatColor.GOLD + ". Only players in arena regions can be teleported to by spectators."); + } else { + printHelp(sender); + } + } + } + return true; // return true: to stop usage showing + } // end of onCommand + }; + void printHelp(CommandSender sender) { + sender.sendMessage(ChatColor.GOLD + " ~~ " + ChatColor.BLUE + "Spectator" + ChatColor.DARK_BLUE + "Plus" + ChatColor.GOLD + " ~~ "); + sender.sendMessage(ChatColor.RED + "/spectate [player]" + ChatColor.GOLD + ": Enables/disables spectator mode [for a certain player]"); + if (sender instanceof Player) { + sender.sendMessage(ChatColor.RED + "/spectate arena /reset/lobby /list>" + ChatColor.GOLD + ": Adds/deletes arenas"); + sender.sendMessage(ChatColor.RED + "/spectate lobby " + ChatColor.GOLD + ": Adds/deletes the spectator lobby"); + sender.sendMessage(ChatColor.RED + "/spectate player " + ChatColor.GOLD + ": Teleport to "); + } + sender.sendMessage(ChatColor.RED + "/spectate reload" + ChatColor.GOLD + ": Reload configuration"); + sender.sendMessage(ChatColor.RED + "/spectate mode " + ChatColor.GOLD + ": Sets who players can teleport to"); + } + void disableSpectate(Player spectator, CommandSender sender) { + if (user.get(spectator.getName()).spectating) { + // show them to everyone + for (Player target : getServer().getOnlinePlayers()) { + if (seeSpecs&&user.get(target.getName()).spectating) { + spectator.hidePlayer(target); + } + target.showPlayer(spectator); + } + + // teleport to spawn + spawnPlayer(spectator); + + // allow interaction + user.get(spectator.getName()).spectating = false; + spectator.setGameMode(getServer().getDefaultGameMode()); + spectator.setAllowFlight(false); + loadPlayerInv(spectator); + spectator.removePotionEffect(PotionEffectType.INVISIBILITY); + + //remove from spec team + if (scoreboard) { + team.removePlayer(spectator); + } + + if (sender instanceof Player && spectator.getName().equals(sender.getName())) { + if(output) {spectator.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "disabled");} + } else if (sender instanceof Player && !spectator.getName().equals(sender.getName())) { + if(output) {spectator.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "disabled" + ChatColor.GOLD + " by " + ChatColor.RED + ((Player) sender).getDisplayName());} + sender.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "disabled" + ChatColor.GOLD + " for " + ChatColor.RED + spectator.getDisplayName()); + } else { + if(output) {spectator.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "disabled" + ChatColor.GOLD + " by " + ChatColor.DARK_RED + "Console");} + sender.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "disabled" + ChatColor.GOLD + " for " + ChatColor.RED + spectator.getDisplayName()); + } + specs.getConfig().set(spectator.getName(), null); + specs.saveConfig(); + } else { + // Spectate mode wasn't on + if (sender instanceof Player && spectator.getName().equals(sender.getName())) { + spectator.sendMessage(prefix + "You aren't spectating!"); + } else { + sender.sendMessage(prefix + ChatColor.RED + spectator.getDisplayName() + ChatColor.GOLD + " isn't spectating!"); + } + } + } + void enableSpectate(Player spectator, CommandSender sender) { + if (user.get(spectator.getName()).spectating) { + // Spectate mode wasn't on + if (sender instanceof Player && spectator.getName().equals(sender.getName())) { + spectator.sendMessage(prefix + "You are already spectating!"); + } else { + sender.sendMessage(prefix + ChatColor.RED + spectator.getDisplayName() + ChatColor.GOLD + " is already spectating!"); + } + } else { + // teleport them to the global lobby + spawnPlayer(spectator); + // hide them from everyone + for (Player target : getServer().getOnlinePlayers()) { + if(seeSpecs&&user.get(target.getName()).spectating) { + spectator.showPlayer(target); + } else { + target.hidePlayer(spectator); // Hide the spectator from non-specs: if seeSpecs mode is off and the target isn't spectating + } + } + // gamemode, 'ghost' and inventory + spectator.setGameMode(GameMode.ADVENTURE); + savePlayerInv(spectator); + spectator.setAllowFlight(true); + spectator.setFoodLevel(20); + spectator.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, Integer.MAX_VALUE, 15), true); + // disable interaction + user.get(spectator.getName()).spectating = true; + // give them compass if toggle on + if (compass) { + ItemStack compass = new ItemStack(Material.COMPASS, 1); + ItemMeta compassMeta = (ItemMeta)compass.getItemMeta(); + compassMeta.setDisplayName(ChatColor.BLUE + "Teleporter"); + compass.setItemMeta(compassMeta); + spectator.getInventory().addItem(compass); + } + // give them clock (only for arena mode and if toggle is on) + if (clock) { + String mode = setup.getConfig().getString("mode"); + if (mode.equals("arena")) { + ItemStack book = new ItemStack(Material.WATCH, 1); + ItemMeta bookMeta = (ItemMeta)book.getItemMeta(); + bookMeta.setDisplayName(ChatColor.DARK_RED + "Arena chooser"); + book.setItemMeta(bookMeta); + spectator.getInventory().addItem(book); + } + } + // set the prefix in the tab list if the toggle is on + if (scoreboard) { + team.addPlayer(spectator); + } + // manage messages if spectator was enabled + if (sender instanceof Player && spectator.getName().equals(sender.getName())) { + if(output) {spectator.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "enabled");} + } else if (sender instanceof Player && !spectator.getName().equals(sender.getName())) { + if(output) {spectator.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "enabled" + ChatColor.GOLD + " by " + ChatColor.RED + ((Player) sender).getDisplayName());} + sender.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "enabled" + ChatColor.GOLD + " for " + ChatColor.RED + spectator.getDisplayName()); + } else { + if(output) {spectator.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "enabled" + ChatColor.GOLD + " by " + ChatColor.DARK_RED + "Console");} + sender.sendMessage(prefix + "Spectator mode " + ChatColor.RED + "enabled" + ChatColor.GOLD + " for " + ChatColor.RED + spectator.getDisplayName()); + } + specs.getConfig().set(spectator.getName(), true); + specs.saveConfig(); + } + } + boolean modeSetup(Player player, Block block) { + if (user.get(player.getName()).setup == 2) { + user.get(player.getName()).pos2 = block.getLocation(); + user.get(player.getName()).setup = 0; + + Location lowPos, hiPos; + lowPos = new Location(user.get(player.getName()).pos1.getWorld(), 0, 0, 0); + hiPos = new Location(user.get(player.getName()).pos1.getWorld(), 0, 0, 0); + // yPos + if (Math.floor(user.get(player.getName()).pos1.getY()) > Math.floor(user.get(player.getName()).pos2.getY())) { + hiPos.setY(Math.floor(user.get(player.getName()).pos1.getY())); + lowPos.setY(Math.floor(user.get(player.getName()).pos2.getY())); + } else { + lowPos.setY(Math.floor(user.get(player.getName()).pos1.getY())); + hiPos.setY(Math.floor(user.get(player.getName()).pos2.getY())); + } + // xPos + if (Math.floor(user.get(player.getName()).pos1.getX()) > Math.floor(user.get(player.getName()).pos2.getX())) { + hiPos.setX(Math.floor(user.get(player.getName()).pos1.getX())); + lowPos.setX(Math.floor(user.get(player.getName()).pos2.getX())); + } else { + lowPos.setX(Math.floor(user.get(player.getName()).pos1.getX())); + hiPos.setX(Math.floor(user.get(player.getName()).pos2.getX())); + } + // zPos + if (Math.floor(user.get(player.getName()).pos1.getZ()) > Math.floor(user.get(player.getName()).pos2.getZ())) { + hiPos.setZ(Math.floor(user.get(player.getName()).pos1.getZ())); + lowPos.setZ(Math.floor(user.get(player.getName()).pos2.getZ())); + } else { + lowPos.setZ(Math.floor(user.get(player.getName()).pos1.getZ())); + hiPos.setZ(Math.floor(user.get(player.getName()).pos2.getZ())); + } + + setup.getConfig().set("arena." + setup.getConfig().getInt("nextarena") + ".1.y", Math.floor(hiPos.getY())); + setup.getConfig().set("arena." + setup.getConfig().getInt("nextarena") + ".1.x", Math.floor(hiPos.getX())); + setup.getConfig().set("arena." + setup.getConfig().getInt("nextarena") + ".1.z", Math.floor(hiPos.getZ())); + setup.getConfig().set("arena." + setup.getConfig().getInt("nextarena") + ".2.y", Math.floor(lowPos.getY())); + setup.getConfig().set("arena." + setup.getConfig().getInt("nextarena") + ".2.x", Math.floor(lowPos.getX())); + setup.getConfig().set("arena." + setup.getConfig().getInt("nextarena") + ".2.z", Math.floor(lowPos.getZ())); + setup.getConfig().set("arena." + setup.getConfig().getInt("nextarena") + ".name", user.get(player.getName()).arenaName); + setup.getConfig().set("nextarena", setup.getConfig().getInt("nextarena") + 1); + setup.saveConfig(); + player.sendMessage(prefix + "Arena " + ChatColor.RED + user.get(player.getName()).arenaName + " (#" + (setup.getConfig().getInt("nextarena")-1) + ")" + ChatColor.GOLD + " successfully set up!"); + return true; + } else { + if (user.get(player.getName()).setup == 1) { + user.get(player.getName()).pos1 = block.getLocation(); + player.sendMessage(prefix + "Punch point " + ChatColor.RED + "#2" + ChatColor.GOLD + " - the opposite corner of the arena"); + user.get(player.getName()).setup = 2; + return true; + } else { + return false; + } + } + } + void lobbySetup(Player player, String arenaName) { + int arenaNum = 0; + for (int i=1; i