diff --git a/Changelog.txt b/Changelog.txt index f3f3c9a77..87338abb9 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,17 @@ 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 + Fixed a bug where mcMMO didn't appropriately flag blocks as natural in some tree growing events + (SQL) Added more MySQL/MariaDB settings (allowPublicKeyRetrieval - thanks rosaage) + (API) Added CREATED_PARTY and DISBANDED_PARTY to EventReason (used in some party events - thanks PikaMug ) + Party member name matching is no longer case sensitive (thanks Wariorrrr) + Updated zh_CN locale (thanks GhostDC) + Added some settings for over fishing (Settings are in experience.yml under Fishing_ExploitFix_Options - thanks tunagohan) + + NOTES: + This means tree feller will correctly traverse flowering azalea leaves during its ability Version 2.1.201 Tweaked the visual/audio effect for Rupture diff --git a/pom.xml b/pom.xml index 8f167b8d6..c861f48f1 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.202-SNAPSHOT + 2.1.202 mcMMO https://github.com/mcMMO-Dev/mcMMO @@ -141,7 +141,6 @@ net.kyori:adventure-text-serializer-gson net.kyori:adventure-platform-bukkit net.kyori:adventure-platform-api - net.kyori:adventure-platform-common net.kyori:adventure-platform-viaversion net.kyori:adventure-platform-facet net.kyori:adventure-nbt @@ -248,48 +247,37 @@ net.kyori adventure-text-serializer-gson - 4.8.0 + 4.9.1 net.kyori adventure-api - 4.8.0 + 4.9.1 net.kyori adventure-nbt - 4.8.0 + 4.9.1 net.kyori adventure-key - 4.8.0 + 4.9.1 net.kyori adventure-text-serializer-gson-legacy-impl - 4.8.0 + 4.9.1 net.kyori adventure-platform-bukkit - 4.0.0-SNAPSHOT + 4.0.0 net.kyori adventure-platform-api - 4.0.0-SNAPSHOT - - - net.kyori - adventure-platform-common - 4.0.0-SNAPSHOT - - - net.kyori - adventure-nbt - - + 4.0.0 org.apache.maven.scm diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 0953f00c3..5354d644a 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -238,7 +238,10 @@ public class BlockListener implements Listener { WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer(); if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) { - mcMMO.getPlaceStore().setTrue(blockState); + //NOTE: BlockMultiPlace has its own logic so don't handle anything that would overlap + if (!(event instanceof BlockMultiPlaceEvent)) { + mcMMO.getPlaceStore().setTrue(blockState); + } } @@ -276,7 +279,16 @@ public class BlockListener implements Listener { /* Check if the blocks placed should be monitored so they do not give out XP in the future */ if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) { - mcMMO.getPlaceStore().setTrue(blockState); + //Updated: 10/5/2021 + //Note: For some reason Azalea trees trigger this event but no other tree does (as of 10/5/2021) but if this changes in the future we may need to update this + if(BlockUtils.isPartOfTree(event.getBlockPlaced())) { + return; + } + + //Track unnatural blocks + for(BlockState replacedStates : event.getReplacedBlockStates()) { + mcMMO.getPlaceStore().setTrue(replacedStates); + } } } } diff --git a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java index a08071a04..5abea42b3 100644 --- a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java @@ -29,10 +29,6 @@ public class WorldListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getWorld())) return; - if (!mcMMO.getPlaceStore().isTrue(event.getLocation().getBlock())) { - return; - } - for (BlockState blockState : event.getBlocks()) { mcMMO.getPlaceStore().setFalse(blockState); } 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); diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java index c9a00f015..566c95c3a 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java +++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java @@ -285,8 +285,8 @@ public final class BlockUtils { return true; } - public static boolean isPartOfTree(Block rayCast) { - return hasWoodcuttingXP(rayCast.getState()) || isNonWoodPartOfTree(rayCast.getType()); + public static boolean isPartOfTree(Block block) { + return hasWoodcuttingXP(block.getState()) || isNonWoodPartOfTree(block.getType()); } public static boolean isWithinWorldBounds(@NotNull WorldCompatibilityLayer worldCompatibilityLayer, @NotNull Block block) { diff --git a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java index f170cfc3b..90104acce 100644 --- a/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java +++ b/src/main/java/com/gmail/nossr50/util/MaterialMapStore.java @@ -1009,6 +1009,7 @@ public class MaterialMapStore { treeFellerDestructibleWhiteList.add("jungle_leaves"); treeFellerDestructibleWhiteList.add("spruce_leaves"); treeFellerDestructibleWhiteList.add("azalea_leaves"); + treeFellerDestructibleWhiteList.add("flowering_azalea_leaves"); treeFellerDestructibleWhiteList.add("nether_wart_block"); treeFellerDestructibleWhiteList.add("warped_wart_block"); treeFellerDestructibleWhiteList.add("brown_mushroom_block");