From cd3f9af2322212aa11e1af50aa0eb770afb53460 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Fri, 30 Jul 2021 10:22:50 -0400 Subject: [PATCH] Fix tree type size matcher --- .../com/volmit/iris/core/TreeManager.java | 25 ++++++++----------- .../engine/object/IrisObjectPlacement.java | 13 ++++++++++ .../volmit/iris/engine/object/IrisTree.java | 25 +++++++++++++++++++ 3 files changed, 48 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/TreeManager.java b/src/main/java/com/volmit/iris/core/TreeManager.java index fa01a7077..2c2955112 100644 --- a/src/main/java/com/volmit/iris/core/TreeManager.java +++ b/src/main/java/com/volmit/iris/core/TreeManager.java @@ -222,29 +222,20 @@ public class TreeManager implements Listener { private IrisObjectPlacement getObjectPlacement(IrisAccess worldAccess, Location location, TreeType type, IrisTreeSize size) { KList placements = new KList<>(); - KList allObjects = new KList<>(); boolean isUseAll = ((Engine) worldAccess.getEngineAccess(location.getBlockY())).getDimension().getTreeSettings().getMode().equals(IrisTreeModes.ALL); // Retrieve objectPlacements of type `species` from biome IrisBiome biome = worldAccess.getBiome(location.getBlockX(), location.getBlockY(), location.getBlockZ()); placements.addAll(matchObjectPlacements(biome.getObjects(), size, type)); - allObjects.addAll(biome.getObjects()); // Add more or find any in the region if (isUseAll || placements.isEmpty()) { IrisRegion region = worldAccess.getCompound().getEngineForHeight(location.getBlockY()).getRegion(location.getBlockX(), location.getBlockZ()); placements.addAll(matchObjectPlacements(region.getObjects(), size, type)); - allObjects.addAll(region.getObjects()); } - // TODO: Add more or find any in the dimension - // Add object placer to dimension - // if (isUseAll || placements.isEmpty()){ - // placements.addAll(matchObjectPlacements(worldAccess.getCompound().getRootDimension().getObjects(), size, type)); - // } - // Check if no matches were found, return a random one if they are - return placements.isNotEmpty() ? placements.getRandom(RNG.r) : null; + return placements.isNotEmpty() ? placements.getRandom() : null; } /** @@ -257,13 +248,17 @@ public class TreeManager implements Listener { */ private KList matchObjectPlacements(KList objects, IrisTreeSize size, TreeType type) { - Predicate isValid = irisTree -> ( - irisTree.isAnySize() || irisTree.getSizes().stream().anyMatch(treeSize -> treeSize.doesMatch(size))) && ( - irisTree.isAnyTree() || irisTree.getTreeTypes().stream().anyMatch(treeType -> treeType.equals(type))); + KList p = new KList<>(); - objects.removeIf(objectPlacement -> objectPlacement.getTrees().stream().noneMatch(isValid)); + for(IrisObjectPlacement i : objects) + { + if(i.matches(size, type)) + { + p.add(i); + } + } - return objects; + return p; } /** diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java b/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java index ae224305e..a6ef66945 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java @@ -36,6 +36,7 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import org.bukkit.Material; +import org.bukkit.TreeType; import org.bukkit.block.data.BlockData; @EqualsAndHashCode() @@ -214,6 +215,18 @@ public class IrisObjectPlacement { private transient AtomicCache cache = new AtomicCache<>(); + public boolean matches(IrisTreeSize size, TreeType type) { + for(IrisTree i : getTrees()) + { + if(i.matches(size, type)) + { + return true; + } + } + + return false; + } + private static class TableCache { final transient WeightedRandom global = new WeightedRandom<>(); final transient KMap> basic = new KMap<>(); diff --git a/src/main/java/com/volmit/iris/engine/object/IrisTree.java b/src/main/java/com/volmit/iris/engine/object/IrisTree.java index df356c7c2..8d73ea11e 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisTree.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisTree.java @@ -50,4 +50,29 @@ public class IrisTree { @Desc("If enabled, overrides trees of any size") private boolean anySize; + + public boolean matches(IrisTreeSize size, TreeType type) { + if(!matchesSize(size)) + { + return false; + } + + return matchesType(type); + } + + private boolean matchesSize(IrisTreeSize size) { + for(IrisTreeSize i : getSizes()) + { + if((i.getDepth() == size.getDepth() && i.getWidth() == size.getWidth()) || (i.getDepth() == size.getWidth() && i.getWidth() == size.getDepth())) + { + return true; + } + } + + return false; + } + + private boolean matchesType(TreeType type) { + return getTreeTypes().contains(type); + } } \ No newline at end of file