Example #1
0
 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);
       }
     }
   }
 }
Example #2
0
  @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
      }
    }
  }