Search in sources :

Example 86 with MaterialData

use of org.bukkit.material.MaterialData in project Essentials by drtshock.

the class YamlStorageWriter method writeMaterialData.

private void writeMaterialData(final Object data) {
    final MaterialData matData = (MaterialData) data;
    writeMaterial(matData.getItemType());
    if (matData.getData() > 0) {
        writer.print(':');
        writer.print(matData.getData());
    }
}
Also used : MaterialData(org.bukkit.material.MaterialData)

Example 87 with MaterialData

use of org.bukkit.material.MaterialData in project MyPet by xXKeyleXx.

the class EntityConverterService method convertEntity.

public void convertEntity(MyPet myPet, LivingEntity normalEntity) {
    if (myPet instanceof MyCreeper) {
        if (((MyCreeper) myPet).isPowered()) {
            ((Creeper) normalEntity).setPowered(true);
        }
    } else if (myPet instanceof MyEnderman) {
        if (((MyEnderman) myPet).hasBlock()) {
            MaterialData materialData = new MaterialData(((MyEnderman) myPet).getBlock().getType(), ((MyEnderman) myPet).getBlock().getData().getData());
            ((Enderman) normalEntity).setCarriedMaterial(materialData);
        }
    } else if (myPet instanceof MyIronGolem) {
        ((IronGolem) normalEntity).setPlayerCreated(true);
    } else if (myPet instanceof MyMagmaCube) {
        ((MagmaCube) normalEntity).setSize(((MyMagmaCube) myPet).getSize());
    } else if (myPet instanceof MyOcelot) {
        ((Ocelot) normalEntity).setCatType(Ocelot.Type.WILD_OCELOT);
        ((Ocelot) normalEntity).setTamed(false);
    } else if (myPet instanceof MyPig) {
        ((Pig) normalEntity).setSaddle(((MyPig) myPet).hasSaddle());
    } else if (myPet instanceof MySheep) {
        ((Sheep) normalEntity).setSheared(((MySheep) myPet).isSheared());
        ((Sheep) normalEntity).setColor(((MySheep) myPet).getColor());
    } else if (myPet instanceof MyVillager) {
        MyVillager villagerPet = (MyVillager) myPet;
        Villager.Profession profession;
        profession = Villager.Profession.values()[villagerPet.getProfession() + 1];
        ((Villager) normalEntity).setProfession(profession);
        if (villagerPet.hasOriginalData()) {
            TagCompound villagerTag = MyPetApi.getPlatformHelper().entityToTag(normalEntity);
            for (String key : villagerPet.getOriginalData().getCompoundData().keySet()) {
                villagerTag.put(key, villagerPet.getOriginalData().get(key));
            }
            MyPetApi.getPlatformHelper().applyTagToEntity(villagerTag, normalEntity);
        }
    } else if (myPet instanceof MyWolf) {
        ((Wolf) normalEntity).setTamed(false);
    } else if (myPet instanceof MySlime) {
        ((Slime) normalEntity).setSize(((MySlime) myPet).getSize());
    } else if (myPet instanceof MyZombieVillager) {
        Villager.Profession profession = Villager.Profession.values()[((MyZombieVillager) myPet).getProfession()];
        ((ZombieVillager) normalEntity).setVillagerProfession(profession);
    } else if (myPet instanceof MyWitherSkeleton) {
        normalEntity.getEquipment().setItemInMainHand(new ItemStack(Material.STONE_SWORD));
    } else if (myPet instanceof MySkeleton) {
        normalEntity.getEquipment().setItemInMainHand(new ItemStack(Material.BOW));
    } else if (myPet instanceof MyPigZombie) {
        normalEntity.getEquipment().setItemInMainHand(new ItemStack(Material.GOLD_SWORD));
    } else if (myPet instanceof MyHorse) {
        Horse.Style style = Horse.Style.values()[(((MyHorse) myPet).getVariant() >>> 8)];
        Horse.Color color = Horse.Color.values()[(((MyHorse) myPet).getVariant() & 0xFF)];
        ((Horse) normalEntity).setColor(color);
        ((Horse) normalEntity).setStyle(style);
        if (((MyHorse) myPet).hasSaddle()) {
            ((Horse) normalEntity).getInventory().setSaddle(((MyHorse) myPet).getSaddle().clone());
        }
        if (((MyHorse) myPet).hasArmor()) {
            ((Horse) normalEntity).getInventory().setArmor(((MyHorse) myPet).getArmor().clone());
        }
        ((Horse) normalEntity).setOwner(myPet.getOwner().getPlayer());
    } else if (myPet instanceof MySkeletonHorse) {
        ((SkeletonHorse) normalEntity).setOwner(myPet.getOwner().getPlayer());
    } else if (myPet instanceof MyZombieHorse) {
        if (((MyZombieHorse) myPet).isBaby()) {
            ((ZombieHorse) normalEntity).setBaby();
        }
        ((ZombieHorse) normalEntity).setOwner(myPet.getOwner().getPlayer());
    } else if (myPet instanceof MyLlama) {
        ((Llama) normalEntity).setColor(Llama.Color.values()[Math.max(0, Math.min(3, ((MyLlama) myPet).getVariant()))]);
        ((Llama) normalEntity).setCarryingChest(((MyLlama) myPet).hasChest());
        if (((MyLlama) myPet).hasDecor()) {
            ((Llama) normalEntity).getInventory().setDecor(((MyLlama) myPet).getDecor());
        }
        ((Llama) normalEntity).setOwner(myPet.getOwner().getPlayer());
    } else if (myPet instanceof MyRabbit) {
        ((Rabbit) normalEntity).setRabbitType(((MyRabbit) myPet).getVariant().getBukkitType());
    }
    if (myPet instanceof MyPetBaby && normalEntity instanceof Ageable) {
        if (((MyPetBaby) myPet).isBaby()) {
            ((Ageable) normalEntity).setBaby();
        } else {
            ((Ageable) normalEntity).setAdult();
        }
    }
}
Also used : TagCompound(de.keyle.knbt.TagCompound) MyPetBaby(de.Keyle.MyPet.api.entity.MyPetBaby) MaterialData(org.bukkit.material.MaterialData) ItemStack(org.bukkit.inventory.ItemStack)

Example 88 with MaterialData

use of org.bukkit.material.MaterialData in project MyPet by xXKeyleXx.

the class EntityConverterService method convertEntity.

@Override
public void convertEntity(MyPet myPet, LivingEntity normalEntity) {
    if (myPet instanceof MyCreeper) {
        if (((MyCreeper) myPet).isPowered()) {
            ((Creeper) normalEntity).setPowered(true);
        }
    } else if (myPet instanceof MyEnderman) {
        if (((MyEnderman) myPet).hasBlock()) {
            MaterialData materialData = new MaterialData(((MyEnderman) myPet).getBlock().getType(), ((MyEnderman) myPet).getBlock().getData().getData());
            ((Enderman) normalEntity).setCarriedMaterial(materialData);
        }
    } else if (myPet instanceof MyIronGolem) {
        ((IronGolem) normalEntity).setPlayerCreated(true);
    } else if (myPet instanceof MyMagmaCube) {
        ((MagmaCube) normalEntity).setSize(((MyMagmaCube) myPet).getSize());
    } else if (myPet instanceof MyOcelot) {
        ((Ocelot) normalEntity).setCatType(Ocelot.Type.WILD_OCELOT);
        ((Ocelot) normalEntity).setTamed(false);
    } else if (myPet instanceof MyPig) {
        ((Pig) normalEntity).setSaddle(((MyPig) myPet).hasSaddle());
    } else if (myPet instanceof MySheep) {
        ((Sheep) normalEntity).setSheared(((MySheep) myPet).isSheared());
        ((Sheep) normalEntity).setColor(((MySheep) myPet).getColor());
    } else if (myPet instanceof MyVillager) {
        MyVillager villagerPet = (MyVillager) myPet;
        Villager.Profession profession = Villager.Profession.values()[villagerPet.getProfession()];
        ((Villager) normalEntity).setProfession(profession);
        if (villagerPet.hasOriginalData()) {
            TagCompound villagerTag = MyPetApi.getPlatformHelper().entityToTag(normalEntity);
            for (String key : villagerPet.getOriginalData().getCompoundData().keySet()) {
                villagerTag.put(key, villagerPet.getOriginalData().get(key));
            }
            MyPetApi.getPlatformHelper().applyTagToEntity(villagerTag, normalEntity);
        }
    } else if (myPet instanceof MyWolf) {
        ((Wolf) normalEntity).setTamed(false);
    } else if (myPet instanceof MySlime) {
        ((Slime) normalEntity).setSize(((MySlime) myPet).getSize());
    } else if (myPet instanceof MyZombie) {
        ((Zombie) normalEntity).setVillager(((MyZombie) myPet).isVillager());
    } else if (myPet instanceof MySkeleton) {
        ((Skeleton) normalEntity).setSkeletonType(Skeleton.SkeletonType.values()[((MySkeleton) myPet).getType()]);
        if (((MySkeleton) myPet).isWither()) {
            normalEntity.getEquipment().setItemInHand(new ItemStack(Material.STONE_SWORD));
        } else {
            normalEntity.getEquipment().setItemInHand(new ItemStack(Material.BOW));
        }
    } else if (myPet instanceof MyPigZombie) {
        normalEntity.getEquipment().setItemInHand(new ItemStack(Material.GOLD_SWORD));
    } else if (myPet instanceof MyHorse) {
        Horse.Variant type = Horse.Variant.values()[((MyHorse) myPet).getHorseType()];
        Horse.Style style = Horse.Style.values()[(((MyHorse) myPet).getVariant() >>> 8)];
        Horse.Color color = Horse.Color.values()[(((MyHorse) myPet).getVariant() & 0xFF)];
        ((Horse) normalEntity).setVariant(type);
        ((Horse) normalEntity).setColor(color);
        ((Horse) normalEntity).setStyle(style);
        ((Horse) normalEntity).setCarryingChest(((MyHorse) myPet).hasChest());
        if (((MyHorse) myPet).hasSaddle()) {
            ((Horse) normalEntity).getInventory().setSaddle(((MyHorse) myPet).getSaddle().clone());
        }
        if (((MyHorse) myPet).hasArmor()) {
            ((Horse) normalEntity).getInventory().setArmor(((MyHorse) myPet).getArmor().clone());
        }
        ((Horse) normalEntity).setOwner(myPet.getOwner().getPlayer());
    } else if (myPet instanceof MyRabbit) {
        ((Rabbit) normalEntity).setRabbitType(((MyRabbit) myPet).getVariant().getBukkitType());
    } else if (myPet instanceof MyGuardian) {
        ((Guardian) normalEntity).setElder(((MyGuardian) myPet).isElder());
    }
    if (myPet instanceof MyPetBaby && normalEntity instanceof Ageable) {
        if (((MyPetBaby) myPet).isBaby()) {
            ((Ageable) normalEntity).setBaby();
        } else {
            ((Ageable) normalEntity).setAdult();
        }
    }
}
Also used : TagCompound(de.keyle.knbt.TagCompound) MyPetBaby(de.Keyle.MyPet.api.entity.MyPetBaby) MaterialData(org.bukkit.material.MaterialData) ItemStack(org.bukkit.inventory.ItemStack)

Example 89 with MaterialData

use of org.bukkit.material.MaterialData in project MyPet by xXKeyleXx.

the class EntityConverterService method convertEntity.

@Override
public void convertEntity(MyPet myPet, LivingEntity normalEntity) {
    if (myPet instanceof MyCreeper) {
        if (((MyCreeper) myPet).isPowered()) {
            ((Creeper) normalEntity).setPowered(true);
        }
    } else if (myPet instanceof MyEnderman) {
        if (((MyEnderman) myPet).hasBlock()) {
            MaterialData materialData = new MaterialData(((MyEnderman) myPet).getBlock().getType(), ((MyEnderman) myPet).getBlock().getData().getData());
            ((Enderman) normalEntity).setCarriedMaterial(materialData);
        }
    } else if (myPet instanceof MyIronGolem) {
        ((IronGolem) normalEntity).setPlayerCreated(true);
    } else if (myPet instanceof MyMagmaCube) {
        ((MagmaCube) normalEntity).setSize(((MyMagmaCube) myPet).getSize());
    } else if (myPet instanceof MyOcelot) {
        ((Ocelot) normalEntity).setCatType(Ocelot.Type.WILD_OCELOT);
        ((Ocelot) normalEntity).setTamed(false);
    } else if (myPet instanceof MyPig) {
        ((Pig) normalEntity).setSaddle(((MyPig) myPet).hasSaddle());
    } else if (myPet instanceof MySheep) {
        ((Sheep) normalEntity).setSheared(((MySheep) myPet).isSheared());
        ((Sheep) normalEntity).setColor(((MySheep) myPet).getColor());
    } else if (myPet instanceof MyVillager) {
        MyVillager villagerPet = (MyVillager) myPet;
        Villager.Profession profession = Villager.Profession.values()[villagerPet.getProfession()];
        ((Villager) normalEntity).setProfession(profession);
        if (villagerPet.hasOriginalData()) {
            TagCompound villagerTag = MyPetApi.getPlatformHelper().entityToTag(normalEntity);
            for (String key : villagerPet.getOriginalData().getCompoundData().keySet()) {
                villagerTag.put(key, villagerPet.getOriginalData().get(key));
            }
            MyPetApi.getPlatformHelper().applyTagToEntity(villagerTag, normalEntity);
        }
    } else if (myPet instanceof MyWolf) {
        ((Wolf) normalEntity).setTamed(false);
    } else if (myPet instanceof MySlime) {
        ((Slime) normalEntity).setSize(((MySlime) myPet).getSize());
    } else if (myPet instanceof MyZombie) {
        if (((MyZombie) myPet).isVillager()) {
            Villager.Profession profession = Villager.Profession.values()[((MyZombie) myPet).getProfession()];
            ((Zombie) normalEntity).setVillagerProfession(profession);
        }
    } else if (myPet instanceof MySkeleton) {
        ((Skeleton) normalEntity).setSkeletonType(Skeleton.SkeletonType.values()[((MySkeleton) myPet).getType()]);
        if (((MySkeleton) myPet).isWither()) {
            normalEntity.getEquipment().setItemInHand(new ItemStack(Material.STONE_SWORD));
        } else {
            normalEntity.getEquipment().setItemInHand(new ItemStack(Material.BOW));
        }
    } else if (myPet instanceof MyPigZombie) {
        normalEntity.getEquipment().setItemInHand(new ItemStack(Material.GOLD_SWORD));
    } else if (myPet instanceof MyHorse) {
        Horse.Variant type = Horse.Variant.values()[((MyHorse) myPet).getHorseType()];
        Horse.Style style = Horse.Style.values()[(((MyHorse) myPet).getVariant() >>> 8)];
        Horse.Color color = Horse.Color.values()[(((MyHorse) myPet).getVariant() & 0xFF)];
        ((Horse) normalEntity).setVariant(type);
        ((Horse) normalEntity).setColor(color);
        ((Horse) normalEntity).setStyle(style);
        ((Horse) normalEntity).setCarryingChest(((MyHorse) myPet).hasChest());
        if (((MyHorse) myPet).hasSaddle()) {
            ((Horse) normalEntity).getInventory().setSaddle(((MyHorse) myPet).getSaddle().clone());
        }
        if (((MyHorse) myPet).hasArmor()) {
            ((Horse) normalEntity).getInventory().setArmor(((MyHorse) myPet).getArmor().clone());
        }
        ((Horse) normalEntity).setOwner(myPet.getOwner().getPlayer());
    } else if (myPet instanceof MyRabbit) {
        ((Rabbit) normalEntity).setRabbitType(((MyRabbit) myPet).getVariant().getBukkitType());
    } else if (myPet instanceof MyGuardian) {
        ((Guardian) normalEntity).setElder(((MyGuardian) myPet).isElder());
    }
    if (myPet instanceof MyPetBaby && normalEntity instanceof Ageable) {
        if (((MyPetBaby) myPet).isBaby()) {
            ((Ageable) normalEntity).setBaby();
        } else {
            ((Ageable) normalEntity).setAdult();
        }
    }
}
Also used : TagCompound(de.keyle.knbt.TagCompound) MyPetBaby(de.Keyle.MyPet.api.entity.MyPetBaby) MaterialData(org.bukkit.material.MaterialData) ItemStack(org.bukkit.inventory.ItemStack)

Example 90 with MaterialData

use of org.bukkit.material.MaterialData 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]);
                    int reqDurability = Integer.parseInt(part[1]);
                    ItemStack item = new ItemStack(reqItem);
                    // Item
                    item.setDurability((short) reqDurability);
                    // 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()) {
                            continue;
                        }
                        if (i.getDurability() == reqDurability) {
                            // 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;
                            final byte durability;
                            if (sPart.length == 2) {
                                // Only a quantity is specified
                                quantity = Integer.parseInt(sPart[1]);
                                durability = 0;
                            } else {
                                quantity = Integer.parseInt(sPart[2]);
                                durability = Byte.parseByte(sPart[1]);
                            }
                            neededItem.put(new MaterialData(item, durability), quantity);
                        // plugin.getLogger().info("DEBUG: Needed item is " + Integer.parseInt(sPart[1]) + " x " + Material.getMaterial(sPart[0]).toString());
                        } 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 (neededItem.containsKey(b)) {
                        if (neededItem.get(b) == 1) {
                            neededItem.remove(b);
                        } else {
                            // Reduce the require amount by 1
                            neededItem.put(b, neededItem.get(b) - 1);
                        }
                    }
                }
            }
        }
        // Check if all the needed items have been amassed
        if (!neededItem.isEmpty()) {
            // plugin.getLogger().info("DEBUG: Insufficient items around");
            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 : 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) 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)

Aggregations

MaterialData (org.bukkit.material.MaterialData)93 GlowBlockState (net.glowstone.block.GlowBlockState)20 ItemStack (org.bukkit.inventory.ItemStack)20 Material (org.bukkit.Material)13 Block (org.bukkit.block.Block)12 BlockState (org.bukkit.block.BlockState)12 GlowBlock (net.glowstone.block.GlowBlock)10 BlockFace (org.bukkit.block.BlockFace)10 MyPetBaby (de.Keyle.MyPet.api.entity.MyPetBaby)9 TagCompound (de.keyle.knbt.TagCompound)9 ArrayList (java.util.ArrayList)6 DoublePlant (org.bukkit.material.DoublePlant)6 Bed (org.bukkit.material.Bed)5 IOException (java.io.IOException)3 GlowDispenser (net.glowstone.block.state.GlowDispenser)3 Location (org.bukkit.Location)3 Player (org.bukkit.entity.Player)3 CocoaPlant (org.bukkit.material.CocoaPlant)3 Dispenser (org.bukkit.material.Dispenser)3 BukkitRunnable (org.bukkit.scheduler.BukkitRunnable)3