/** * Handler for what blocks drop from the explosion. * * @param ores List of ore blocks destroyed by the explosion * @param debris List of non-ore blocks destroyed by the explosion * @param yield Percentage of blocks to drop * @param oreBonus Percentage bonus for ore drops * @param debrisReduction Percentage reduction for non-ore drops * @param extraDrops Number of times to drop each block * @return A list of blocks dropped from the explosion */ private static List<Block> explosionYields( List<Block> ores, List<Block> debris, float yield, float oreBonus, float debrisReduction, int extraDrops) { Iterator<Block> oresIterator = ores.iterator(); List<Block> blocksDropped = new ArrayList<Block>(); while (oresIterator.hasNext()) { Block temp = oresIterator.next(); if (random.nextFloat() < (yield + oreBonus)) { blocksDropped.add(temp); Mining.miningDrops(temp); if (!temp.hasMetadata("mcmmoPlacedBlock")) { for (int i = 1; i < extraDrops; i++) { blocksDropped.add(temp); Mining.miningDrops(temp); } } } } if (yield - debrisReduction > 0) { Iterator<Block> debrisIterator = debris.iterator(); while (debrisIterator.hasNext()) { Block temp = debrisIterator.next(); if (random.nextFloat() < (yield - debrisReduction)) Mining.miningDrops(temp); } } return blocksDropped; }
/** * Process Mining block drops. * * @param player The player mining the block * @param block The block being broken */ public static void miningBlockCheck(Player player, Block block) { if (block.hasMetadata("mcmmoPlacedBlock")) { return; } miningXP(player, block); if (canBeSuperBroken(block.getType())) { final int MAX_BONUS_LEVEL = 1000; int skillLevel = Users.getProfile(player).getSkillLevel(SkillType.MINING); if ((MAX_BONUS_LEVEL > 1000 || (Math.random() * 1000 <= skillLevel)) && mcPermissions.getInstance().miningDoubleDrops(player)) { if (player.getItemInHand().containsEnchantment(Enchantment.SILK_TOUCH)) { m.mcDropItem(block.getLocation(), new ItemStack(block.getType())); } else { miningDrops(block); } } } }