From 0c83bf2a8045b9b8cd956a136ce1c9b491fb6b90 Mon Sep 17 00:00:00 2001 From: GJ Date: Wed, 9 Oct 2013 11:44:45 -0400 Subject: [PATCH] Improve our drop handling. --- .../config/mods/CustomBlockConfig.java | 24 +--------- .../nossr50/datatypes/mods/CustomBlock.java | 24 ++-------- .../skills/herbalism/HerbalismManager.java | 7 +-- .../gmail/nossr50/skills/mining/Mining.java | 32 +++---------- .../nossr50/skills/mining/MiningManager.java | 3 +- .../skills/smelting/SmeltingManager.java | 13 ++--- .../skills/woodcutting/Woodcutting.java | 30 +++--------- .../woodcutting/WoodcuttingManager.java | 27 ++++------- .../java/com/gmail/nossr50/util/Misc.java | 8 +++- src/main/resources/mods/blocks.yml | 48 ++++--------------- 10 files changed, 54 insertions(+), 162 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/config/mods/CustomBlockConfig.java b/src/main/java/com/gmail/nossr50/config/mods/CustomBlockConfig.java index d27d63ded..b6a36ff14 100644 --- a/src/main/java/com/gmail/nossr50/config/mods/CustomBlockConfig.java +++ b/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"))); } } diff --git a/src/main/java/com/gmail/nossr50/datatypes/mods/CustomBlock.java b/src/main/java/com/gmail/nossr50/datatypes/mods/CustomBlock.java index 526af3072..900ddc623 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/mods/CustomBlock.java +++ b/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; } } diff --git a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java index 44b381a8b..4090baabc 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/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(); } } diff --git a/src/main/java/com/gmail/nossr50/skills/mining/Mining.java b/src/main/java/com/gmail/nossr50/skills/mining/Mining.java index 3bca2053e..ce1c9f3e1 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/Mining.java +++ b/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; } diff --git a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java index 7ab8629c3..9fc30224a 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/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; } diff --git a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java index 20b6123b5..b2b85a781 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java +++ b/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")); diff --git a/src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java b/src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java index 100650480..db84be955 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java +++ b/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; diff --git a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java index aca6349ee..fe5793259 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/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: diff --git a/src/main/java/com/gmail/nossr50/util/Misc.java b/src/main/java/com/gmail/nossr50/util/Misc.java index 43c1396e6..d7f5c88a1 100644 --- a/src/main/java/com/gmail/nossr50/util/Misc.java +++ b/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 drops, double chance) { + for (ItemStack item : drops) { + randomDropItem(location, item, chance); + } + } + /** * Drop an item at a given location. * diff --git a/src/main/resources/mods/blocks.yml b/src/main/resources/mods/blocks.yml index aa7c279b6..6c63b8c68 100644 --- a/src/main/resources/mods/blocks.yml +++ b/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