diff --git a/Server/src/main/java/core/game/node/entity/skill/cooking/dairy/DairyChurnPulse.java b/Server/src/main/java/core/game/node/entity/skill/cooking/dairy/DairyChurnPulse.java index eadc328b8..050c60a5c 100644 --- a/Server/src/main/java/core/game/node/entity/skill/cooking/dairy/DairyChurnPulse.java +++ b/Server/src/main/java/core/game/node/entity/skill/cooking/dairy/DairyChurnPulse.java @@ -1,13 +1,15 @@ package core.game.node.entity.skill.cooking.dairy; +import core.game.node.entity.player.Player; import core.game.node.entity.player.link.diary.DiaryType; -import core.game.world.map.Location; import core.game.node.entity.skill.SkillPulse; import core.game.node.entity.skill.Skills; -import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; import core.game.node.item.Item; +import core.game.world.map.Location; import core.game.world.update.flag.context.Animation; import core.tools.StringUtils; +import org.rs09.consts.Items; /** * Represents the skill pulse used to make a dairy product. @@ -57,14 +59,18 @@ public final class DairyChurnPulse extends SkillPulse { @Override public boolean checkRequirements() { player.getInterfaceManager().closeChatbox(); - if (!player.getInventory().contains(1927, 1)) { + boolean hasAnyInput = false; + for(Item input : dairy.getInputs()) { + if(player.getInventory().containsItem(input)) { + hasAnyInput = true; + node = input; + break; + } + } + if (!hasAnyInput) { player.getPacketDispatch().sendMessage("You need a bucket of milk."); return false; } - if (player.getInventory().freeSlots() < 1) { - player.getPacketDispatch().sendMessage("You don't have enough inventory space."); - return false; - } if (player.getSkills().getLevel(Skills.COOKING) < dairy.getLevel()) { player.getPacketDispatch().sendMessage("You need a cooking level of " + dairy.getLevel() + " to cook this."); return false; @@ -87,30 +93,31 @@ public final class DairyChurnPulse extends SkillPulse { @Override public boolean reward() { amount--; - if (player.getInventory().containsItem(BUCKET_OF_MILK)) { - if (player.getInventory().remove(BUCKET_OF_MILK)) { - if (player.getInventory().freeSlots() > 1) { - player.getInventory().add(dairy.getProduct()); - player.getInventory().add(BUCKET); - } - player.getPacketDispatch().sendMessage("You make " + (StringUtils.isPlusN(dairy.getProduct().getName().toLowerCase()) ? "an" : "a") + " " + dairy.getProduct().getName().toLowerCase() + "."); - player.getSkills().addExperience(Skills.COOKING, dairy.getExperience(), true); + for(Item input : dairy.getInputs()) { + if (player.getInventory().remove(input)) { + // Since we've just removed the input, there's always enough room for the primary output + player.getInventory().add(dairy.getProduct()); + // But if we were churning milk, we might need to drop the bucket on the floor if there isn't enough space + if(input.getId() == Items.BUCKET_OF_MILK_1927) { + if(!player.getInventory().add(BUCKET)) { + // https://runescape.wiki/w/Pat_of_butter?oldid=2043294 + // "using milk with a full inventory will auto-drop the buckets" + GroundItemManager.create(BUCKET, player); + } + } + player.getPacketDispatch().sendMessage("You make " + (StringUtils.isPlusN(dairy.getProduct().getName().toLowerCase()) ? "an" : "a") + " " + dairy.getProduct().getName().toLowerCase() + "."); + player.getSkills().addExperience(Skills.COOKING, dairy.getExperience(), true); - // Seers village diary - if (player.getLocation().withinDistance(new Location(2730, 3578, 0)) - && !player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(0,8)) { - player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).updateTask(player,0,8,true); - } + // Seers village diary + if (player.getLocation().withinDistance(new Location(2730, 3578, 0)) + && !player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(0,8)) { + player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).updateTask(player,0,8,true); + } + break; + } + } - } - } - - - if (player.getInventory().freeSlots() < 1) { - player.getPacketDispatch().sendMessage("You don't have enough inventory space."); - return true; - } - return amount < 1 || player.getInventory().freeSlots() < 1; + return amount < 1; } } diff --git a/Server/src/main/java/core/game/node/entity/skill/cooking/dairy/DairyProduct.java b/Server/src/main/java/core/game/node/entity/skill/cooking/dairy/DairyProduct.java index 17f6bdba6..9d6f31151 100644 --- a/Server/src/main/java/core/game/node/entity/skill/cooking/dairy/DairyProduct.java +++ b/Server/src/main/java/core/game/node/entity/skill/cooking/dairy/DairyProduct.java @@ -1,13 +1,18 @@ package core.game.node.entity.skill.cooking.dairy; +import java.util.Arrays; + import core.game.node.item.Item; +import org.rs09.consts.Items; /** * Represents an enumeration of dairy products. * @author 'Vexia */ public enum DairyProduct { - POT_OF_CREAM(21, 18, new Item(2130, 1)), PAT_OF_BUTTER(38, 40.5, new Item(6697, 1)), CHEESE(48, 64, new Item(1985, 1)); + POT_OF_CREAM(21, 18, new Item(Items.POT_OF_CREAM_2130, 1), new Integer[] { Items.BUCKET_OF_MILK_1927 }), + PAT_OF_BUTTER(38, 40.5, new Item(Items.PAT_OF_BUTTER_6697, 1), new Integer[] { Items.BUCKET_OF_MILK_1927, Items.POT_OF_CREAM_2130 }), + CHEESE(48, 64, new Item(Items.CHEESE_1985, 1), new Integer[] { Items.BUCKET_OF_MILK_1927, Items.POT_OF_CREAM_2130, Items.PAT_OF_BUTTER_6697 }); /** * The prodct Item. @@ -24,16 +29,22 @@ public enum DairyProduct { */ private double experience; + /** + * The possible inputs for making this dairy product + */ + private Item[] inputs; + /** * Constructs a new {@code DairyProduct.java} {@code Object}. * @param level * @param experience * @param product */ - DairyProduct(int level, double experience, Item product) { + DairyProduct(int level, double experience, Item product, Integer[] inputs) { this.level = level; this.experience = experience; this.product = product; + this.inputs = Arrays.stream(inputs).map(id -> new Item(id, 1)).toArray(len -> new Item[len]); } /** @@ -56,4 +67,8 @@ public enum DairyProduct { public double getExperience() { return experience; } + + public Item[] getInputs() { + return inputs; + } }