diff --git a/Changelog.txt b/Changelog.txt index 26f88d6a7..87338abb9 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.202 + Fixed a bug where mcMMO didn't reward XP for Kelp Fixed a bug where mcMMO marked bonemealed Azalea trees as unnatural (and thus did not give XP or get affected by Tree Feller) Added Amethyst_Block to experience.yml for Mining Added Flowering Azalea Leaves to Tree Feller's white list 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 6200d9eec..c8c78bd02 100644 --- a/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java +++ b/src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java @@ -251,6 +251,9 @@ public class HerbalismManager extends SkillManager { * @param brokenPlants plant blocks to process */ private void processHerbalismOnBlocksBroken(BlockBreakEvent blockBreakEvent, HashSet brokenPlants) { + if(blockBreakEvent.isCancelled()) + return; + BlockState originalBreak = blockBreakEvent.getBlock().getState(); boolean greenThumbActivated = false; @@ -263,16 +266,6 @@ public class HerbalismManager extends SkillManager { } } - //When replanting a immature crop we cancel the block break event and back out - if(greenThumbActivated) { - if(originalBreak.getBlock().getBlockData() instanceof Ageable) { - Ageable ageableCrop = (Ageable) originalBreak.getBlock().getBlockData(); - if(!isAgeableMature(ageableCrop)) { - return; - } - } - } - /* * Mark blocks for double drops * Be aware of the hacky interactions we are doing with Chorus Plants @@ -394,6 +387,7 @@ public class HerbalismManager extends SkillManager { //Catcus and Sugar Canes cannot be trusted switch(blockData.getMaterial()) { case CACTUS: + case KELP: case SUGAR_CANE: return true; default: @@ -530,21 +524,18 @@ public class HerbalismManager extends SkillManager { * @param blockBreakEvent target event * @return a set of plant-blocks that were broken as a result of this event */ - private HashSet getBrokenHerbalismBlocks(BlockBreakEvent blockBreakEvent) { + private HashSet getBrokenHerbalismBlocks(@NotNull BlockBreakEvent blockBreakEvent) { //Get an updated capture of this block - BlockState originalBlockBlockState = blockBreakEvent.getBlock().getState(); - Material originalBlockMaterial = originalBlockBlockState.getType(); + BlockState originBlockState = blockBreakEvent.getBlock().getState(); + Material originBlockMaterial = originBlockState.getType(); HashSet blocksBroken = new HashSet<>(); //Blocks broken - //Check if this block is a one block plant or not - boolean oneBlockPlant = isOneBlockPlant(originalBlockMaterial); + //Add the initial block + blocksBroken.add(originBlockState.getBlock()); - if(oneBlockPlant) { - //If the block is a one-block plant return only that - blocksBroken.add(originalBlockBlockState.getBlock()); - } else { + if(!isOneBlockPlant(originBlockMaterial)) { //If the block is a multi-block structure, capture a set of all blocks broken and return that - blocksBroken = getBrokenBlocksMultiBlockPlants(originalBlockBlockState, blockBreakEvent); + blocksBroken = getBrokenBlocksMultiBlockPlants(originBlockState); } //Return all broken plant-blocks @@ -580,17 +571,16 @@ public class HerbalismManager extends SkillManager { * The method to grab these blocks is a bit hacky and does not hook into the API * Basically we expect the blocks to be broken if this event is not cancelled and we determine which block are broken on our end rather than any event state captures * - * @param blockBreakEvent target event * @return a set of plant-blocks broken from this event */ - protected HashSet getBrokenBlocksMultiBlockPlants(BlockState originalBlockBroken, BlockBreakEvent blockBreakEvent) { + protected HashSet getBrokenBlocksMultiBlockPlants(BlockState brokenBlock) { //Track the broken blocks HashSet brokenBlocks; - if (isChorusBranch(originalBlockBroken.getType())) { - brokenBlocks = getBrokenChorusBlocks(originalBlockBroken); + if (isChorusBranch(brokenBlock.getType())) { + brokenBlocks = getBrokenChorusBlocks(brokenBlock); } else { - brokenBlocks = getBlocksBrokenAbove(originalBlockBroken); + brokenBlocks = getBlocksBrokenAbove(brokenBlock, false); } return brokenBlocks; @@ -610,21 +600,22 @@ public class HerbalismManager extends SkillManager { * The vertical search returns early if it runs into anything that is not a multi-block plant * Multi-block plants are hard-coded and kept in {@link MaterialMapStore} * - * @param breakPointBlockState The point of the "break" + * @param originBlock The point of the "break" * @return A set of blocks above the target block which can be assumed to be broken */ - private HashSet getBlocksBrokenAbove(BlockState breakPointBlockState) { + private HashSet getBlocksBrokenAbove(BlockState originBlock, boolean inclusive) { HashSet brokenBlocks = new HashSet<>(); - Block block = breakPointBlockState.getBlock(); + Block block = originBlock.getBlock(); //Add the initial block to the set - brokenBlocks.add(block); + if(inclusive) + brokenBlocks.add(block); //Limit our search - int maxHeight = 255; + int maxHeight = 512; // Search vertically for multi-block plants, exit early if any non-multi block plants - for (int y = 1; y < maxHeight; y++) { + for (int y = 0; y < maxHeight; y++) { //TODO: Should this grab state? It would be more expensive.. Block relativeUpBlock = block.getRelative(BlockFace.UP, y);