diff --git a/src/main/java/com/songoda/ultimatetimber/UltimateTimber.java b/src/main/java/com/songoda/ultimatetimber/UltimateTimber.java index 1ca2696..0d165d4 100644 --- a/src/main/java/com/songoda/ultimatetimber/UltimateTimber.java +++ b/src/main/java/com/songoda/ultimatetimber/UltimateTimber.java @@ -19,9 +19,11 @@ import java.util.Set; */ public class UltimateTimber extends JavaPlugin { - private static final CommandSender console = Bukkit.getConsoleSender(); private static UltimateTimber INSTANCE; + private final String prefix = "&8[&6UltimateTimber&8]"; + private final CommandSender console = Bukkit.getConsoleSender(); + private Set managers; private VersionAdapter versionAdapter; @@ -120,6 +122,15 @@ public class UltimateTimber extends JavaPlugin { } } + /** + * Gets the plugin prefix for chat + * + * @return The plugin prefix + */ + public String getPrefix() { + return this.prefix; + } + /** * Gets the active version adapter being used * diff --git a/src/main/java/com/songoda/ultimatetimber/adapter/IBlockData.java b/src/main/java/com/songoda/ultimatetimber/adapter/IBlockData.java new file mode 100644 index 0000000..58e33ee --- /dev/null +++ b/src/main/java/com/songoda/ultimatetimber/adapter/IBlockData.java @@ -0,0 +1,36 @@ +package com.songoda.ultimatetimber.adapter; + +import org.bukkit.Material; +import org.bukkit.block.Block; + +public interface IBlockData { + + /** + * Gets the Material of the BlockData + * + * @return The Material + */ + Material getMaterial(); + + /** + * Gets the data of the BlockData + * + * @return The data + */ + byte getData(); + + /** + * Compares this IBlockData with another one to see if they are similar + * + * @return True if they are similar, otherwise false + */ + boolean isSimilar(IBlockData otherBlockData); + + /** + * Compares this IBlockData with a block to see if they are similar + * + * @return True if they are similar, otherwise false + */ + boolean isSimilar(Block block); + +} diff --git a/src/main/java/com/songoda/ultimatetimber/adapter/VersionAdapter.java b/src/main/java/com/songoda/ultimatetimber/adapter/VersionAdapter.java index 1bc63e4..afe3410 100644 --- a/src/main/java/com/songoda/ultimatetimber/adapter/VersionAdapter.java +++ b/src/main/java/com/songoda/ultimatetimber/adapter/VersionAdapter.java @@ -3,14 +3,11 @@ package com.songoda.ultimatetimber.adapter; import com.songoda.ultimatetimber.tree.FallingTreeBlock; import com.songoda.ultimatetimber.tree.TreeBlock; import com.songoda.ultimatetimber.tree.TreeBlockSet; -import com.songoda.ultimatetimber.tree.TreeDefinition; import org.bukkit.block.Block; -import org.bukkit.block.BlockState; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.util.Collection; -import java.util.Set; public interface VersionAdapter { @@ -22,12 +19,12 @@ public interface VersionAdapter { VersionAdapterType getVersionAdapterType(); /** - * Parses a String into a BlockState + * Parses a String into an IBlockData instance * - * @param blockStateString The String to parse - * @return A BlockState that the given String represents + * @param blockDataString The String to parse + * @return An IBlockData instance that the given String represents */ - BlockState parseBlockStateFromString(String blockStateString); + IBlockData parseBlockDataFromString(String blockDataString); /** * Parses a String into an ItemStack @@ -45,15 +42,6 @@ public interface VersionAdapter { */ Collection getBlockDrops(TreeBlock treeBlock); - /** - * Checks if two block states are similar - * - * @param blockState1 The first BlockState - * @param blockState2 The second BlockState - * @return True if the BlockStates are similar, otherwise false - */ - boolean areBlockStatesSimilar(BlockState blockState1, BlockState blockState2); - /** * Applies damage to a tool * diff --git a/src/main/java/com/songoda/ultimatetimber/adapter/current/CurrentAdapter.java b/src/main/java/com/songoda/ultimatetimber/adapter/current/CurrentAdapter.java index 8407bc4..cb150d1 100644 --- a/src/main/java/com/songoda/ultimatetimber/adapter/current/CurrentAdapter.java +++ b/src/main/java/com/songoda/ultimatetimber/adapter/current/CurrentAdapter.java @@ -1,12 +1,12 @@ package com.songoda.ultimatetimber.adapter.current; +import com.songoda.ultimatetimber.adapter.IBlockData; import com.songoda.ultimatetimber.adapter.VersionAdapter; import com.songoda.ultimatetimber.adapter.VersionAdapterType; import com.songoda.ultimatetimber.tree.FallingTreeBlock; import com.songoda.ultimatetimber.tree.TreeBlock; import com.songoda.ultimatetimber.tree.TreeBlockSet; import org.bukkit.block.Block; -import org.bukkit.block.BlockState; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -20,7 +20,7 @@ public class CurrentAdapter implements VersionAdapter { } @Override - public BlockState parseBlockStateFromString(String blockStateString) { + public IBlockData parseBlockDataFromString(String blockDataString) { return null; } @@ -34,11 +34,6 @@ public class CurrentAdapter implements VersionAdapter { return null; } - @Override - public boolean areBlockStatesSimilar(BlockState blockState1, BlockState blockState2) { - return false; - } - @Override public void applyToolDurability(TreeBlockSet treeBlocks, ItemStack tool) { diff --git a/src/main/java/com/songoda/ultimatetimber/adapter/current/CurrentBlockData.java b/src/main/java/com/songoda/ultimatetimber/adapter/current/CurrentBlockData.java new file mode 100644 index 0000000..825c962 --- /dev/null +++ b/src/main/java/com/songoda/ultimatetimber/adapter/current/CurrentBlockData.java @@ -0,0 +1,35 @@ +package com.songoda.ultimatetimber.adapter.current; + +import com.songoda.ultimatetimber.adapter.IBlockData; +import org.bukkit.Material; +import org.bukkit.block.Block; + +public class CurrentBlockData implements IBlockData { + + private final Material material; + + public CurrentBlockData(Material material) { + this.material = material; + } + + @Override + public Material getMaterial() { + return this.material; + } + + @Override + public byte getData() { + return 0; + } + + @Override + public boolean isSimilar(IBlockData otherBlockData) { + return this.material.equals(otherBlockData.getMaterial()); + } + + @Override + public boolean isSimilar(Block block) { + return this.material.equals(block.getType()); + } + +} diff --git a/src/main/java/com/songoda/ultimatetimber/adapter/legacy/LegacyAdapter.java b/src/main/java/com/songoda/ultimatetimber/adapter/legacy/LegacyAdapter.java index d438bd8..51cffd9 100644 --- a/src/main/java/com/songoda/ultimatetimber/adapter/legacy/LegacyAdapter.java +++ b/src/main/java/com/songoda/ultimatetimber/adapter/legacy/LegacyAdapter.java @@ -1,12 +1,12 @@ package com.songoda.ultimatetimber.adapter.legacy; +import com.songoda.ultimatetimber.adapter.IBlockData; import com.songoda.ultimatetimber.adapter.VersionAdapter; import com.songoda.ultimatetimber.adapter.VersionAdapterType; import com.songoda.ultimatetimber.tree.FallingTreeBlock; import com.songoda.ultimatetimber.tree.TreeBlock; import com.songoda.ultimatetimber.tree.TreeBlockSet; import org.bukkit.block.Block; -import org.bukkit.block.BlockState; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -20,7 +20,7 @@ public class LegacyAdapter implements VersionAdapter { } @Override - public BlockState parseBlockStateFromString(String blockStateString) { + public IBlockData parseBlockDataFromString(String blockDataString) { return null; } @@ -34,11 +34,6 @@ public class LegacyAdapter implements VersionAdapter { return null; } - @Override - public boolean areBlockStatesSimilar(BlockState blockState1, BlockState blockState2) { - return false; - } - @Override public void applyToolDurability(TreeBlockSet treeBlocks, ItemStack tool) { diff --git a/src/main/java/com/songoda/ultimatetimber/adapter/legacy/LegacyBlockData.java b/src/main/java/com/songoda/ultimatetimber/adapter/legacy/LegacyBlockData.java new file mode 100644 index 0000000..1d51e8d --- /dev/null +++ b/src/main/java/com/songoda/ultimatetimber/adapter/legacy/LegacyBlockData.java @@ -0,0 +1,40 @@ +package com.songoda.ultimatetimber.adapter.legacy; + +import com.songoda.ultimatetimber.adapter.IBlockData; +import org.bukkit.Material; +import org.bukkit.block.Block; + +@SuppressWarnings("deprecation") +public class LegacyBlockData implements IBlockData { + + private final Material material; + private final byte data; + + public LegacyBlockData(Material material, byte data) { + this.material = material; + this.data = data; + } + + @Override + public Material getMaterial() { + return this.material; + } + + @Override + public byte getData() { + return this.data; + } + + @Override + public boolean isSimilar(IBlockData otherBlockData) { + return this.getMaterial().equals(otherBlockData.getMaterial()) && this.getData() == otherBlockData.getData(); + } + + @Override + public boolean isSimilar(Block block) { + Material blockMaterial = block.getType(); + byte blockData = block.getData(); + return this.material.equals(blockMaterial) && this.data == blockData; + } + +} diff --git a/src/main/java/com/songoda/ultimatetimber/manager/CommandManager.java b/src/main/java/com/songoda/ultimatetimber/manager/CommandManager.java index 35e0fb9..e96a67c 100644 --- a/src/main/java/com/songoda/ultimatetimber/manager/CommandManager.java +++ b/src/main/java/com/songoda/ultimatetimber/manager/CommandManager.java @@ -39,7 +39,7 @@ public class CommandManager extends Manager implements CommandExecutor, TabCompl return true; UltimateTimber.getInstance().reload(); - commandSender.sendMessage(Methods.formatText(UltimateTimber.getInstance().getMessageManager().getPrefix() + " &7Configuration reloaded")); + commandSender.sendMessage(Methods.formatText(UltimateTimber.getInstance().getPrefix() + " &7Configuration reloaded")); return true; } else if (args[0].equalsIgnoreCase("toggle")) { if (!(commandSender instanceof Player)) { @@ -51,9 +51,9 @@ public class CommandManager extends Manager implements CommandExecutor, TabCompl return true; if (UltimateTimber.getInstance().getChoppingManager().togglePlayer((Player)commandSender)) { - commandSender.sendMessage(Methods.formatText(UltimateTimber.getInstance().getMessageManager().getPrefix() + " Chopping Mode: &aEnabled")); + commandSender.sendMessage(Methods.formatText(UltimateTimber.getInstance().getPrefix() + " Chopping Mode: &aEnabled")); } else { - commandSender.sendMessage(Methods.formatText(UltimateTimber.getInstance().getMessageManager().getPrefix() + " Chopping Mode: &cDisabled")); + commandSender.sendMessage(Methods.formatText(UltimateTimber.getInstance().getPrefix() + " Chopping Mode: &cDisabled")); } return true; @@ -61,7 +61,7 @@ public class CommandManager extends Manager implements CommandExecutor, TabCompl } commandSender.sendMessage(""); - commandSender.sendMessage(Methods.formatText(UltimateTimber.getInstance().getMessageManager().getPrefix() + " &7Version " + UltimateTimber.getInstance().getDescription().getVersion() + " Created with <3 by &5&l&oSongoda")); + commandSender.sendMessage(Methods.formatText(UltimateTimber.getInstance().getPrefix() + " &7Version " + UltimateTimber.getInstance().getDescription().getVersion() + " Created with <3 by &5&l&oSongoda")); commandSender.sendMessage(Methods.formatText("&8 - &a/ut reload &7 - Reloads the config.")); commandSender.sendMessage(Methods.formatText("&8 - &a/ut toggle &7 - Toggles your chopping mode")); commandSender.sendMessage(""); diff --git a/src/main/java/com/songoda/ultimatetimber/manager/TreeDefinitionManager.java b/src/main/java/com/songoda/ultimatetimber/manager/TreeDefinitionManager.java index c0174b1..ba5c2c6 100644 --- a/src/main/java/com/songoda/ultimatetimber/manager/TreeDefinitionManager.java +++ b/src/main/java/com/songoda/ultimatetimber/manager/TreeDefinitionManager.java @@ -1,6 +1,7 @@ package com.songoda.ultimatetimber.manager; import com.songoda.ultimatetimber.UltimateTimber; +import com.songoda.ultimatetimber.adapter.IBlockData; import com.songoda.ultimatetimber.adapter.VersionAdapter; import com.songoda.ultimatetimber.tree.ITreeBlock; import com.songoda.ultimatetimber.tree.TreeBlockType; @@ -8,7 +9,7 @@ import com.songoda.ultimatetimber.tree.TreeDefinition; import com.songoda.ultimatetimber.tree.TreeLoot; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.block.BlockState; +import org.bukkit.block.Block; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.enchantments.Enchantment; @@ -51,9 +52,10 @@ public class TreeDefinitionManager extends Manager { for (String key : treeSection.getKeys(false)) { ConfigurationSection tree = treeSection.getConfigurationSection(key); - Set logBlockStates = new HashSet<>(); - Set leafBlockStates = new HashSet<>(); - BlockState saplingBlockState; + Set logBlockData = new HashSet<>(); + Set leafBlockData = new HashSet<>(); + IBlockData saplingBlockData; + Set plantableSoilBlockData = new HashSet<>(); int maxLeafDistanceFromLog; boolean detectLeavesDiagonally; boolean dropOriginalLog; @@ -62,13 +64,17 @@ public class TreeDefinitionManager extends Manager { Set leafLoot = new HashSet<>(); Set requiredTools = new HashSet<>(); - for (String blockStateString : tree.getStringList("logs")) - logBlockStates.add(versionAdapter.parseBlockStateFromString(blockStateString)); + for (String blockDataString : tree.getStringList("logs")) + logBlockData.add(versionAdapter.parseBlockDataFromString(blockDataString)); - for (String blockStateString : tree.getStringList("leaves")) - leafBlockStates.add(versionAdapter.parseBlockStateFromString(blockStateString)); + for (String blockDataString : tree.getStringList("leaves")) + leafBlockData.add(versionAdapter.parseBlockDataFromString(blockDataString)); + + saplingBlockData = versionAdapter.parseBlockDataFromString(tree.getString("sapling")); + + for (String blockDataString : tree.getStringList("plantable-soil")) + plantableSoilBlockData.add(versionAdapter.parseBlockDataFromString(blockDataString)); - saplingBlockState = versionAdapter.parseBlockStateFromString(tree.getString("sapling")); maxLeafDistanceFromLog = tree.getInt("max-leaf-distance-from-log"); detectLeavesDiagonally = tree.getBoolean("search-for-leaves-diagonally"); dropOriginalLog = tree.getBoolean("drop-original-log"); @@ -85,7 +91,7 @@ public class TreeDefinitionManager extends Manager { for (String itemStackString : tree.getStringList("required-tools")) requiredTools.add(versionAdapter.parseItemStackFromString(itemStackString)); - this.treeDefinitions.add(new TreeDefinition(key, logBlockStates, leafBlockStates, saplingBlockState, maxLeafDistanceFromLog, detectLeavesDiagonally, dropOriginalLog, dropOriginalLeaf, logLoot, leafLoot, requiredTools)); + this.treeDefinitions.add(new TreeDefinition(key, logBlockData, leafBlockData, saplingBlockData, plantableSoilBlockData, maxLeafDistanceFromLog, detectLeavesDiagonally, dropOriginalLog, dropOriginalLeaf, logLoot, leafLoot, requiredTools)); } // Load global log drops @@ -109,32 +115,32 @@ public class TreeDefinitionManager extends Manager { } /** - * Gets a Set of possible TreeDefinitions that match the given BlockState + * Gets a Set of possible TreeDefinitions that match the given Block * - * @param blockState The BlockState to check - * @return A Set of TreeDefinitions for the given BlockState + * @param block The Block to check + * @return A Set of TreeDefinitions for the given Block */ - public Set getTreeDefinitionsForLog(BlockState blockState) { - return this.narrowTreeDefinition(this.treeDefinitions, blockState, TreeBlockType.LOG); + public Set getTreeDefinitionsForLog(Block block) { + return this.narrowTreeDefinition(this.treeDefinitions, block, TreeBlockType.LOG); } /** - * Narrows a Set of TreeDefinitions down to ones matching the given BlockState and TreeBlockType + * Narrows a Set of TreeDefinitions down to ones matching the given Block and TreeBlockType * * @param possibleTreeDefinitions The possible TreeDefinitions - * @param blockState The BlockState to narrow to - * @param treeBlockType The TreeBlockType of the given BlockState + * @param block The Block to narrow to + * @param treeBlockType The TreeBlockType of the given Block * @return A Set of TreeDefinitions narrowed down */ - public Set narrowTreeDefinition(Set possibleTreeDefinitions, BlockState blockState, TreeBlockType treeBlockType) { + public Set narrowTreeDefinition(Set possibleTreeDefinitions, Block block, TreeBlockType treeBlockType) { VersionAdapter versionAdapter = this.ultimateTimber.getVersionAdapter(); Set matchingTreeDefinitions = new HashSet<>(); switch (treeBlockType) { case LOG: - for (TreeDefinition treeDefinition : this.treeDefinitions) { - for (BlockState logBlockState : treeDefinition.getLogBlockStates()) { - if (versionAdapter.areBlockStatesSimilar(logBlockState, blockState)) { + for (TreeDefinition treeDefinition : possibleTreeDefinitions) { + for (IBlockData logBlockData : treeDefinition.getLogBlockData()) { + if (logBlockData.isSimilar(block)) { matchingTreeDefinitions.add(treeDefinition); break; } @@ -142,9 +148,9 @@ public class TreeDefinitionManager extends Manager { } break; case LEAF: - for (TreeDefinition treeDefinition : this.treeDefinitions) { - for (BlockState leafBlockState : treeDefinition.getLeafBlockStates()) { - if (versionAdapter.areBlockStatesSimilar(leafBlockState, blockState)) { + for (TreeDefinition treeDefinition : possibleTreeDefinitions) { + for (IBlockData leafBlockData : treeDefinition.getLeafBlockData()) { + if (leafBlockData.isSimilar(block)) { matchingTreeDefinitions.add(treeDefinition); break; } @@ -156,6 +162,23 @@ public class TreeDefinitionManager extends Manager { return matchingTreeDefinitions; } + /** + * Checks if a given tool is valid for any tree definitions, also takes into account global tools + * + * @param tool The tool to check + * @return True if the tool is allowed for toppling any trees + */ + public boolean isToolValidForAnyTreeDefinition(ItemStack tool) { + for (TreeDefinition treeDefinition : this.treeDefinitions) + for (ItemStack requiredTool : treeDefinition.getRequiredTools()) + if (requiredTool.isSimilar(tool)) + return true; + for (ItemStack requiredTool : this.globalRequiredTools) + if (requiredTool.isSimilar(tool)) + return true; + return false; + } + /** * Checks if a given tool is valid for a given tree definition, also takes into account global tools * diff --git a/src/main/java/com/songoda/ultimatetimber/manager/TreeDetectionManager.java b/src/main/java/com/songoda/ultimatetimber/manager/TreeDetectionManager.java index 1aaed6a..ff9bec0 100644 --- a/src/main/java/com/songoda/ultimatetimber/manager/TreeDetectionManager.java +++ b/src/main/java/com/songoda/ultimatetimber/manager/TreeDetectionManager.java @@ -1,11 +1,11 @@ package com.songoda.ultimatetimber.manager; import com.songoda.ultimatetimber.UltimateTimber; +import com.songoda.ultimatetimber.adapter.IBlockData; import com.songoda.ultimatetimber.adapter.VersionAdapter; import com.songoda.ultimatetimber.tree.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.block.BlockState; import org.bukkit.util.Vector; import java.util.Comparator; @@ -76,7 +76,7 @@ public class TreeDetectionManager extends Manager { public DetectedTree detectTree(Block initialBlock) { TreeBlock initialTreeBlock = new TreeBlock(initialBlock, TreeBlockType.LOG); TreeBlockSet detectedTreeBlocks = new TreeBlockSet<>(initialTreeBlock); - Set possibleTreeDefinitions = treeDefinitionManager.getTreeDefinitionsForLog(initialBlock.getState()); + Set possibleTreeDefinitions = treeDefinitionManager.getTreeDefinitionsForLog(initialBlock); // Detect tree trunk Set trunkBlocks = new HashSet<>(); @@ -86,7 +86,7 @@ public class TreeDetectionManager extends Manager { TreeBlock treeBlock = new TreeBlock(targetBlock, TreeBlockType.LOG); detectedTreeBlocks.add(treeBlock); trunkBlocks.add(initialBlock); - possibleTreeDefinitions.retainAll(this.treeDefinitionManager.narrowTreeDefinition(possibleTreeDefinitions, targetBlock.getState(), TreeBlockType.LOG)); + possibleTreeDefinitions.retainAll(this.treeDefinitionManager.narrowTreeDefinition(possibleTreeDefinitions, targetBlock, TreeBlockType.LOG)); } // Tree must be at least 2 blocks tall @@ -102,18 +102,23 @@ public class TreeDetectionManager extends Manager { for (ITreeBlock branchBlock : branchBlocks) this.recursiveLeafSearch(possibleTreeDefinitions, detectedTreeBlocks, branchBlock.getBlock(), 1); + TreeDefinition actualTreeDefinition = possibleTreeDefinitions.iterator().next(); + // Trees need at least a certain number of leaves if (detectedTreeBlocks.getLeafBlocks().size() < this.numLeavesRequiredForTree) return null; // TODO: Soil detection + if (this.entireTreeBase) { + // TODO: Yadda yadda + } // Delete the starting block if applicable if (this.destroyBaseLog) detectedTreeBlocks.remove(initialTreeBlock); // Use the first tree definition in the set - return new DetectedTree(possibleTreeDefinitions.iterator().next(), detectedTreeBlocks); + return new DetectedTree(actualTreeDefinition, detectedTreeBlocks); } /** @@ -133,7 +138,7 @@ public class TreeDetectionManager extends Manager { TreeBlock treeBlock = new TreeBlock(targetBlock, TreeBlockType.LOG); if (this.isValidLogType(treeDefinitions, targetBlock) && !treeBlocks.contains(treeBlock)) { treeBlocks.add(treeBlock); - treeDefinitions.retainAll(this.treeDefinitionManager.narrowTreeDefinition(treeDefinitions, block.getState(), TreeBlockType.LOG)); + treeDefinitions.retainAll(this.treeDefinitionManager.narrowTreeDefinition(treeDefinitions, block, TreeBlockType.LOG)); if (!this.onlyBreakLogsUpwards || targetBlock.getLocation().getBlockY() > startingBlockY) this.recursiveBranchSearch(treeDefinitions, treeBlocks, targetBlock, startingBlockY); } @@ -161,7 +166,7 @@ public class TreeDetectionManager extends Manager { if (this.isValidLeafType(treeDefinitions, targetBlock)) { if (!treeBlocks.contains(treeBlock) && !this.doesLeafBorderInvalidLog(treeDefinitions, treeBlocks, targetBlock)) { treeBlocks.add(treeBlock); - treeDefinitions.retainAll(this.treeDefinitionManager.narrowTreeDefinition(treeDefinitions, block.getState(), TreeBlockType.LEAF)); + treeDefinitions.retainAll(this.treeDefinitionManager.narrowTreeDefinition(treeDefinitions, block, TreeBlockType.LEAF)); } this.recursiveLeafSearch(treeDefinitions, treeBlocks, targetBlock, distanceFromLog + 1); } @@ -195,8 +200,8 @@ public class TreeDetectionManager extends Manager { private boolean isValidLogType(Set treeDefinitions, Block block) { VersionAdapter versionAdapter = this.ultimateTimber.getVersionAdapter(); for (TreeDefinition treeDefinition : treeDefinitions) - for (BlockState logBlockState : treeDefinition.getLogBlockStates()) - if (versionAdapter.areBlockStatesSimilar(logBlockState, block.getState())) + for (IBlockData logBlockData : treeDefinition.getLogBlockData()) + if (logBlockData.isSimilar(block)) return true; return false; } @@ -211,8 +216,8 @@ public class TreeDetectionManager extends Manager { private boolean isValidLeafType(Set treeDefinitions, Block block) { VersionAdapter versionAdapter = this.ultimateTimber.getVersionAdapter(); for (TreeDefinition treeDefinition : treeDefinitions) - for (BlockState leafBlockState : treeDefinition.getLeafBlockStates()) - if (versionAdapter.areBlockStatesSimilar(leafBlockState, block.getState())) + for (IBlockData leafBlockData : treeDefinition.getLeafBlockData()) + if (leafBlockData.isSimilar(block)) return true; return false; } diff --git a/src/main/java/com/songoda/ultimatetimber/old_code/TreeChecker.java b/src/main/java/com/songoda/ultimatetimber/old_code/TreeChecker.java index 513891f..3195aee 100644 --- a/src/main/java/com/songoda/ultimatetimber/old_code/TreeChecker.java +++ b/src/main/java/com/songoda/ultimatetimber/old_code/TreeChecker.java @@ -217,7 +217,7 @@ public class TreeChecker { for (Vector offset : !this.isMushroom ? VALID_LEAF_OFFSETS : VALID_TRUNK_OFFSETS) { Block targetBlock = block.getRelative(offset.getBlockX(), offset.getBlockY(), offset.getBlockZ()); - if (this.isValidLeafType(targetBlock.getType()) || (this.isMushroom && this.isMushroomBlock(targetBlock.getType()))) { + if (this.isValidLeafType(targetBlock.getType())) { if (!this.treeBlocks.contains(targetBlock) && !doesLeafBorderInvalidLog(targetBlock)) this.treeBlocks.add(targetBlock); this.recursiveLeafSearch(targetBlock, distanceFromLog + 1); @@ -252,16 +252,6 @@ public class TreeChecker { return material.equals(this.leafType); } - /** - * Checks if a block is a mushroom head block - * - * @param block The block to check - * @return If the given block is a mushroom - */ - private boolean isMushroomBlock(Material material) { - return material.equals(Material.BROWN_MUSHROOM_BLOCK) || material.equals(Material.RED_MUSHROOM_BLOCK); - } - /** * Gets the max distance away from a log based on how many logs there are and the leaf type * diff --git a/src/main/java/com/songoda/ultimatetimber/tree/TreeDefinition.java b/src/main/java/com/songoda/ultimatetimber/tree/TreeDefinition.java index 5bb6358..7b6771b 100644 --- a/src/main/java/com/songoda/ultimatetimber/tree/TreeDefinition.java +++ b/src/main/java/com/songoda/ultimatetimber/tree/TreeDefinition.java @@ -1,6 +1,6 @@ package com.songoda.ultimatetimber.tree; -import org.bukkit.block.BlockState; +import com.songoda.ultimatetimber.adapter.IBlockData; import org.bukkit.inventory.ItemStack; import java.util.Collections; @@ -9,21 +9,23 @@ import java.util.Set; public class TreeDefinition { private final String key; - private final Set logBlockStates, leafBlockStates; - private final BlockState saplingBlockState; + private final Set logBlockData, leafBlockData, plantableSoilBlockData; + private final IBlockData saplingBlockData; private final int maxLeafDistanceFromLog; private final boolean detectLeavesDiagonally; private final boolean dropOriginalLog, dropOriginalLeaf; private final Set logLoot, leafLoot; private final Set requiredTools; - public TreeDefinition(String key, Set logBlocks, Set leafBlocks, BlockState saplingBlockState, - int maxLeafDistanceFromLog, boolean detectLeavesDiagonally, boolean dropOriginalLog, boolean dropOriginalLeaf, - Set logLoot, Set leafLoot, 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 requiredTools) { this.key = key; - this.logBlockStates = logBlocks; - this.leafBlockStates = leafBlocks; - this.saplingBlockState = saplingBlockState; + this.logBlockData = logBlockData; + this.leafBlockData = leafBlockData; + this.saplingBlockData = saplingBlockData; + this.plantableSoilBlockData = plantableSoilBlockData; this.maxLeafDistanceFromLog = maxLeafDistanceFromLog; this.detectLeavesDiagonally = detectLeavesDiagonally; this.dropOriginalLog = dropOriginalLog; @@ -43,30 +45,39 @@ public class TreeDefinition { } /** - * Gets a set of valid log block states for this TreeDefinition + * Gets a set of valid log block data for this TreeDefinition * - * @return A Set of BlockStates + * @return A Set of IBlockData */ - public Set getLogBlockStates() { - return Collections.unmodifiableSet(this.logBlockStates); + public Set getLogBlockData() { + return Collections.unmodifiableSet(this.logBlockData); } /** - * Gets a set of valid leaf block states for this TreeDefinition + * Gets a set of valid leaf block data for this TreeDefinition * - * @return A Set of BlockStates + * @return A Set of IBlockData */ - public Set getLeafBlockStates() { - return Collections.unmodifiableSet(this.leafBlockStates); + public Set getLeafBlockData() { + return Collections.unmodifiableSet(this.leafBlockData); } /** - * Gets the sapling block state of this TreeDefinition + * Gets the sapling block data of this TreeDefinition * - * @return A BlockState for the sapling + * @return An IBlockData instance for the sapling */ - public BlockState getSaplingBlockState() { - return this.saplingBlockState; + public IBlockData getSaplingBlockData() { + return this.saplingBlockData; + } + + /** + * Gets a set of plantable soil block data for this TreeDefinition + * + * @return A Set of IBlockData + */ + public Set getPlantableSoilBlockData() { + return Collections.unmodifiableSet(this.plantableSoilBlockData); } /** diff --git a/src/main/resources/config-current.yml b/src/main/resources/config-current.yml index 1991595..58c01da 100644 --- a/src/main/resources/config-current.yml +++ b/src/main/resources/config-current.yml @@ -124,6 +124,7 @@ trees: leaves: - OAK_LEAVES sapling: OAK_SAPLING + plantable-soil: [] max-leaf-distance-from-log: 6 search-for-leaves-diagonally: false drop-original-log: true @@ -146,6 +147,7 @@ trees: leaves: - SPRUCE_LEAVES sapling: SPRUCE_SAPLING + plantable-soil: [] max-leaf-distance-from-log: 6 search-for-leaves-diagonally: false drop-original-log: true @@ -165,6 +167,7 @@ trees: leaves: - SPRUCE_BIRCH sapling: BIRCH_SAPLING + plantable-soil: [] max-leaf-distance-from-log: 4 search-for-leaves-diagonally: false drop-original-log: true @@ -184,6 +187,7 @@ trees: leaves: - SPRUCE_LEAVES sapling: SPRUCE_SAPLING + plantable-soil: [] max-leaf-distance-from-log: 5 search-for-leaves-diagonally: false drop-original-log: true @@ -203,6 +207,7 @@ trees: leaves: - ACACIA_LEAVES sapling: ACACIA_SAPLING + plantable-soil: [] max-leaf-distance-from-log: 5 search-for-leaves-diagonally: false drop-original-log: true @@ -222,6 +227,7 @@ trees: leaves: - DARK_OAK_LEAVES sapling: DARK_OAK_SAPLING + plantable-soil: [] max-leaf-distance-from-log: 5 search-for-leaves-diagonally: false drop-original-log: true @@ -241,6 +247,8 @@ trees: leaves: - BROWN_MUSHROOM_BLOCK sapling: BROWN_MUSHROOM + plantable-soil: + - MYCELIUM max-leaf-distance-from-log: 4 search-for-leaves-diagonally: false drop-original-log: false @@ -257,6 +265,8 @@ trees: leaves: - RED_MUSHROOM_BLOCK sapling: RED_MUSHROOM + plantable-soil: + - MYCELIUM max-leaf-distance-from-log: 4 search-for-leaves-diagonally: true drop-original-log: false @@ -268,6 +278,12 @@ trees: chance: 25 required-tools: [] +# All soil types that the tree type's saplings can be planted on +global-plantable-soil: + - GRASS_BLOCK + - DIRT + - COARSE_DIRT + # Custom loot that is available for all tree types # The loot applies to each log broken in the tree # To add more, increment the number by 1 diff --git a/src/main/resources/config-legacy.yml b/src/main/resources/config-legacy.yml index 7d43b49..c5d9972 100644 --- a/src/main/resources/config-legacy.yml +++ b/src/main/resources/config-legacy.yml @@ -127,6 +127,7 @@ trees: - LEAVES:8 - LEAVES:12 sapling: SAPLING:0 + plantable-soil: [] max-leaf-distance-from-log: 6 search-for-leaves-diagonally: false drop-original-log: true @@ -152,6 +153,7 @@ trees: - LEAVES:9 - LEAVES:13 sapling: SAPLING:1 + plantable-soil: [] max-leaf-distance-from-log: 6 search-for-leaves-diagonally: false drop-original-log: true @@ -174,6 +176,7 @@ trees: - LEAVES:10 - LEAVES:14 sapling: SAPLING:2 + plantable-soil: [] max-leaf-distance-from-log: 4 search-for-leaves-diagonally: false drop-original-log: true @@ -196,6 +199,7 @@ trees: - LEAVES:11 - LEAVES:15 sapling: SAPLING:3 + plantable-soil: [] max-leaf-distance-from-log: 5 search-for-leaves-diagonally: false drop-original-log: true @@ -218,6 +222,7 @@ trees: - LEAVES_2:8 - LEAVES_2:12 sapling: SAPLING:4 + plantable-soil: [] max-leaf-distance-from-log: 5 search-for-leaves-diagonally: false drop-original-log: true @@ -240,6 +245,7 @@ trees: - LEAVES:9 - LEAVES:13 sapling: SAPLING:5 + plantable-soil: [] max-leaf-distance-from-log: 5 search-for-leaves-diagonally: false drop-original-log: true @@ -270,6 +276,8 @@ trees: - HUGE_MUSHROOM_1:9 - HUGE_MUSHROOM_1:14 sapling: BROWN_MUSHROOM + plantable-soil: + - MYCEL max-leaf-distance-from-log: 4 search-for-leaves-diagonally: false drop-original-log: false @@ -297,6 +305,8 @@ trees: - HUGE_MUSHROOM_2:9 - HUGE_MUSHROOM_2:14 sapling: RED_MUSHROOM + plantable-soil: + - MYCEL max-leaf-distance-from-log: 4 search-for-leaves-diagonally: true drop-original-log: false @@ -308,6 +318,12 @@ trees: chance: 25 required-tools: [] +# All soil types that the tree type's saplings can be planted on +global-plantable-soil: + - GRASS + - DIRT:0 + - DIRT:1 + # Custom loot that is available for all tree types # The loot applies to each log broken in the tree # To add more, increment the number by 1