private void disperseDrops( final Player cause, final Sprout sprout, final Block block, final boolean bonus) { if (cause != null && cause.getGameMode() == GameMode.CREATIVE) { return; } if (!sprout.isFullyGrown()) { return; } final Collection<Drop> drops = sprout.getDrops(); for (Drop drop : drops) { final org.getspout.spoutapi.material.Material customMaterial = MaterialData.getCustomItem(drop.getName()); if (customMaterial == null) { final Material material = Material.getMaterial(drop.getName().toUpperCase()); if (material == null) { continue; } final ItemStack stack = new ItemStack(material, drop.getAmount()); block.getWorld().dropItemNaturally(block.getLocation(), stack); } else { final SpoutItemStack spoutStack = new SpoutItemStack(customMaterial, drop.getAmount()); block.getWorld().dropItemNaturally(block.getLocation(), spoutStack); } } if (bonus) { final Collection<Drop> bonusDrops = sprout.getBonus(); for (Drop drop : bonusDrops) { final org.getspout.spoutapi.material.Material customMaterial = MaterialData.getCustomItem(drop.getName()); if (customMaterial == null) { final Material material = Material.getMaterial(drop.getName().toUpperCase()); if (material == null) { continue; } final ItemStack stack = new ItemStack(material, drop.getAmount()); block.getWorld().dropItemNaturally(block.getLocation(), stack); } else { final SpoutItemStack spoutStack = new SpoutItemStack(customMaterial, drop.getAmount()); block.getWorld().dropItemNaturally(block.getLocation(), spoutStack); } } } }
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { final Block block = event.getBlock(); // Handle random seed drops. To preserve a possible LongGrass base block, make sure it isn't a // custom block // TODO Configurable. if (event.getBlock().getType() == Material.LONG_GRASS && !(((SpoutBlock) block).getBlockType() instanceof CustomBlock) && RANDOM.nextInt(10 - 1) + 1 == 7) { // 10% chance for a drop. final Sprout sprout = plugin.getSproutRegistry().get(RANDOM.nextInt(plugin.getSproutRegistry().size())); if (sprout == null) { return; } if (!sprout.getVariables().dropItemSourceOnGrassBreak()) { return; } disperseSeeds(event.getPlayer(), sprout, block); } else { // Handle breaking of Sprouts final Sprout sprout = plugin .getWorldRegistry() .get(block.getWorld().getName(), block.getX(), block.getY(), block.getZ()); final SaveThread thread = ((SaveThread) ThreadRegistry.get(block.getWorld().getName())); if (sprout == null) { return; } event.setCancelled(true); // Cancels Bukkit Event, SpoutPlugin events proceed this. // Handle Custom Tools, Required tools first. SpoutItemStack handStack = null; if (event.getPlayer().getItemInHand() != null) { handStack = new SpoutItemStack(event.getPlayer().getItemInHand()); } boolean foundSproutTool = false; boolean foundStageTool = false; // Sprout based Tools if (handStack != null && handStack.isCustomItem() && !sprout.getRequiredTools().isEmpty()) { for (Tool requiredTool : sprout.getRequiredTools()) { if (requiredTool .getName() .equalsIgnoreCase(((CustomItem) handStack.getMaterial()).getFullName())) { // Found exact tool. foundSproutTool = true; break; } } } // Stage based Tools if (handStack != null && handStack.isCustomItem() && !sprout.getCurrentStage().getRequiredTools().isEmpty()) { for (Tool requiredStageTool : sprout.getCurrentStage().getRequiredTools()) { if (requiredStageTool .getName() .equalsIgnoreCase(((CustomItem) handStack.getMaterial()).getFullName())) { // Found exact tool. foundStageTool = true; break; } } } // Sprout Tool Lookup if (!foundSproutTool && !sprout.getRequiredTools().isEmpty() && !event.getPlayer().getGameMode().equals(GameMode.CREATIVE)) { // Invalid tool or item in hand null event .getPlayer() .sendMessage( ChatColor.DARK_AQUA + "[Sprout]" + ChatColor.WHITE + " Requires a tool to harvest."); return; } // Stage Tool Lookup if (!foundStageTool && !sprout.getCurrentStage().getRequiredTools().isEmpty() && !event.getPlayer().getGameMode().equals(GameMode.CREATIVE)) { // Invalid tool or item in hand null event .getPlayer() .sendMessage( ChatColor.DARK_AQUA + "[Sprout]" + ChatColor.WHITE + " Requires a tool to harvest."); return; } // Handle Jobs Integration Calls if (SproutConfiguration.jobsEnabled) { if (!Jobs.hasRequiredJobAndLevel( event.getPlayer(), "Farmer", sprout.getMinimumLevelRequired())) { event .getPlayer() .sendMessage( ChatColor.DARK_AQUA + "[Sprout]" + ChatColor.WHITE + " Harvesting this crop requires the job " + ChatColor.GOLD + "[Farmer]" + ChatColor.WHITE + ", at level " + ChatColor.GOLD + sprout.getMinimumLevelRequired() + ChatColor.WHITE + " or higher."); return; } JobsWorker.jobsBreak(event.getPlayer(), block); } // Clear current location block.setType(Material.AIR); ((SpoutBlock) block).setCustomBlock(null); // Lets roll a dice for a bonus! if (!event.getPlayer().getGameMode().equals(GameMode.CREATIVE) && (sprout.isFullyGrown())) { if (!sprout.getBonus().isEmpty()) { int bonusModifier = 0; if (handStack != null && !sprout.getCurrentStage().getBonusTools().isEmpty()) { for (Tool bonusTool : sprout.getCurrentStage().getBonusTools()) { if (bonusTool .getName() .equalsIgnoreCase(((CustomItem) handStack.getMaterial()).getFullName())) { bonusModifier = bonusTool.getBonusAmount(); break; } } } else if (handStack != null && !sprout.getBonusTools().isEmpty()) { for (Tool bonusTool : sprout.getBonusTools()) { if (bonusTool .getName() .equalsIgnoreCase(((CustomItem) handStack.getMaterial()).getFullName())) { bonusModifier = bonusTool.getBonusAmount(); break; } } } if (sprout.getBonusChance() - bonusModifier < 0) { // Automatic bonus drop disperseDrops(event.getPlayer(), sprout, block, true); } else if (RANDOM.nextInt((sprout.getBonusChance() - bonusModifier) + 1) == (sprout.getBonusChance() - bonusModifier)) { if (SproutConfiguration.bonusMessage) { event .getPlayer() .sendMessage( ChatColor.DARK_AQUA + "[Sprout]" + ChatColor.WHITE + " You get a bonus drop!"); } disperseDrops(event.getPlayer(), sprout, block, true); } } disperseDrops(event.getPlayer(), sprout, block, false); } // Remove Sprout from Db. if (thread != null) { thread.remove(block.getLocation(), (SimpleSprout) sprout); // Remove from DB. plugin .getWorldRegistry() .remove( block.getWorld().getName(), block.getX(), block.getY(), block.getZ()); // Remove from Registry } } }