diff --git a/Changelog.txt b/Changelog.txt index c0898f16a..9bf530fd0 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -7,6 +7,13 @@ Key: ! Change - Removal +Version 2.1.30 + Fixed yet another bug involving double drops + DoubleDrop config tables now must contain all things that can possibly be doubled, such as the Ore block, the ore itself, etc. + Added the following items to the DoubleDrop tables for Mining: Coal, Diamond, Emerald, Glowstone_Dust, Iron_Ingot, Lapis_Lazuli, Nether_Quartz, Redstone, Cobblestone + + NOTE: I'm gonna have to blame Bukkit on this one, several API methods I used are actually unfinished and kind of janky. So I hacked something together to make them work. + Version 2.1.29 Fixed a bug where double drops and triple drops were not activating diff --git a/pom.xml b/pom.xml index c34c8e55c..3e5ffbdc4 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.29 + 2.1.30-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 96ff2dffb..6d2f95d91 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -35,6 +35,7 @@ import org.bukkit.Material; import org.bukkit.Tag; import org.bukkit.block.*; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -54,41 +55,65 @@ public class BlockListener implements Listener { this.plugin = plugin; } -/* @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onBlockDropItemEvent(BlockDropItemEvent event) { - - Bukkit.broadcastMessage("Debug: Drop Item Event"); - - for(Item item : event.getItems()) { ItemStack is = new ItemStack(item.getItemStack()); - if(!event.getBlock().getDrops().contains(is)) - continue; - if(is.getAmount() <= 0) continue; - if(event.getBlock().getState().getMetadata(mcMMO.doubleDropKey).size() > 0) - { - //Extra Protection - if(event.getBlock().getState() instanceof Container) - return; + if(!Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.MINING, is.getType()) + && !Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.HERBALISM, is.getType()) + && !Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.WOODCUTTING, is.getType())) + continue; - event.getBlock().getState().removeMetadata(mcMMO.doubleDropKey, plugin); + if(event.getBlock().getState().getMetadata(mcMMO.doubleDrops).size() > 0) + event.getBlock().getState().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is); + else if(event.getBlock().getState().getMetadata(mcMMO.tripleDrops).size() > 0) + { + event.getBlock().getState().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is); event.getBlock().getState().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is); } + } + } - else if(event.getBlock().getState().getMetadata(mcMMO.tripleDropKey).size() > 0) + /*@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) { - //Extra Protection - if(event.getBlock().getState() instanceof Container) - return; - event.getBlock().getState().removeMetadata(mcMMO.tripleDropKey, plugin); - event.getBlock().getState().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is); - event.getBlock().getState().getWorld().dropItemNaturally(event.getBlockState().getLocation(), is); + 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); + } } } }*/ diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index aceebcded..7d8664e4b 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -110,6 +110,8 @@ public class mcMMO extends JavaPlugin { public final static String infiniteArrowKey = "mcMMO: Infinite Arrow"; public final static String bowForceKey = "mcMMO: Bow Force"; public final static String arrowDistanceKey = "mcMMO: Arrow Distance"; + public final static String doubleDrops = "mcMMO: Double Drops"; + public final static String tripleDrops = "mcMMO: Triple Drops"; //public final static String customDamageKey = "mcMMO: Custom Damage"; public final static String disarmedItemKey = "mcMMO: Disarmed Item"; public final static String playerDataKey = "mcMMO: Player Data"; diff --git a/src/main/java/com/gmail/nossr50/skills/herbalism/Herbalism.java b/src/main/java/com/gmail/nossr50/skills/herbalism/Herbalism.java index eb7b01c5b..a51cab404 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/Herbalism.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/Herbalism.java @@ -67,7 +67,7 @@ public class Herbalism { dropAmount++; if(herbalismManager.checkDoubleDrop(target.getState())) - BlockUtils.spawnBonusDrops(target.getState(), triple); + BlockUtils.markDropsAsBonus(target.getState(), triple); } for (BlockFace blockFace : new BlockFace[] { BlockFace.UP, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST ,BlockFace.WEST}) @@ -110,7 +110,7 @@ public class Herbalism { dropAmount++; if(herbalismManager.checkDoubleDrop(relativeBlock.getState())) - BlockUtils.spawnBonusDrops(relativeBlock.getState(), triple); + BlockUtils.markDropsAsBonus(relativeBlock.getState(), triple); } } } @@ -142,7 +142,7 @@ public class Herbalism { amount += 1; if(herbalismManager.checkDoubleDrop(relativeUpBlock.getState())) - BlockUtils.spawnBonusDrops(relativeUpBlock.getState(), triple); + BlockUtils.markDropsAsBonus(relativeUpBlock.getState(), triple); } 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 f7501bc86..afb280e98 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -147,7 +147,7 @@ public class HerbalismManager extends SkillManager { if (Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_DOUBLE_DROPS) && customBlock.isDoubleDropEnabled()) { if(checkDoubleDrop(blockState)) - BlockUtils.spawnBonusDrops(blockState, greenTerra); + BlockUtils.markDropsAsBonus(blockState, greenTerra); } } else { @@ -165,7 +165,7 @@ public class HerbalismManager extends SkillManager { } else { /* MARK SINGLE BLOCK CROP FOR DOUBLE DROP */ if(checkDoubleDrop(blockState)) - BlockUtils.spawnBonusDrops(blockState, greenTerra); + BlockUtils.markDropsAsBonus(blockState, greenTerra); } if (Permissions.greenThumbPlant(player, material)) { 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 a5dd723d9..fa3ceaaa1 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -91,7 +91,7 @@ public class MiningManager extends SkillManager { //TODO: Make this readable if (RandomChanceUtil.checkRandomChanceExecutionSuccess(getPlayer(), SubSkillType.MINING_DOUBLE_DROPS, true)) { - BlockUtils.spawnBonusDrops(blockState, mcMMOPlayer.getAbilityMode(skill.getAbility())); + BlockUtils.markDropsAsBonus(blockState, mcMMOPlayer.getAbilityMode(skill.getAbility())); } } diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index e3fe60458..66cef68f3 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -14,7 +14,6 @@ import org.bukkit.block.BlockState; import org.bukkit.block.data.Ageable; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; import java.util.HashSet; @@ -27,15 +26,12 @@ public final class BlockUtils { * @param blockState target blockstate * @param triple marks the block to give triple drops */ - public static void spawnBonusDrops(BlockState blockState, boolean triple) + public static void markDropsAsBonus(BlockState blockState, boolean triple) { - for(ItemStack spawnItem : blockState.getBlock().getDrops()) - { - if(triple) - blockState.getWorld().dropItemNaturally(blockState.getLocation(), spawnItem); - - blockState.getWorld().dropItemNaturally(blockState.getLocation(), spawnItem); - } + if(triple) + blockState.setMetadata(mcMMO.tripleDrops, mcMMO.metadataValue); + else + blockState.setMetadata(mcMMO.doubleDrops, mcMMO.metadataValue); } /** diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 4c616b22d..7858b9ec5 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -461,20 +461,29 @@ Double_Drops: Diorite: true Granite: true Coal_Ore: true + Coal: true Diamond_Ore: true + Diamond: true Emerald_Ore: true + Emerald: true End_Stone: true Glowstone: true + Glowstone_Dust: true Gold_Ore: true Iron_Ore: true + Iron_Ingot: true Lapis_Ore: true + Lapis_Lazuli: true Mossy_Cobblestone: true Netherrack: true Obsidian: true Nether_Quartz_Ore: true + Nether_Quartz: true Redstone_Ore: true + Redstone: true Sandstone: true Stone: true + Cobblestone: true Woodcutting: Acacia_Log: true Birch_Log: true