Search in sources :

Example 71 with EntityType

use of org.bukkit.entity.EntityType in project askyblock by tastybento.

the class IslandCmd method 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()) {
        // 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").setIcon(Material.GRASS);
        schematics.get("default").setOrder(1);
        schematics.get("default").setName("The Original");
        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);
        } else {
            schematics.get("default").setUseDefaultChest(true);
        }
    }
    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("schematicsection")) {
        Settings.useSchematicPanel = schemSection.getBoolean("useschematicspanel", false);
        Settings.chooseIslandRandomly = schemSection.getBoolean("chooseislandrandomly", false);
        ConfigurationSection schematicsSection = schemSection.getConfigurationSection("schematics");
        // Section exists, so go through the various sections
        for (String key : schematicsSection.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));
                    // 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(split[0]));
                            if (icon == null) {
                                icon = Material.MAP;
                                plugin.getLogger().severe("Schematic's icon could not be found. Try using quotes like '17:2'");
                            }
                        } 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();
        }
    }
}
Also used : Potion(org.bukkit.potion.Potion) ArrayList(java.util.ArrayList) Material(org.bukkit.Material) IOException(java.io.IOException) IOException(java.io.IOException) EntityType(org.bukkit.entity.EntityType) Biome(org.bukkit.block.Biome) PotionType(org.bukkit.potion.PotionType) ItemStack(org.bukkit.inventory.ItemStack) File(java.io.File) Schematic(com.wasteofplastic.askyblock.schematics.Schematic) ConfigurationSection(org.bukkit.configuration.ConfigurationSection)

Example 72 with EntityType

use of org.bukkit.entity.EntityType in project acidisland by tastybento.

the class Schematic method spawnCompanion.

/**
 * Spawns a random companion for the player with a random name at the location given
 * @param player
 * @param location
 */
protected void spawnCompanion(Player player, Location location) {
    // Bukkit.getLogger().info("DEBUG: spawning compantion at " + location);
    if (!islandCompanion.isEmpty() && location != null) {
        Random rand = new Random();
        int randomNum = rand.nextInt(islandCompanion.size());
        EntityType type = islandCompanion.get(randomNum);
        if (type != null) {
            LivingEntity companion = (LivingEntity) location.getWorld().spawnEntity(location, type);
            if (!companionNames.isEmpty()) {
                randomNum = rand.nextInt(companionNames.size());
                String name = companionNames.get(randomNum).replace("[player]", player.getName());
                // plugin.getLogger().info("DEBUG: name is " + name);
                companion.setCustomName(name);
                companion.setCustomNameVisible(true);
            }
        }
    }
}
Also used : EntityType(org.bukkit.entity.EntityType) LivingEntity(org.bukkit.entity.LivingEntity) Random(java.util.Random)

Example 73 with EntityType

use of org.bukkit.entity.EntityType in project acidisland by tastybento.

the class Challenges method giveItems.

/**
 * Gives player the reward items.
 * @param player
 * @param itemRewards
 * @return List of ItemStacks that were given to the player or null if there was an error in the interpretation of the rewards
 */
private List<ItemStack> giveItems(Player player, String[] itemRewards) {
    List<ItemStack> rewardedItems = new ArrayList<ItemStack>();
    Material rewardItem;
    int rewardQty;
    // Build the item stack of rewards to give the player
    for (final String s : itemRewards) {
        final String[] element = s.split(":");
        if (element.length == 2) {
            try {
                if (StringUtils.isNumeric(element[0])) {
                    rewardItem = Material.getMaterial(Integer.parseInt(element[0]));
                } else {
                    rewardItem = Material.getMaterial(element[0].toUpperCase());
                }
                rewardQty = Integer.parseInt(element[1]);
                ItemStack item = new ItemStack(rewardItem, rewardQty);
                rewardedItems.add(item);
                final HashMap<Integer, ItemStack> leftOvers = player.getInventory().addItem(new ItemStack[] { item });
                if (!leftOvers.isEmpty()) {
                    player.getWorld().dropItemNaturally(player.getLocation(), leftOvers.get(0));
                }
                if (plugin.getServer().getVersion().contains("(MC: 1.8") || plugin.getServer().getVersion().contains("(MC: 1.7")) {
                    player.getWorld().playSound(player.getLocation(), Sound.valueOf("ITEM_PICKUP"), 1F, 1F);
                } else {
                    player.getWorld().playSound(player.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1F, 1F);
                }
            } catch (Exception e) {
                Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).challengeserrorRewardProblem);
                plugin.getLogger().severe("Could not give " + element[0] + ":" + element[1] + " to " + player.getName() + " for challenge reward!");
                String materialList = "";
                boolean hint = false;
                for (Material m : Material.values()) {
                    materialList += m.toString() + ",";
                    if (element[0].length() > 3) {
                        if (m.toString().startsWith(element[0].substring(0, 3))) {
                            plugin.getLogger().severe("Did you mean " + m.toString() + "? If so, put that in challenges.yml.");
                            hint = true;
                        }
                    }
                }
                if (!hint) {
                    plugin.getLogger().severe("Sorry, I have no idea what " + element[0] + " is. Pick from one of these:");
                    plugin.getLogger().severe(materialList.substring(0, materialList.length() - 1));
                }
            }
        } else if (element.length == 3) {
            try {
                if (StringUtils.isNumeric(element[0])) {
                    rewardItem = Material.getMaterial(Integer.parseInt(element[0]));
                } else {
                    rewardItem = Material.getMaterial(element[0].toUpperCase());
                }
                rewardQty = Integer.parseInt(element[2]);
                // Check for POTION
                if (rewardItem.equals(Material.POTION)) {
                    givePotion(player, rewardedItems, element, rewardQty);
                } else {
                    ItemStack item = null;
                    // Normal item, not a potion, check if it is a Monster Egg
                    if (rewardItem.equals(Material.MONSTER_EGG)) {
                        try {
                            EntityType type = EntityType.valueOf(element[1].toUpperCase());
                            if (Bukkit.getServer().getVersion().contains("(MC: 1.8") || Bukkit.getServer().getVersion().contains("(MC: 1.7")) {
                                item = new SpawnEgg(type).toItemStack(rewardQty);
                            } else {
                                try {
                                    item = new SpawnEgg1_9(type).toItemStack(rewardQty);
                                } catch (Exception ex) {
                                    item = new ItemStack(rewardItem);
                                    plugin.getLogger().severe("Monster eggs not supported with this server version.");
                                }
                            }
                        } catch (Exception e) {
                            Bukkit.getLogger().severe("Spawn eggs must be described by name. Try one of these (not all are possible):");
                            for (EntityType type : EntityType.values()) {
                                if (type.isSpawnable() && type.isAlive()) {
                                    plugin.getLogger().severe(type.toString());
                                }
                            }
                        }
                    } else {
                        int rewMod = Integer.parseInt(element[1]);
                        item = new ItemStack(rewardItem, rewardQty, (short) rewMod);
                    }
                    if (item != null) {
                        rewardedItems.add(item);
                        final HashMap<Integer, ItemStack> leftOvers = player.getInventory().addItem(new ItemStack[] { item });
                        if (!leftOvers.isEmpty()) {
                            player.getWorld().dropItemNaturally(player.getLocation(), leftOvers.get(0));
                        }
                    }
                }
                if (plugin.getServer().getVersion().contains("(MC: 1.8") || plugin.getServer().getVersion().contains("(MC: 1.7")) {
                    player.getWorld().playSound(player.getLocation(), Sound.valueOf("ITEM_PICKUP"), 1F, 1F);
                } else {
                    player.getWorld().playSound(player.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1F, 1F);
                }
            } catch (Exception e) {
                Util.sendMessage(player, ChatColor.RED + "There was a problem giving your reward. Ask Admin to check log!");
                plugin.getLogger().severe("Could not give " + element[0] + ":" + element[1] + " to " + player.getName() + " for challenge reward!");
                /*
                    if (element[0].equalsIgnoreCase("POTION")) {
                        String potionList = "";
                        boolean hint = false;
                        for (PotionEffectType m : PotionEffectType.values()) {
                            potionList += m.toString() + ",";
                            if (element[1].length() > 3) {
                                if (m.toString().startsWith(element[1].substring(0, 3))) {
                                    plugin.getLogger().severe("Did you mean " + m.toString() + "?");
                                    hint = true;
                                }
                            }
                        }
                        if (!hint) {
                            plugin.getLogger().severe("Sorry, I have no idea what potion type " + element[1] + " is. Pick from one of these:");
                            plugin.getLogger().severe(potionList.substring(0, potionList.length() - 1));
                        }

                    } else {*/
                String materialList = "";
                boolean hint = false;
                for (Material m : Material.values()) {
                    materialList += m.toString() + ",";
                    if (m.toString().startsWith(element[0].substring(0, 3))) {
                        plugin.getLogger().severe("Did you mean " + m.toString() + "? If so, put that in challenges.yml.");
                        hint = true;
                    }
                }
                if (!hint) {
                    plugin.getLogger().severe("Sorry, I have no idea what " + element[0] + " is. Pick from one of these:");
                    plugin.getLogger().severe(materialList.substring(0, materialList.length() - 1));
                }
                // }
                return null;
            }
        } else if (element.length == 6) {
            // Potion format = POTION:name:level:extended:splash:qty
            try {
                if (StringUtils.isNumeric(element[0])) {
                    rewardItem = Material.getMaterial(Integer.parseInt(element[0]));
                } else {
                    rewardItem = Material.getMaterial(element[0].toUpperCase());
                }
                rewardQty = Integer.parseInt(element[5]);
                // Check for POTION
                if (rewardItem.equals(Material.POTION)) {
                    givePotion(player, rewardedItems, element, rewardQty);
                }
            } catch (Exception e) {
                Util.sendMessage(player, ChatColor.RED + "There was a problem giving your reward. Ask Admin to check log!");
                plugin.getLogger().severe("Problem with reward potion: " + s);
                plugin.getLogger().severe("Format POTION:NAME:<LEVEL>:<EXTENDED>:<SPLASH/LINGER>:QTY");
                plugin.getLogger().severe("LEVEL, EXTENDED and SPLASH are optional");
                plugin.getLogger().severe("LEVEL is a number");
                plugin.getLogger().severe("Examples:");
                plugin.getLogger().severe("POTION:STRENGTH:1:EXTENDED:SPLASH:1");
                plugin.getLogger().severe("POTION:JUMP:2:NOTEXTENDED:NOSPLASH:1");
                plugin.getLogger().severe("POTION:WEAKNESS:::::1   -  any weakness potion");
                plugin.getLogger().severe("Available names are:");
                String potionNames = "";
                for (PotionType p : PotionType.values()) {
                    potionNames += p.toString() + ", ";
                }
                plugin.getLogger().severe(potionNames.substring(0, potionNames.length() - 2));
                return null;
            }
        }
    }
    return rewardedItems;
}
Also used : HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) ArrayList(java.util.ArrayList) SpawnEgg1_9(com.wasteofplastic.acidisland.util.SpawnEgg1_9) Material(org.bukkit.Material) SpawnEgg(org.bukkit.material.SpawnEgg) IOException(java.io.IOException) EntityType(org.bukkit.entity.EntityType) PotionType(org.bukkit.potion.PotionType) ItemStack(org.bukkit.inventory.ItemStack)

Example 74 with EntityType

use of org.bukkit.entity.EntityType in project acidisland by tastybento.

the class Challenges method hasRequired.

/**
 * Checks if a player has enough for a challenge. Supports two types of
 * checks, inventory and island. Removes items if required.
 *
 * @param player
 * @param challenge
 * @param type
 * @return true if the player has everything required
 */
public boolean hasRequired(final Player player, final String challenge, final String type) {
    // Check money
    double moneyReq = 0D;
    if (Settings.useEconomy) {
        moneyReq = getChallengeConfig().getDouble("challenges.challengeList." + challenge + ".requiredMoney", 0D);
        if (moneyReq > 0D) {
            if (!VaultHelper.econ.has(player, Settings.worldName, moneyReq)) {
                Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).challengeserrorNotEnoughItems);
                String desc = ChatColor.translateAlternateColorCodes('&', getChallengeConfig().getString("challenges.challengeList." + challenge + ".description").replace("[label]", Settings.ISLANDCOMMAND));
                List<String> result = new ArrayList<String>();
                if (desc.contains("|")) {
                    result.addAll(Arrays.asList(desc.split("\\|")));
                } else {
                    result.add(desc);
                }
                for (String line : result) {
                    Util.sendMessage(player, ChatColor.RED + line);
                }
                return false;
            }
        }
    }
    final String reqList = getChallengeConfig().getString("challenges.challengeList." + challenge + ".requiredItems");
    // standard items can be collected
    if (type.equalsIgnoreCase("inventory")) {
        List<ItemStack> toBeRemoved = new ArrayList<ItemStack>();
        Material reqItem;
        int reqAmount = 0;
        if (!reqList.isEmpty()) {
            for (final String s : reqList.split(" ")) {
                final String[] part = s.split(":");
                // Material:Qty
                if (part.length == 2) {
                    try {
                        // Correct some common mistakes
                        if (part[0].equalsIgnoreCase("potato")) {
                            part[0] = "POTATO_ITEM";
                        } else if (part[0].equalsIgnoreCase("brewing_stand")) {
                            part[0] = "BREWING_STAND_ITEM";
                        } else if (part[0].equalsIgnoreCase("carrot")) {
                            part[0] = "CARROT_ITEM";
                        } else if (part[0].equalsIgnoreCase("cauldron")) {
                            part[0] = "CAULDRON_ITEM";
                        } else if (part[0].equalsIgnoreCase("skull")) {
                            part[0] = "SKULL_ITEM";
                        }
                        // TODO: add netherwart vs. netherstalk?
                        if (StringUtils.isNumeric(part[0])) {
                            reqItem = Material.getMaterial(Integer.parseInt(part[0]));
                        } else {
                            reqItem = Material.getMaterial(part[0].toUpperCase());
                        }
                        reqAmount = Integer.parseInt(part[1]);
                        ItemStack item = new ItemStack(reqItem);
                        if (DEBUG) {
                            plugin.getLogger().info("DEBUG: required item = " + reqItem.toString());
                            plugin.getLogger().info("DEBUG: item amount = " + reqAmount);
                        }
                        if (!player.getInventory().contains(reqItem)) {
                            if (DEBUG)
                                plugin.getLogger().info("DEBUG: item not in inventory");
                            return false;
                        } else {
                            // check amount
                            int amount = 0;
                            if (DEBUG)
                                plugin.getLogger().info("DEBUG: Amount in inventory = " + player.getInventory().all(reqItem).size());
                            // enough required items
                            for (Entry<Integer, ? extends ItemStack> en : player.getInventory().all(reqItem).entrySet()) {
                                // Get the item
                                ItemStack i = en.getValue();
                                // If the item is enchanted, skip - it doesn't count
                                if (!i.getEnchantments().isEmpty()) {
                                    if (DEBUG)
                                        plugin.getLogger().info("DEBUG: item has enchantment - doesn't count");
                                    continue;
                                }
                                // in the same way, they need adding too...
                                if (i.getDurability() == 0 || (reqItem == Material.MAP && i.getType() == Material.MAP)) {
                                    // amount += i.getAmount();
                                    if ((amount + i.getAmount()) < reqAmount) {
                                        // Remove all of this item stack - clone
                                        // otherwise it will keep a reference to
                                        // the
                                        // original
                                        toBeRemoved.add(i.clone());
                                        amount += i.getAmount();
                                        if (DEBUG)
                                            plugin.getLogger().info("DEBUG: amount is <= req Remove " + i.toString() + ":" + i.getDurability() + " x " + i.getAmount());
                                    } else if ((amount + i.getAmount()) == reqAmount) {
                                        if (DEBUG)
                                            plugin.getLogger().info("DEBUG: amount is = req Remove " + i.toString() + ":" + i.getDurability() + " x " + i.getAmount());
                                        toBeRemoved.add(i.clone());
                                        amount += i.getAmount();
                                        break;
                                    } else {
                                        // Remove a portion of this item
                                        if (DEBUG)
                                            plugin.getLogger().info("DEBUG: amount is > req Remove " + i.toString() + ":" + i.getDurability() + " x " + i.getAmount());
                                        item.setAmount(reqAmount - amount);
                                        item.setDurability(i.getDurability());
                                        toBeRemoved.add(item);
                                        amount += i.getAmount();
                                        break;
                                    }
                                }
                            }
                            if (DEBUG)
                                plugin.getLogger().info("DEBUG: amount " + amount);
                            if (amount < reqAmount) {
                                return false;
                            }
                        }
                    } catch (Exception e) {
                        plugin.getLogger().severe("Problem with " + s + " in challenges.yml!");
                        Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorCommandNotReady);
                        String materialList = "";
                        boolean hint = false;
                        for (Material m : Material.values()) {
                            materialList += m.toString() + ",";
                            if (m.toString().contains(s.substring(0, 3).toUpperCase())) {
                                plugin.getLogger().severe("Did you mean " + m.toString() + "?");
                                hint = true;
                            }
                        }
                        if (!hint) {
                            plugin.getLogger().severe("Sorry, I have no idea what " + s + " is. Pick from one of these:");
                            plugin.getLogger().severe(materialList.substring(0, materialList.length() - 1));
                        } else {
                            plugin.getLogger().severe("Correct challenges.yml with the correct material.");
                        }
                        return false;
                    }
                } else if (part.length == 3) {
                    if (DEBUG)
                        plugin.getLogger().info("DEBUG: Item with durability");
                    // Correct some common mistakes
                    if (part[0].equalsIgnoreCase("potato")) {
                        part[0] = "POTATO_ITEM";
                    } else if (part[0].equalsIgnoreCase("brewing_stand")) {
                        part[0] = "BREWING_STAND_ITEM";
                    } else if (part[0].equalsIgnoreCase("carrot")) {
                        part[0] = "CARROT_ITEM";
                    } else if (part[0].equalsIgnoreCase("cauldron")) {
                        part[0] = "CAULDRON_ITEM";
                    } else if (part[0].equalsIgnoreCase("skull")) {
                        part[0] = "SKULL_ITEM";
                    }
                    if (StringUtils.isNumeric(part[0])) {
                        reqItem = Material.getMaterial(Integer.parseInt(part[0]));
                    } else {
                        reqItem = Material.getMaterial(part[0].toUpperCase());
                    }
                    reqAmount = Integer.parseInt(part[2]);
                    ItemStack item = new ItemStack(reqItem);
                    int reqDurability = 0;
                    boolean entityIsString = false;
                    if (StringUtils.isNumeric(part[1])) {
                        reqDurability = Integer.parseInt(part[1]);
                        item.setDurability((short) reqDurability);
                    } else if (reqItem.equals(Material.MONSTER_EGG)) {
                        entityIsString = true;
                        // non existent
                        reqDurability = -1;
                        try {
                            // Check if this is a string
                            EntityType entityType = EntityType.valueOf(part[1]);
                            NMSAbstraction nms = null;
                            nms = Util.checkVersion();
                            item = nms.getSpawnEgg(entityType, reqAmount);
                        } catch (Exception ex) {
                            plugin.getLogger().severe("Unknown entity type '" + part[1] + "' for MONSTER_EGG in challenge " + challenge);
                            return false;
                        }
                    }
                    // check amount
                    int amount = 0;
                    // enough required items
                    for (Entry<Integer, ? extends ItemStack> en : player.getInventory().all(reqItem).entrySet()) {
                        // Get the item
                        ItemStack i = en.getValue();
                        if (i.hasItemMeta() && !i.getType().equals(Material.MONSTER_EGG)) {
                            continue;
                        }
                        if (i.getDurability() == reqDurability || (entityIsString && i.getItemMeta().equals(item.getItemMeta()))) {
                            // amount += i.getAmount();
                            if ((amount + i.getAmount()) < reqAmount) {
                                // Remove all of this item stack - clone
                                // otherwise it will keep a reference to
                                // the
                                // original
                                toBeRemoved.add(i.clone());
                                amount += i.getAmount();
                                if (DEBUG)
                                    plugin.getLogger().info("DEBUG: amount is <= req Remove " + i.toString() + ":" + i.getDurability() + " x " + i.getAmount());
                            } else if ((amount + i.getAmount()) == reqAmount) {
                                toBeRemoved.add(i.clone());
                                amount += i.getAmount();
                                break;
                            } else {
                                // Remove a portion of this item
                                if (DEBUG)
                                    plugin.getLogger().info("DEBUG: amount is > req Remove " + i.toString() + ":" + i.getDurability() + " x " + i.getAmount());
                                item.setAmount(reqAmount - amount);
                                item.setDurability(i.getDurability());
                                toBeRemoved.add(item);
                                amount += i.getAmount();
                                break;
                            }
                        }
                    }
                    if (DEBUG) {
                        plugin.getLogger().info("DEBUG: amount is " + amount);
                        plugin.getLogger().info("DEBUG: req amount is " + reqAmount);
                    }
                    if (amount < reqAmount) {
                        if (DEBUG)
                            plugin.getLogger().info("DEBUG: Failure! Insufficient amount of " + item.toString() + " required = " + reqAmount + " actual = " + amount);
                        return false;
                    }
                    if (DEBUG)
                        plugin.getLogger().info("DEBUG: before set amount " + item.toString() + ":" + item.getDurability() + " x " + item.getAmount());
                } else if (part.length == 6 && part[0].contains("POTION")) {
                    // Run through player's inventory for the item
                    ItemStack[] playerInv = player.getInventory().getContents();
                    try {
                        reqAmount = Integer.parseInt(part[5]);
                        if (DEBUG)
                            plugin.getLogger().info("DEBUG: required amount is " + reqAmount);
                    } catch (Exception e) {
                        plugin.getLogger().severe("Could not parse the quantity of the potion item " + s);
                        return false;
                    }
                    int count = reqAmount;
                    for (ItemStack i : playerInv) {
                        // Catches all POTION, LINGERING_POTION and SPLASH_POTION
                        if (i != null && i.getType().toString().contains("POTION")) {
                            // POTION:NAME:<LEVEL>:<EXTENDED>:<SPLASH/LINGER>:QTY
                            if (plugin.getServer().getVersion().contains("(MC: 1.8") || plugin.getServer().getVersion().contains("(MC: 1.7")) {
                                // Test potion
                                Potion potion = null;
                                try {
                                    // This may fail if there are custom potions in the player's inventory
                                    // If so, just skip this item stack.
                                    potion = Potion.fromItemStack(i);
                                } catch (Exception e) {
                                    potion = null;
                                }
                                if (potion != null) {
                                    PotionType potionType = potion.getType();
                                    boolean match = true;
                                    if (DEBUG) {
                                        plugin.getLogger().info("DEBUG: name check " + part[1]);
                                        plugin.getLogger().info("DEBUG: potion = " + potion);
                                        plugin.getLogger().info("DEBUG: potionType = " + potionType);
                                        plugin.getLogger().info("DEBUG: part[1] = " + part[1]);
                                    }
                                    // Name check
                                    if (potionType != null && !part[1].isEmpty()) {
                                        // Custom potions may not have names
                                        if (potionType.name() != null) {
                                            if (!part[1].equalsIgnoreCase(potionType.name())) {
                                                match = false;
                                                if (DEBUG)
                                                    plugin.getLogger().info("DEBUG: name does not match");
                                            } else {
                                                if (DEBUG)
                                                    plugin.getLogger().info("DEBUG: name matches");
                                            }
                                        } else {
                                            plugin.getLogger().severe("Potion type is unknown. Please pick from the following:");
                                            for (PotionType pt : PotionType.values()) {
                                                plugin.getLogger().severe(pt.name());
                                            }
                                            match = false;
                                        }
                                    } else {
                                        if (DEBUG)
                                            plugin.getLogger().info("DEBUG: potionType = null");
                                        match = false;
                                    }
                                    // Level check (upgraded)
                                    if (DEBUG)
                                        plugin.getLogger().info("DEBUG: level check " + part[2]);
                                    if (!part[2].isEmpty()) {
                                        // There is a level declared - check it
                                        if (StringUtils.isNumeric(part[2])) {
                                            int level = Integer.valueOf(part[2]);
                                            if (level != potion.getLevel()) {
                                                if (DEBUG)
                                                    plugin.getLogger().info("DEBUG: level does not match");
                                                match = false;
                                            }
                                        }
                                    }
                                    // Extended check
                                    if (DEBUG)
                                        plugin.getLogger().info("DEBUG: extended check " + part[3]);
                                    if (!part[3].isEmpty()) {
                                        if (part[3].equalsIgnoreCase("EXTENDED") && !potion.hasExtendedDuration()) {
                                            match = false;
                                            if (DEBUG)
                                                plugin.getLogger().info("DEBUG: extended does not match");
                                        }
                                        if (part[3].equalsIgnoreCase("NOTEXTENDED") && potion.hasExtendedDuration()) {
                                            match = false;
                                            if (DEBUG)
                                                plugin.getLogger().info("DEBUG: extended does not match");
                                        }
                                    }
                                    // Splash check
                                    if (DEBUG)
                                        plugin.getLogger().info("DEBUG: splash/linger check " + part[4]);
                                    if (!part[4].isEmpty()) {
                                        if (part[4].equalsIgnoreCase("SPLASH") && !potion.isSplash()) {
                                            match = false;
                                            if (DEBUG)
                                                plugin.getLogger().info("DEBUG: not splash");
                                        }
                                        if (part[4].equalsIgnoreCase("NOSPLASH") && potion.isSplash()) {
                                            match = false;
                                            if (DEBUG)
                                                plugin.getLogger().info("DEBUG: not no splash");
                                        }
                                    }
                                    // Quantity check
                                    if (match) {
                                        if (DEBUG)
                                            plugin.getLogger().info("DEBUG: potion matches!");
                                        ItemStack removeItem = i.clone();
                                        if (removeItem.getAmount() > reqAmount) {
                                            if (DEBUG)
                                                plugin.getLogger().info("DEBUG: found " + removeItem.getAmount() + " qty in inv");
                                            removeItem.setAmount(reqAmount);
                                        }
                                        count = count - removeItem.getAmount();
                                        if (DEBUG)
                                            plugin.getLogger().info("DEBUG: " + count + " left");
                                        toBeRemoved.add(removeItem);
                                    }
                                }
                            } else {
                                // V1.9 and above
                                PotionMeta potionMeta = (PotionMeta) i.getItemMeta();
                                // If any of the settings above are missing, then any is okay
                                boolean match = true;
                                if (DEBUG)
                                    plugin.getLogger().info("DEBUG: name check " + part[1]);
                                // Name check
                                if (!part[1].isEmpty()) {
                                    // There is a name
                                    if (PotionType.valueOf(part[1]) != null) {
                                        if (!potionMeta.getBasePotionData().getType().name().equalsIgnoreCase(part[1])) {
                                            match = false;
                                            if (DEBUG)
                                                plugin.getLogger().info("DEBUG: name does not match");
                                        } else {
                                            if (DEBUG)
                                                plugin.getLogger().info("DEBUG: name matches");
                                        }
                                    } else {
                                        plugin.getLogger().severe("Potion type is unknown. Please pick from the following:");
                                        for (PotionType pt : PotionType.values()) {
                                            plugin.getLogger().severe(pt.name());
                                        }
                                        match = false;
                                    }
                                }
                                // plugin.getLogger().info("DEBUG: level check " + part[2]);
                                if (!part[2].isEmpty()) {
                                    // There is a level declared - check it
                                    if (StringUtils.isNumeric(part[2])) {
                                        int level = Integer.valueOf(part[2]);
                                        if (level == 1 && potionMeta.getBasePotionData().isUpgraded()) {
                                            if (DEBUG)
                                                plugin.getLogger().info("DEBUG: level does not match");
                                            match = false;
                                        }
                                        if (level != 1 && !potionMeta.getBasePotionData().isUpgraded()) {
                                            match = false;
                                            if (DEBUG)
                                                plugin.getLogger().info("DEBUG: level does not match");
                                        }
                                    }
                                }
                                // Extended check
                                if (DEBUG)
                                    plugin.getLogger().info("DEBUG: extended check " + part[3]);
                                if (!part[3].isEmpty()) {
                                    if (part[3].equalsIgnoreCase("EXTENDED") && !potionMeta.getBasePotionData().isExtended()) {
                                        match = false;
                                        if (DEBUG)
                                            plugin.getLogger().info("DEBUG: extended does not match");
                                    }
                                    if (part[3].equalsIgnoreCase("NOTEXTENDED") && potionMeta.getBasePotionData().isExtended()) {
                                        match = false;
                                        if (DEBUG)
                                            plugin.getLogger().info("DEBUG: extended does not match");
                                    }
                                }
                                // Splash or Linger check
                                if (DEBUG)
                                    plugin.getLogger().info("DEBUG: splash/linger check " + part[4]);
                                if (!part[4].isEmpty()) {
                                    if (part[4].equalsIgnoreCase("SPLASH") && !i.getType().equals(Material.SPLASH_POTION)) {
                                        match = false;
                                        if (DEBUG)
                                            plugin.getLogger().info("DEBUG: not splash");
                                    }
                                    if (part[4].equalsIgnoreCase("NOSPLASH") && i.getType().equals(Material.SPLASH_POTION)) {
                                        match = false;
                                        if (DEBUG)
                                            plugin.getLogger().info("DEBUG: not no splash");
                                    }
                                    if (part[4].equalsIgnoreCase("LINGER") && !i.getType().equals(Material.LINGERING_POTION)) {
                                        match = false;
                                        if (DEBUG)
                                            plugin.getLogger().info("DEBUG: not linger");
                                    }
                                    if (part[4].equalsIgnoreCase("NOLINGER") && i.getType().equals(Material.LINGERING_POTION)) {
                                        match = false;
                                        if (DEBUG)
                                            plugin.getLogger().info("DEBUG: not no linger");
                                    }
                                }
                                // Quantity check
                                if (match) {
                                    if (DEBUG)
                                        plugin.getLogger().info("DEBUG: potion matches!");
                                    ItemStack removeItem = i.clone();
                                    if (removeItem.getAmount() > reqAmount) {
                                        if (DEBUG)
                                            plugin.getLogger().info("DEBUG: found " + removeItem.getAmount() + " qty in inv");
                                        removeItem.setAmount(reqAmount);
                                    }
                                    count = count - removeItem.getAmount();
                                    if (DEBUG)
                                        plugin.getLogger().info("DEBUG: " + count + " left");
                                    toBeRemoved.add(removeItem);
                                }
                            }
                        }
                        if (count <= 0) {
                            if (DEBUG)
                                plugin.getLogger().info("DEBUG: Player has enough");
                            break;
                        }
                        if (DEBUG)
                            plugin.getLogger().info("DEBUG: still need " + count + " to complete");
                    }
                    if (count > 0) {
                        if (DEBUG)
                            plugin.getLogger().info("DEBUG: Player does not have enough");
                        return false;
                    }
                } else {
                    plugin.getLogger().severe("Problem with " + s + " in challenges.yml!");
                    return false;
                }
            }
        }
        if (getChallengeConfig().getBoolean("challenges.challengeList." + challenge + ".takeItems")) {
            // int qty = 0;
            if (DEBUG)
                plugin.getLogger().info("DEBUG: Removing items");
            for (ItemStack i : toBeRemoved) {
                // qty += i.getAmount();
                if (DEBUG)
                    plugin.getLogger().info("DEBUG: Remove " + i.toString() + "::" + i.getDurability() + " x " + i.getAmount());
                HashMap<Integer, ItemStack> leftOver = player.getInventory().removeItem(i);
                if (!leftOver.isEmpty()) {
                    plugin.getLogger().warning("Exploit? Could not remove the following in challenge " + challenge + " for player " + player.getName() + ":");
                    for (ItemStack left : leftOver.values()) {
                        plugin.getLogger().info(left.toString());
                    }
                    return false;
                }
            }
            // Remove money
            if (moneyReq > 0D) {
                EconomyResponse er = VaultHelper.econ.withdrawPlayer(player, moneyReq);
                if (!er.transactionSuccess()) {
                    plugin.getLogger().warning("Exploit? Could not remove " + VaultHelper.econ.format(moneyReq) + " from " + player.getName() + " in challenge " + challenge);
                    plugin.getLogger().warning("Player's balance is " + VaultHelper.econ.format(VaultHelper.econ.getBalance(player)));
                }
            }
        // plugin.getLogger().info("DEBUG: total = " + qty);
        }
        return true;
    }
    if (type.equalsIgnoreCase("island")) {
        final HashMap<MaterialData, Integer> neededItem = new HashMap<MaterialData, Integer>();
        final HashMap<EntityType, Integer> neededEntities = new HashMap<EntityType, Integer>();
        if (!reqList.isEmpty()) {
            for (int i = 0; i < reqList.split(" ").length; i++) {
                final String[] sPart = reqList.split(" ")[i].split(":");
                try {
                    // Find out if the needed item is a Material or an Entity
                    boolean isEntity = false;
                    for (EntityType entityType : EntityType.values()) {
                        if (entityType.toString().equalsIgnoreCase(sPart[0])) {
                            isEntity = true;
                            break;
                        }
                    }
                    if (isEntity) {
                        // plugin.getLogger().info("DEBUG: Item " + sPart[0].toUpperCase() + " is an entity");
                        EntityType entityType = EntityType.valueOf(sPart[0].toUpperCase());
                        if (entityType != null) {
                            neededEntities.put(entityType, Integer.parseInt(sPart[1]));
                        // plugin.getLogger().info("DEBUG: Needed entity is " + Integer.parseInt(sPart[1]) + " x " + EntityType.valueOf(sPart[0].toUpperCase()).toString());
                        }
                    } else {
                        Material item;
                        if (StringUtils.isNumeric(sPart[0])) {
                            item = Material.getMaterial(Integer.parseInt(sPart[0]));
                        } else {
                            item = Material.getMaterial(sPart[0].toUpperCase());
                        }
                        if (item != null) {
                            // We have two cases : quantity only OR durability + quantity
                            final int quantity;
                            MaterialData md = new MaterialData(item);
                            if (sPart.length == 2) {
                                // Only a quantity is specified
                                quantity = Integer.parseInt(sPart[1]);
                            } else {
                                quantity = Integer.parseInt(sPart[2]);
                                md.setData(Byte.parseByte(sPart[1]));
                            }
                            neededItem.put(md, quantity);
                            if (DEBUG) {
                                plugin.getLogger().info("DEBUG: Needed item is " + md.toString() + " x " + quantity);
                            }
                        } else {
                            plugin.getLogger().warning("Problem parsing required item for challenge " + challenge + " in challenges.yml!");
                            return false;
                        }
                    }
                } catch (Exception intEx) {
                    plugin.getLogger().warning("Problem parsing required items for challenge " + challenge + " in challenges.yml - skipping");
                    return false;
                }
            }
        }
        // We now have two sets of required items or entities
        // Check the items first
        final Location l = player.getLocation();
        // if (!neededItem.isEmpty()) {
        final int px = l.getBlockX();
        final int py = l.getBlockY();
        final int pz = l.getBlockZ();
        // Get search radius - min is 10, max is 50
        int searchRadius = getChallengeConfig().getInt("challenges.challengeList." + challenge + ".searchRadius", 10);
        if (searchRadius < 10) {
            searchRadius = 10;
        } else if (searchRadius > 50) {
            searchRadius = 50;
        }
        for (int x = -searchRadius; x <= searchRadius; x++) {
            for (int y = -searchRadius; y <= searchRadius; y++) {
                for (int z = -searchRadius; z <= searchRadius; z++) {
                    final MaterialData b = new Location(l.getWorld(), px + x, py + y, pz + z).getBlock().getState().getData();
                    if (!b.getItemType().equals(Material.AIR)) {
                        neededItem.entrySet().stream().filter(e -> (e.getKey().getItemType().equals(b.getItemType()) && (e.getKey().getData() == 0 || e.getKey().getData() == b.getData()) || (e.getKey().getItemType().toString().endsWith("_DOOR") && b.getItemType().toString().endsWith("_DOOR")) || (e.getKey().getItemType().toString().endsWith("_COMPARATOR") && b.getItemType().toString().endsWith("_COMPARATOR")) || (e.getKey().getItemType().toString().contains("_LAMP") && b.getItemType().toString().contains("_LAMP")) || (e.getKey().getItemType().toString().endsWith("FURNACE") && b.getItemType().toString().endsWith("FURNACE")) || (e.getKey().getItemType().toString().contains("DAYLIGHT") && b.getItemType().toString().contains("DAYLIGHT")) || (e.getKey().getItemType().toString().startsWith("BOAT") && b.getItemType().toString().startsWith("BOAT")))).forEach(e -> e.setValue(e.getValue() - 1));
                    }
                }
            }
        }
        neededItem.values().removeIf(v -> v <= 0);
        // Check if all the needed items have been amassed
        if (!neededItem.isEmpty()) {
            for (MaterialData missing : neededItem.keySet()) {
                Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).challengeserrorYouAreMissing + " " + neededItem.get(missing) + " x " + Util.prettifyText(missing.getItemType().toString()) + ":" + missing.getData());
            }
            return false;
        } else {
            // Check for needed entities
            for (Entity entity : player.getNearbyEntities(searchRadius, searchRadius, searchRadius)) {
                // entity.getType().toString());
                if (neededEntities.containsKey(entity.getType())) {
                    // plugin.getLogger().info("DEBUG: Entity in list");
                    if (neededEntities.get(entity.getType()) == 1) {
                        neededEntities.remove(entity.getType());
                    // plugin.getLogger().info("DEBUG: Entity qty satisfied");
                    } else {
                        neededEntities.put(entity.getType(), neededEntities.get(entity.getType()) - 1);
                    // plugin.getLogger().info("DEBUG: Entity qty reduced by 1");
                    }
                } else {
                // plugin.getLogger().info("DEBUG: Entity not in list");
                }
            }
            if (neededEntities.isEmpty()) {
                return true;
            } else {
                for (EntityType missing : neededEntities.keySet()) {
                    Util.sendMessage(player, ChatColor.RED + plugin.myLocale(player.getUniqueId()).challengeserrorYouAreMissing + " " + neededEntities.get(missing) + " x " + Util.prettifyText(missing.toString()));
                }
                return false;
            }
        }
    }
    return true;
}
Also used : ItemFlag(org.bukkit.inventory.ItemFlag) Arrays(java.util.Arrays) StringUtils(org.apache.commons.lang.StringUtils) Enchantment(org.bukkit.enchantments.Enchantment) ItemMeta(org.bukkit.inventory.meta.ItemMeta) NMSAbstraction(com.wasteofplastic.acidisland.nms.NMSAbstraction) CPItem(com.wasteofplastic.acidisland.panels.CPItem) Date(java.util.Date) TabCompleter(org.bukkit.command.TabCompleter) VaultHelper(com.wasteofplastic.acidisland.util.VaultHelper) HashMap(java.util.HashMap) Player(org.bukkit.entity.Player) Inventory(org.bukkit.inventory.Inventory) MaterialData(org.bukkit.material.MaterialData) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) FileConfiguration(org.bukkit.configuration.file.FileConfiguration) Location(org.bukkit.Location) Map(java.util.Map) EconomyResponse(net.milkbowl.vault.economy.EconomyResponse) PotionMeta(org.bukkit.inventory.meta.PotionMeta) Potion(org.bukkit.potion.Potion) ASkyBlock(com.wasteofplastic.acidisland.ASkyBlock) Material(org.bukkit.Material) SpawnEgg1_9(com.wasteofplastic.acidisland.util.SpawnEgg1_9) Bukkit(org.bukkit.Bukkit) CommandSender(org.bukkit.command.CommandSender) SpawnEgg(org.bukkit.material.SpawnEgg) Util(com.wasteofplastic.acidisland.util.Util) Entity(org.bukkit.entity.Entity) PotionType(org.bukkit.potion.PotionType) Set(java.util.Set) IOException(java.io.IOException) UUID(java.util.UUID) Sound(org.bukkit.Sound) EntityType(org.bukkit.entity.EntityType) CommandExecutor(org.bukkit.command.CommandExecutor) File(java.io.File) PotionData(org.bukkit.potion.PotionData) ItemStack(org.bukkit.inventory.ItemStack) ChallengeLevelCompleteEvent(com.wasteofplastic.acidisland.events.ChallengeLevelCompleteEvent) List(java.util.List) ChallengeCompleteEvent(com.wasteofplastic.acidisland.events.ChallengeCompleteEvent) YamlConfiguration(org.bukkit.configuration.file.YamlConfiguration) Entry(java.util.Map.Entry) Settings(com.wasteofplastic.acidisland.Settings) ChatColor(org.bukkit.ChatColor) Command(org.bukkit.command.Command) Entity(org.bukkit.entity.Entity) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) ArrayList(java.util.ArrayList) Entry(java.util.Map.Entry) EconomyResponse(net.milkbowl.vault.economy.EconomyResponse) Potion(org.bukkit.potion.Potion) Material(org.bukkit.Material) PotionMeta(org.bukkit.inventory.meta.PotionMeta) NMSAbstraction(com.wasteofplastic.acidisland.nms.NMSAbstraction) IOException(java.io.IOException) EntityType(org.bukkit.entity.EntityType) PotionType(org.bukkit.potion.PotionType) MaterialData(org.bukkit.material.MaterialData) ItemStack(org.bukkit.inventory.ItemStack) Location(org.bukkit.Location)

Example 75 with EntityType

use of org.bukkit.entity.EntityType in project acidisland by tastybento.

the class IslandCmd method 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()) {
        // 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").setIcon(Material.GRASS);
        schematics.get("default").setOrder(1);
        schematics.get("default").setName("The Original");
        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);
        } else {
            schematics.get("default").setUseDefaultChest(true);
        }
    }
    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("schematicsection")) {
        Settings.useSchematicPanel = schemSection.getBoolean("useschematicspanel", false);
        Settings.chooseIslandRandomly = schemSection.getBoolean("chooseislandrandomly", false);
        ConfigurationSection schematicsSection = schemSection.getConfigurationSection("schematics");
        // Section exists, so go through the various sections
        for (String key : schematicsSection.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));
                    // 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(split[0]));
                            if (icon == null) {
                                icon = Material.MAP;
                                plugin.getLogger().severe("Schematic's icon could not be found. Try using quotes like '17:2'");
                            }
                        } 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.
                    newSchem.setPasteAir(schemSection.getBoolean("schematics." + key + ".pasteair", true));
                    // 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 " + ChatColor.stripColor(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();
        }
    }
}
Also used : Potion(org.bukkit.potion.Potion) ArrayList(java.util.ArrayList) Material(org.bukkit.Material) IOException(java.io.IOException) IOException(java.io.IOException) EntityType(org.bukkit.entity.EntityType) Biome(org.bukkit.block.Biome) PotionType(org.bukkit.potion.PotionType) ItemStack(org.bukkit.inventory.ItemStack) File(java.io.File) Schematic(com.wasteofplastic.acidisland.schematics.Schematic) ConfigurationSection(org.bukkit.configuration.ConfigurationSection)

Aggregations

EntityType (org.bukkit.entity.EntityType)109 ArrayList (java.util.ArrayList)29 ItemStack (org.bukkit.inventory.ItemStack)28 Material (org.bukkit.Material)23 Player (org.bukkit.entity.Player)23 Entity (org.bukkit.entity.Entity)19 Location (org.bukkit.Location)17 IOException (java.io.IOException)16 File (java.io.File)13 LivingEntity (org.bukkit.entity.LivingEntity)13 EventHandler (org.bukkit.event.EventHandler)12 PotionType (org.bukkit.potion.PotionType)12 HashMap (java.util.HashMap)10 ConfigurationSection (org.bukkit.configuration.ConfigurationSection)9 Block (org.bukkit.block.Block)8 YamlConfiguration (org.bukkit.configuration.file.YamlConfiguration)8 World (org.bukkit.World)7 SpawnEgg (org.bukkit.material.SpawnEgg)7 UUID (java.util.UUID)5 Biome (org.bukkit.block.Biome)5