Browse Source

Fix sapling drops to ignore reduction and obey Knock on Wood (#5012)

* Fixed NPE when party creation doesn't use password.  Solves bug reported here: https://discord.com/channels/526933440214597677/526938425161416727/1213131451235827753

Signed-off-by: Momshroom <Momshroom@gmail.com>

* Actually don't reduce sapling drop if KnockOnWood unlocked. (Prior fix didn't)

Signed-off-by: Momshroom <Momshroom@gmail.com>

* removed unnecessary getPlayer() calls.
clarified comment
clarified location variable name

Signed-off-by: Momshroom <Momshroom@gmail.com>

* made new method more generic.
Removed no longer needed dropString variable

Signed-off-by: Momshroom <Momshroom@gmail.com>

---------

Signed-off-by: Momshroom <Momshroom@gmail.com>
Momshroom 1 year ago
parent
commit
2f1278c784

+ 10 - 4
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<String> 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)) {

+ 13 - 0
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<String> predicate, @NotNull Player player, @NotNull Location spawnLocation, @NotNull Collection <ItemStack> 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.
      *