Browse Source

Improve our drop handling.

GJ 11 years ago
parent
commit
0c83bf2a80

+ 1 - 23
src/main/java/com/gmail/nossr50/config/mods/CustomBlockConfig.java

@@ -7,7 +7,6 @@ import java.util.Set;
 
 import org.bukkit.Material;
 import org.bukkit.configuration.ConfigurationSection;
-import org.bukkit.inventory.ItemStack;
 import org.bukkit.material.MaterialData;
 
 import com.gmail.nossr50.config.ConfigLoader;
@@ -92,27 +91,6 @@ public class CustomBlockConfig extends ConfigLoader {
 
             int xp = config.getInt(skillType + "." + blockName + ".XP_Gain");
 
-            boolean shouldDropItem = config.getBoolean(skillType + "." + blockName + ".Drop_Item");
-            Material dropMaterial = Material.matchMaterial(config.getString(skillType + "." + blockName + ".Drop_Item_Name"));
-
-            if (shouldDropItem && dropMaterial == null) {
-                plugin.getLogger().warning("Incomplete item drop information. This block will drop itself. - " + blockInfo[0]);
-                shouldDropItem = false;
-            }
-
-            ItemStack itemDrop;
-
-            if (shouldDropItem) {
-                byte dropData = (byte) config.getInt(skillType + "." + blockName + ".Drop_Item_Data_Value");
-                itemDrop = (new MaterialData(dropMaterial, dropData)).toItemStack(1);
-            }
-            else {
-                itemDrop = blockMaterialData.toItemStack(1);
-            }
-
-            int minimumDropAmount = config.getInt(skillType + "." + blockName + ".Min_Drop_Item_Amount", 1);
-            int maxiumDropAmount = config.getInt(skillType + "." + blockName + ".Max_Drop_Item_Amount", 1);
-
             if (skillType.equals("Mining") && config.getBoolean(skillType + "." + blockName + ".Is_Ore")) {
                 customOres.add(blockMaterialData);
             }
@@ -126,7 +104,7 @@ public class CustomBlockConfig extends ConfigLoader {
                 }
             }
 
-            customBlockMap.put(blockMaterialData, new CustomBlock(minimumDropAmount, maxiumDropAmount, itemDrop, xp));
+            customBlockMap.put(blockMaterialData, new CustomBlock(xp, config.getBoolean(skillType + "." + blockName + ".Double_Drops_Enabled")));
         }
     }
 

+ 5 - 19
src/main/java/com/gmail/nossr50/datatypes/mods/CustomBlock.java

@@ -1,33 +1,19 @@
 package com.gmail.nossr50.datatypes.mods;
 
-import org.bukkit.inventory.ItemStack;
-
 public class CustomBlock {
     private int xpGain;
-    private ItemStack itemDrop;
-    private int minimumDropAmount;
-    private int maximumDropAmount;
+    private boolean canDoubleDrop;
 
-    public CustomBlock(int minimumDropAmount, int maximumDropAmount, ItemStack itemDrop, int xpGain) {
+    public CustomBlock(int xpGain, boolean canDoubleDrop) {
         this.xpGain = xpGain;
-        this.itemDrop = itemDrop;
-        this.minimumDropAmount = minimumDropAmount;
-        this.maximumDropAmount = maximumDropAmount;
+        this.canDoubleDrop = canDoubleDrop;
     }
 
     public int getXpGain() {
         return xpGain;
     }
 
-    public ItemStack getItemDrop() {
-        return itemDrop;
-    }
-
-    public int getMinimumDropAmount() {
-        return minimumDropAmount;
-    }
-
-    public int getMaximumDropAmount() {
-        return maximumDropAmount;
+    public boolean isDoubleDropEnabled() {
+        return canDoubleDrop;
     }
 }

+ 4 - 3
src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java

@@ -20,6 +20,7 @@ import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.experience.ExperienceConfig;
 import com.gmail.nossr50.config.treasure.TreasureConfig;
+import com.gmail.nossr50.datatypes.mods.CustomBlock;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.AbilityType;
 import com.gmail.nossr50.datatypes.skills.SkillType;
@@ -135,10 +136,10 @@ public class HerbalismManager extends SkillManager {
         boolean greenTerra = mcMMOPlayer.getAbilityMode(skill.getAbility());
 
         if (ModUtils.isCustomHerbalismBlock(blockState)) {
-            xp = ModUtils.getCustomBlock(blockState).getXpGain();
+            CustomBlock customBlock = ModUtils.getCustomBlock(blockState);
+            xp = customBlock.getXpGain();
 
-            // XXX: Add double drop check to blocks.yml
-            if (Permissions.doubleDrops(player, skill)) {
+            if (Permissions.doubleDrops(player, skill) && customBlock.isDoubleDropEnabled()) {
                 drops = blockState.getBlock().getDrops();
             }
         }

+ 6 - 26
src/main/java/com/gmail/nossr50/skills/mining/Mining.java

@@ -1,6 +1,5 @@
 package com.gmail.nossr50.skills.mining;
 
-import org.bukkit.Location;
 import org.bukkit.Material;
 import org.bukkit.block.BlockState;
 import org.bukkit.inventory.ItemStack;
@@ -8,7 +7,6 @@ import org.bukkit.inventory.ItemStack;
 import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.experience.ExperienceConfig;
-import com.gmail.nossr50.datatypes.mods.CustomBlock;
 import com.gmail.nossr50.datatypes.skills.SkillType;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.ModUtils;
@@ -88,10 +86,7 @@ public class Mining {
      * @param blockState The {@link BlockState} to check ability activation for
      */
     protected static void handleMiningDrops(BlockState blockState) {
-        Material blockType = blockState.getType();
-        Location location = blockState.getLocation();
-
-        switch (blockType) {
+        switch (blockState.getType()) {
             case COAL_ORE:
             case DIAMOND_ORE:
             case EMERALD_ORE:
@@ -104,36 +99,21 @@ public class Mining {
             case MOSSY_COBBLESTONE:
             case NETHERRACK:
             case OBSIDIAN:
+            case REDSTONE_ORE:
             case SANDSTONE:
             case QUARTZ_ORE:
-                for (ItemStack drop : blockState.getBlock().getDrops()) {
-                    Misc.dropItem(location, drop);
-                }
+                Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
                 return;
 
             case GLOWING_REDSTONE_ORE:
-            case REDSTONE_ORE:
                 if (Config.getInstance().getDoubleDropsEnabled(SkillType.MINING, Material.REDSTONE_ORE)) {
-                    for (ItemStack drop : blockState.getBlock().getDrops()) {
-                        Misc.dropItem(location, drop);
-                    }
+                    Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
                 }
                 return;
+
             default:
                 if (ModUtils.isCustomMiningBlock(blockState)) {
-                    CustomBlock customBlock = ModUtils.getCustomBlock(blockState);
-                    int minimumDropAmount = customBlock.getMinimumDropAmount();
-                    int maximumDropAmount = customBlock.getMaximumDropAmount();
-
-                    ItemStack dropItem = customBlock.getItemDrop();
-
-                    if (minimumDropAmount != maximumDropAmount) {
-                        Misc.dropItems(location, dropItem, minimumDropAmount);
-                        Misc.randomDropItems(location, dropItem, maximumDropAmount - minimumDropAmount);
-                    }
-                    else {
-                        Misc.dropItems(location, dropItem, minimumDropAmount);
-                    }
+                    Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
                 }
                 return;
         }

+ 2 - 1
src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java

@@ -23,6 +23,7 @@ import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.skills.mining.BlastMining.Tier;
 import com.gmail.nossr50.util.BlockUtils;
 import com.gmail.nossr50.util.Misc;
+import com.gmail.nossr50.util.ModUtils;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.skills.SkillUtils;
 
@@ -69,7 +70,7 @@ public class MiningManager extends SkillManager {
             SkillUtils.handleDurabilityChange(getPlayer().getItemInHand(), Config.getInstance().getAbilityToolDamage());
         }
 
-        if (material != Material.GLOWING_REDSTONE_ORE && !Config.getInstance().getDoubleDropsEnabled(skill, material)) {
+        if ((ModUtils.isCustomMiningBlock(blockState) && !ModUtils.getCustomBlock(blockState).isDoubleDropEnabled()) || material != Material.GLOWING_REDSTONE_ORE && !Config.getInstance().getDoubleDropsEnabled(skill, material)) {
             return;
         }
 

+ 5 - 8
src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java

@@ -1,6 +1,5 @@
 package com.gmail.nossr50.skills.smelting;
 
-import org.bukkit.Location;
 import org.bukkit.Material;
 import org.bukkit.block.BlockState;
 import org.bukkit.entity.Player;
@@ -28,6 +27,10 @@ public class SmeltingManager extends SkillManager {
         return getSkillLevel() >= Smelting.fluxMiningUnlockLevel && BlockUtils.affectedByFluxMining(blockState) && Permissions.fluxMining(getPlayer()) && !mcMMO.getPlaceStore().isTrue(blockState);
     }
 
+    public boolean isDoubleDropSuccessful() {
+        return Permissions.doubleDrops(getPlayer(), skill) && SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Mining.doubleDropsMaxChance, Mining.doubleDropsMaxLevel);
+    }
+
     /**
      * Process the Flux Mining ability.
      *
@@ -57,13 +60,7 @@ public class SmeltingManager extends SkillManager {
                 return false;
             }
 
-            Location location = blockState.getLocation();
-
-            Misc.dropItem(location, item);
-
-            if (Permissions.doubleDrops(player, skill) && SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Mining.doubleDropsMaxChance, Mining.doubleDropsMaxLevel)) {
-                Misc.dropItem(location, item);
-            }
+            Misc.dropItems(blockState.getLocation(), item, isDoubleDropSuccessful() ? 2 : 1);
 
             blockState.setType(Material.AIR);
             player.sendMessage(LocaleLoader.getString("Smelting.FluxMining.Success"));

+ 7 - 23
src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java

@@ -3,7 +3,6 @@ package com.gmail.nossr50.skills.woodcutting;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.bukkit.Location;
 import org.bukkit.Material;
 import org.bukkit.block.BlockState;
 import org.bukkit.enchantments.Enchantment;
@@ -14,7 +13,6 @@ import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.experience.ExperienceConfig;
-import com.gmail.nossr50.datatypes.mods.CustomBlock;
 import com.gmail.nossr50.util.BlockUtils;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.ModUtils;
@@ -87,46 +85,32 @@ public final class Woodcutting {
      * @param blockState Block being broken
      */
     protected static void checkForDoubleDrop(BlockState blockState) {
-        if (ModUtils.isCustomLogBlock(blockState)) {
-            CustomBlock customBlock = ModUtils.getCustomBlock(blockState);
-            int minimumDropAmount = customBlock.getMinimumDropAmount();
-            int maximumDropAmount = customBlock.getMaximumDropAmount();
-            Location location = blockState.getLocation();
-            ItemStack item = customBlock.getItemDrop();
-
-            Misc.dropItems(location, item, minimumDropAmount);
-
-            if (minimumDropAmount != maximumDropAmount) {
-                Misc.randomDropItems(location, item, maximumDropAmount - minimumDropAmount);
-            }
+        if (ModUtils.isCustomLogBlock(blockState) && ModUtils.getCustomBlock(blockState).isDoubleDropEnabled()) {
+            Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
         }
         else {
-            Location location = blockState.getLocation();
-            Tree tree = (Tree) blockState.getData();
-            ItemStack item = tree.toItemStack(1);
-
-            switch (tree.getSpecies()) {
+            switch (((Tree) blockState.getData()).getSpecies()) {
                 case GENERIC:
                     if (Config.getInstance().getOakDoubleDropsEnabled()) {
-                        Misc.dropItem(location, item);
+                        Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
                     }
                     return;
 
                 case REDWOOD:
                     if (Config.getInstance().getSpruceDoubleDropsEnabled()) {
-                        Misc.dropItem(location, item);
+                        Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
                     }
                     return;
 
                 case BIRCH:
                     if (Config.getInstance().getBirchDoubleDropsEnabled()) {
-                        Misc.dropItem(location, item);
+                        Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
                     }
                     return;
 
                 case JUNGLE:
                     if (Config.getInstance().getJungleDoubleDropsEnabled()) {
-                        Misc.dropItem(location, item);
+                        Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
                     }
                     return;
 

+ 9 - 18
src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java

@@ -3,8 +3,8 @@ package com.gmail.nossr50.skills.woodcutting;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.bukkit.Location;
 import org.bukkit.Material;
+import org.bukkit.block.Block;
 import org.bukkit.block.BlockFace;
 import org.bukkit.block.BlockState;
 import org.bukkit.entity.Player;
@@ -127,7 +127,9 @@ public class WoodcuttingManager extends SkillManager {
         int xp = 0;
 
         for (BlockState blockState : treeFellerBlocks) {
-            if (!SkillUtils.blockBreakSimulate(blockState.getBlock(), player, true)) {
+            Block block = blockState.getBlock();
+
+            if (!SkillUtils.blockBreakSimulate(block, player, true)) {
                 break; // TODO: Shouldn't we use continue instead?
             }
 
@@ -135,10 +137,7 @@ public class WoodcuttingManager extends SkillManager {
 
             if (material == Material.HUGE_MUSHROOM_1 || material == Material.HUGE_MUSHROOM_2) {
                 xp += Woodcutting.getExperienceFromLog(blockState, ExperienceGainMethod.TREE_FELLER);
-
-                for (ItemStack drop : blockState.getBlock().getDrops()) {
-                    Misc.dropItem(blockState.getLocation(), drop);
-                }
+                Misc.dropItems(blockState.getLocation(), block.getDrops());
             }
             else if (ModUtils.isCustomLogBlock(blockState)) {
                 if (canGetDoubleDrops()) {
@@ -147,19 +146,11 @@ public class WoodcuttingManager extends SkillManager {
 
                 CustomBlock customBlock = ModUtils.getCustomBlock(blockState);
                 xp = customBlock.getXpGain();
-                int minimumDropAmount = customBlock.getMinimumDropAmount();
-                int maximumDropAmount = customBlock.getMaximumDropAmount();
-                Location location = blockState.getLocation();
-                ItemStack item = customBlock.getItemDrop();;
 
-                Misc.dropItems(location, item, minimumDropAmount);
-
-                if (minimumDropAmount < maximumDropAmount) {
-                    Misc.randomDropItems(location, item, maximumDropAmount - minimumDropAmount);
-                }
+                Misc.dropItems(blockState.getLocation(), block.getDrops());
             }
             else if (ModUtils.isCustomLeafBlock(blockState)) {
-                Misc.randomDropItem(blockState.getLocation(), ModUtils.getCustomBlock(blockState).getItemDrop(), 10);
+                Misc.randomDropItems(blockState.getLocation(), block.getDrops(), 10.0);
             }
             else {
                 Tree tree = (Tree) blockState.getData();
@@ -171,11 +162,11 @@ public class WoodcuttingManager extends SkillManager {
                             Woodcutting.checkForDoubleDrop(blockState);
                         }
                         xp += Woodcutting.getExperienceFromLog(blockState, ExperienceGainMethod.TREE_FELLER);
-                        Misc.dropItem(blockState.getLocation(), tree.toItemStack(1));
+                        Misc.dropItems(blockState.getLocation(), block.getDrops());
                         break;
 
                     case LEAVES:
-                        Misc.randomDropItem(blockState.getLocation(), new ItemStack(Material.SAPLING, 1, tree.getSpecies().getData()), 10);
+                        Misc.randomDropItems(blockState.getLocation(), block.getDrops(), 10.0);
                         break;
 
                     default:

+ 7 - 1
src/main/java/com/gmail/nossr50/util/Misc.java

@@ -138,7 +138,7 @@ public final class Misc {
      * @param is The item to drop
      * @param chance The percentage chance for the item to drop
      */
-    public static void randomDropItem(Location location, ItemStack is, int chance) {
+    public static void randomDropItem(Location location, ItemStack is, double chance) {
         if (random.nextInt(100) < chance) {
             dropItem(location, is);
         }
@@ -160,6 +160,12 @@ public final class Misc {
         }
     }
 
+    public static void randomDropItems(Location location, Collection<ItemStack> drops, double chance) {
+        for (ItemStack item : drops) {
+            randomDropItem(location, item, chance);
+        }
+    }
+
     /**
      * Drop an item at a given location.
      *

+ 8 - 40
src/main/resources/mods/blocks.yml

@@ -4,18 +4,10 @@
 Excavation:
     Block_1|0:
         XP_Gain: 99
-        Drop_Item: false
-        Drop_Item_Name: BLOCK_DROP
-        Drop_Item_Data_Value: 0
-        Min_Drop_Item_Amount: 1
-        Max_Drop_Item_Amount: 1
+        Double_Drops_Enabled: true
     Block_2|0:
         XP_Gain: 99
-        Drop_Item: false
-        Drop_Item_Name: BLOCK_DROP
-        Drop_Item_Data_Value: 0
-        Min_Drop_Item_Amount: 1
-        Max_Drop_Item_Amount: 1
+        Double_Drops_Enabled: true
 
 #
 #  Settings for Custom Herbalism Blocks
@@ -23,18 +15,10 @@ Excavation:
 Herbalism:
     Block_1|0:
         XP_Gain: 99
-        Drop_Item: false
-        Drop_Item_Name: BLOCK_DROP
-        Drop_Item_Data_Value: 0
-        Min_Drop_Item_Amount: 1
-        Max_Drop_Item_Amount: 1
+        Double_Drops_Enabled: true
     Block_2|0:
         XP_Gain: 99
-        Drop_Item: false
-        Drop_Item_Name: BLOCK_DROP
-        Drop_Item_Data_Value: 0
-        Min_Drop_Item_Amount: 1
-        Max_Drop_Item_Amount: 1
+        Double_Drops_Enabled: true
 
 #
 #  Settings for Custom Mining Blocks
@@ -42,20 +26,12 @@ Herbalism:
 Mining:
     Block_1|0:
         XP_Gain: 99
+        Double_Drops_Enabled: true
         Is_Ore: true
-        Drop_Item: false
-        Drop_Item_Name: BLOCK_DROP
-        Drop_Item_Data_Value: 0
-        Min_Drop_Item_Amount: 1
-        Max_Drop_Item_Amount: 1
     Block_2|0:
         XP_Gain: 99
+        Double_Drops_Enabled: true
         Is_Ore: true
-        Drop_Item: false
-        Drop_Item_Name: BLOCK_DROP
-        Drop_Item_Data_Value: 0
-        Min_Drop_Item_Amount: 1
-        Max_Drop_Item_Amount: 1
 
 #
 #  Settings for Custom Woodcutting Blocks
@@ -63,20 +39,12 @@ Mining:
 Woodcutting:
     Block_1|0:
         XP_Gain: 99
+        Double_Drops_Enabled: true
         Is_Log: true
-        Drop_Item: false
-        Drop_Item_Name: BLOCK_DROP
-        Drop_Item_Data_Value: 0
-        Min_Drop_Item_Amount: 1
-        Max_Drop_Item_Amount: 1
     Block_2|0:
         XP_Gain: 99
+        Double_Drops_Enabled: true
         Is_Log: true
-        Drop_Item: false
-        Drop_Item_Name: BLOCK_DROP
-        Drop_Item_Data_Value: 0
-        Min_Drop_Item_Amount: 1
-        Max_Drop_Item_Amount: 1
 
 #
 #  Settings for Custom Ability Blocks