/******************************************************************************* * This file is part of ASkyBlock. * * ASkyBlock is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ASkyBlock is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with ASkyBlock. If not, see <http://www.gnu.org/licenses/>. *******************************************************************************/ package com.wasteofplastic.askyblock.commands; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Random; import java.util.Set; import java.util.TreeMap; import java.util.UUID; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.Sound; import org.bukkit.World.Environment; import org.bukkit.block.Biome; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.Sign; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.EntityType; import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.material.MaterialData; import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.potion.Potion; import org.bukkit.potion.PotionType; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.Vector; import com.wasteofplastic.askyblock.ASLocale; import com.wasteofplastic.askyblock.ASkyBlock; import com.wasteofplastic.askyblock.CoopPlay; import com.wasteofplastic.askyblock.DeleteIslandChunk; import com.wasteofplastic.askyblock.GridManager; import com.wasteofplastic.askyblock.Island; import com.wasteofplastic.askyblock.Island.SettingsFlag; import com.wasteofplastic.askyblock.LevelCalcByChunk; import com.wasteofplastic.askyblock.Settings; import com.wasteofplastic.askyblock.TopTen; import com.wasteofplastic.askyblock.events.IslandJoinEvent; import com.wasteofplastic.askyblock.events.IslandLeaveEvent; import com.wasteofplastic.askyblock.events.IslandNewEvent; import com.wasteofplastic.askyblock.events.IslandResetEvent; import com.wasteofplastic.askyblock.listeners.PlayerEvents; import com.wasteofplastic.askyblock.panels.ControlPanel; import com.wasteofplastic.askyblock.schematics.Schematic; import com.wasteofplastic.askyblock.util.Util; import com.wasteofplastic.askyblock.util.VaultHelper; @SuppressWarnings("deprecation") public class IslandCmd implements CommandExecutor, TabCompleter { private static final boolean DEBUG = false; public boolean levelCalcFreeFlag = true; private static HashMap<String, Schematic> schematics = new HashMap<String, Schematic>(); private ASkyBlock plugin; // The island reset confirmation private HashMap<UUID, Boolean> confirm = new HashMap<UUID, Boolean>(); // Last island Location last = null; // List of players in the middle of choosing an island schematic private Set<UUID> pendingNewIslandSelection = new HashSet<UUID>(); private Set<UUID> resettingIsland = new HashSet<UUID>(); /** * Invite list - invited player name string (key), inviter name string * (value) */ private final HashMap<UUID, UUID> inviteList = new HashMap<UUID, UUID>(); // private PlayerCache players; // The time a player has to wait until they can reset their island again private HashMap<UUID, Long> resetWaitTime = new HashMap<UUID, Long>(); // Level calc cool down private HashMap<UUID, Long> levelWaitTime = new HashMap<UUID, Long>(); // Level calc checker BukkitTask checker = null; // To choose an island randomly private final Random random = new Random(); private HashMap<UUID, Location> islandSpot = new HashMap<UUID, Location>(); private List<UUID> leavingPlayers = new ArrayList<UUID>(); /** * Constructor * * @param aSkyBlock */ public IslandCmd(ASkyBlock aSkyBlock) { // Plugin instance this.plugin = aSkyBlock; // Load schematics loadSchematics(); } /** * Loads schematics from the config.yml file. If the default * island is not included, it will be made up */ public void loadSchematics() { // Check if there is a schematic folder and make it if it does not exist File schematicFolder = new File(plugin.getDataFolder(), "schematics"); if (!schematicFolder.exists()) { schematicFolder.mkdir(); } // Clear the schematic list that is kept in memory schematics.clear(); // Load the default schematic if it exists // Set up the default schematic File schematicFile = new File(schematicFolder, "island.schematic"); File netherFile = new File(schematicFolder, "nether.schematic"); if (!schematicFile.exists()) { //plugin.getLogger().info("Default schematic does not exist..."); // Only copy if the default exists if (plugin.getResource("schematics/island.schematic") != null) { plugin.getLogger().info("Default schematic does not exist, saving it..."); plugin.saveResource("schematics/island.schematic", false); // Add it to schematics try { schematics.put("default",new Schematic(plugin, schematicFile)); } catch (IOException e) { plugin.getLogger().severe("Could not load default schematic!"); e.printStackTrace(); } // If this is repeated later due to the schematic config, fine, it will only add info } else { // No islands.schematic in the jar, so just make the default using // built-in island generation schematics.put("default",new Schematic(plugin)); } plugin.getLogger().info("Loaded default nether schematic"); } else { // It exists, so load it try { schematics.put("default",new Schematic(plugin, schematicFile)); plugin.getLogger().info("Loaded default island schematic."); } catch (IOException e) { plugin.getLogger().severe("Could not load default schematic!"); e.printStackTrace(); } } // Add the nether default too if (!netherFile.exists()) { if (plugin.getResource("schematics/nether.schematic") != null) { plugin.saveResource("schematics/nether.schematic", false); // Add it to schematics try { Schematic netherIsland = new Schematic(plugin, netherFile); netherIsland.setVisible(false); schematics.put("nether", netherIsland); plugin.getLogger().info("Loaded default nether schematic."); } catch (IOException e) { plugin.getLogger().severe("Could not load default nether schematic!"); e.printStackTrace(); } } else { plugin.getLogger().severe("Could not find default nether schematic!"); } } else { // It exists, so load it try { Schematic netherIsland = new Schematic(plugin, netherFile); netherIsland.setVisible(false); schematics.put("nether", netherIsland); plugin.getLogger().info("Loaded default nether schematic."); } catch (IOException e) { plugin.getLogger().severe("Could not load default nether schematic!"); e.printStackTrace(); } } // Set up some basic settings just in case the schematics section is missing if (schematics.containsKey("default")) { schematics.get("default").setName("Island"); schematics.get("default").setDescription(""); schematics.get("default").setPartnerName("nether"); schematics.get("default").setBiome(Settings.defaultBiome); schematics.get("default").setIcon(Material.GRASS); if (Settings.chestItems.length == 0) { schematics.get("default").setUseDefaultChest(false); } schematics.get("default").setOrder(0); } if (schematics.containsKey("nether")) { schematics.get("nether").setName("NetherBlock Island"); schematics.get("nether").setDescription("Nether Island"); schematics.get("nether").setPartnerName("default"); schematics.get("nether").setBiome(Biome.HELL); schematics.get("nether").setIcon(Material.NETHERRACK); schematics.get("nether").setVisible(false); schematics.get("nether").setPasteEntities(true); if (Settings.chestItems.length == 0) { schematics.get("nether").setUseDefaultChest(false); } } // Load the schematics from config.yml ConfigurationSection schemSection = plugin.getConfig().getConfigurationSection("schematicsection"); if (plugin.getConfig().contains("general.schematics")) { tip(); // Load the schematics in this section int count = 1; for (String perms: plugin.getConfig().getConfigurationSection("general.schematics").getKeys(true)) { // See if the file exists String fileName = plugin.getConfig().getString("general.schematics." + perms); File schem = new File(plugin.getDataFolder(), fileName); if (schem.exists()) { plugin.getLogger().info("Loading schematic " + fileName + " for permission " + perms); Schematic schematic; try { schematic = new Schematic(plugin, schem); schematic.setPerm(perms); schematic.setHeading(perms); schematic.setName("#" + count++); if (!schematic.isVisible()) { plugin.getLogger().info("Schematic " + fileName + " will not be shown on the GUI"); } schematics.put(perms, schematic); } catch (IOException e) { plugin.getLogger().severe("Could not load schematic " + fileName + " due to error. Skipping..."); } } // Cannot declare a not-found because get keys gets some additional non-wanted strings } } else if (plugin.getConfig().contains("schematicsection")) { Settings.useSchematicPanel = schemSection.getBoolean("useschematicspanel", false); Settings.chooseIslandRandomly = schemSection.getBoolean("chooseislandrandomly", false); // Section exists, so go through the various sections for (String key : schemSection.getConfigurationSection("schematics").getKeys(false)) { try { Schematic newSchem = null; // Check the file exists //plugin.getLogger().info("DEBUG: schematics." + key + ".filename" ); String filename = schemSection.getString("schematics." + key + ".filename",""); if (!filename.isEmpty()) { //plugin.getLogger().info("DEBUG: filename = " + filename); // Check if this file exists or if it is in the jar schematicFile = new File(schematicFolder, filename); // See if the file exists if (schematicFile.exists()) { newSchem = new Schematic(plugin, schematicFile); } else if (plugin.getResource("schematics/"+filename) != null) { plugin.saveResource("schematics/"+filename, false); newSchem = new Schematic(plugin, schematicFile); } } else { //plugin.getLogger().info("DEBUG: filename is empty"); if (key.equalsIgnoreCase("default")) { //Øplugin.getLogger().info("DEBUG: key is default, so use this one"); newSchem = schematics.get("default"); } else { plugin.getLogger().severe("Schematic " + key + " does not have a filename. Skipping!"); } } if (newSchem != null) { // Set the heading newSchem.setHeading(key); // Order newSchem.setOrder(schemSection.getInt("schematics." + key + ".order", 0)); // Load the rest of the settings // Icon try { Material icon; String iconString = schemSection.getString("schematics." + key + ".icon","MAP").toUpperCase(); // Support damage values String[] split = iconString.split(":"); if (StringUtils.isNumeric(split[0])) { icon = Material.getMaterial(Integer.parseInt(iconString)); } else { icon = Material.valueOf(split[0]); } int damage = 0; if (split.length == 2) { if (StringUtils.isNumeric(split[1])) { damage = Integer.parseInt(split[1]); } } newSchem.setIcon(icon, damage); } catch (Exception e) { //e.printStackTrace(); newSchem.setIcon(Material.MAP); } // Friendly name String name = ChatColor.translateAlternateColorCodes('&', schemSection.getString("schematics." + key + ".name","")); newSchem.setName(name); // Rating - Rating is not used right now int rating = schemSection.getInt("schematics." + key + ".rating",50); if (rating <1) { rating = 1; } else if (rating > 100) { rating = 100; } newSchem.setRating(rating); // Cost double cost = schemSection.getDouble("schematics." + key + ".cost", 0D); if (cost < 0) { cost = 0; } newSchem.setCost(cost); // Description String description = ChatColor.translateAlternateColorCodes('&', schemSection.getString("schematics." + key + ".description","")); description = description.replace("[rating]",String.valueOf(rating)); if (Settings.useEconomy) { description = description.replace("[cost]", String.valueOf(cost)); } newSchem.setDescription(description); // Permission String perm = schemSection.getString("schematics." + key + ".permission",""); newSchem.setPerm(perm); // Use default chest newSchem.setUseDefaultChest(schemSection.getBoolean("schematics." + key + ".useDefaultChest", true)); // Biomes - overrides default if it exists String biomeString = schemSection.getString("schematics." + key + ".biome",Settings.defaultBiome.toString()); Biome biome = null; try { biome = Biome.valueOf(biomeString); newSchem.setBiome(biome); } catch (Exception e) { plugin.getLogger().severe("Could not parse biome " + biomeString + " using default instead."); } // Use physics - overrides default if it exists newSchem.setUsePhysics(schemSection.getBoolean("schematics." + key + ".usephysics",Settings.usePhysics)); // Paste Entities or not newSchem.setPasteEntities(schemSection.getBoolean("schematics." + key + ".pasteentities",false)); // Paste air or not. Default is false - huge performance savings! //newSchem.setPasteAir(schemSection.getBoolean("schematics." + key + ".pasteair",false)); // Visible in GUI or not newSchem.setVisible(schemSection.getBoolean("schematics." + key + ".show",true)); // Partner schematic if (biome != null && biome.equals(Biome.HELL)) { // Default for nether biomes is the default overworld island newSchem.setPartnerName(schemSection.getString("schematics." + key + ".partnerSchematic","default")); } else { // Default for overworld biomes is nether island newSchem.setPartnerName(schemSection.getString("schematics." + key + ".partnerSchematic","nether")); } // Island companion List<String> companion = schemSection.getStringList("schematics." + key + ".companion"); List<EntityType> companionTypes = new ArrayList<EntityType>(); if (!companion.isEmpty()) { for (String companionType : companion) { companionType = companionType.toUpperCase(); if (companionType.equalsIgnoreCase("NOTHING")) { companionTypes.add(null); } else { try { EntityType type = EntityType.valueOf(companionType); companionTypes.add(type); } catch (Exception e) { plugin.getLogger() .warning( "Island companion is not recognized in schematic '" + name + "'."); } } } newSchem.setIslandCompanion(companionTypes); } // Companion names List<String> companionNames = schemSection.getStringList("schematics." + key + ".companionnames"); if (!companionNames.isEmpty()) { List<String> names = new ArrayList<String>(); for (String companionName : companionNames) { names.add(ChatColor.translateAlternateColorCodes('&', companionName)); } newSchem.setCompanionNames(names); } // Get chest items final List<String> chestItems = schemSection.getStringList("schematics." + key + ".chestItems"); if (!chestItems.isEmpty()) { ItemStack[] tempChest = new ItemStack[chestItems.size()]; int i = 0; for (String chestItemString : chestItems) { //plugin.getLogger().info("DEBUG: chest item = " + chestItemString); try { String[] amountdata = chestItemString.split(":"); if (amountdata[0].equals("POTION")) { if (amountdata.length == 3) { Potion chestPotion = new Potion(PotionType.valueOf(amountdata[1])); tempChest[i++] = chestPotion.toItemStack(Integer.parseInt(amountdata[2])); } else if (amountdata.length == 4) { // Extended or splash potions if (amountdata[2].equals("EXTENDED")) { Potion chestPotion = new Potion(PotionType.valueOf(amountdata[1])).extend(); tempChest[i++] = chestPotion.toItemStack(Integer.parseInt(amountdata[3])); } else if (amountdata[2].equals("SPLASH")) { Potion chestPotion = new Potion(PotionType.valueOf(amountdata[1])).splash(); tempChest[i++] = chestPotion.toItemStack(Integer.parseInt(amountdata[3])); } else if (amountdata[2].equals("EXTENDEDSPLASH")) { Potion chestPotion = new Potion(PotionType.valueOf(amountdata[1])).extend().splash(); tempChest[i++] = chestPotion.toItemStack(Integer.parseInt(amountdata[3])); } } } else { Material mat; if (StringUtils.isNumeric(amountdata[0])) { mat = Material.getMaterial(Integer.parseInt(amountdata[0])); } else { mat = Material.getMaterial(amountdata[0].toUpperCase()); } if (amountdata.length == 2) { tempChest[i++] = new ItemStack(mat, Integer.parseInt(amountdata[1])); } else if (amountdata.length == 3) { tempChest[i++] = new ItemStack(mat, Integer.parseInt(amountdata[2]), Short.parseShort(amountdata[1])); } } } catch (java.lang.IllegalArgumentException ex) { plugin.getLogger().severe("Problem loading chest item for schematic '" + name + "' so skipping it: " + chestItemString); plugin.getLogger().severe("Error is : " + ex.getMessage()); plugin.getLogger().info("Potential potion types are: "); for (PotionType c : PotionType.values()) plugin.getLogger().info(c.name()); } catch (Exception e) { plugin.getLogger().severe("Problem loading chest item for schematic '" + name + "' so skipping it: " + chestItemString); plugin.getLogger().info("Potential material types are: "); for (Material c : Material.values()) plugin.getLogger().info(c.name()); // e.printStackTrace(); } } // Store it newSchem.setDefaultChestItems(tempChest); } // Player spawn block String spawnBlock = schemSection.getString("schematics." + key + ".spawnblock"); if (spawnBlock != null) { // Check to see if this block is a valid material try { Material playerSpawnBlock; if (StringUtils.isNumeric(spawnBlock)) { playerSpawnBlock = Material.getMaterial(Integer.parseInt(spawnBlock)); } else { playerSpawnBlock = Material.valueOf(spawnBlock.toUpperCase()); } if (newSchem.setPlayerSpawnBlock(playerSpawnBlock)) { plugin.getLogger().info("Player will spawn at the " + playerSpawnBlock.toString()); } else { plugin.getLogger().severe("Problem with schematic '" + name + "'. Spawn block '" + spawnBlock + "' not found in schematic or there is more than one. Skipping..."); } } catch (Exception e) { plugin.getLogger().severe("Problem with schematic '" + name + "'. Spawn block '" + spawnBlock + "' is unknown. Skipping..."); } } else { // plugin.getLogger().info("No spawn block found"); } // Level handicap newSchem.setLevelHandicap(schemSection.getInt("schematics." + key + ".levelHandicap", 0)); // Store it schematics.put(key, newSchem); if (perm.isEmpty()) { perm = "all players"; } else { perm = "player with " + perm + " permission"; } plugin.getLogger().info("Loading schematic " + name + " (" + filename + ") for " + perm + ", order " + newSchem.getOrder()); } else { plugin.getLogger().warning("Could not find " + filename + " in the schematics folder! Skipping..."); } } catch (IOException e) { plugin.getLogger().info("Error loading schematic in section " + key + ". Skipping..."); } } if (schematics.isEmpty()) { tip(); } } } private void tip() { // There is no section in config.yml. Save the default schematic anyway plugin.getLogger().warning("***************************************************************"); plugin.getLogger().warning("* 'schematics' section in config.yml has been deprecated. *"); plugin.getLogger().warning("* See 'schematicsection' in config.new.yml for replacement. *"); plugin.getLogger().warning("***************************************************************"); } /** * Adds a player to a team. The player and the teamleader MAY be the same * * @param playerUUID * @param teamLeader * @return true if the player is successfully added */ public boolean addPlayertoTeam(final UUID playerUUID, final UUID teamLeader) { // Set the player's team giving the team leader's name and the team's // island // location if (!plugin.getPlayers().setJoinTeam(playerUUID, teamLeader, plugin.getPlayers().getIslandLocation(teamLeader))) { return false; } // If the player's name and the team leader are NOT the same when this // method is called then set the player's home location to the leader's // home location // if it exists, and if not set to the island location if (!playerUUID.equals(teamLeader)) { // Clear any old home locations plugin.getPlayers().clearHomeLocations(playerUUID); if (plugin.getPlayers().getHomeLocation(teamLeader,1) != null) { plugin.getPlayers().setHomeLocation(playerUUID, plugin.getPlayers().getHomeLocation(teamLeader)); // plugin.getLogger().info("DEBUG: Setting player's home to the leader's home location"); } else { plugin.getPlayers().setHomeLocation(playerUUID, plugin.getPlayers().getIslandLocation(teamLeader)); // plugin.getLogger().info("DEBUG: Setting player's home to the team island location"); } // If the leader's member list does not contain player then add it if (!plugin.getPlayers().getMembers(teamLeader).contains(playerUUID)) { plugin.getPlayers().addTeamMember(teamLeader, playerUUID); } // If the leader's member list does not contain their own name then // add it if (!plugin.getPlayers().getMembers(teamLeader).contains(teamLeader)) { plugin.getPlayers().addTeamMember(teamLeader, teamLeader); } // Fire event final Island island = plugin.getGrid().getIsland(teamLeader); final IslandJoinEvent event = new IslandJoinEvent(playerUUID, island); plugin.getServer().getPluginManager().callEvent(event); } return true; } /** * Removes a player from a team run by teamleader * * @param playerUUID * @param teamLeader * @return true if successful, false if not */ public boolean removePlayerFromTeam(final UUID playerUUID, final UUID teamLeader) { return removePlayerFromTeam(playerUUID, teamLeader, false); } /** * Removes a player from a team run by teamleader * * @param playerUUID * @param teamLeader * @param makeLeader - true if this is the result of switching leader * @return true if successful, false if not */ public boolean removePlayerFromTeam(final UUID playerUUID, final UUID teamLeader, boolean makeLeader) { // Remove player from the team plugin.getPlayers().removeMember(teamLeader, playerUUID); // If player is online // If player is not the leader of their own team if (teamLeader == null || !playerUUID.equals(teamLeader)) { if (!plugin.getPlayers().setLeaveTeam(playerUUID)) { return false; } //plugin.getPlayers().setHomeLocation(player, null); plugin.getPlayers().clearHomeLocations(playerUUID); plugin.getPlayers().setIslandLocation(playerUUID, null); plugin.getPlayers().setTeamIslandLocation(playerUUID, null); if (!makeLeader) { OfflinePlayer offlinePlayer = plugin.getServer().getOfflinePlayer(playerUUID); if (offlinePlayer.isOnline()) { // Check perms if (!((Player)offlinePlayer).hasPermission(Settings.PERMPREFIX + "command.leaveexempt")) { runCommands(Settings.leaveCommands, offlinePlayer); } } else { // If offline, all commands are run, sorry runCommands(Settings.leaveCommands, offlinePlayer); } // Deduct a reset if (Settings.leaversLoseReset && Settings.resetLimit >= 0) { int resetsLeft = plugin.getPlayers().getResetsLeft(playerUUID); if (resetsLeft > 0) { resetsLeft--; plugin.getPlayers().setResetsLeft(playerUUID, resetsLeft); } } } // Fire event if (teamLeader != null) { final Island island = plugin.getGrid().getIsland(teamLeader); final IslandLeaveEvent event = new IslandLeaveEvent(playerUUID, island); plugin.getServer().getPluginManager().callEvent(event); } } else { // Ex-Leaders keeps their island, but the rest of the team members are // removed if (!plugin.getPlayers().setLeaveTeam(playerUUID)) { // Event was cancelled for some reason return false; } } return true; } /** * List schematics this player can access. If @param ignoreNoPermission is true, then only * schematics with a specific permission set will be checked. I.e., no common schematics will * be returned (including the default one). * @param player * @param ignoreNoPermission * @return List of schematics this player can use based on their permission level */ public List<Schematic> getSchematics(Player player, boolean ignoreNoPermission) { List<Schematic> result = new ArrayList<Schematic>(); // Find out what schematics this player can choose from //Bukkit.getLogger().info("DEBUG: Checking schematics for " + player.getName()); for (Schematic schematic : schematics.values()) { //Bukkit.getLogger().info("DEBUG: schematic name is '"+ schematic.getName() + "'"); //Bukkit.getLogger().info("DEBUG: perm is " + schematic.getPerm()); if ((!ignoreNoPermission && schematic.getPerm().isEmpty()) || VaultHelper.checkPerm(player, schematic.getPerm())) { //Bukkit.getLogger().info("DEBUG: player can use this schematic"); // Only add if it's visible if (schematic.isVisible()) { // Check if it's a nether island, but the nether is not enables if (schematic.getBiome().equals(Biome.HELL)) { if (Settings.createNether && Settings.newNether && ASkyBlock.getNetherWorld() != null) { result.add(schematic); } } else { result.add(schematic); } } } } // Sort according to order Collections.sort(result, new Comparator<Schematic>() { @Override public int compare(Schematic o1, Schematic o2) { return ((o2.getOrder() < o1.getOrder()) ? 1 : -1); } }); return result; } /** * @return the schematics */ public static HashMap<String, Schematic> getSchematics() { return schematics; } /** * Makes the default island for the player * @param player */ public void newIsland(final Player player) { //plugin.getLogger().info("DEBUG: Making default island"); newIsland(player, schematics.get("default")); } /** * Makes an island using schematic. No permission checks are made. They have to be decided * before this method is called. * @param player * @param schematic */ public void newIsland(final Player player, final Schematic schematic) { //long time = System.nanoTime(); final UUID playerUUID = player.getUniqueId(); boolean firstTime = false; if (!plugin.getPlayers().hasIsland(playerUUID)) { firstTime = true; } //plugin.getLogger().info("DEBUG: finding island location"); Location next = getNextIsland(player.getUniqueId()); //plugin.getLogger().info("DEBUG: found " + next); // Set the player's parameters to this island plugin.getPlayers().setHasIsland(playerUUID, true); // Clear any old home locations (they should be clear, but just in case) plugin.getPlayers().clearHomeLocations(playerUUID); // Set the player's island location to this new spot plugin.getPlayers().setIslandLocation(playerUUID, next); // Set the biome //BiomesPanel.setIslandBiome(next, schematic.getBiome()); // Teleport to the new home if (schematic.isPlayerSpawn()) { // Set home and teleport plugin.getPlayers().setHomeLocation(playerUUID, schematic.getPlayerSpawn(next), 1); } // Sets a flag to temporarily disable cleanstone generation plugin.setNewIsland(true); //plugin.getBiomes(); // Create island based on schematic if (schematic != null) { //plugin.getLogger().info("DEBUG: pasting schematic " + schematic.getName() + " " + schematic.getPerm()); //plugin.getLogger().info("DEBUG: nether world is " + ASkyBlock.getNetherWorld()); // Paste the starting island. If it is a HELL biome, then we start in the Nether if (Settings.createNether && schematic.isInNether() && Settings.newNether && ASkyBlock.getNetherWorld() != null) { // Nether start // Paste the overworld if it exists if (!schematic.getPartnerName().isEmpty() && schematics.containsKey(schematic.getPartnerName())) { // A partner schematic is available pastePartner(schematics.get(schematic.getPartnerName()),next, player); } // Switch home location to the Nether next = next.toVector().toLocation(ASkyBlock.getNetherWorld()); // Set the player's island location to this new spot plugin.getPlayers().setIslandLocation(playerUUID, next); schematic.pasteSchematic(next, player, true); } else { // Over world start //plugin.getLogger().info("DEBUG: pasting"); //long timer = System.nanoTime(); // Paste the island and teleport the player home schematic.pasteSchematic(next, player, true); //double diff = (System.nanoTime() - timer)/1000000; //plugin.getLogger().info("DEBUG: nano time = " + diff + " ms"); //plugin.getLogger().info("DEBUG: pasted overworld"); if (Settings.createNether && Settings.newNether && ASkyBlock.getNetherWorld() != null) { // Paste the other world schematic final Location netherLoc = next.toVector().toLocation(ASkyBlock.getNetherWorld()); if (schematic.getPartnerName().isEmpty()) { // This will paste the over world schematic again //plugin.getLogger().info("DEBUG: pasting nether"); pastePartner(schematic, netherLoc, player); //plugin.getLogger().info("DEBUG: pasted nether"); } else { if (schematics.containsKey(schematic.getPartnerName())) { //plugin.getLogger().info("DEBUG: pasting partner"); // A partner schematic is available pastePartner(schematics.get(schematic.getPartnerName()),netherLoc, player); } else { plugin.getLogger().severe("Partner schematic heading '" + schematic.getPartnerName() + "' does not exist"); } } } } // Record the rating of this schematic - not used for anything right now plugin.getPlayers().setStartIslandRating(playerUUID, schematic.getRating()); } // Clear the cleanstone flag so events can happen again plugin.setNewIsland(false); // Add to the grid Island myIsland = plugin.getGrid().addIsland(next.getBlockX(), next.getBlockZ(), playerUUID); myIsland.setLevelHandicap(schematic.getLevelHandicap()); // Save the player so that if the server is reset weird things won't happen plugin.getPlayers().save(playerUUID); // Start the reset cooldown if (!firstTime) { setResetWaitTime(player); } // Set the custom protection range if appropriate // Dynamic island range sizes with permissions int range = Settings.islandProtectionRange; for (PermissionAttachmentInfo perms : player.getEffectivePermissions()) { if (perms.getPermission().startsWith(Settings.PERMPREFIX + "island.range.")) { if (perms.getPermission().contains(Settings.PERMPREFIX + "island.range.*")) { range = Settings.islandProtectionRange; break; } else { String[] spl = perms.getPermission().split(Settings.PERMPREFIX + "island.range."); if (spl.length > 1) { if (!NumberUtils.isDigits(spl[1])) { plugin.getLogger().severe("Player " + player.getName() + " has permission: " + perms.getPermission() + " <-- the last part MUST be a number! Ignoring..."); } else { range = Math.max(range, Integer.valueOf(spl[1])); } } } } } // Do some sanity checking if (range % 2 != 0) { range--; plugin.getLogger().warning("Protection range must be even, using " + range + " for " + player.getName()); } if (range > Settings.islandDistance) { plugin.getLogger().warning("Player has " + Settings.PERMPREFIX + "island.range." + range); range = Settings.islandDistance; plugin.getLogger().warning( "Island protection range must be " + Settings.islandDistance + " or less. Setting to: " + range); } myIsland.setProtectionSize(range); // Run any commands that need to be run at the start if (firstTime) { //plugin.getLogger().info("DEBUG: First time"); if (!player.hasPermission(Settings.PERMPREFIX + "command.newislandexempt")) { //plugin.getLogger().info("DEBUG: Executing new island commands"); runCommands(Settings.startCommands, player); } } // Save grid just in case there's a crash plugin.getGrid().saveGrid(); // Done - fire event final IslandNewEvent event = new IslandNewEvent(player,schematic, myIsland); plugin.getServer().getPluginManager().callEvent(event); //plugin.getLogger().info("DEBUG: Done! " + (System.nanoTime()- time) * 0.000001); } /** * Does a delayed pasting of the partner island * @param schematic * @param player */ private void pastePartner(final Schematic schematic, final Location loc, final Player player) { plugin.getServer().getScheduler().runTaskLater(plugin, new Runnable() { @Override public void run() { schematic.pasteSchematic(loc, player, false); }}, 60L); } /** * Pastes a schematic at a location for the player * @param schematic * @param loc * @param player */ public void pasteSchematic(final Schematic schematic, final Location loc, final Player player) { schematic.pasteSchematic(loc, player, false); } /** * Get the location of next free island spot * @param playerUUID * @return Location of island spot */ private Location getNextIsland(UUID playerUUID) { // See if there is a reserved spot if (islandSpot.containsKey(playerUUID)) { Location next = plugin.getGrid().getClosestIsland(islandSpot.get(playerUUID)); // Single shot only islandSpot.remove(playerUUID); // Check if it is already occupied (shouldn't be) Island island = plugin.getGrid().getIslandAt(next); if (island == null || island.getOwner() == null) { // it's still free return next; } // Else, fall back to the random pick } // Find the next free spot if (last == null) { last = new Location(ASkyBlock.getIslandWorld(), Settings.islandXOffset + Settings.islandStartX, Settings.islandHeight, Settings.islandZOffset + Settings.islandStartZ); } Location next = last.clone(); while (plugin.getGrid().islandAtLocation(next) || islandSpot.containsValue(next)) { next = nextGridLocation(next); } // Make the last next, last last = next.clone(); return next; } /** * Finds the next free island spot based off the last known island Uses * island_distance setting from the config file Builds up in a grid fashion * * @param lastIsland * @return Location of next free island */ private Location nextGridLocation(final Location lastIsland) { // plugin.getLogger().info("DEBUG nextIslandLocation"); final int x = lastIsland.getBlockX(); final int z = lastIsland.getBlockZ(); final Location nextPos = lastIsland; if (x < z) { if (-1 * x < z) { nextPos.setX(nextPos.getX() + Settings.islandDistance); return nextPos; } nextPos.setZ(nextPos.getZ() + Settings.islandDistance); return nextPos; } if (x > z) { if (-1 * x >= z) { nextPos.setX(nextPos.getX() - Settings.islandDistance); return nextPos; } nextPos.setZ(nextPos.getZ() - Settings.islandDistance); return nextPos; } if (x <= 0) { nextPos.setZ(nextPos.getZ() + Settings.islandDistance); return nextPos; } nextPos.setZ(nextPos.getZ() - Settings.islandDistance); return nextPos; } /** * Calculates the island level * * @param sender * - Player object of player who is asking * @param targetPlayer * - UUID of the player's island that is being requested * @return - true if successful. */ public boolean calculateIslandLevel(final CommandSender sender, final UUID targetPlayer) { return calculateIslandLevel(sender, targetPlayer, false); } /** * Calculates the island level * @param sender - asker of the level info * @param targetPlayer * @param report - if true, a detailed report will be provided * @return - false if this is cannot be done */ public boolean calculateIslandLevel(final CommandSender sender, final UUID targetPlayer, boolean report) { if (sender instanceof Player) { Player asker = (Player)sender; // Player asking for their own island calc if (asker.getUniqueId().equals(targetPlayer) || asker.isOp() || VaultHelper.checkPerm(asker, Settings.PERMPREFIX + "mod.info")) { // Newer better system - uses chunks if (!onLevelWaitTime(asker) || Settings.levelWait <= 0 || asker.isOp() || VaultHelper.checkPerm(asker, Settings.PERMPREFIX + "mod.info")) { asker.sendMessage(ChatColor.GREEN + plugin.myLocale(asker.getUniqueId()).levelCalculating); setLevelWaitTime(asker); new LevelCalcByChunk(plugin, targetPlayer, asker, report); } else { asker.sendMessage(ChatColor.YELLOW + plugin.myLocale(asker.getUniqueId()).islandresetWait.replace("[time]", String.valueOf(getLevelWaitTime(asker)))); } } else { // Asking for the level of another player asker.sendMessage(ChatColor.GREEN + plugin.myLocale(asker.getUniqueId()).islandislandLevelis + " " + ChatColor.WHITE + plugin.getPlayers().getIslandLevel(targetPlayer)); } } else { // Console request Util.sendMessage(sender, ChatColor.GREEN + plugin.myLocale().levelCalculating); new LevelCalcByChunk(plugin, targetPlayer, sender, report); } return true; } /** * One-to-one relationship, you can return the first matched key * * @param map * @param value * @return key */ public static <T, E> T getKeyByValue(Map<T, E> map, E value) { for (Entry<T, E> entry : map.entrySet()) { if (value.equals(entry.getValue())) { return entry.getKey(); } } return null; } /* * (non-Javadoc) * @see * org.bukkit.command.CommandExecutor#onCommand(org.bukkit.command.CommandSender * , org.bukkit.command.Command, java.lang.String, java.lang.String[]) */ @Override public boolean onCommand(final CommandSender sender, final Command command, final String label, final String[] split) { if (!(sender instanceof Player)) { Util.sendMessage(sender, plugin.myLocale().errorUseInGame); return false; } final Player player = (Player) sender; // Basic permissions check to even use /island if (!VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.create")) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).islanderrorYouDoNotHavePermission); return true; } /* * Grab data for this player - may be null or empty * playerUUID is the unique ID of the player who issued the command */ final UUID playerUUID = player.getUniqueId(); if (playerUUID == null) { plugin.getLogger().severe("Player " + sender.getName() + " has a null UUID - this should never happen!"); sender.sendMessage(ChatColor.RED + plugin.myLocale().errorCommandNotReady + " (No UUID)"); return true; } final UUID teamLeader = plugin.getPlayers().getTeamLeader(playerUUID); List<UUID> teamMembers = new ArrayList<UUID>(); if (teamLeader != null) { teamMembers = plugin.getPlayers().getMembers(teamLeader); } // Island name (can have spaces) if (split.length > 1 && split[0].equalsIgnoreCase("name")) { // Naming of island if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.name") && plugin.getPlayers().hasIsland(playerUUID)) { String name = split[1]; for (int i = 2; i < split.length; i++) { name = name + " " + split[i]; } if (name.length() < Settings.minNameLength) { Util.sendMessage(player, ChatColor.RED + (plugin.myLocale(player.getUniqueId()).errorTooShort).replace("[length]", String.valueOf(Settings.minNameLength))); return true; } if (name.length() > Settings.maxNameLength) { Util.sendMessage(player, ChatColor.RED + (plugin.myLocale(player.getUniqueId()).errorTooLong).replace("[length]", String.valueOf(Settings.maxNameLength))); return true; } plugin.getGrid().setIslandName(playerUUID, ChatColor.translateAlternateColorCodes('&', name)); Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).generalSuccess); return true; } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } } // The target player's UUID UUID targetPlayer = null; // Check if a player has an island or is in a team switch (split.length) { // /island command by itself case 0: // New island if (plugin.getPlayers().getIslandLocation(playerUUID) == null && !plugin.getPlayers().inTeam(playerUUID)) { // Check if the max number of islands is made already if (Settings.maxIslands > 0 && plugin.getGrid().getIslandCount() > Settings.maxIslands) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorMaxIslands); return true; } // Check if player has resets left if (plugin.getPlayers().getResetsLeft(playerUUID) == 0) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).islandResetNoMore); return true; } // Create new island for player Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).islandnew); chooseIsland(player); return true; } else { // Island command // Check if this should open the Control Panel or not if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.controlpanel") && plugin.getPlayers().getControlPanel(playerUUID)) { player.performCommand(Settings.ISLANDCOMMAND + " cp"); } else { // Check permission if (!VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.go")) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } if (!player.getWorld().getName().equalsIgnoreCase(Settings.worldName) || Settings.allowTeleportWhenFalling || !PlayerEvents.isFalling(playerUUID) || (player.isOp() && !Settings.damageOps)) { // Teleport home plugin.getGrid().homeTeleport(player); if (Settings.islandRemoveMobs) { plugin.getGrid().removeMobs(player.getLocation()); } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorCommandNotReady); } } return true; } case 1: if (split[0].equalsIgnoreCase("value")) { // Explain command if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.value")) { // Check they are on their island if (!plugin.getGrid().playerIsOnIsland(player)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNotOnIsland); return true; } ItemStack item = player.getItemInHand(); double multiplier = 1; if (item != null && item.getType().isBlock()) { // Get permission multiplier for (PermissionAttachmentInfo perms : player.getEffectivePermissions()) { if (perms.getPermission().startsWith(Settings.PERMPREFIX + "island.multiplier.")) { String[] spl = perms.getPermission().split(Settings.PERMPREFIX + "island.multiplier."); // Get the max value should there be more than one if (spl.length > 1) { if (!NumberUtils.isDigits(spl[1])) { plugin.getLogger().severe("Player " + player.getName() + " has permission: " + perms.getPermission() + " <-- the last part MUST be a number! Ignoring..."); } else { multiplier = Math.max(multiplier, Integer.valueOf(spl[1])); } } } // Do some sanity checking if (multiplier < 1) { multiplier = 1; } } // Player height if (player.getLocation().getBlockY() < Settings.seaHeight) { multiplier *= Settings.underWaterMultiplier; } // Get the value. Try the specific item int value = 0; if (Settings.blockValues.containsKey(item.getData())) { value = (int)((double)Settings.blockValues.get(item.getData()) * multiplier); } else if (Settings.blockValues.containsKey(new MaterialData(item.getType()))) { value = (int)((double)Settings.blockValues.get(new MaterialData(item.getType())) * multiplier); } if (value > 0) { // [name] placed here may be worth [value] Util.sendMessage(player, ChatColor.GREEN + (plugin.myLocale(player.getUniqueId()).islandblockValue.replace("[name]", Util.prettifyText(item.getType().name())).replace("[value]", String.valueOf(value)))); } else { // [name] is worthless Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).islandblockWorthless.replace("[name]", Util.prettifyText(item.getType().name()))); } } else { // That is not a block Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNotABlock); } return true; } } else if (split[0].equalsIgnoreCase("name")) { // Explain command if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.name") && plugin.getPlayers().hasIsland(playerUUID)) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " name <name>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandHelpName); return true; } } else if (split[0].equalsIgnoreCase("resetname")) { // Convert name to a UUID if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.name") && plugin.getPlayers().hasIsland(playerUUID)) { // Has an island plugin.getGrid().setIslandName(playerUUID, null); Util.sendMessage(sender, plugin.myLocale().generalSuccess); } return true; } if (split[0].equalsIgnoreCase("coop")) { // Explain command if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "coop")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " coop <player>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpCoop); return true; } } else if (split[0].equalsIgnoreCase("uncoop")) { // Explain command if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "coop")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " uncoop <player>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpUnCoop); return true; } } else if (split[0].equalsIgnoreCase("expel")) { // Explain command if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.expel")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " expel <player>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpExpel); return true; } } else if (split[0].equalsIgnoreCase("teamchat") || split[0].equalsIgnoreCase("tc")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.chat")) { // Check if this command is on or not if (!Settings.teamChat) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale().errorUnknownCommand); return false; } // Check if in team if (plugin.getPlayers().inTeam(playerUUID)) { // Check if team members are online boolean online = false; for (UUID teamMember : plugin.getPlayers().getMembers(playerUUID)) { if (!teamMember.equals(playerUUID) && plugin.getServer().getPlayer(teamMember) != null) { online = true; } } if (!online) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).teamChatNoTeamAround); Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(playerUUID).teamChatStatusOff); plugin.getChatListener().unSetPlayer(playerUUID); return true; } if (plugin.getChatListener().isTeamChat(playerUUID)) { // Toggle Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(playerUUID).teamChatStatusOff); plugin.getChatListener().unSetPlayer(playerUUID); } else { Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(playerUUID).teamChatStatusOn); plugin.getChatListener().setPlayer(playerUUID); } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).teamChatNoTeam); } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorNoPermission); } return true; } if (split[0].equalsIgnoreCase("banlist")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.ban")) { // Show banned players Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(playerUUID).adminInfoBannedPlayers + ":"); List<UUID> bannedList = plugin.getPlayers().getBanList(playerUUID); if (bannedList.isEmpty()) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).banNone); } else { for (UUID bannedPlayers: bannedList) { Util.sendMessage(player, plugin.myLocale(playerUUID).helpColor + plugin.getPlayers().getName(bannedPlayers)); } } return true; } else { Util.sendMessage(player, plugin.myLocale(playerUUID).errorNoPermission); } return true; } else if (split[0].equalsIgnoreCase("ban")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.ban")) { // Just show ban help Util.sendMessage(player, plugin.myLocale(playerUUID).helpColor + "/" + label + " ban <player>: " + ChatColor.WHITE + plugin.myLocale(playerUUID).islandhelpBan); } else { Util.sendMessage(player, plugin.myLocale(playerUUID).errorNoPermission); } return true; } else if (split[0].equalsIgnoreCase("unban") && VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.ban")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.ban")) { // Just show unban help Util.sendMessage(player, plugin.myLocale(playerUUID).helpColor + "/" + label + " unban <player>: " + ChatColor.WHITE + plugin.myLocale(playerUUID).islandhelpUnban); } else { Util.sendMessage(player, plugin.myLocale(playerUUID).errorNoPermission); } return true; } else if (split[0].equalsIgnoreCase("make")) { //plugin.getLogger().info("DEBUG: /is make called"); if (!pendingNewIslandSelection.contains(playerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale().errorUnknownCommand); return false; } pendingNewIslandSelection.remove(playerUUID); Island oldIsland = plugin.getGrid().getIsland(player.getUniqueId()); newIsland(player); if (resettingIsland.contains(playerUUID)) { resettingIsland.remove(playerUUID); resetPlayer(player, oldIsland); } return true; } else if (split[0].equalsIgnoreCase("lang")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.lang")) { Util.sendMessage(player, "/" + label + " lang <#>"); displayLocales(player); } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorNoPermission); } return true; } else if (split[0].equalsIgnoreCase("settings")) { // Show what the plugin settings are if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.settings")) { try { player.openInventory(plugin.getSettingsPanel().islandGuardPanel(player)); } catch (Exception e) { if (DEBUG) e.printStackTrace(); Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorCommandNotReady); } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); } return true; } else if (split[0].equalsIgnoreCase("lock")) { if (!VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.lock")) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } // plugin.getLogger().info("DEBUG: perms ok"); // Find out which island they want to lock Island island = plugin.getGrid().getIsland(playerUUID); if (island == null) { // plugin.getLogger().info("DEBUG: player has no island in grid"); // Player has no island in the grid Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoIsland); return true; } else { if (!island.isLocked()) { // Remove any visitors for (Player target : plugin.getServer().getOnlinePlayers()) { // See if target is on this player's island, not a mod, no bypass, and not a coop player if (!player.equals(target) && !target.isOp() && !VaultHelper.checkPerm(target, Settings.PERMPREFIX + "mod.bypassprotect") && plugin.getGrid().isOnIsland(player, target) && !CoopPlay.getInstance().getCoopPlayers(island.getCenter()).contains(target.getUniqueId())) { // Send them home if (plugin.getPlayers().inTeam(target.getUniqueId()) || plugin.getPlayers().hasIsland(target.getUniqueId())) { plugin.getGrid().homeTeleport(target); } else { // Just move target to spawn if (!target.performCommand(Settings.SPAWNCOMMAND)) { target.teleport(player.getWorld().getSpawnLocation()); } } target.sendMessage(ChatColor.RED + plugin.myLocale(target.getUniqueId()).expelExpelled); plugin.getLogger().info(player.getName() + " expelled " + target.getName() + " from their island when locking."); // Yes they are Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).expelSuccess.replace("[name]", target.getName())); } } Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(playerUUID).lockLocking); plugin.getMessages().tellOfflineTeam(playerUUID, plugin.myLocale(playerUUID).lockPlayerLocked.replace("[name]", player.getName())); plugin.getMessages().tellTeam(playerUUID, plugin.myLocale(playerUUID).lockPlayerLocked.replace("[name]", player.getName())); island.setLocked(true); } else { Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(playerUUID).lockUnlocking); plugin.getMessages().tellOfflineTeam(playerUUID, plugin.myLocale(playerUUID).lockPlayerUnlocked.replace("[name]", player.getName())); plugin.getMessages().tellTeam(playerUUID, plugin.myLocale(playerUUID).lockPlayerUnlocked.replace("[name]", player.getName())); island.setLocked(false); } return true; } } else if (split[0].equalsIgnoreCase("go")) { if (!VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.go")) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } if (!plugin.getPlayers().hasIsland(playerUUID) && !plugin.getPlayers().inTeam(playerUUID)) { // Player has no island Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorNoIsland); return true; } // Teleport home plugin.getGrid().homeTeleport(player); if (Settings.islandRemoveMobs) { plugin.getGrid().removeMobs(player.getLocation()); } return true; } else if (split[0].equalsIgnoreCase("about")) { Util.sendMessage(player, ChatColor.GOLD + "This plugin is free software: you can redistribute"); Util.sendMessage(player, ChatColor.GOLD + "it and/or modify it under the terms of the GNU"); Util.sendMessage(player, ChatColor.GOLD + "General Public License as published by the Free"); Util.sendMessage(player, ChatColor.GOLD + "Software Foundation, either version 3 of the License,"); Util.sendMessage(player, ChatColor.GOLD + "or (at your option) any later version."); Util.sendMessage(player, ChatColor.GOLD + "This plugin is distributed in the hope that it"); Util.sendMessage(player, ChatColor.GOLD + "will be useful, but WITHOUT ANY WARRANTY; without"); Util.sendMessage(player, ChatColor.GOLD + "even the implied warranty of MERCHANTABILITY or"); Util.sendMessage(player, ChatColor.GOLD + "FITNESS FOR A PARTICULAR PURPOSE. See the"); Util.sendMessage(player, ChatColor.GOLD + "GNU General Public License for more details."); Util.sendMessage(player, ChatColor.GOLD + "You should have received a copy of the GNU"); Util.sendMessage(player, ChatColor.GOLD + "General Public License along with this plugin."); Util.sendMessage(player, ChatColor.GOLD + "If not, see <http://www.gnu.org/licenses/>."); Util.sendMessage(player, ChatColor.GOLD + "Souce code is available on GitHub."); Util.sendMessage(player, ChatColor.GOLD + "(c) 2014 - 2015 by tastybento"); return true; // Spawn enderman // Enderman enderman = (Enderman) // player.getWorld().spawnEntity(player.getLocation().add(new // Vector(5,0,5)), EntityType.ENDERMAN); // enderman.setCustomName("TastyBento's Ghost"); // enderman.setCarriedMaterial(new // MaterialData(Material.GRASS)); } if (split[0].equalsIgnoreCase("controlpanel") || split[0].equalsIgnoreCase("cp")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.controlpanel")) { player.openInventory(ControlPanel.controlPanel.get(ControlPanel.getDefaultPanelName())); return true; } } if (split[0].equalsIgnoreCase("minishop") || split[0].equalsIgnoreCase("ms")) { if (Settings.useEconomy && Settings.useMinishop) { // Check island if (plugin.getGrid().getIsland(player.getUniqueId()) == null) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoIsland); return true; } if (player.getWorld().equals(ASkyBlock.getIslandWorld()) || player.getWorld().equals(ASkyBlock.getNetherWorld())) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.minishop")) { if (ControlPanel.miniShop != null) { player.openInventory(ControlPanel.miniShop); } else { Util.sendMessage(player, plugin.myLocale(playerUUID).errorCommandNotReady); plugin.getLogger().severe("Player tried to open the minishop, but it does not exist. Look for errors in the console about the minishop loading."); } return true; } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorWrongWorld); return true; } } else{ Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorMinishopDisabled); } } // /island <command> if (split[0].equalsIgnoreCase("warp")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.warp")) { Util.sendMessage(player, ChatColor.YELLOW + "/island warp <player>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpWarp); return true; } } else if (split[0].equalsIgnoreCase("warps")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.warp")) { // Step through warp table Collection<UUID> warpList = plugin.getWarpSignsListener().listWarps(); if (warpList.isEmpty()) { Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).warpserrorNoWarpsYet); if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.addwarp") && plugin.getGrid().playerIsOnIsland(player)) { Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale().warpswarpTip); } return true; } else { if (Settings.useWarpPanel) { // Try the warp panel player.openInventory(plugin.getWarpPanel().getWarpPanel(0)); } else { Boolean hasWarp = false; String wlist = ""; for (UUID w : warpList) { if (w == null) continue; if (wlist.isEmpty()) { wlist = plugin.getPlayers().getName(w); } else { wlist += ", " + plugin.getPlayers().getName(w); } if (w.equals(playerUUID)) { hasWarp = true; } } Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).warpswarpsAvailable + ": " + ChatColor.WHITE + wlist); if (!hasWarp && (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.addwarp"))) { Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale().warpswarpTip); } } return true; } } } else if (split[0].equalsIgnoreCase("restart") || split[0].equalsIgnoreCase("reset")) { if (!VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.reset")) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } // Check this player has an island if (!plugin.getPlayers().hasIsland(playerUUID)) { // No so just start an island player.performCommand(Settings.ISLANDCOMMAND); return true; } if (plugin.getPlayers().inTeam(playerUUID)) { if (!plugin.getPlayers().getTeamLeader(playerUUID).equals(playerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).islandresetOnlyOwner); } else { Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).islandresetMustRemovePlayers); } return true; } // Check if the player has used up all their resets if (plugin.getPlayers().getResetsLeft(playerUUID) == 0) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).islandResetNoMore); return true; } if (plugin.getPlayers().getResetsLeft(playerUUID) > 0) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).resetYouHave.replace("[number]", String.valueOf(plugin.getPlayers().getResetsLeft(playerUUID)))); } if (!onRestartWaitTime(player) || Settings.resetWait == 0 || player.isOp()) { // Kick off the confirmation Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).islandresetConfirm.replace("[seconds]", String.valueOf(Settings.resetConfirmWait))); if (!confirm.containsKey(playerUUID) || !confirm.get(playerUUID)) { confirm.put(playerUUID, true); plugin.getServer().getScheduler().runTaskLater(plugin, new Runnable() { @Override public void run() { confirm.put(playerUUID, false); } }, (Settings.resetConfirmWait * 20)); } return true; } else { Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).islandresetWait.replace("[time]", String.valueOf(getResetWaitTime(player)))); } return true; } else if (split[0].equalsIgnoreCase("confirm")) { // This is where the actual reset is done if (confirm.containsKey(playerUUID) && confirm.get(playerUUID)) { confirm.remove(playerUUID); // Actually RESET the island Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).islandresetPleaseWait); if (plugin.getPlayers().getResetsLeft(playerUUID) == 0) { Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).islandResetNoMore); } if (plugin.getPlayers().getResetsLeft(playerUUID) > 0) { Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).resetYouHave.replace("[number]", String.valueOf(plugin.getPlayers().getResetsLeft(playerUUID)))); } // Show a schematic panel if the player has a choice // Get the schematics that this player is eligible to use List<Schematic> schems = getSchematics(player, false); //plugin.getLogger().info("DEBUG: size of schematics for this player = " + schems.size()); Island oldIsland = plugin.getGrid().getIsland(player.getUniqueId()); if (schems.isEmpty()) { // No schematics - use default island newIsland(player); resetPlayer(player,oldIsland); } else if (schems.size() == 1) { // Hobson's choice newIsland(player,schems.get(0)); resetPlayer(player,oldIsland); } else { // A panel can only be shown if there is >1 viable schematic if (Settings.useSchematicPanel) { pendingNewIslandSelection.add(playerUUID); resettingIsland.add(playerUUID); player.openInventory(plugin.getSchematicsPanel().getPanel(player)); } else { // No panel // Check schematics for specific permission schems = getSchematics(player,true); if (schems.isEmpty()) { newIsland(player); } else if (Settings.chooseIslandRandomly) { // Choose an island randomly from the list newIsland(player, schems.get(random.nextInt(schems.size()))); } else { // Do the first one in the list newIsland(player, schems.get(0)); } resetPlayer(player,oldIsland); } } return true; } else { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/island restart: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpRestart); return true; } } else if (split[0].equalsIgnoreCase("sethome")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.sethome")) { // Check island if (plugin.getGrid().getIsland(player.getUniqueId()) == null) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoIsland); return true; } plugin.getGrid().homeSet(player); return true; } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorNoPermission); return true; } } else if (split[0].equalsIgnoreCase("help")) { Util.sendMessage(player, ChatColor.GREEN + plugin.getName() + " " + plugin.getDescription().getVersion() + " help:"); if (Settings.useControlPanel) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + ": " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpControlPanel); } else { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + ": " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpIsland); } // Dynamic home sizes with permissions int maxHomes = Settings.maxHomes; for (PermissionAttachmentInfo perms : player.getEffectivePermissions()) { if (perms.getPermission().startsWith(Settings.PERMPREFIX + "island.maxhomes.")) { if (perms.getPermission().startsWith(Settings.PERMPREFIX + "island.maxhomes.*")) { maxHomes = Settings.maxHomes; break; } else { // Get the max value should there be more than one String[] spl = perms.getPermission().split(Settings.PERMPREFIX + "island.maxhomes."); if (spl.length > 1) { // Check that it is a number if (!NumberUtils.isDigits(spl[1])) { plugin.getLogger().severe("Player " + player.getName() + " has permission: " + perms.getPermission() + " <-- the last part MUST be a number! Ignoring..."); } else { maxHomes = Math.max(maxHomes, Integer.valueOf(spl[1])); } } } } // Do some sanity checking if (maxHomes < 1) { maxHomes = 1; } } if (maxHomes > 1 && VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.go")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " go <1 - " + maxHomes + ">: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpTeleport); } else if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.go")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " go: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpTeleport); } if (plugin.getGrid() != null && plugin.getGrid().getSpawn() != null && VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.spawn")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " spawn: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpSpawn); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.controlpanel")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " controlpanel or cp [on/off]: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpControlPanel); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.reset")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " reset: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpRestart); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.sethome")) { if (maxHomes > 1) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " sethome <1 - " + maxHomes + ">: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpSetHome); } else { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " sethome: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpSetHome); } } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.info")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " level: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpLevel); Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " level <player>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpLevelPlayer); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.name") && plugin.getPlayers().hasIsland(playerUUID)) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " name <name>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandHelpName); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.topten")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " top: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpTop); } if (Settings.useEconomy && VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.minishop")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " minishop or ms: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpMiniShop); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.value")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " value: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpValue); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.warp")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " warps: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpWarps); Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " warp <player>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpWarp); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.create")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " team: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpTeam); Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " invite <player>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpInvite); Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " leave: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpLeave); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.kick")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " kick <player>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpKick); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.join")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " <accept/reject>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpAcceptReject); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.makeleader")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " makeleader <player>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpMakeLeader); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.chat") && plugin.getPlayers().inTeam(playerUUID)) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " teamchat: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).teamChatHelp); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.biomes")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " biomes: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpBiome); } // if (!Settings.allowPvP) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.expel")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " expel <player>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpExpel); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.ban")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " ban <player>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpBan); Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " banlist <player>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpBanList); Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " unban <player>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpUnban); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "coop")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " coop <player>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpCoop); Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " uncoop <player>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpUnCoop); Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " listcoops: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpListCoops); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.lock")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " lock: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandHelpLock); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.name") && plugin.getPlayers().hasIsland(playerUUID)) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " resetname: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpResetName); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.settings")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " settings: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandHelpSettings); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.challenges")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + plugin.myLocale(player.getUniqueId()).islandHelpChallenges); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.lang")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "/" + label + " lang <#>: "+ ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandHelpSelectLanguage); } // DEBUG - used to find meta tags /* if (player.getInventory().getItemInMainHand() != null) { net.minecraft.server.v1_11_R1.ItemStack stack = CraftItemStack.asNMSCopy(player.getInventory().getItemInMainHand()); NBTTagCompound tagCompound = stack.getTag(); Bukkit.getLogger().info("DEBUG: tag = " + tagCompound); } */ return true; } else if (split[0].equalsIgnoreCase("listcoops")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "coop")) { if (!plugin.getPlayers().hasIsland(playerUUID)) { // Player has no island Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoIsland); return true; } Island island = plugin.getGrid().getIsland(playerUUID); boolean none = true; for (UUID uuid: CoopPlay.getInstance().getCoopPlayers(island.getCenter())) { Util.sendMessage(player, ChatColor.GREEN + plugin.getPlayers().getName(uuid)); none = false; } if (none) { Util.sendMessage(player, plugin.myLocale(playerUUID).helpColor + "/" + label + " coop <player>: " + ChatColor.WHITE + plugin.myLocale(player.getUniqueId()).islandhelpCoop); } else { Util.sendMessage(player, plugin.myLocale(playerUUID).helpColor + plugin.myLocale(playerUUID).coopUseExpel); } return true; } } else if (split[0].equalsIgnoreCase("biomes")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.biomes")) { // Only the team leader can do this if (teamLeader != null && !teamLeader.equals(playerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).levelerrornotYourIsland); return true; } if (!plugin.getPlayers().hasIsland(playerUUID)) { // Player has no island Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoIsland); return true; } if (!plugin.getGrid().playerIsOnIsland(player)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).challengeserrorNotOnIsland); return true; } // Not allowed in the nether if (plugin.getPlayers().getIslandLocation(playerUUID).getWorld().getEnvironment().equals(Environment.NETHER)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorWrongWorld); return true; } // Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).helpColor + "[Biomes]"); Inventory inv = plugin.getBiomes().getBiomePanel(player); if (inv != null) { player.openInventory(inv); } return true; } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } } else if (split[0].equalsIgnoreCase("spawn") && plugin.getGrid().getSpawn() != null) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.spawn")) { // go to spawn Location l = ASkyBlock.getIslandWorld().getSpawnLocation(); l.add(new Vector(0.5,0,0.5)); Island spawn = plugin.getGrid().getSpawn(); if (spawn != null && spawn.getSpawnPoint() != null) { l = spawn.getSpawnPoint(); } player.teleport(l); } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorNoPermission); } return true; } else if (split[0].equalsIgnoreCase("top")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.topten")) { TopTen.topTenShow(player); return true; } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorNoPermission); return true; } } else if (split[0].equalsIgnoreCase("level")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.info")) { if (!plugin.getPlayers().inTeam(playerUUID) && !plugin.getPlayers().hasIsland(playerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoIsland); return true; } else { if (!VaultHelper.checkPerm(player, Settings.PERMPREFIX + "intopten")) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).topTenerrorExcluded.replace("[perm]", Settings.PERMPREFIX + "intopten")); } calculateIslandLevel(player, playerUUID); return true; } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorNoPermission); return true; } } else if (split[0].equalsIgnoreCase("invite")) { // Invite label with no name, i.e., /island invite - tells the // player how many more people they can invite if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.create")) { Util.sendMessage(player, plugin.myLocale(player.getUniqueId()).invitehelp); // If the player who is doing the inviting has a team if (plugin.getPlayers().inTeam(playerUUID)) { // Check to see if the player is the leader if (teamLeader.equals(playerUUID)) { // Check to see if the team is already full int maxSize = Settings.maxTeamSize; // Dynamic team sizes with permissions for (PermissionAttachmentInfo perms : player.getEffectivePermissions()) { if (perms.getPermission().startsWith(Settings.PERMPREFIX + "team.maxsize.")) { if (perms.getPermission().contains(Settings.PERMPREFIX + "team.maxsize.*")) { maxSize = Settings.maxTeamSize; break; } else { // Get the max value should there be more than one String[] spl = perms.getPermission().split(Settings.PERMPREFIX + "team.maxsize."); if (spl.length > 1) { if (!NumberUtils.isDigits(spl[1])) { plugin.getLogger().severe("Player " + player.getName() + " has permission: " + perms.getPermission() + " <-- the last part MUST be a number! Ignoring..."); } else { maxSize = Math.max(maxSize, Integer.valueOf(spl[1])); } } } } // Do some sanity checking if (maxSize < 1) { maxSize = 1; } } // Account for deprecated permissions. These will be zero on new installs // This avoids these permissions breaking on upgrades if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.vip")) { if (Settings.maxTeamSizeVIP > maxSize) { maxSize = Settings.maxTeamSizeVIP; } } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.vip2")) { if (Settings.maxTeamSizeVIP2 > maxSize) { maxSize = Settings.maxTeamSizeVIP2; } } if (teamMembers.size() < maxSize) { Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).inviteyouCanInvite.replace("[number]", String.valueOf(maxSize - teamMembers.size()))); } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).inviteerrorYourIslandIsFull); } return true; } Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).inviteerrorYouMustHaveIslandToInvite); return true; } return true; } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorNoPermission); return true; } } else if (split[0].equalsIgnoreCase("accept")) { // Accept an invite command if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.join")) { // If player is not in a team but has been invited to join // one if (!plugin.getPlayers().inTeam(playerUUID) && inviteList.containsKey(playerUUID)) { // If the invitee has an island of their own if (plugin.getPlayers().hasIsland(playerUUID)) { plugin.getLogger().info(player.getName() + "'s island will be deleted because they joined a party."); plugin.deletePlayerIsland(playerUUID, true); plugin.getLogger().info("Island deleted."); } // Add the player to the team addPlayertoTeam(playerUUID, inviteList.get(playerUUID)); // If the leader who did the invite does not yet have a // team (leader is not in a team yet) if (!plugin.getPlayers().inTeam(inviteList.get(playerUUID))) { // Add the leader to their own team addPlayertoTeam(inviteList.get(playerUUID), inviteList.get(playerUUID)); } setResetWaitTime(player); if (Settings.teamJoinDeathReset) { plugin.getPlayers().setDeaths(player.getUniqueId(), 0); } plugin.getGrid().homeTeleport(player); plugin.resetPlayer(player); if (!player.hasPermission(Settings.PERMPREFIX + "command.newteamexempt")) { //plugin.getLogger().info("DEBUG: Executing new island commands"); runCommands(Settings.teamStartCommands, player); } Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).inviteyouHaveJoinedAnIsland); if (plugin.getServer().getPlayer(inviteList.get(playerUUID)) != null) { Util.sendMessage(plugin.getServer().getPlayer(inviteList.get(playerUUID)), ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).invitehasJoinedYourIsland.replace("[name]", player.getName())); } // Remove the invite inviteList.remove(player.getUniqueId()); plugin.getGrid().saveGrid(); return true; } Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorCommandNotReady); return true; } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorNoPermission); return true; } } else if (split[0].equalsIgnoreCase("reject")) { // Reject /island reject if (inviteList.containsKey(player.getUniqueId())) { Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).rejectyouHaveRejectedInvitation); // If the player is online still then tell them directly // about the rejection if (Bukkit.getPlayer(inviteList.get(player.getUniqueId())) != null) { Util.sendMessage(Bukkit.getPlayer(inviteList.get(player.getUniqueId())), ChatColor.RED + plugin.myLocale(player.getUniqueId()).rejectnameHasRejectedInvite.replace("[name]", player.getName())); } // Remove this player from the global invite list inviteList.remove(player.getUniqueId()); } else { // Someone typed /island reject and had not been invited Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).rejectyouHaveNotBeenInvited); } return true; } else if (split[0].equalsIgnoreCase("leave")) { // Leave team command if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.join")) { if (player.getWorld().equals(ASkyBlock.getIslandWorld()) || (Settings.createNether && Settings.newNether && ASkyBlock.getNetherWorld() != null && player.getWorld().equals(ASkyBlock.getNetherWorld()))) { if (plugin.getPlayers().inTeam(playerUUID)) { if (plugin.getPlayers().getTeamLeader(playerUUID) != null && plugin.getPlayers().getTeamLeader(playerUUID).equals(playerUUID)) { Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).leaveerrorYouAreTheLeader); return true; } // Check for confirmation if (!leavingPlayers.contains(playerUUID)) { leavingPlayers.add(playerUUID); Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).leaveWarning); new BukkitRunnable() { @Override public void run() { // If the player is still on the list, remove them and cancel the leave if (leavingPlayers.contains(playerUUID)) { leavingPlayers.remove(playerUUID); Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).leaveCanceled); } } }.runTaskLater(plugin, Settings.resetConfirmWait * 20L); return true; } // Remove from confirmation list leavingPlayers.remove(playerUUID); // Remove from team if (!removePlayerFromTeam(playerUUID, teamLeader)) { //Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).leaveerrorYouCannotLeaveIsland); // If this is canceled, fail silently return true; } // Clear any coop inventories // CoopPlay.getInstance().returnAllInventories(player); // Remove any of the target's coop invitees and grab // their stuff CoopPlay.getInstance().clearMyInvitedCoops(player); CoopPlay.getInstance().clearMyCoops(player); // Log the location that this player left so they // cannot join again before the cool down ends plugin.getPlayers().startInviteCoolDownTimer(playerUUID, plugin.getPlayers().getTeamIslandLocation(teamLeader)); // Remove any warps plugin.getWarpSignsListener().removeWarp(playerUUID); Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).leaveyouHaveLeftTheIsland); // Tell the leader if they are online if (plugin.getServer().getPlayer(teamLeader) != null) { plugin.getServer().getPlayer(teamLeader) .sendMessage(ChatColor.RED + plugin.myLocale(teamLeader).leavenameHasLeftYourIsland.replace("[name]", player.getName())); } else { // Leave them a message plugin.getMessages().setMessage(teamLeader, ChatColor.RED + plugin.myLocale(teamLeader).leavenameHasLeftYourIsland.replace("[name]", player.getName())); } // Check if the size of the team is now 1 // teamMembers.remove(playerUUID); if (teamMembers.size() < 2) { // plugin.getLogger().info("DEBUG: Party is less than 2 - removing leader from team"); if (!removePlayerFromTeam(teamLeader, teamLeader)) { // If this is canceled, return silently. return true; } } // Clear all player variables and save plugin.resetPlayer(player); if (!player.performCommand(Settings.SPAWNCOMMAND)) { player.teleport(player.getWorld().getSpawnLocation()); } return true; } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).leaveerrorYouCannotLeaveIsland); return true; } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).leaveerrorYouMustBeInWorld); } return true; } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorNoPermission); return true; } } else if (split[0].equalsIgnoreCase("team")) { if (plugin.getPlayers().inTeam(playerUUID)) { if (teamLeader.equals(playerUUID)) { int maxSize = Settings.maxTeamSize; for (PermissionAttachmentInfo perms : player.getEffectivePermissions()) { if (perms.getPermission().startsWith(Settings.PERMPREFIX + "team.maxsize.")) { if (perms.getPermission().contains(Settings.PERMPREFIX + "team.maxsize.*")) { maxSize = Settings.maxTeamSize; break; } else { // Get the max value should there be more than one String[] spl = perms.getPermission().split(Settings.PERMPREFIX + "team.maxsize."); if (spl.length > 1) { if (!NumberUtils.isDigits(spl[1])) { plugin.getLogger().severe("Player " + player.getName() + " has permission: " + perms.getPermission() + " <-- the last part MUST be a number! Ignoring..."); } else { maxSize = Math.max(maxSize, Integer.valueOf(spl[1])); } } } } // Do some sanity checking if (maxSize < 1) { maxSize = 1; } } if (teamMembers.size() < maxSize) { Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).inviteyouCanInvite.replace("[number]", String.valueOf(maxSize - teamMembers.size()))); } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).inviteerrorYourIslandIsFull); } } Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).teamlistingMembers + ":"); // Display members in the list for (UUID m : plugin.getPlayers().getMembers(teamLeader)) { Util.sendMessage(player, ChatColor.WHITE + plugin.getPlayers().getName(m)); } } else if (inviteList.containsKey(playerUUID)) { Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).invitenameHasInvitedYou.replace("[name]", plugin.getPlayers().getName(inviteList.get(playerUUID)))); Util.sendMessage(player, ChatColor.WHITE + "/" + label + " [accept/reject]" + ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).invitetoAcceptOrReject); } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).kickerrorNoTeam); } return true; } else { // Incorrect syntax Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorUnknownCommand); return true; } /* * Commands that have two parameters */ case 2: if (split[0].equalsIgnoreCase("controlpanel") || split[0].equalsIgnoreCase("cp")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.controlpanel")) { if (split[1].equalsIgnoreCase("on")) { plugin.getPlayers().setControlPanel(playerUUID, true); } else if (split[1].equalsIgnoreCase("off")) { plugin.getPlayers().setControlPanel(playerUUID, false); } Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(playerUUID).generalSuccess); return true; } else { Util.sendMessage(player, plugin.myLocale(playerUUID).errorNoPermission); return true; } } else if (split[0].equalsIgnoreCase("warps")) { if (Settings.useWarpPanel) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.warp")) { // Step through warp table Set<UUID> warpList = plugin.getWarpSignsListener().listWarps(); if (warpList.isEmpty()) { Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).warpserrorNoWarpsYet); if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.addwarp") && plugin.getGrid().playerIsOnIsland(player)) { Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale().warpswarpTip); } return true; } else { // Try the warp panel int panelNum = 0; try { panelNum = Integer.valueOf(split[1]) - 1; } catch (Exception e) { panelNum = 0; } player.openInventory(plugin.getWarpPanel().getWarpPanel(panelNum)); return true; } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorNoPermission); } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorUnknownCommand); return true; } } else if (split[0].equalsIgnoreCase("make")) { //plugin.getLogger().info("DEBUG: /is make '" + split[1] + "' called"); if (!pendingNewIslandSelection.contains(playerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorUnknownCommand); return true; } pendingNewIslandSelection.remove(playerUUID); // Create a new island using schematic if (!schematics.containsKey(split[1])) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorUnknownCommand); return true; } else { Schematic schematic = schematics.get(split[1]); // Check perm again if (schematic.getPerm().isEmpty() || VaultHelper.checkPerm(player, schematic.getPerm())) { Island oldIsland = plugin.getGrid().getIsland(player.getUniqueId()); newIsland(player,schematic); if (resettingIsland.contains(playerUUID)) { resettingIsland.remove(playerUUID); resetPlayer(player, oldIsland); } return true; } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorNoPermission); return true; } } } else if (split[0].equalsIgnoreCase("lang")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.lang")) { if (!NumberUtils.isDigits(split[1])) { Util.sendMessage(player, ChatColor.RED + "/" + label + " lang <#>"); displayLocales(player); return true; } else { try { int index = Integer.valueOf(split[1]); if (index < 1 || index > plugin.getAvailableLocales().size()) { Util.sendMessage(player, ChatColor.RED + "/" + label + " lang <#>"); displayLocales(player); return true; } for (ASLocale locale : plugin.getAvailableLocales().values()) { if (locale.getIndex() == index) { plugin.getPlayers().setLocale(playerUUID, locale.getLocaleName()); Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(playerUUID).generalSuccess); return true; } } // Not in the list Util.sendMessage(player, ChatColor.RED + "/" + label + " lang <#>"); displayLocales(player); } catch (Exception e) { Util.sendMessage(player, ChatColor.RED + "/" + label + " lang <#>"); displayLocales(player); } } return true; } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorNoPermission); return true; } } else // Multi home if (split[0].equalsIgnoreCase("go")) { if (!plugin.getPlayers().hasIsland(playerUUID) && !plugin.getPlayers().inTeam(playerUUID)) { // Player has no island Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoIsland); return true; } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.sethome")) { int number = 1; try { number = Integer.valueOf(split[1]); //plugin.getLogger().info("DEBUG: number = " + number); if (number < 1) { plugin.getGrid().homeTeleport(player,1); } else { // Dynamic home sizes with permissions int maxHomes = Settings.maxHomes; for (PermissionAttachmentInfo perms : player.getEffectivePermissions()) { if (perms.getPermission().startsWith(Settings.PERMPREFIX + "island.maxhomes.")) { if (perms.getPermission().contains(Settings.PERMPREFIX + "island.maxhomes.*")) { maxHomes = Settings.maxHomes; break; } else { // Get the max value should there be more than one String[] spl = perms.getPermission().split(Settings.PERMPREFIX + "island.maxhomes."); if (spl.length > 1) { if (!NumberUtils.isDigits(spl[1])) { plugin.getLogger().severe("Player " + player.getName() + " has permission: " + perms.getPermission() + " <-- the last part MUST be a number! Ignoring..."); } else { maxHomes = Math.max(maxHomes, Integer.valueOf(spl[1])); } } } } // Do some sanity checking if (maxHomes < 1) { maxHomes = 1; } } if (number > maxHomes) { if (maxHomes > 1) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).setHomeerrorNumHomes.replace("[max]",String.valueOf(maxHomes))); } else { plugin.getGrid().homeTeleport(player,1); } } else { // Teleport home plugin.getGrid().homeTeleport(player,number); } } } catch (Exception e) { // Teleport home plugin.getGrid().homeTeleport(player,1); } if (Settings.islandRemoveMobs) { plugin.getGrid().removeMobs(player.getLocation()); } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); } return true; } else if (split[0].equalsIgnoreCase("sethome")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.sethome")) { Island island = plugin.getGrid().getIsland(playerUUID); if (island == null) { // plugin.getLogger().info("DEBUG: player has no island in grid"); // Player has no island in the grid Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoIsland); return true; } // Dynamic home sizes with permissions int maxHomes = Settings.maxHomes; for (PermissionAttachmentInfo perms : player.getEffectivePermissions()) { if (perms.getPermission().startsWith(Settings.PERMPREFIX + "island.maxhomes.")) { // Get the max value should there be more than one if (perms.getPermission().contains(Settings.PERMPREFIX + "island.maxhomes.*")) { maxHomes = Settings.maxHomes; break; } else { String[] spl = perms.getPermission().split(Settings.PERMPREFIX + "island.maxhomes."); if (spl.length > 1) { if (!NumberUtils.isDigits(spl[1])) { plugin.getLogger().severe("Player " + player.getName() + " has permission: " + perms.getPermission() + " <-- the last part MUST be a number! Ignoring..."); } else { maxHomes = Math.max(maxHomes, Integer.valueOf(spl[1])); } } } } // Do some sanity checking if (maxHomes < 1) { maxHomes = 1; } } if (maxHomes > 1) { // Check the number given is a number int number = 0; try { number = Integer.valueOf(split[1]); if (number < 1 || number > maxHomes) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).setHomeerrorNumHomes.replace("[max]",String.valueOf(maxHomes))); } else { plugin.getGrid().homeSet(player, number); } } catch (Exception e) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).setHomeerrorNumHomes.replace("[max]",String.valueOf(maxHomes))); } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); } return true; } Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } else if (split[0].equalsIgnoreCase("warp")) { // Warp somewhere command if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.warp")) { final Set<UUID> warpList = plugin.getWarpSignsListener().listWarps(); if (warpList.isEmpty()) { Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).warpserrorNoWarpsYet); if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.addwarp")) { Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale().warpswarpTip); } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); } return true; } else { // Check if this is part of a name UUID foundWarp = null; for (UUID warp : warpList) { if (warp == null) continue; if (plugin.getPlayers().getName(warp).toLowerCase().equals(split[1].toLowerCase())) { foundWarp = warp; break; } else if (plugin.getPlayers().getName(warp).toLowerCase().startsWith(split[1].toLowerCase())) { foundWarp = warp; } } if (foundWarp == null) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).warpserrorDoesNotExist); return true; } else { // Warp exists! final Location warpSpot = plugin.getWarpSignsListener().getWarp(foundWarp); // Check if the warp spot is safe if (warpSpot == null) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).warpserrorNotReadyYet); plugin.getLogger().warning("Null warp found, owned by " + plugin.getPlayers().getName(foundWarp)); return true; } // Find out if island is locked Island island = plugin.getGrid().getIslandAt(warpSpot); // Check bans if (island != null && plugin.getPlayers().isBanned(island.getOwner(), playerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).banBanned.replace("[name]", plugin.getPlayers().getName(island.getOwner()))); if (!VaultHelper.checkPerm(player, Settings.PERMPREFIX + "mod.bypassprotect") && !VaultHelper.checkPerm(player, Settings.PERMPREFIX + "mod.bypasslock")) { return true; } } if (island != null && island.isLocked() && !player.isOp() && !VaultHelper.checkPerm(player, Settings.PERMPREFIX + "mod.bypasslock") && !VaultHelper.checkPerm(player, Settings.PERMPREFIX + "mod.bypassprotect")) { // Always inform that the island is locked Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).lockIslandLocked); // Check if this is the owner, team member or coop if (!plugin.getGrid().locationIsAtHome(player, true, warpSpot)) { //plugin.getLogger().info("DEBUG: not at home"); return true; } } boolean pvp = false; if ((warpSpot.getWorld().equals(ASkyBlock.getIslandWorld()) && island.getIgsFlag(SettingsFlag.PVP)) || (warpSpot.getWorld().equals(ASkyBlock.getNetherWorld()) && island.getIgsFlag(SettingsFlag.NETHER_PVP))) { pvp = true; } // Find out which direction the warp is facing Block b = warpSpot.getBlock(); if (b.getType().equals(Material.SIGN_POST) || b.getType().equals(Material.WALL_SIGN)) { Sign sign = (Sign) b.getState(); org.bukkit.material.Sign s = (org.bukkit.material.Sign) sign.getData(); BlockFace directionFacing = s.getFacing(); Location inFront = b.getRelative(directionFacing).getLocation(); Location oneDown = b.getRelative(directionFacing).getRelative(BlockFace.DOWN).getLocation(); if ((GridManager.isSafeLocation(inFront))) { warpPlayer(player, inFront, foundWarp, directionFacing, pvp); return true; } else if (b.getType().equals(Material.WALL_SIGN) && GridManager.isSafeLocation(oneDown)) { // Try one block down if this is a wall sign warpPlayer(player, oneDown, foundWarp, directionFacing, pvp); return true; } } else { // Warp has been removed Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).warpserrorDoesNotExist); plugin.getWarpSignsListener().removeWarp(warpSpot); return true; } if (!(GridManager.isSafeLocation(warpSpot))) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).warpserrorNotSafe); // WALL_SIGN's will always be unsafe if the place in front is obscured. if (b.getType().equals(Material.SIGN_POST)) { plugin.getLogger().warning( "Unsafe warp found at " + warpSpot.toString() + " owned by " + plugin.getPlayers().getName(foundWarp)); } return true; } else { final Location actualWarp = new Location(warpSpot.getWorld(), warpSpot.getBlockX() + 0.5D, warpSpot.getBlockY(), warpSpot.getBlockZ() + 0.5D); player.teleport(actualWarp); if (pvp) { Util.sendMessage(player, ChatColor.BOLD + "" + ChatColor.RED + plugin.myLocale(player.getUniqueId()).igs.get(SettingsFlag.PVP) + " " + plugin.myLocale(player.getUniqueId()).igsAllowed); if (plugin.getServer().getVersion().contains("(MC: 1.8") || plugin.getServer().getVersion().contains("(MC: 1.7")) { player.getWorld().playSound(player.getLocation(), Sound.valueOf("ARROW_HIT"), 1F, 1F); } else { player.getWorld().playSound(player.getLocation(), Sound.ENTITY_ARROW_HIT, 1F, 1F); } } else { if (plugin.getServer().getVersion().contains("(MC: 1.8") || plugin.getServer().getVersion().contains("(MC: 1.7")) { player.getWorld().playSound(player.getLocation(), Sound.valueOf("BAT_TAKEOFF"), 1F, 1F); } else { player.getWorld().playSound(player.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 1F, 1F); } } return true; } } } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } } else if (split[0].equalsIgnoreCase("level")) { // island level <name> command if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.info")) { // Find out if the target has an island final UUID targetPlayerUUID = plugin.getPlayers().getUUID(split[1]); // Invited player must be known if (targetPlayerUUID == null) { // plugin.getLogger().info("DEBUG: unknown player"); Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorUnknownPlayer); return true; } // Check if this player has an island or not if (plugin.getPlayers().hasIsland(targetPlayerUUID) || plugin.getPlayers().inTeam(targetPlayerUUID)) { calculateIslandLevel(player, targetPlayerUUID); } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoIslandOther); } return true; } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } } else if (split[0].equalsIgnoreCase("invite")) { // Team invite a player command if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.create")) { // Only online players can be invited Player invitedPlayer = plugin.getServer().getPlayer(split[1]); if (invitedPlayer == null) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorOfflinePlayer); return true; } UUID invitedPlayerUUID = invitedPlayer.getUniqueId(); // Player issuing the command must have an island if (!plugin.getPlayers().hasIsland(player.getUniqueId())) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).inviteerrorYouMustHaveIslandToInvite); return true; } // Player cannot invite themselves if (player.getName().equalsIgnoreCase(split[1])) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).inviteerrorYouCannotInviteYourself); return true; } // Check if this player can be invited to this island, or // whether they are still on cooldown long time = plugin.getPlayers().getInviteCoolDownTime(invitedPlayerUUID, plugin.getPlayers().getIslandLocation(playerUUID)); if (time > 0 && !player.isOp()) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).inviteerrorCoolDown.replace("[time]", String.valueOf(time))); return true; } // If the player already has a team then check that they are // the leader, etc if (plugin.getPlayers().inTeam(player.getUniqueId())) { // Leader? if (teamLeader.equals(player.getUniqueId())) { // Invited player is free and not in a team if (!plugin.getPlayers().inTeam(invitedPlayerUUID)) { // Player has space in their team int maxSize = Settings.maxTeamSize; // Dynamic team sizes with permissions for (PermissionAttachmentInfo perms : player.getEffectivePermissions()) { if (perms.getPermission().startsWith(Settings.PERMPREFIX + "team.maxsize.")) { if (perms.getPermission().contains(Settings.PERMPREFIX + "team.maxsize.*")) { maxSize = Settings.maxTeamSize; break; } else { // Get the max value should there be more than one String[] spl = perms.getPermission().split(Settings.PERMPREFIX + "team.maxsize."); if (spl.length > 1) { if (!NumberUtils.isDigits(spl[1])) { plugin.getLogger().severe("Player " + player.getName() + " has permission: " + perms.getPermission() + " <-- the last part MUST be a number! Ignoring..."); } else { maxSize = Math.max(maxSize, Integer.valueOf(spl[1])); } } } } // Do some sanity checking if (maxSize < 1) { maxSize = 1; } } if (teamMembers.size() < maxSize) { // If that player already has an invite out // then retract it. // Players can only have one invite out at a // time - interesting if (inviteList.containsValue(playerUUID)) { inviteList.remove(getKeyByValue(inviteList, player.getUniqueId())); Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).inviteremovingInvite); } // Put the invited player (key) onto the // list with inviter (value) // If someone else has invited a player, // then this invite will overwrite the // previous invite! inviteList.put(invitedPlayerUUID, player.getUniqueId()); Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).inviteinviteSentTo.replace("[name]", split[1])); // Send message to online player Util.sendMessage(Bukkit.getPlayer(invitedPlayerUUID), plugin.myLocale(invitedPlayerUUID).invitenameHasInvitedYou.replace("[name]", player.getName())); Util.sendMessage(Bukkit.getPlayer(invitedPlayerUUID), ChatColor.WHITE + "/" + label + " [accept/reject]" + ChatColor.YELLOW + " " + plugin.myLocale(invitedPlayerUUID).invitetoAcceptOrReject); if (plugin.getPlayers().hasIsland(invitedPlayerUUID)) { Util.sendMessage(Bukkit.getPlayer(invitedPlayerUUID), ChatColor.RED + plugin.myLocale(invitedPlayerUUID).invitewarningYouWillLoseIsland); } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).inviteerrorYourIslandIsFull); } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).inviteerrorThatPlayerIsAlreadyInATeam); } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).inviteerrorYouMustHaveIslandToInvite); } } else { // First-time invite player does not have a team // Check if invitee is in a team or not if (!plugin.getPlayers().inTeam(invitedPlayerUUID)) { // If the inviter already has an invite out, remove // it if (inviteList.containsValue(playerUUID)) { inviteList.remove(getKeyByValue(inviteList, player.getUniqueId())); Util.sendMessage(player, ChatColor.YELLOW + plugin.myLocale(player.getUniqueId()).inviteremovingInvite); } // Place the player and invitee on the invite list inviteList.put(invitedPlayerUUID, player.getUniqueId()); Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).inviteinviteSentTo.replace("[name]", split[1])); Util.sendMessage(Bukkit.getPlayer(invitedPlayerUUID), plugin.myLocale(invitedPlayerUUID).invitenameHasInvitedYou.replace("[name]", player.getName())); Util.sendMessage(Bukkit.getPlayer(invitedPlayerUUID), ChatColor.WHITE + "/" + label + " [accept/reject]" + ChatColor.YELLOW + " " + plugin.myLocale(invitedPlayerUUID).invitetoAcceptOrReject); // Check if the player has an island and warn // accordingly // plugin.getLogger().info("DEBUG: invited player = " // + invitedPlayerUUID.toString()); if (plugin.getPlayers().hasIsland(invitedPlayerUUID)) { // plugin.getLogger().info("DEBUG: invited player has island"); Util.sendMessage(Bukkit.getPlayer(invitedPlayerUUID), ChatColor.RED + plugin.myLocale(invitedPlayerUUID).invitewarningYouWillLoseIsland); } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).inviteerrorThatPlayerIsAlreadyInATeam); } } return true; } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } } else if (split[0].equalsIgnoreCase("coop")) { // Give a player coop privileges if (!VaultHelper.checkPerm(player, Settings.PERMPREFIX + "coop")) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } // Only online players can be cooped Player target = plugin.getServer().getPlayer(split[1]); if (target == null) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorOfflinePlayer); return true; } UUID targetPlayerUUID = target.getUniqueId(); // Player issuing the command must have an island if (!plugin.getPlayers().hasIsland(playerUUID) && !plugin.getPlayers().inTeam(playerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).inviteerrorYouMustHaveIslandToInvite); return true; } // Player cannot invite themselves if (playerUUID.equals(targetPlayerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).inviteerrorYouCannotInviteYourself); return true; } // If target player is already on the team ignore if (plugin.getPlayers().getMembers(playerUUID).contains(targetPlayerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).coopOnYourTeam); return true; } // Target has to have an island if (!plugin.getPlayers().inTeam(targetPlayerUUID)) { if (!plugin.getPlayers().hasIsland(targetPlayerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoIslandOther); return true; } } // Add target to coop list if (CoopPlay.getInstance().addCoopPlayer(player, target)) { // Tell everyone what happened Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).coopSuccess.replace("[name]", target.getName())); target.sendMessage(ChatColor.GREEN + plugin.myLocale(targetPlayerUUID).coopMadeYouCoop.replace("[name]", player.getName())); // TODO: Give perms if the player is on the coop island } // else fail silently return true; } else if (split[0].equalsIgnoreCase("expel")) { if (!VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.expel")) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } // Find out who they want to expel UUID targetPlayerUUID = plugin.getPlayers().getUUID(split[1]); if (targetPlayerUUID == null) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorUnknownPlayer); return true; } // Target should not be themselves if (targetPlayerUUID.equals(playerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).expelNotYourself); return true; } // Target cannot be op Player target = plugin.getServer().getPlayer(targetPlayerUUID); if (target != null) { if (target.isOp() || VaultHelper.checkPerm(target, Settings.PERMPREFIX + "mod.bypassprotect") || VaultHelper.checkPerm(target, Settings.PERMPREFIX + "mod.bypassexpel")) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).expelFail.replace("[name]", target.getName())); return true; } } // Remove them from the coop list boolean coop = CoopPlay.getInstance().removeCoopPlayer(player, targetPlayerUUID); if (coop) { if (target != null) { target.sendMessage(ChatColor.RED + plugin.myLocale(target.getUniqueId()).coopRemoved.replace("[name]", player.getName())); } else { plugin.getMessages().setMessage(targetPlayerUUID, ChatColor.RED + plugin.myLocale(targetPlayerUUID).coopRemoved.replace("[name]", player.getName())); } Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).coopRemoveSuccess.replace("[name]", plugin.getPlayers().getName(targetPlayerUUID))); } // See if target is on this player's island if (target != null && plugin.getGrid().isOnIsland(player, target)) { // Check to see if this player has an island or is just // helping out if (plugin.getPlayers().inTeam(targetPlayerUUID) || plugin.getPlayers().hasIsland(targetPlayerUUID)) { plugin.getGrid().homeTeleport(target); } else { // Just move target to spawn if (!target.performCommand(Settings.SPAWNCOMMAND)) { target.teleport(player.getWorld().getSpawnLocation()); /* * target.sendBlockChange(target.getWorld(). * getSpawnLocation() * ,target.getWorld().getSpawnLocation().getBlock(). * getType() * ,target.getWorld().getSpawnLocation().getBlock(). * getData()); */ } } target.sendMessage(ChatColor.RED + plugin.myLocale(target.getUniqueId()).expelExpelled); plugin.getLogger().info(player.getName() + " expelled " + target.getName() + " from their island."); // Yes they are Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).expelSuccess.replace("[name]", target.getName())); } else if (!coop) { // No they're not Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).expelNotOnIsland); } return true; } else if (split[0].equalsIgnoreCase("uncoop")) { if (!VaultHelper.checkPerm(player, Settings.PERMPREFIX + "coop")) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } // Find out who they want to uncoop UUID targetPlayerUUID = plugin.getPlayers().getUUID(split[1]); if (targetPlayerUUID == null) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorUnknownPlayer); return true; } // Target should not be themselves if (targetPlayerUUID.equals(playerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).expelNotYourself); return true; } OfflinePlayer target = plugin.getServer().getOfflinePlayer(targetPlayerUUID); // Remove them from the coop list boolean coop = CoopPlay.getInstance().removeCoopPlayer(player, targetPlayerUUID); if (coop) { if (target != null && target.isOnline()) { Util.sendMessage(target.getPlayer(), ChatColor.RED + plugin.myLocale(target.getUniqueId()).coopRemoved.replace("[name]", player.getName())); } else { plugin.getMessages().setMessage(targetPlayerUUID, ChatColor.RED + plugin.myLocale(targetPlayerUUID).coopRemoved.replace("[name]", player.getName())); } Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).coopRemoveSuccess.replace("[name]", plugin.getPlayers().getName(targetPlayerUUID))); } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).coopNotInCoop.replace("[name]", plugin.getPlayers().getName(targetPlayerUUID))); } return true; } else if (split[0].equalsIgnoreCase("ban")) { if (!VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.ban")) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } // Find out who they want to ban final UUID targetPlayerUUID = plugin.getPlayers().getUUID(split[1]); // Player must be known if (targetPlayerUUID == null) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorUnknownPlayer); return true; } // Target should not be themselves if (targetPlayerUUID.equals(playerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).banNotYourself); return true; } // Target cannot be on the same team if (plugin.getPlayers().inTeam(playerUUID) && plugin.getPlayers().inTeam(targetPlayerUUID)) { if (plugin.getPlayers().getTeamLeader(playerUUID).equals(plugin.getPlayers().getTeamLeader(targetPlayerUUID))) { // Same team! Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).banNotTeamMember); return true; } } // Check that the player is not banned already if (plugin.getPlayers().isBanned(playerUUID, targetPlayerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).banAlreadyBanned.replace("[name]", split[1])); return true; } // Check online/offline status Player target = plugin.getServer().getPlayer(targetPlayerUUID); // Get offline player OfflinePlayer offlineTarget = plugin.getServer().getOfflinePlayer(targetPlayerUUID); // Target cannot be op if (offlineTarget.isOp()) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).banFail.replace("[name]", split[1])); return true; } if (target != null) { // Do not ban players with the mod.noban permission if (VaultHelper.checkPerm(target, Settings.PERMPREFIX + "admin.noban")) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).banFail.replace("[name]", split[1])); return true; } // Remove them from the coop list boolean coop = CoopPlay.getInstance().removeCoopPlayer(player, target); if (coop) { target.sendMessage(ChatColor.RED + plugin.myLocale(target.getUniqueId()).coopRemoved.replace("[name]", player.getName())); Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).coopRemoveSuccess.replace("[name]", target.getName())); } // See if target is on this player's island and if so send them away if (plugin.getGrid().isOnIsland(player, target)) { // Check to see if this player has an island or is just // helping out if (plugin.getPlayers().inTeam(targetPlayerUUID) || plugin.getPlayers().hasIsland(targetPlayerUUID)) { plugin.getGrid().homeTeleport(target); } else { // Just move target to spawn if (!target.performCommand(Settings.SPAWNCOMMAND)) { target.teleport(player.getWorld().getSpawnLocation()); } } } // Notifications // Target target.sendMessage(ChatColor.RED + plugin.myLocale(targetPlayerUUID).banBanned.replace("[name]", player.getName())); } else { // Offline notification plugin.getMessages().setMessage(targetPlayerUUID, ChatColor.RED + plugin.myLocale(targetPlayerUUID).banBanned.replace("[name]", player.getName())); } // Console plugin.getLogger().info(player.getName() + " banned " + split[1] + " from their island."); // Player Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).banSuccess.replace("[name]", split[1])); // Tell team plugin.getMessages().tellTeam(playerUUID, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).banSuccess.replace("[name]", split[1])); plugin.getMessages().tellOfflineTeam(playerUUID, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).banSuccess.replace("[name]", split[1])); // Ban the sucker plugin.getPlayers().ban(playerUUID, targetPlayerUUID); plugin.getGrid().saveGrid(); return true; } else if (split[0].equalsIgnoreCase("unban")) { if (!VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.ban")) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } // Find out who they want to unban final UUID targetPlayerUUID = plugin.getPlayers().getUUID(split[1]); // Player must be known if (targetPlayerUUID == null) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorUnknownPlayer); return true; } // Target should not be themselves if (targetPlayerUUID.equals(playerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).banNotYourself); return true; } // Check that the player is actually banned if (!plugin.getPlayers().isBanned(playerUUID, targetPlayerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).banNotBanned.replace("[name]", split[1])); return true; } // Notifications // Online check Player target = plugin.getServer().getPlayer(targetPlayerUUID); // Target if (target != null) { // Online target.sendMessage(ChatColor.RED + plugin.myLocale(target.getUniqueId()).banLifted.replace("[name]", player.getName())); } else { plugin.getMessages().setMessage(targetPlayerUUID, ChatColor.GREEN + plugin.myLocale(targetPlayerUUID).banLifted.replace("[name]", player.getName())); } //OfflinePlayer offlineTarget = plugin.getServer().getOfflinePlayer(targetPlayerUUID); // Player Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).banLiftedSuccess.replace("[name]", split[1])); // Console plugin.getLogger().info(player.getName() + " unbanned " + split[1] + " from their island."); // Tell team plugin.getMessages().tellTeam(playerUUID, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).banLiftedSuccess.replace("[name]", split[1])); plugin.getMessages().tellOfflineTeam(playerUUID, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).banLiftedSuccess.replace("[name]", split[1])); // Unban the redeemed one plugin.getPlayers().unBan(playerUUID, targetPlayerUUID); plugin.getGrid().saveGrid(); return true; } else if (split[0].equalsIgnoreCase("kick") || split[0].equalsIgnoreCase("remove")) { // PlayerIsland remove command with a player name, or island kick // command if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.kick")) { if (!plugin.getPlayers().inTeam(playerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).kickerrorNoTeam); return true; } // Only leaders can kick if (teamLeader != null && !teamLeader.equals(playerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).kickerrorOnlyLeaderCan); return true; } // The main thing to do is check if the player name to kick // is in the list of players in the team. targetPlayer = null; for (UUID member : teamMembers) { if (plugin.getPlayers().getName(member).equalsIgnoreCase(split[1])) { targetPlayer = member; } } if (targetPlayer == null) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).kickerrorNotPartOfTeam); return true; } if (teamMembers.contains(targetPlayer)) { // If the player leader tries to kick or remove // themselves if (player.getUniqueId().equals(targetPlayer)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).leaveerrorLeadersCannotLeave); return true; } // Try to kick player if (!removePlayerFromTeam(targetPlayer, teamLeader)) { //Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).leaveerrorYouCannotLeaveIsland); // If this is canceled, fail silently return true; } // Log the location that this player left so they // cannot join again before the cool down ends plugin.getPlayers().startInviteCoolDownTimer(targetPlayer, plugin.getPlayers().getIslandLocation(playerUUID)); if (Settings.resetChallenges) { // Reset the player's challenge status plugin.getPlayers().resetAllChallenges(targetPlayer, false); } // Reset the island level plugin.getPlayers().setIslandLevel(targetPlayer, 0); TopTen.topTenAddEntry(playerUUID, 0); // If target is online Player target = plugin.getServer().getPlayer(targetPlayer); if (target != null) { // plugin.getLogger().info("DEBUG: player is online"); target.sendMessage(ChatColor.RED + plugin.myLocale(targetPlayer).kicknameRemovedYou.replace("[name]", player.getName())); // Clear any coop inventories // CoopPlay.getInstance().returnAllInventories(target); // Remove any of the target's coop invitees and // anyone they invited CoopPlay.getInstance().clearMyInvitedCoops(target); CoopPlay.getInstance().clearMyCoops(target); // Clear the player out and throw their stuff at the // leader if (target.getWorld().equals(ASkyBlock.getIslandWorld())) { if (!Settings.kickedKeepInv) { for (ItemStack i : target.getInventory().getContents()) { if (i != null) { try { // Fire an event to see if this item should be dropped or not // Some plugins may not want items to be dropped Item drop = player.getWorld().dropItemNaturally(player.getLocation(), i); PlayerDropItemEvent event = new PlayerDropItemEvent(target, drop); plugin.getServer().getPluginManager().callEvent(event); } catch (Exception e) { } } } // plugin.resetPlayer(target); <- no good if // reset inventory is false // Clear their inventory and equipment and set // them as survival target.getInventory().clear(); // Javadocs are // wrong - this // does not // clear armor slots! So... // plugin.getLogger().info("DEBUG: Clearing kicked player's inventory"); target.getInventory().setArmorContents(null); target.getInventory().setHelmet(null); target.getInventory().setChestplate(null); target.getInventory().setLeggings(null); target.getInventory().setBoots(null); target.getEquipment().clear(); // Update the inventory target.updateInventory(); } } if (!target.performCommand(Settings.SPAWNCOMMAND)) { target.teleport(ASkyBlock.getIslandWorld().getSpawnLocation()); } } else { // Offline if (DEBUG) plugin.getLogger().info("DEBUG: player is offline "+ targetPlayer.toString()); // Tell offline player they were kicked plugin.getMessages().setMessage(targetPlayer, ChatColor.RED + plugin.myLocale(player.getUniqueId()).kicknameRemovedYou.replace("[name]", player.getName())); } // Remove any warps plugin.getWarpSignsListener().removeWarp(targetPlayer); // Tell leader they removed the player Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).kicknameRemoved.replace("[name]", split[1])); //removePlayerFromTeam(targetPlayer, teamLeader); teamMembers.remove(targetPlayer); if (teamMembers.size() < 2) { if (!removePlayerFromTeam(player.getUniqueId(), teamLeader)) { // If cancelled, return silently return true; } } plugin.getPlayers().save(targetPlayer); } else { plugin.getLogger().warning("Player " + player.getName() + " failed to remove " + plugin.getPlayers().getName(targetPlayer)); Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).kickerrorNotPartOfTeam); } return true; } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } } else if (split[0].equalsIgnoreCase("makeleader")) { if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.makeleader")) { targetPlayer = plugin.getPlayers().getUUID(split[1]); if (targetPlayer == null) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorUnknownPlayer); return true; } if (targetPlayer.equals(playerUUID)) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).makeLeadererrorGeneralError); return true; } if (!plugin.getPlayers().inTeam(player.getUniqueId())) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).makeLeadererrorYouMustBeInTeam); return true; } if (plugin.getPlayers().getMembers(player.getUniqueId()).size() > 2) { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).makeLeadererrorRemoveAllPlayersFirst); plugin.getLogger().info(player.getName() + " tried to transfer his island, but failed because >2 people in a team"); return true; } if (plugin.getPlayers().inTeam(player.getUniqueId())) { if (teamLeader.equals(player.getUniqueId())) { if (teamMembers.contains(targetPlayer)) { // targetPlayer is the new leader // plugin.getLogger().info("DEBUG: " + // plugin.getPlayers().getIslandLevel(teamLeader)); // Remove the target player from the team if (!removePlayerFromTeam(targetPlayer, teamLeader, true)) { // If cancelled, return silently return true; } // Remove the leader from the team if (!removePlayerFromTeam(teamLeader, teamLeader, true)) { // If cancelled, return silently return true; } Util.sendMessage(player, ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).makeLeadernameIsNowTheOwner.replace("[name]", plugin.getPlayers().getName(targetPlayer))); // plugin.getLogger().info("DEBUG: " + // plugin.getPlayers().getIslandLevel(teamLeader)); // Transfer the data from the old leader to the // new one plugin.getGrid().transferIsland(player.getUniqueId(), targetPlayer); // Create a new team with addPlayertoTeam(player.getUniqueId(), targetPlayer); addPlayertoTeam(targetPlayer, targetPlayer); // Check if online Player target = plugin.getServer().getPlayer(targetPlayer); if (target == null) { plugin.getMessages().setMessage(targetPlayer, plugin.myLocale(player.getUniqueId()).makeLeaderyouAreNowTheOwner); } else { // Online Util.sendMessage(plugin.getServer().getPlayer(targetPlayer), ChatColor.GREEN + plugin.myLocale(targetPlayer).makeLeaderyouAreNowTheOwner); // Check if new leader has a lower range permission than the island size boolean hasARangePerm = false; int range = Settings.islandProtectionRange; // Check for zero protection range Island islandByOwner = plugin.getGrid().getIsland(targetPlayer); if (islandByOwner.getProtectionSize() == 0) { plugin.getLogger().warning("Player " + player.getName() + "'s island had a protection range of 0. Setting to default " + range); islandByOwner.setProtectionSize(range); } for (PermissionAttachmentInfo perms : target.getEffectivePermissions()) { if (perms.getPermission().startsWith(Settings.PERMPREFIX + "island.range.")) { if (perms.getPermission().contains(Settings.PERMPREFIX + "island.range.*")) { // Ignore break; } else { String[] spl = perms.getPermission().split(Settings.PERMPREFIX + "island.range."); if (spl.length > 1) { if (!NumberUtils.isDigits(spl[1])) { plugin.getLogger().severe("Player " + player.getName() + " has permission: " + perms.getPermission() + " <-- the last part MUST be a number! Ignoring..."); } else { hasARangePerm = true; range = Math.max(range, Integer.valueOf(spl[1])); } } } } } // Only set the island range if the player has a perm to override the default if (hasARangePerm) { // Do some sanity checking if (range % 2 != 0) { range--; } // Get island range // Range can go up or down if (range != islandByOwner.getProtectionSize()) { Util.sendMessage(player, ChatColor.GOLD + plugin.myLocale(targetPlayer).adminSetRangeUpdated.replace("[number]", String.valueOf(range))); target.sendMessage(ChatColor.GOLD + plugin.myLocale(targetPlayer).adminSetRangeUpdated.replace("[number]", String.valueOf(range))); plugin.getLogger().info( "Makeleader: Island protection range changed from " + islandByOwner.getProtectionSize() + " to " + range + " for " + player.getName() + " due to permission."); } islandByOwner.setProtectionSize(range); } } plugin.getGrid().saveGrid(); return true; } Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).makeLeadererrorThatPlayerIsNotInTeam); } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).makeLeadererrorNotYourIsland); } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).makeLeadererrorGeneralError); } return true; } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission); return true; } } else { Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorUnknownCommand); return true; } break; } Util.sendMessage(player, ChatColor.RED + plugin.myLocale(playerUUID).errorUnknownCommand); return true; } /** * Shows available languages to the player * @param player */ private void displayLocales(Player player) { TreeMap<Integer,String> langs = new TreeMap<Integer,String>(); for (ASLocale locale : plugin.getAvailableLocales().values()) { if (!locale.getLocaleName().equalsIgnoreCase("locale")) { langs.put(locale.getIndex(), locale.getLanguageName() + " (" + locale.getCountryName() + ")"); } } for (Entry<Integer, String> entry: langs.entrySet()) { Util.sendMessage(player, entry.getKey() + ": " + entry.getValue()); } } /** * Warps a player to a spot in front of a sign * @param player * @param inFront * @param foundWarp * @param directionFacing */ private void warpPlayer(Player player, Location inFront, UUID foundWarp, BlockFace directionFacing, boolean pvp) { // convert blockface to angle float yaw = Util.blockFaceToFloat(directionFacing); final Location actualWarp = new Location(inFront.getWorld(), inFront.getBlockX() + 0.5D, inFront.getBlockY(), inFront.getBlockZ() + 0.5D, yaw, 30F); player.teleport(actualWarp); if (pvp) { Util.sendMessage(player, ChatColor.BOLD + "" + ChatColor.RED + plugin.myLocale(player.getUniqueId()).igs.get(SettingsFlag.PVP) + " " + plugin.myLocale(player.getUniqueId()).igsAllowed); if (plugin.getServer().getVersion().contains("(MC: 1.8") || plugin.getServer().getVersion().contains("(MC: 1.7")) { player.getWorld().playSound(player.getLocation(), Sound.valueOf("ARROW_HIT"), 1F, 1F); } else { player.getWorld().playSound(player.getLocation(), Sound.ENTITY_ARROW_HIT, 1F, 1F); } } else { if (plugin.getServer().getVersion().contains("(MC: 1.8") || plugin.getServer().getVersion().contains("(MC: 1.7")) { player.getWorld().playSound(player.getLocation(), Sound.valueOf("BAT_TAKEOFF"), 1F, 1F); } else { player.getWorld().playSound(player.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 1F, 1F); } } Player warpOwner = plugin.getServer().getPlayer(foundWarp); if (warpOwner != null && !warpOwner.equals(player)) { warpOwner.sendMessage(plugin.myLocale(foundWarp).warpsPlayerWarped.replace("[name]", player.getName())); } } /** * Only run when a new island is created for the first time * @param player */ private void chooseIsland(Player player) { // Get the schematics that this player is eligible to use List<Schematic> schems = getSchematics(player, false); //plugin.getLogger().info("DEBUG: size of schematics for this player = " + schems.size()); if (schems.isEmpty()) { // No schematics - use default island newIsland(player); } else if (schems.size() == 1) { // Hobson's choice newIsland(player,schems.get(0)); } else { // A panel can only be shown if there is >1 viable schematic if (Settings.useSchematicPanel) { pendingNewIslandSelection.add(player.getUniqueId()); Inventory inv = plugin.getSchematicsPanel().getPanel(player); if (inv != null) { player.openInventory(inv); } else { plugin.getLogger().severe("There are no valid schematics available for " + player.getName() + "! Check config.yml schematicsection."); } } else { // No panel // Check schematics for specific permission schems = getSchematics(player,true); if (schems.isEmpty()) { newIsland(player); } else if (Settings.chooseIslandRandomly) { // Choose an island randomly from the list newIsland(player, schems.get(random.nextInt(schems.size()))); } else { // Do the first one in the list newIsland(player, schems.get(0)); } } } } private void resetPlayer(Player player, Island oldIsland) { // Deduct the reset plugin.getPlayers().setResetsLeft(player.getUniqueId(), plugin.getPlayers().getResetsLeft(player.getUniqueId()) - 1); // Reset deaths if (Settings.islandResetDeathReset) { plugin.getPlayers().setDeaths(player.getUniqueId(), 0); } // Clear any coop inventories // CoopPlay.getInstance().returnAllInventories(player); // Remove any coop invitees and grab their stuff CoopPlay.getInstance().clearMyInvitedCoops(player); CoopPlay.getInstance().clearMyCoops(player); //plugin.getLogger().info("DEBUG Reset command issued!"); // Remove any warps plugin.getWarpSignsListener().removeWarp(player.getUniqueId()); // Delete the old island, if it exists if (oldIsland != null) { // Remove any coops CoopPlay.getInstance().clearAllIslandCoops(oldIsland.getCenter()); plugin.getGrid().removePlayersFromIsland(oldIsland, player.getUniqueId()); //plugin.getLogger().info("DEBUG Deleting old island"); new DeleteIslandChunk(plugin, oldIsland); //new DeleteIslandByBlock(plugin, oldIsland); // Fire event final IslandResetEvent event = new IslandResetEvent(player, oldIsland.getCenter()); plugin.getServer().getPluginManager().callEvent(event); } else { //plugin.getLogger().info("DEBUG oldisland = null!"); } // Run any commands that need to be run at reset // Ignore commands with this perm if (!player.hasPermission(Settings.PERMPREFIX + "command.resetexempt")) { runCommands(Settings.resetCommands, player); } plugin.getGrid().saveGrid(); } /** * Runs commands when a player resets or leaves a team, etc. * Can be run for offline players * * @param commands * @param offlinePlayer */ public static void runCommands(List<String> commands, OfflinePlayer offlinePlayer) { // Run commands for (String cmd : commands) { if (cmd.startsWith("[SELF]")) { cmd = cmd.substring(6,cmd.length()).replace("[player]", offlinePlayer.getName()).trim(); if (offlinePlayer.isOnline()) { try { Bukkit.getLogger().info("Running command '" + cmd + "' as " + offlinePlayer.getName()); ((Player)offlinePlayer).performCommand(cmd); } catch (Exception e) { Bukkit.getLogger().severe("Problem executing island command executed by player - skipping!"); Bukkit.getLogger().severe("Command was : " + cmd); Bukkit.getLogger().severe("Error was: " + e.getMessage()); e.printStackTrace(); } } continue; } // Substitute in any references to player try { //plugin.getLogger().info("Running command " + cmd + " as console."); if (!Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), cmd.replace("[player]", offlinePlayer.getName()))) { Bukkit.getLogger().severe("Problem executing island command - skipping!"); Bukkit.getLogger().severe("Command was : " + cmd); } } catch (Exception e) { Bukkit.getLogger().severe("Problem executing island command - skipping!"); Bukkit.getLogger().severe("Command was : " + cmd); Bukkit.getLogger().severe("Error was: " + e.getMessage()); e.printStackTrace(); } } } /** * Check time out for island restarting * * @param player * @return true if the timeout is over */ public boolean onRestartWaitTime(final Player player) { if (resetWaitTime.containsKey(player.getUniqueId())) { if (resetWaitTime.get(player.getUniqueId()).longValue() > Calendar.getInstance().getTimeInMillis()) { return true; } return false; } return false; } public boolean onLevelWaitTime(final Player player) { if (levelWaitTime.containsKey(player.getUniqueId())) { if (levelWaitTime.get(player.getUniqueId()).longValue() > Calendar.getInstance().getTimeInMillis()) { return true; } return false; } return false; } /** * Sets a timeout for player into the Hashmap resetWaitTime * * @param player */ private void setResetWaitTime(final Player player) { resetWaitTime.put(player.getUniqueId(), Long.valueOf(Calendar.getInstance().getTimeInMillis() + Settings.resetWait * 1000)); } /** * Sets cool down for the level command * * @param player */ private void setLevelWaitTime(final Player player) { levelWaitTime.put(player.getUniqueId(), Long.valueOf(Calendar.getInstance().getTimeInMillis() + Settings.levelWait * 1000)); } /** * Returns how long the player must wait until they can restart their island * in seconds * * @param player * @return how long the player must wait */ private long getResetWaitTime(final Player player) { if (resetWaitTime.containsKey(player.getUniqueId())) { if (resetWaitTime.get(player.getUniqueId()).longValue() > Calendar.getInstance().getTimeInMillis()) { return (resetWaitTime.get(player.getUniqueId()).longValue() - Calendar.getInstance().getTimeInMillis()) / 1000; } return 0L; } return 0L; } private long getLevelWaitTime(final Player player) { if (levelWaitTime.containsKey(player.getUniqueId())) { if (levelWaitTime.get(player.getUniqueId()).longValue() > Calendar.getInstance().getTimeInMillis()) { return (levelWaitTime.get(player.getUniqueId()).longValue() - Calendar.getInstance().getTimeInMillis()) / 1000; } return 0L; } return 0L; } /** * Reserves a spot in the world for the player to have their island placed next time they make one * @param playerUUID * @param location */ public void reserveLocation(UUID playerUUID, Location location) { islandSpot.put(playerUUID, location); } @Override public List<String> onTabComplete(final CommandSender sender, final Command command, final String label, final String[] args) { if (!(sender instanceof Player)) { return new ArrayList<String>(); } final Player player = (Player) sender; if (!VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.create")) { return new ArrayList<String>(); } final UUID playerUUID = player.getUniqueId(); final UUID teamLeader = plugin.getPlayers().getTeamLeader(playerUUID); List<UUID> teamMembers = new ArrayList<UUID>(); if (teamLeader != null) { teamMembers = plugin.getPlayers().getMembers(teamLeader); } final List<String> options = new ArrayList<String>(); String lastArg = (args.length != 0 ? args[args.length - 1] : ""); switch (args.length) { case 0: case 1: options.add("help"); //No permission needed. //options.add("make"); //Make is currently a private command never accessible to the player if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.go")) { options.add("go"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.name") && plugin.getPlayers().hasIsland(player.getUniqueId())) { options.add("name"); } options.add("about"); //No permission needed. :-) Indeed. if (plugin.getGrid() != null && plugin.getGrid().getSpawn() != null) { options.add("spawn"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.controlpanel")) { options.add("controlpanel"); options.add("cp"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.reset")) { options.add("reset"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.sethome")) { options.add("sethome"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.info")) { options.add("level"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.topten")) { options.add("top"); } if (Settings.useEconomy && VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.minishop")) { options.add("minishop"); options.add("ms"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.warp")) { options.add("warp"); options.add("warps"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.create")) { options.add("team"); options.add("invite"); options.add("leave"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.kick")) { options.add("kick"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.join")) { options.add("accept"); options.add("reject"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.makeleader")) { options.add("makeleader"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.chat")) { options.add("teamchat"); options.add("tc"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.biomes")) { options.add("biomes"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.expel")) { options.add("expel"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "coop")) { options.add("coop"); options.add("uncoop"); options.add("listcoops"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.lock")) { options.add("lock"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.settings")) { options.add("settings"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.lang")) { options.add("lang"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.ban")) { options.add("ban"); options.add("unban"); options.add("banlist"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.value")) { options.add("value"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.spawn") && plugin.getGrid() != null && plugin.getGrid().getSpawn() != null) { options.add("spawn"); } break; case 2: if (args[0].equalsIgnoreCase("make")) { options.addAll(schematics.keySet()); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.sethome")) { if (args[0].equalsIgnoreCase("go") || args[0].equalsIgnoreCase("sethome")) { // Dynamic home sizes with permissions int maxHomes = Settings.maxHomes; for (PermissionAttachmentInfo perms : player.getEffectivePermissions()) { if (perms.getPermission().startsWith(Settings.PERMPREFIX + "island.maxhomes.")) { if (perms.getPermission().contains(Settings.PERMPREFIX + "island.maxhomes.*")) { maxHomes = Settings.maxHomes; break; } else { // Get the max value should there be more than one String[] spl = perms.getPermission().split(Settings.PERMPREFIX + "island.maxhomes."); if (spl.length > 1) { if (!NumberUtils.isDigits(spl[1])) { plugin.getLogger().severe("Player " + player.getName() + " has permission: " + perms.getPermission() + " <-- the last part MUST be a number! Ignoring..."); } else { maxHomes = Math.max(maxHomes, Integer.valueOf(spl[1])); } } } } // Do some sanity checking if (maxHomes < 1) { maxHomes = 1; } } for (int i = 0; i < maxHomes; i++) { options.add(Integer.toString(i)); } } } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.warp") && args[0].equalsIgnoreCase("warp")) { final Set<UUID> warpList = plugin.getWarpSignsListener().listWarps(); for (UUID warp : warpList) { options.add(plugin.getPlayers().getName(warp)); } } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.info") && args[0].equalsIgnoreCase("level")) { options.addAll(Util.getOnlinePlayerList()); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.create") && args[0].equalsIgnoreCase("invite")) { options.addAll(Util.getOnlinePlayerList()); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "coop") && args[0].equalsIgnoreCase("coop")) { options.addAll(Util.getOnlinePlayerList()); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "coop") && args[0].equalsIgnoreCase("uncoop")) { options.addAll(Util.getOnlinePlayerList()); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.expel") && args[0].equalsIgnoreCase("expel")) { options.addAll(Util.getOnlinePlayerList()); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.kick") && (args[0].equalsIgnoreCase("kick") || args[0].equalsIgnoreCase("remove"))) { for (UUID member : teamMembers) { options.add(plugin.getPlayers().getName(member)); } } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "team.makeleader") && args[0].equalsIgnoreCase("makeleader")) { for (UUID member : teamMembers) { options.add(plugin.getPlayers().getName(member)); } } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.controlpanel") && (args[0].equalsIgnoreCase("cp") || args[0].equalsIgnoreCase("controlpanel"))) { options.add("on"); options.add("off"); } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.ban") && (args[0].equalsIgnoreCase("ban"))) { for (Player banPlayer: plugin.getServer().getOnlinePlayers()) { if (!banPlayer.isOp() && !VaultHelper.checkPerm(banPlayer, Settings.PERMPREFIX + "admin.noban") && !banPlayer.equals(player) && !plugin.getPlayers().getMembers(playerUUID).contains(banPlayer.getUniqueId())) { options.add(banPlayer.getName()); } } } if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "island.ban") && (args[0].equalsIgnoreCase("unban"))) { for (UUID banPlayer: plugin.getPlayers().getBanList(playerUUID)) { options.add(plugin.getPlayers().getName(banPlayer)); } } break; } return Util.tabLimit(options, lastArg); } }