mirror of
https://github.com/songoda/UltimateTimber.git
synced 2025-02-11 01:01:56 +01:00
Max log distance from trunk setting, bug fixes
This commit is contained in:
parent
a7787caa84
commit
c98377bb93
@ -11,6 +11,7 @@ public class TreeDefinition {
|
||||
private final String key;
|
||||
private final Set<IBlockData> 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<ItemStack> requiredTools;
|
||||
|
||||
public TreeDefinition(String key, Set<IBlockData> logBlockData, Set<IBlockData> leafBlockData, IBlockData saplingBlockData,
|
||||
Set<IBlockData> plantableSoilBlockData, int maxLeafDistanceFromLog, boolean detectLeavesDiagonally,
|
||||
boolean dropOriginalLog, boolean dropOriginalLeaf, Set<TreeLoot> logLoot, Set<TreeLoot> leafLoot,
|
||||
Set<TreeLoot> entireTreeLoot, Set<ItemStack> requiredTools) {
|
||||
Set<IBlockData> plantableSoilBlockData, double maxLogDistanceFromTrunk, int maxLeafDistanceFromLog,
|
||||
boolean detectLeavesDiagonally, boolean dropOriginalLog, boolean dropOriginalLeaf, Set<TreeLoot> logLoot,
|
||||
Set<TreeLoot> leafLoot, Set<TreeLoot> entireTreeLoot, Set<ItemStack> 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
|
||||
*
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -29,7 +29,7 @@ public class TreeFallEvent extends TreeEvent implements Cancellable {
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
return this.cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -62,6 +62,7 @@ public class TreeDefinitionManager extends Manager {
|
||||
Set<IBlockData> leafBlockData = new HashSet<>();
|
||||
IBlockData saplingBlockData;
|
||||
Set<IBlockData> 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));
|
||||
}
|
||||
|
||||
|
@ -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<Block> 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<ITreeBlock<Block>> 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<TreeDefinition> treeDefinitions, TreeBlockSet<Block> treeBlocks, Block block, int startingBlockY) {
|
||||
private void recursiveBranchSearch(Set<TreeDefinition> treeDefinitions, List<Block> trunkBlocks, TreeBlockSet<Block> 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<TreeDefinition> treeDefinitions, TreeBlockSet<Block> 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<TreeDefinition> treeDefinitions, Block block) {
|
||||
private boolean isValidLogType(Set<TreeDefinition> treeDefinitions, List<Block> 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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user