Browse Source

Fixes #3832 - Resolved issue with double drops & herbalism, similar fixes coming to woodcutting/mining soon. Reminder to update config.yml, read changelog for instructions.

If you harvest crops with a Hoe it does not require seeds to replant on successful Green Thumb
nossr50 6 years ago
parent
commit
255f7bf335

+ 1 - 0
Changelog.txt

@@ -11,6 +11,7 @@ Version 2.1.22
     Less aggressive spam click protection on Fishing
     Less aggressive spam click protection on Fishing
     Added all missing flowers to Double Drop tables for Herbalism
     Added all missing flowers to Double Drop tables for Herbalism
     Fixed Double Drop entries for all farming crops for Herbalism
     Fixed Double Drop entries for all farming crops for Herbalism
+    It no longer requires seeds to replant crops if you are harvesting crops with a hoe (will still consume seeds if you aren't)
     NOTE: You'll need to add these entries to your config.yml manually, or wait for the upcoming config update where this will be fixed for you automatically.
     NOTE: You'll need to add these entries to your config.yml manually, or wait for the upcoming config update where this will be fixed for you automatically.
     NOTE: Here's what your Double_Drop entries in Config.yml for Herbalism should look like: https://paste.gg/p/anonymous/8d8db4ac69bd495fa48a7f5190484c5e
     NOTE: Here's what your Double_Drop entries in Config.yml for Herbalism should look like: https://paste.gg/p/anonymous/8d8db4ac69bd495fa48a7f5190484c5e
 
 

+ 0 - 2
src/main/java/com/gmail/nossr50/commands/skills/SmeltingCommand.java

@@ -3,8 +3,6 @@ package com.gmail.nossr50.commands.skills;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.skills.smelting.Smelting;
-import com.gmail.nossr50.skills.smelting.SmeltingManager;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.TextComponentFactory;
 import com.gmail.nossr50.util.TextComponentFactory;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.player.UserManager;

+ 17 - 0
src/main/java/com/gmail/nossr50/listeners/BlockListener.java

@@ -35,6 +35,7 @@ import org.bukkit.Material;
 import org.bukkit.Tag;
 import org.bukkit.Tag;
 import org.bukkit.block.*;
 import org.bukkit.block.*;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Item;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Player;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.EventPriority;
 import org.bukkit.event.EventPriority;
@@ -54,6 +55,22 @@ public class BlockListener implements Listener {
         this.plugin = plugin;
         this.plugin = plugin;
     }
     }
 
 
+    @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
+    public void onBlockDropItemEvent(BlockDropItemEvent event)
+    {
+        for(Item item : event.getItems())
+        {
+            ItemStack is = new ItemStack(item.getItemStack());
+            if(event.getBlock().getState().getMetadata(mcMMO.doubleDropKey).size() > 0)
+                event.getBlock().getState().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is);
+            else if(event.getBlock().getState().getMetadata(mcMMO.tripleDropKey).size() > 0)
+            {
+                event.getBlock().getState().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is);
+                event.getBlock().getState().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is);
+            }
+        }
+    }
+
     /**
     /**
      * Monitor BlockPistonExtend events.
      * Monitor BlockPistonExtend events.
      *
      *

+ 0 - 1
src/main/java/com/gmail/nossr50/listeners/EntityListener.java

@@ -14,7 +14,6 @@ import com.gmail.nossr50.events.fake.FakeEntityTameEvent;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.party.PartyManager;
 import com.gmail.nossr50.party.PartyManager;
 import com.gmail.nossr50.skills.archery.Archery;
 import com.gmail.nossr50.skills.archery.Archery;
-import com.gmail.nossr50.skills.fishing.Fishing;
 import com.gmail.nossr50.skills.mining.BlastMining;
 import com.gmail.nossr50.skills.mining.BlastMining;
 import com.gmail.nossr50.skills.mining.MiningManager;
 import com.gmail.nossr50.skills.mining.MiningManager;
 import com.gmail.nossr50.skills.taming.Taming;
 import com.gmail.nossr50.skills.taming.Taming;

+ 0 - 1
src/main/java/com/gmail/nossr50/listeners/WorldListener.java

@@ -2,7 +2,6 @@ package com.gmail.nossr50.listeners;
 
 
 import com.gmail.nossr50.config.WorldBlacklist;
 import com.gmail.nossr50.config.WorldBlacklist;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
-import com.gmail.nossr50.util.blockmeta.conversion.BlockStoreConversionMain;
 import org.bukkit.Chunk;
 import org.bukkit.Chunk;
 import org.bukkit.World;
 import org.bukkit.World;
 import org.bukkit.block.BlockState;
 import org.bukkit.block.BlockState;

+ 2 - 0
src/main/java/com/gmail/nossr50/mcMMO.java

@@ -113,6 +113,8 @@ public class mcMMO extends JavaPlugin {
     public final static String disarmedItemKey     = "mcMMO: Disarmed Item";
     public final static String disarmedItemKey     = "mcMMO: Disarmed Item";
     public final static String playerDataKey       = "mcMMO: Player Data";
     public final static String playerDataKey       = "mcMMO: Player Data";
     public final static String greenThumbDataKey   = "mcMMO: Green Thumb";
     public final static String greenThumbDataKey   = "mcMMO: Green Thumb";
+    public final static String doubleDropKey       = "mcMMO: Double Drop";
+    public final static String tripleDropKey       = "mcMMO: Triple Drop";
     public final static String databaseCommandKey  = "mcMMO: Processing Database Command";
     public final static String databaseCommandKey  = "mcMMO: Processing Database Command";
     public final static String bredMetadataKey     = "mcMMO: Bred Animal";
     public final static String bredMetadataKey     = "mcMMO: Bred Animal";
 
 

+ 0 - 1
src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java

@@ -27,7 +27,6 @@ import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillUtils;
 import com.gmail.nossr50.util.skills.SkillUtils;
 import com.gmail.nossr50.util.sounds.SoundManager;
 import com.gmail.nossr50.util.sounds.SoundManager;
 import com.gmail.nossr50.util.sounds.SoundType;
 import com.gmail.nossr50.util.sounds.SoundType;
-import org.bukkit.Bukkit;
 import org.bukkit.Location;
 import org.bukkit.Location;
 import org.bukkit.Material;
 import org.bukkit.Material;
 import org.bukkit.block.Block;
 import org.bukkit.block.Block;

+ 25 - 13
src/main/java/com/gmail/nossr50/skills/herbalism/Herbalism.java

@@ -1,6 +1,7 @@
 package com.gmail.nossr50.skills.herbalism;
 package com.gmail.nossr50.skills.herbalism;
 
 
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
+import com.gmail.nossr50.util.BlockUtils;
 import com.gmail.nossr50.util.skills.SkillUtils;
 import com.gmail.nossr50.util.skills.SkillUtils;
 import org.bukkit.Material;
 import org.bukkit.Material;
 import org.bukkit.block.Block;
 import org.bukkit.block.Block;
@@ -42,11 +43,11 @@ public class Herbalism {
         }
         }
     }
     }
 
 
-    private static int calculateChorusPlantDrops(Block target) {
-        return calculateChorusPlantDropsRecursive(target, new HashSet<>());
+    private static int calculateChorusPlantDrops(Block target, boolean triple, HerbalismManager herbalismManager) {
+        return calculateChorusPlantDropsRecursive(target, new HashSet<>(), triple, herbalismManager);
     }
     }
 
 
-    private static int calculateChorusPlantDropsRecursive(Block target, HashSet<Block> traversed) {
+    private static int calculateChorusPlantDropsRecursive(Block target, HashSet<Block> traversed, boolean triple, HerbalismManager herbalismManager) {
         if (target.getType() != Material.CHORUS_PLANT)
         if (target.getType() != Material.CHORUS_PLANT)
             return 0;
             return 0;
 
 
@@ -62,10 +63,15 @@ public class Herbalism {
         if (mcMMO.getPlaceStore().isTrue(target))
         if (mcMMO.getPlaceStore().isTrue(target))
             mcMMO.getPlaceStore().setFalse(target);
             mcMMO.getPlaceStore().setFalse(target);
         else
         else
+        {
             dropAmount++;
             dropAmount++;
 
 
+            if(herbalismManager.checkDoubleDrop(target.getState()))
+                BlockUtils.markBlocksForBonusDrops(target.getState(), triple);
+        }
+
         for (BlockFace blockFace : new BlockFace[] { BlockFace.UP, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST ,BlockFace.WEST})
         for (BlockFace blockFace : new BlockFace[] { BlockFace.UP, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST ,BlockFace.WEST})
-            dropAmount += calculateChorusPlantDropsRecursive(target.getRelative(blockFace, 1), traversed);
+            dropAmount += calculateChorusPlantDropsRecursive(target.getRelative(blockFace, 1), traversed, triple, herbalismManager);
 
 
         return dropAmount;
         return dropAmount;
     }
     }
@@ -78,7 +84,7 @@ public class Herbalism {
      *            The {@link BlockState} of the bottom block of the plant
      *            The {@link BlockState} of the bottom block of the plant
      * @return the number of bonus drops to award from the blocks in this plant
      * @return the number of bonus drops to award from the blocks in this plant
      */
      */
-    protected static int calculateMultiBlockPlantDrops(BlockState blockState) {
+    protected static int countAndMarkDoubleDropsMultiBlockPlant(BlockState blockState, boolean triple, HerbalismManager herbalismManager) {
         Block block = blockState.getBlock();
         Block block = blockState.getBlock();
         Material blockType = blockState.getType();
         Material blockType = blockState.getType();
         int dropAmount = mcMMO.getPlaceStore().isTrue(block) ? 0 : 1;
         int dropAmount = mcMMO.getPlaceStore().isTrue(block) ? 0 : 1;
@@ -87,11 +93,11 @@ public class Herbalism {
             dropAmount = 1;
             dropAmount = 1;
 
 
             if (block.getRelative(BlockFace.DOWN, 1).getType() == Material.END_STONE) {
             if (block.getRelative(BlockFace.DOWN, 1).getType() == Material.END_STONE) {
-                dropAmount = calculateChorusPlantDrops(block);
+                dropAmount = calculateChorusPlantDrops(block, triple, herbalismManager);
             }
             }
         } else {
         } else {
             // Handle the two blocks above it - cacti & sugar cane can only grow 3 high naturally
             // Handle the two blocks above it - cacti & sugar cane can only grow 3 high naturally
-            for (int y = 1; y < 256; y++) {
+            for (int y = 1; y < 255; y++) {
                 Block relativeBlock = block.getRelative(BlockFace.UP, y);
                 Block relativeBlock = block.getRelative(BlockFace.UP, y);
 
 
                 if (relativeBlock.getType() != blockType) {
                 if (relativeBlock.getType() != blockType) {
@@ -102,6 +108,9 @@ public class Herbalism {
                     mcMMO.getPlaceStore().setFalse(relativeBlock);
                     mcMMO.getPlaceStore().setFalse(relativeBlock);
                 } else {
                 } else {
                     dropAmount++;
                     dropAmount++;
+
+                    if(herbalismManager.checkDoubleDrop(relativeBlock.getState()))
+                        BlockUtils.markBlocksForBonusDrops(relativeBlock.getState(), triple);
                 }
                 }
             }
             }
         }
         }
@@ -117,12 +126,11 @@ public class Herbalism {
      *            The {@link BlockState} of the bottom block of the plant
      *            The {@link BlockState} of the bottom block of the plant
      * @return the number of bonus drops to award from the blocks in this plant
      * @return the number of bonus drops to award from the blocks in this plant
      */
      */
-    protected static int calculateKelpPlantDrops(BlockState blockState) {
+    protected static int countAndMarkDoubleDropsKelp(BlockState blockState, boolean triple, HerbalismManager herbalismManager) {
         Block block = blockState.getBlock();
         Block block = blockState.getBlock();
 
 
-        int dropAmount = mcMMO.getPlaceStore().isTrue(block) ? 0 : 1;
-
-        int kelpMaxHeight = 256;
+        int kelpMaxHeight = 255;
+        int amount = 1;
 
 
         // Handle the two blocks above it - cacti & sugar cane can only grow 3 high naturally
         // Handle the two blocks above it - cacti & sugar cane can only grow 3 high naturally
         for (int y = 1; y < kelpMaxHeight; y++) {
         for (int y = 1; y < kelpMaxHeight; y++) {
@@ -131,10 +139,14 @@ public class Herbalism {
             if(!isKelp(relativeUpBlock))
             if(!isKelp(relativeUpBlock))
                 break;
                 break;
 
 
-            dropAmount = addKelpDrops(dropAmount, relativeUpBlock);
+            amount += 1;
+
+            if(herbalismManager.checkDoubleDrop(relativeUpBlock.getState()))
+                BlockUtils.markBlocksForBonusDrops(relativeUpBlock.getState(), triple);
+
         }
         }
 
 
-        return dropAmount;
+        return amount;
     }
     }
 
 
     private static int addKelpDrops(int dropAmount, Block relativeBlock) {
     private static int addKelpDrops(int dropAmount, Block relativeBlock) {

+ 29 - 28
src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java

@@ -31,7 +31,6 @@ import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.PlayerInventory;
 import org.bukkit.inventory.PlayerInventory;
 import org.bukkit.metadata.FixedMetadataValue;
 import org.bukkit.metadata.FixedMetadataValue;
 
 
-import java.util.Collection;
 import java.util.List;
 import java.util.List;
 
 
 public class HerbalismManager extends SkillManager {
 public class HerbalismManager extends SkillManager {
@@ -138,8 +137,7 @@ public class HerbalismManager extends SkillManager {
             return;
             return;
         }
         }
 
 
-        Collection<ItemStack> drops = null;
-        int amount = 1;
+        int amount;
         int xp;
         int xp;
         boolean greenTerra = mcMMOPlayer.getAbilityMode(skill.getAbility());
         boolean greenTerra = mcMMOPlayer.getAbilityMode(skill.getAbility());
 
 
@@ -148,45 +146,44 @@ public class HerbalismManager extends SkillManager {
             xp = customBlock.getXpGain();
             xp = customBlock.getXpGain();
 
 
             if (Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_DOUBLE_DROPS) && customBlock.isDoubleDropEnabled()) {
             if (Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_DOUBLE_DROPS) && customBlock.isDoubleDropEnabled()) {
-                drops = blockState.getBlock().getDrops();
+                if(checkDoubleDrop(blockState))
+                    BlockUtils.markBlocksForBonusDrops(blockState, greenTerra);
             }
             }
         }
         }
         else {
         else {
             xp = ExperienceConfig.getInstance().getXp(skill, blockState.getBlockData());
             xp = ExperienceConfig.getInstance().getXp(skill, blockState.getBlockData());
 
 
-            if (Config.getInstance().getDoubleDropsEnabled(skill, material) && Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_DOUBLE_DROPS)) {
-                drops = blockState.getBlock().getDrops();
-            }
-
             if (!oneBlockPlant) {
             if (!oneBlockPlant) {
                 //Kelp is actually two blocks mixed together
                 //Kelp is actually two blocks mixed together
                 if(material == Material.KELP_PLANT || material == Material.KELP) {
                 if(material == Material.KELP_PLANT || material == Material.KELP) {
-                    amount = Herbalism.calculateKelpPlantDrops(blockState);
+                    amount = Herbalism.countAndMarkDoubleDropsKelp(blockState, greenTerra,this);
                 } else {
                 } else {
-                    amount = Herbalism.calculateMultiBlockPlantDrops(blockState);
+                    amount = Herbalism.countAndMarkDoubleDropsMultiBlockPlant(blockState, greenTerra, this);
                 }
                 }
 
 
                 xp *= amount;
                 xp *= amount;
+            } else {
+                /* MARK SINGLE BLOCK CROP FOR DOUBLE DROP */
+                if(checkDoubleDrop(blockState))
+                    BlockUtils.markBlocksForBonusDrops(blockState, greenTerra);
             }
             }
-            
+
             if (Permissions.greenThumbPlant(player, material)) {
             if (Permissions.greenThumbPlant(player, material)) {
                 processGreenThumbPlants(blockState, greenTerra);
                 processGreenThumbPlants(blockState, greenTerra);
             }
             }
         }
         }
 
 
         applyXpGain(xp, XPGainReason.PVE);
         applyXpGain(xp, XPGainReason.PVE);
+    }
 
 
-        if (drops == null) {
-            return;
-        }
-
-        for (int i = greenTerra ? 2 : 1; i != 0; i--) {
-            if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.HERBALISM_DOUBLE_DROPS, player)) {
-                for (ItemStack item : drops) {
-                    Misc.dropItems(Misc.getBlockCenter(blockState), item, amount);
-                }
-            }
-        }
+    /**
+     * Check for success on herbalism double drops
+     * @param blockState target block state
+     * @return true if double drop succeeds
+     */
+    public boolean checkDoubleDrop(BlockState blockState)
+    {
+        return BlockUtils.checkDoubleDrops(getPlayer(), blockState, skill, SubSkillType.HERBALISM_DOUBLE_DROPS);
     }
     }
 
 
     /**
     /**
@@ -320,20 +317,24 @@ public class HerbalismManager extends SkillManager {
 
 
         ItemStack seedStack = new ItemStack(seed);
         ItemStack seedStack = new ItemStack(seed);
 
 
-        if (!playerInventory.containsAtLeast(seedStack, 1)) {
+        if (!greenTerra && !RandomChanceUtil.checkRandomChanceExecutionSuccess(player, SubSkillType.HERBALISM_GREEN_THUMB, true)) {
             return;
             return;
         }
         }
 
 
-        if (!greenTerra && !RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.HERBALISM_GREEN_THUMB, player)) {
+        if (!handleBlockState(blockState, greenTerra)) {
             return;
             return;
         }
         }
 
 
-        if (!handleBlockState(blockState, greenTerra)) {
-            return;
+        if(!ItemUtils.isHoe(getPlayer().getInventory().getItemInMainHand()))
+        {
+            if (!playerInventory.containsAtLeast(seedStack, 1)) {
+                return;
+            }
+
+            playerInventory.removeItem(seedStack);
+            player.updateInventory(); // Needed until replacement available
         }
         }
 
 
-        playerInventory.removeItem(seedStack);
-        player.updateInventory(); // Needed until replacement available
         new HerbalismBlockUpdaterTask(blockState).runTaskLater(mcMMO.p, 0);
         new HerbalismBlockUpdaterTask(blockState).runTaskLater(mcMMO.p, 0);
     }
     }
 
 

+ 0 - 1
src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java

@@ -1,6 +1,5 @@
 package com.gmail.nossr50.skills.smelting;
 package com.gmail.nossr50.skills.smelting;
 
 
-import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.config.experience.ExperienceConfig;
 import com.gmail.nossr50.config.experience.ExperienceConfig;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;

+ 0 - 12
src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java

@@ -1,28 +1,16 @@
 package com.gmail.nossr50.skills.smelting;
 package com.gmail.nossr50.skills.smelting;
 
 
-import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.datatypes.experience.XPGainReason;
 import com.gmail.nossr50.datatypes.experience.XPGainReason;
 import com.gmail.nossr50.datatypes.experience.XPGainSource;
 import com.gmail.nossr50.datatypes.experience.XPGainSource;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
-import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.skills.SkillManager;
-import com.gmail.nossr50.skills.mining.Mining;
-import com.gmail.nossr50.util.BlockUtils;
-import com.gmail.nossr50.util.EventUtils;
-import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.random.RandomChanceUtil;
-import com.gmail.nossr50.util.skills.ParticleEffectUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.util.skills.SkillActivationType;
-import com.gmail.nossr50.util.skills.SkillUtils;
-import com.gmail.nossr50.util.sounds.SoundManager;
-import com.gmail.nossr50.util.sounds.SoundType;
-import org.bukkit.Material;
 import org.bukkit.block.BlockState;
 import org.bukkit.block.BlockState;
-import org.bukkit.entity.Player;
 import org.bukkit.event.inventory.FurnaceBurnEvent;
 import org.bukkit.event.inventory.FurnaceBurnEvent;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.ItemStack;
 
 

+ 33 - 0
src/main/java/com/gmail/nossr50/util/BlockUtils.java

@@ -1,14 +1,19 @@
 package com.gmail.nossr50.util;
 package com.gmail.nossr50.util;
 
 
+import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.experience.ExperienceConfig;
 import com.gmail.nossr50.config.experience.ExperienceConfig;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
+import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.repair.Repair;
 import com.gmail.nossr50.skills.repair.Repair;
 import com.gmail.nossr50.skills.salvage.Salvage;
 import com.gmail.nossr50.skills.salvage.Salvage;
+import com.gmail.nossr50.util.random.RandomChanceSkill;
+import com.gmail.nossr50.util.random.RandomChanceUtil;
 import org.bukkit.Material;
 import org.bukkit.Material;
 import org.bukkit.block.BlockState;
 import org.bukkit.block.BlockState;
 import org.bukkit.block.data.Ageable;
 import org.bukkit.block.data.Ageable;
 import org.bukkit.block.data.BlockData;
 import org.bukkit.block.data.BlockData;
+import org.bukkit.entity.Player;
 
 
 import java.util.HashSet;
 import java.util.HashSet;
 
 
@@ -16,6 +21,34 @@ public final class BlockUtils {
 
 
     private BlockUtils() {}
     private BlockUtils() {}
 
 
+    /**
+     * Mark a block for giving bonus drops, double drops are used if triple is false
+     * @param blockState target blockstate
+     * @param triple marks the block to give triple drops
+     */
+    public static void markBlocksForBonusDrops(BlockState blockState, boolean triple)
+    {
+        if(triple)
+            blockState.setMetadata(mcMMO.tripleDropKey, mcMMO.metadataValue);
+        else
+            blockState.setMetadata(mcMMO.doubleDropKey, mcMMO.metadataValue);
+    }
+
+    /**
+     * Checks if a player successfully passed the double drop check
+     * @param blockState the blockstate
+     * @return true if the player succeeded in the check
+     */
+    public static boolean checkDoubleDrops(Player player, BlockState blockState, PrimarySkillType skillType, SubSkillType subSkillType)
+    {
+        if(Config.getInstance().getDoubleDropsEnabled(skillType, blockState.getType()) && Permissions.isSubSkillEnabled(player, subSkillType))
+        {
+            return RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkill(player, subSkillType, true));
+        }
+
+        return false;
+    }
+
     /**
     /**
      * Checks to see if a given block awards XP.
      * Checks to see if a given block awards XP.
      *
      *

+ 0 - 1
src/main/java/com/gmail/nossr50/worldguard/WorldGuardUtils.java

@@ -1,7 +1,6 @@
 package com.gmail.nossr50.worldguard;
 package com.gmail.nossr50.worldguard;
 
 
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
-import com.sk89q.worldguard.WorldGuard;
 import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
 import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
 import org.bukkit.plugin.Plugin;
 import org.bukkit.plugin.Plugin;