From c98377bb93d7d0557e224db630fb2e5ef06b20dc Mon Sep 17 00:00:00 2001 From: Esophose Date: Thu, 2 May 2019 18:33:26 -0600 Subject: [PATCH] Max log distance from trunk setting, bug fixes --- .../ultimatetimber/tree/TreeDefinition.java | 17 +++++-- .../animation/TreeAnimationDisintegrate.java | 1 - .../ultimatetimber/events/TreeEvent.java | 2 +- .../ultimatetimber/events/TreeFallEvent.java | 2 +- .../manager/ChoppingManager.java | 1 - .../manager/CommandManager.java | 3 +- .../manager/SaplingManager.java | 2 +- .../manager/TreeDefinitionManager.java | 4 +- .../manager/TreeDetectionManager.java | 49 ++++++++++++++----- .../src/main/resources/config-current.yml | 8 +++ .../src/main/resources/config-legacy.yml | 10 +++- 11 files changed, 77 insertions(+), 22 deletions(-) diff --git a/UltimateTimber/Core/src/main/java/com/songoda/ultimatetimber/tree/TreeDefinition.java b/UltimateTimber/Core/src/main/java/com/songoda/ultimatetimber/tree/TreeDefinition.java index 656c903..0d77dc9 100644 --- a/UltimateTimber/Core/src/main/java/com/songoda/ultimatetimber/tree/TreeDefinition.java +++ b/UltimateTimber/Core/src/main/java/com/songoda/ultimatetimber/tree/TreeDefinition.java @@ -11,6 +11,7 @@ public class TreeDefinition { private final String key; private final Set logBlockData, leafBlockData, plantableSoilBlockData; private final IBlockData saplingBlockData; + private final double maxLogDistanceFromTrunk; private final int maxLeafDistanceFromLog; private final boolean detectLeavesDiagonally; private final boolean dropOriginalLog, dropOriginalLeaf; @@ -18,14 +19,15 @@ public class TreeDefinition { private final Set requiredTools; public TreeDefinition(String key, Set logBlockData, Set leafBlockData, IBlockData saplingBlockData, - Set plantableSoilBlockData, int maxLeafDistanceFromLog, boolean detectLeavesDiagonally, - boolean dropOriginalLog, boolean dropOriginalLeaf, Set logLoot, Set leafLoot, - Set entireTreeLoot, Set requiredTools) { + Set plantableSoilBlockData, double maxLogDistanceFromTrunk, int maxLeafDistanceFromLog, + boolean detectLeavesDiagonally, boolean dropOriginalLog, boolean dropOriginalLeaf, Set logLoot, + Set leafLoot, Set entireTreeLoot, Set requiredTools) { this.key = key; this.logBlockData = logBlockData; this.leafBlockData = leafBlockData; this.saplingBlockData = saplingBlockData; this.plantableSoilBlockData = plantableSoilBlockData; + this.maxLogDistanceFromTrunk = maxLogDistanceFromTrunk; this.maxLeafDistanceFromLog = maxLeafDistanceFromLog; this.detectLeavesDiagonally = detectLeavesDiagonally; this.dropOriginalLog = dropOriginalLog; @@ -81,6 +83,15 @@ public class TreeDefinition { return Collections.unmodifiableSet(this.plantableSoilBlockData); } + /** + * Gets the max distance away a log can be from the tree trunk in order to be part of the tree + * + * @return The max distance a log can be from the tree trunk + */ + public double getMaxLogDistanceFromTrunk() { + return this.maxLogDistanceFromTrunk; + } + /** * Gets the max distance away a leaf can be from a log in order to be part of the tree * diff --git a/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/animation/TreeAnimationDisintegrate.java b/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/animation/TreeAnimationDisintegrate.java index 15fe43f..6c9e578 100644 --- a/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/animation/TreeAnimationDisintegrate.java +++ b/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/animation/TreeAnimationDisintegrate.java @@ -9,7 +9,6 @@ import com.songoda.ultimatetimber.tree.ITreeBlock; import com.songoda.ultimatetimber.tree.TreeBlock; import com.songoda.ultimatetimber.tree.TreeBlockType; import com.songoda.ultimatetimber.tree.TreeDefinition; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.FallingBlock; import org.bukkit.entity.Player; diff --git a/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/events/TreeEvent.java b/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/events/TreeEvent.java index 6ab83ed..46fd387 100644 --- a/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/events/TreeEvent.java +++ b/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/events/TreeEvent.java @@ -8,7 +8,7 @@ import org.bukkit.event.player.PlayerEvent; * Abstract tree event containing tree's blocks and broke block */ public abstract class TreeEvent extends PlayerEvent { - + protected final DetectedTree detectedTree; public TreeEvent(Player player, DetectedTree detectedTree) { diff --git a/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/events/TreeFallEvent.java b/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/events/TreeFallEvent.java index 4923b32..0cebee6 100644 --- a/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/events/TreeFallEvent.java +++ b/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/events/TreeFallEvent.java @@ -29,7 +29,7 @@ public class TreeFallEvent extends TreeEvent implements Cancellable { @Override public boolean isCancelled() { - return cancelled; + return this.cancelled; } @Override diff --git a/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/ChoppingManager.java b/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/ChoppingManager.java index f5a8a45..6bb2410 100644 --- a/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/ChoppingManager.java +++ b/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/ChoppingManager.java @@ -2,7 +2,6 @@ package com.songoda.ultimatetimber.manager; import com.songoda.ultimatetimber.UltimateTimber; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.entity.Player; import java.util.HashMap; diff --git a/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/CommandManager.java b/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/CommandManager.java index ece5f8d..cd9639f 100644 --- a/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/CommandManager.java +++ b/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/CommandManager.java @@ -98,7 +98,8 @@ public class CommandManager extends Manager implements CommandExecutor, TabCompl } /** - * Checks if a player has a permission + * Checks if a player does have a permission + * Sends them an error message if they don't * * @param sender The CommandSender to check * @param permission The permission to check for diff --git a/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/SaplingManager.java b/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/SaplingManager.java index 1c9eb19..f53163e 100644 --- a/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/SaplingManager.java +++ b/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/SaplingManager.java @@ -62,7 +62,7 @@ public class SaplingManager extends Manager { * @param treeBlock The ITreeBlock to replant for */ public void replantSaplingWithChance(TreeDefinition treeDefinition, ITreeBlock treeBlock) { - if (!ConfigurationManager.Setting.FALLING_BLOCKS_REPLANT_SAPLINGS.getBoolean()) + if (!ConfigurationManager.Setting.FALLING_BLOCKS_REPLANT_SAPLINGS.getBoolean() || !treeBlock.getLocation().getBlock().getType().equals(Material.AIR)) return; double chance = ConfigurationManager.Setting.FALLING_BLOCKS_REPLANT_SAPLINGS_CHANCE.getDouble(); diff --git a/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/TreeDefinitionManager.java b/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/TreeDefinitionManager.java index c49a33a..a0393d9 100644 --- a/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/TreeDefinitionManager.java +++ b/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/TreeDefinitionManager.java @@ -62,6 +62,7 @@ public class TreeDefinitionManager extends Manager { Set leafBlockData = new HashSet<>(); IBlockData saplingBlockData; Set plantableSoilBlockData = new HashSet<>(); + double maxLogDistanceFromTrunk; int maxLeafDistanceFromLog; boolean detectLeavesDiagonally; boolean dropOriginalLog; @@ -82,6 +83,7 @@ public class TreeDefinitionManager extends Manager { for (String blockDataString : tree.getStringList("plantable-soil")) plantableSoilBlockData.add(versionAdapter.parseBlockDataFromString(blockDataString)); + maxLogDistanceFromTrunk = tree.getDouble("max-log-distance-from-trunk"); maxLeafDistanceFromLog = tree.getInt("max-leaf-distance-from-log"); detectLeavesDiagonally = tree.getBoolean("search-for-leaves-diagonally"); dropOriginalLog = tree.getBoolean("drop-original-log"); @@ -105,7 +107,7 @@ public class TreeDefinitionManager extends Manager { for (String itemStackString : tree.getStringList("required-tools")) requiredTools.add(versionAdapter.parseItemStackFromString(itemStackString)); - this.treeDefinitions.add(new TreeDefinition(key, logBlockData, leafBlockData, saplingBlockData, plantableSoilBlockData, + this.treeDefinitions.add(new TreeDefinition(key, logBlockData, leafBlockData, saplingBlockData, plantableSoilBlockData, maxLogDistanceFromTrunk, maxLeafDistanceFromLog, detectLeavesDiagonally, dropOriginalLog, dropOriginalLeaf, logLoot, leafLoot, entireTreeLoot, requiredTools)); } diff --git a/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/TreeDetectionManager.java b/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/TreeDetectionManager.java index b7f24f2..89e2bdf 100644 --- a/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/TreeDetectionManager.java +++ b/UltimateTimber/Plugin/src/main/java/com/songoda/ultimatetimber/manager/TreeDetectionManager.java @@ -8,6 +8,7 @@ import com.songoda.ultimatetimber.tree.TreeBlock; import com.songoda.ultimatetimber.tree.TreeBlockSet; import com.songoda.ultimatetimber.tree.TreeBlockType; import com.songoda.ultimatetimber.tree.TreeDefinition; +import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.util.Vector; @@ -91,7 +92,7 @@ public class TreeDetectionManager extends Manager { List trunkBlocks = new ArrayList<>(); trunkBlocks.add(initialBlock); Block targetBlock = initialBlock; - while (this.isValidLogType(possibleTreeDefinitions, (targetBlock = targetBlock.getRelative(BlockFace.UP)))) { + while (this.isValidLogType(possibleTreeDefinitions, null, (targetBlock = targetBlock.getRelative(BlockFace.UP)))) { trunkBlocks.add(targetBlock); possibleTreeDefinitions.retainAll(this.treeDefinitionManager.narrowTreeDefinition(possibleTreeDefinitions, targetBlock, TreeBlockType.LOG)); } @@ -105,7 +106,7 @@ public class TreeDetectionManager extends Manager { // Detect branches off the main trunk for (Block trunkBlock : trunkBlocks) - this.recursiveBranchSearch(possibleTreeDefinitions, detectedTreeBlocks, trunkBlock, initialBlock.getLocation().getBlockY()); + this.recursiveBranchSearch(possibleTreeDefinitions, trunkBlocks, detectedTreeBlocks, trunkBlock, initialBlock.getLocation().getBlockY()); // Detect leaves off the trunk/branches Set> branchBlocks = new HashSet<>(detectedTreeBlocks.getLogBlocks()); @@ -128,7 +129,7 @@ public class TreeDetectionManager extends Manager { for (Block block : groundBlocks) { Block blockBelow = block.getRelative(BlockFace.DOWN); - boolean blockBelowIsLog = this.isValidLogType(possibleTreeDefinitions, blockBelow); + boolean blockBelowIsLog = this.isValidLogType(possibleTreeDefinitions, null, blockBelow); boolean blockBelowIsSoil = false; for (IBlockData blockData : treeDefinitionManager.getPlantableSoilBlockData(actualTreeDefinition)) { if (blockData.isSimilar(blockBelow)) { @@ -153,22 +154,23 @@ public class TreeDetectionManager extends Manager { * Recursively searches for branches off a given block * * @param treeDefinitions The possible tree definitions + * @param trunkBlocks The tree trunk blocks * @param treeBlocks The detected tree blocks * @param block The next block to check for a branch * @param startingBlockY The Y coordinate of the initial block */ - private void recursiveBranchSearch(Set treeDefinitions, TreeBlockSet treeBlocks, Block block, int startingBlockY) { + private void recursiveBranchSearch(Set treeDefinitions, List trunkBlocks, TreeBlockSet treeBlocks, Block block, int startingBlockY) { if (treeBlocks.size() > this.maxLogBlocksAllowed) return; for (Vector offset : this.onlyBreakLogsUpwards ? this.VALID_BRANCH_OFFSETS : this.VALID_TRUNK_OFFSETS) { Block targetBlock = block.getRelative(offset.getBlockX(), offset.getBlockY(), offset.getBlockZ()); TreeBlock treeBlock = new TreeBlock(targetBlock, TreeBlockType.LOG); - if (this.isValidLogType(treeDefinitions, targetBlock) && !treeBlocks.contains(treeBlock)) { + if (this.isValidLogType(treeDefinitions, trunkBlocks, targetBlock) && !treeBlocks.contains(treeBlock)) { treeBlocks.add(treeBlock); treeDefinitions.retainAll(this.treeDefinitionManager.narrowTreeDefinition(treeDefinitions, targetBlock, TreeBlockType.LOG)); if (!this.onlyBreakLogsUpwards || targetBlock.getLocation().getBlockY() > startingBlockY) - this.recursiveBranchSearch(treeDefinitions, treeBlocks, targetBlock, startingBlockY); + this.recursiveBranchSearch(treeDefinitions, trunkBlocks, treeBlocks, targetBlock, startingBlockY); } } } @@ -177,6 +179,7 @@ public class TreeDetectionManager extends Manager { * Recursively searches for leaves that are next to this tree * * @param treeDefinitions The possible tree definitions + * * @param treeBlocks The detected tree blocks * @param block The next block to check for a leaf * @param distanceFromLog The distance this leaf is from a log @@ -212,7 +215,7 @@ public class TreeDetectionManager extends Manager { private boolean doesLeafBorderInvalidLog(Set treeDefinitions, TreeBlockSet treeBlocks, Block block) { for (Vector offset : this.VALID_TRUNK_OFFSETS) { Block targetBlock = block.getRelative(offset.getBlockX(), offset.getBlockY(), offset.getBlockZ()); - if (this.isValidLogType(treeDefinitions, targetBlock) && !treeBlocks.contains(new TreeBlock(targetBlock, TreeBlockType.LOG))) + if (this.isValidLogType(treeDefinitions, null, targetBlock) && !treeBlocks.contains(new TreeBlock(targetBlock, TreeBlockType.LOG))) return true; } return false; @@ -222,17 +225,41 @@ public class TreeDetectionManager extends Manager { * Checks if a given block is valid for the given TreeDefinitions * * @param treeDefinitions The Set of TreeDefinitions to compare against + * @param trunkBlocks The trunk blocks of the tree for checking the distance * @param block The Block to check * @return True if the block is a valid log type, otherwise false */ - private boolean isValidLogType(Set treeDefinitions, Block block) { + private boolean isValidLogType(Set treeDefinitions, List trunkBlocks, Block block) { + // Check if block is placed if (this.placedBlockManager.isBlockPlaced(block)) return false; - for (TreeDefinition treeDefinition : treeDefinitions) - for (IBlockData logBlockData : treeDefinition.getLogBlockData()) - if (logBlockData.isSimilar(block)) + // Check if it matches the tree definition + boolean isCorrectType = false; + for (TreeDefinition treeDefinition : treeDefinitions) { + for (IBlockData logBlockData : treeDefinition.getLogBlockData()) { + if (logBlockData.isSimilar(block)) { + isCorrectType = true; + break; + } + } + } + + if (!isCorrectType) + return false; + + // Check that it is close enough to the trunk + if (trunkBlocks == null || trunkBlocks.isEmpty()) + return true; + + Location location = block.getLocation(); + for (TreeDefinition treeDefinition : treeDefinitions) { + double maxDistance = treeDefinition.getMaxLogDistanceFromTrunk() * treeDefinition.getMaxLogDistanceFromTrunk(); + for (Block trunkBlock : trunkBlocks) + if (location.distanceSquared(trunkBlock.getLocation()) < maxDistance) return true; + } + return false; } diff --git a/UltimateTimber/Plugin/src/main/resources/config-current.yml b/UltimateTimber/Plugin/src/main/resources/config-current.yml index 0630d93..443462e 100644 --- a/UltimateTimber/Plugin/src/main/resources/config-current.yml +++ b/UltimateTimber/Plugin/src/main/resources/config-current.yml @@ -190,6 +190,7 @@ trees: - OAK_LEAVES sapling: OAK_SAPLING plantable-soil: [] + max-log-distance-from-trunk: 6 max-leaf-distance-from-log: 6 search-for-leaves-diagonally: false drop-original-log: true @@ -214,6 +215,7 @@ trees: - SPRUCE_LEAVES sapling: SPRUCE_SAPLING plantable-soil: [] + max-log-distance-from-trunk: 1 max-leaf-distance-from-log: 6 search-for-leaves-diagonally: false drop-original-log: true @@ -235,6 +237,7 @@ trees: - BIRCH_LEAVES sapling: BIRCH_SAPLING plantable-soil: [] + max-log-distance-from-trunk: 1 max-leaf-distance-from-log: 4 search-for-leaves-diagonally: false drop-original-log: true @@ -256,6 +259,7 @@ trees: - JUNGLE_LEAVES sapling: JUNGLE_SAPLING plantable-soil: [] + max-log-distance-from-trunk: 5 max-leaf-distance-from-log: 6 search-for-leaves-diagonally: false drop-original-log: true @@ -277,6 +281,7 @@ trees: - ACACIA_LEAVES sapling: ACACIA_SAPLING plantable-soil: [] + max-log-distance-from-trunk: 4 max-leaf-distance-from-log: 5 search-for-leaves-diagonally: false drop-original-log: true @@ -298,6 +303,7 @@ trees: - DARK_OAK_LEAVES sapling: DARK_OAK_SAPLING plantable-soil: [] + max-log-distance-from-trunk: 3 max-leaf-distance-from-log: 5 search-for-leaves-diagonally: false drop-original-log: true @@ -320,6 +326,7 @@ trees: sapling: BROWN_MUSHROOM plantable-soil: - MYCELIUM + max-log-distance-from-trunk: 4 max-leaf-distance-from-log: 4 search-for-leaves-diagonally: false drop-original-log: false @@ -339,6 +346,7 @@ trees: sapling: RED_MUSHROOM plantable-soil: - MYCELIUM + max-log-distance-from-trunk: 4 max-leaf-distance-from-log: 4 search-for-leaves-diagonally: true drop-original-log: false diff --git a/UltimateTimber/Plugin/src/main/resources/config-legacy.yml b/UltimateTimber/Plugin/src/main/resources/config-legacy.yml index a025c63..1a472b0 100644 --- a/UltimateTimber/Plugin/src/main/resources/config-legacy.yml +++ b/UltimateTimber/Plugin/src/main/resources/config-legacy.yml @@ -188,6 +188,7 @@ trees: - LEAVES:0,4,8,12 sapling: SAPLING:0 plantable-soil: [] + max-log-distance-from-trunk: 6 max-leaf-distance-from-log: 6 search-for-leaves-diagonally: false drop-original-log: true @@ -209,6 +210,7 @@ trees: - LEAVES:1,5,9,13 sapling: SAPLING:1 plantable-soil: [] + max-log-distance-from-trunk: 1 max-leaf-distance-from-log: 6 search-for-leaves-diagonally: false drop-original-log: true @@ -227,6 +229,7 @@ trees: - LEAVES:2,6,10,14 sapling: SAPLING:2 plantable-soil: [] + max-log-distance-from-trunk: 1 max-leaf-distance-from-log: 4 search-for-leaves-diagonally: false drop-original-log: true @@ -245,6 +248,7 @@ trees: - LEAVES:3,7,11,15 sapling: SAPLING:3 plantable-soil: [] + max-log-distance-from-trunk: 5 max-leaf-distance-from-log: 6 search-for-leaves-diagonally: false drop-original-log: true @@ -263,6 +267,7 @@ trees: - LEAVES_2:0,4,8,12 sapling: SAPLING:4 plantable-soil: [] + max-log-distance-from-trunk: 4 max-leaf-distance-from-log: 5 search-for-leaves-diagonally: false drop-original-log: true @@ -281,6 +286,7 @@ trees: - LEAVES_2:1,5,9,13 sapling: SAPLING:5 plantable-soil: [] + max-log-distance-from-trunk: 3 max-leaf-distance-from-log: 5 search-for-leaves-diagonally: false drop-original-log: true @@ -303,7 +309,8 @@ trees: sapling: BROWN_MUSHROOM plantable-soil: - MYCEL - max-leaf-distance-from-log: 6 + max-log-distance-from-trunk: 4 + max-leaf-distance-from-log: 4 search-for-leaves-diagonally: false drop-original-log: false drop-original-leaf: false @@ -322,6 +329,7 @@ trees: sapling: RED_MUSHROOM plantable-soil: - MYCEL + max-log-distance-from-trunk: 4 max-leaf-distance-from-log: 4 search-for-leaves-diagonally: true drop-original-log: false