diff --git a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java index e9d4623f3..679f15017 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -35,6 +35,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.ThreadLocalRandom; +import java.util.function.Predicate; //TODO: Seems to not be using the item drop event for bonus drops, may want to change that.. or may not be able to be changed? public class WoodcuttingManager extends SkillManager { @@ -316,19 +317,24 @@ public class WoodcuttingManager extends SkillManager { xp += processTreeFellerXPGains(blockState, processedLogCount); //Drop displaced block - Misc.spawnItemsFromCollection(getPlayer(), Misc.getBlockCenter(blockState), block.getDrops(itemStack), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); + Misc.spawnItemsFromCollection(player, Misc.getBlockCenter(blockState), block.getDrops(itemStack), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); //Bonus Drops / Harvest lumber checks processBonusDropCheck(blockState); } else if (BlockUtils.isNonWoodPartOfTree(blockState)) { // 75% of the time do not drop leaf blocks - if (blockState.getType().getKey().getKey().toLowerCase().contains("sapling") - || ThreadLocalRandom.current().nextInt(100) > 75) { - Misc.spawnItemsFromCollection(getPlayer(), + if (ThreadLocalRandom.current().nextInt(100) > 75) { + Misc.spawnItemsFromCollection(player, Misc.getBlockCenter(blockState), block.getDrops(itemStack), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); } + // if KnockOnWood is unlocked, then drop any saplings from the remaining blocks + else if (RankUtils.hasUnlockedSubskill(player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) { + Predicate isSapling = p -> p.contains("sapling") || p.contains("propagule"); + Misc.conditionallySpawn(isSapling, player, Misc.getBlockCenter(blockState), + block.getDrops(itemStack), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); + } //Drop displaced non-woodcutting XP blocks if (RankUtils.hasUnlockedSubskill(player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) { diff --git a/src/main/java/com/gmail/nossr50/util/Misc.java b/src/main/java/com/gmail/nossr50/util/Misc.java index a289315cb..9b719b7aa 100644 --- a/src/main/java/com/gmail/nossr50/util/Misc.java +++ b/src/main/java/com/gmail/nossr50/util/Misc.java @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.Locale; import java.util.Random; import java.util.Set; +import java.util.function.Predicate; public final class Misc { private static final @NotNull Random random = new Random(); @@ -128,6 +129,18 @@ public final class Misc { } } + /** + * Drops the item from the item stack only if it is a sapling (or equivalent) + * Needed for TreeFeller + */ + public static void conditionallySpawn(@NotNull Predicate predicate, @NotNull Player player, @NotNull Location spawnLocation, @NotNull Collection drops, @NotNull ItemSpawnReason itemSpawnReason) { + for (ItemStack drop : drops) { + if (predicate.test(drop.getType().getKey().getKey())) { + spawnItem(player, spawnLocation, drop, itemSpawnReason); + } + } + } + /** * Drop items at a given location. *