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 eeb7687bc..09ddaa8bc 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -35,18 +35,20 @@ import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.ThreadLocalRandom; +import java.util.function.Predicate; import static com.gmail.nossr50.util.ItemUtils.spawnItemsFromCollection; import static com.gmail.nossr50.util.Misc.getBlockCenter; -import static com.gmail.nossr50.util.ItemUtils.spawnItem; import static com.gmail.nossr50.util.skills.RankUtils.hasUnlockedSubskill; -//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 { public static final String SAPLING = "sapling"; public static final String PROPAGULE = "propagule"; + private static final Predicate IS_SAPLING_OR_PROPAGULE = + p -> p.getType().getKey().getKey().toLowerCase().contains(SAPLING) + || p.getType().getKey().getKey().toLowerCase().contains(PROPAGULE); private boolean treeFellerReachedThreshold = false; - private static int treeFellerThreshold; //TODO: Shared setting, will be removed in 2.2 + private static int treeFellerThreshold; /** * The x/y differences to the blocks in a flat cylinder around the center @@ -336,11 +338,11 @@ public class WoodcuttingManager extends SkillManager { ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK); } else if (hasUnlockedSubskill(player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) { // if KnockOnWood is unlocked, then drop any saplings from the remaining blocks - spawnItem(block.getDrops(itemStack), + ItemUtils.spawnItemsConditionally(block.getDrops(itemStack), + IS_SAPLING_OR_PROPAGULE, ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK, getBlockCenter(blockState), // only spawn saplings - p -> p.toLowerCase().contains(SAPLING) || p.toLowerCase().contains(PROPAGULE), player ); } diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index 208d01f56..deaf95e93 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -681,25 +681,6 @@ public final class ItemUtils { return enchantmentWrappers.get(randomIndex); } - /** - * Spawn item if conditions are met. - * - * @param potentialItemSpawn The item to spawn if conditions are met - * @param itemSpawnReason The reason for the item drop - * @param spawnLocation The location to spawn the item at - * @param predicate The predicate to test the item against - * @param player The player to spawn the item for - */ - public static void spawnItem(@NotNull ItemStack potentialItemSpawn, - @NotNull ItemSpawnReason itemSpawnReason, - @NotNull Location spawnLocation, - @NotNull Predicate predicate, - @NotNull Player player) { - if (predicate.test(potentialItemSpawn.getType().getKey().getKey())) { - spawnItem(player, spawnLocation, potentialItemSpawn, itemSpawnReason); - } - } - /** * Drop items at a given location. * @@ -879,18 +860,18 @@ public final class ItemUtils { * * @param potentialItemDrops The collection of items to iterate over, each one is tested and spawned if the * predicate is true + * @param predicate The predicate to test the item against * @param itemSpawnReason The reason for the item drop * @param spawnLocation The location to spawn the item at - * @param predicate The predicate to test the item against * @param player The player to spawn the item for */ - public static void spawnItem(@NotNull Collection potentialItemDrops, - @NotNull ItemSpawnReason itemSpawnReason, - @NotNull Location spawnLocation, - @NotNull Predicate predicate, - @NotNull Player player) { - for (ItemStack drop : potentialItemDrops) { - spawnItem(drop, itemSpawnReason, spawnLocation, predicate, player); - } + public static void spawnItemsConditionally(@NotNull Collection potentialItemDrops, + @NotNull Predicate predicate, + @NotNull ItemSpawnReason itemSpawnReason, + @NotNull Location spawnLocation, + @NotNull Player player) { + potentialItemDrops.stream() + .filter(predicate) + .forEach(itemStack -> spawnItem(player, spawnLocation, itemStack, itemSpawnReason)); } }