From b4179cb9a615d5996a7321b78869d1c731e159fa Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 18 Oct 2019 15:23:15 -0700 Subject: [PATCH] Fixed a dupe bug --- Changelog.txt | 4 ++ .../nossr50/listeners/BlockListener.java | 61 +++++++------------ 2 files changed, 27 insertions(+), 38 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 9ad1752e9..ce9afdc66 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,7 @@ +Version 2.1.110 + Fixed a dupe bug + Added Lithuanian locale (thanks Vyciokazz) + Version 2.1.109 Block Cracker will now correctly crack stone_bricks during Berserk again Added Lily_Of_The_Valley to the Bonus Drops list in config.yml (you'll probably want to add this manually) which enables it to double drop diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index e11b6271d..e3330e875 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -41,7 +41,9 @@ import org.bukkit.event.block.*; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.MetadataValue; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class BlockListener implements Listener { private final mcMMO plugin; @@ -53,6 +55,20 @@ public class BlockListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onBlockDropItemEvent(BlockDropItemEvent event) { + //Track how many "things" are being dropped + HashSet uniqueMaterials = new HashSet<>(); + boolean dontRewardTE = false; //If we suspect TEs are mixed in with other things don't reward bonus drops for anything that isn't a block + + for(Item item : event.getItems()) { + uniqueMaterials.add(item.getItemStack().getType()); + } + + if(uniqueMaterials.size() > 1) { + //Too many things are dropping, assume tile entities might be duped + //Technically this would also prevent something like coal from being bonus dropped if you placed a TE above a coal ore when mining it but that's pretty edge case and this is a good solution for now + dontRewardTE = true; + } + for(Item item : event.getItems()) { ItemStack is = new ItemStack(item.getItemStack()); @@ -66,6 +82,13 @@ public class BlockListener implements Listener { && !Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.WOODCUTTING, is.getType())) continue; + //If we suspect TEs might be duped only reward block + if(dontRewardTE) { + if(!is.getType().isBlock()) { + continue; + } + } + if (event.getBlock().getMetadata(mcMMO.BONUS_DROPS_METAKEY).size() > 0) { BonusDropMeta bonusDropMeta = (BonusDropMeta) event.getBlock().getMetadata(mcMMO.BONUS_DROPS_METAKEY).get(0); int bonusCount = bonusDropMeta.asInt(); @@ -80,44 +103,6 @@ public class BlockListener implements Listener { event.getBlock().removeMetadata(mcMMO.BONUS_DROPS_METAKEY, 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().getMetadata(mcMMO.doubleDrops).size() > 0) - { - List metadataValue = event.getBlock().getMetadata(mcMMO.doubleDrops); - - BonusDrops bonusDrops = (BonusDrops) metadataValue.get(0); - Collection potentialDrops = (Collection) bonusDrops.value(); - - if(potentialDrops.contains(is)) - { - event.getBlock().getState().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is); - } - - event.getBlock().removeMetadata(mcMMO.doubleDrops, plugin); - } else { - if(event.getBlock().getMetadata(mcMMO.tripleDrops).size() > 0) { - List metadataValue = event.getBlock().getMetadata(mcMMO.tripleDrops); - - BonusDrops bonusDrops = (BonusDrops) metadataValue.get(0); - Collection potentialDrops = (Collection) bonusDrops.value(); - - if (potentialDrops.contains(is)) { - event.getBlock().getState().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is); - event.getBlock().getState().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is); - } - - event.getBlock().removeMetadata(mcMMO.tripleDrops, plugin); - } - } - } - }*/ - /** * Monitor BlockPistonExtend events. *