Max log distance from trunk setting, bug fixes

This commit is contained in:
Esophose 2019-05-02 18:33:26 -06:00
parent a7787caa84
commit c98377bb93
11 changed files with 77 additions and 22 deletions

View File

@ -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
*

View File

@ -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;

View File

@ -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) {

View File

@ -29,7 +29,7 @@ public class TreeFallEvent extends TreeEvent implements Cancellable {
@Override
public boolean isCancelled() {
return cancelled;
return this.cancelled;
}
@Override

View File

@ -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;

View File

@ -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

View File

@ -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();

View File

@ -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));
}

View File

@ -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;
}

View File

@ -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

View File

@ -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