From 7e91c228fa3d08f434feead790267f08816dd5e5 Mon Sep 17 00:00:00 2001 From: Drefvelin <54400154+Drefvelin@users.noreply.github.com> Date: Wed, 23 Sep 2026 21:33:29 +0000 Subject: [PATCH 1/2] fix: stop paper tools and scooped soup from being consumed Sausage casing now accepts only plain paper, so the masher and other paper-based tools stay in hand. A soup scoop also cancels the pot click so the ladle-shaped soup is not placed into the ladle slot. Co-authored-by: Cursor --- .../cooking/cooking/PotReference.java | 22 +++++++++- .../cooking/sausagemaker/CasingPaper.java | 41 +++++++++++++++++++ .../sausagemaker/SausageMakerHandler.java | 10 ++--- 3 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 src/main/java/net/tfminecraft/cooking/sausagemaker/CasingPaper.java diff --git a/src/main/java/net/tfminecraft/cooking/cooking/PotReference.java b/src/main/java/net/tfminecraft/cooking/cooking/PotReference.java index 4f3d085..a7a2e62 100644 --- a/src/main/java/net/tfminecraft/cooking/cooking/PotReference.java +++ b/src/main/java/net/tfminecraft/cooking/cooking/PotReference.java @@ -385,12 +385,20 @@ public void interact(FurnitureInteractEvent e) { return; } ItemStack item = p.getInventory().getItemInMainHand(); + if (isHeldSoup(item)) { + e.setCancelled(true); + return; + } if(ItemCache.isLadle(item)) { - scoop(p, item); + if (isSoup()) { + scoop(p, item); + e.setCancelled(true); + } return; } if(ItemCache.isMasher(item)) { mash(p); + e.setCancelled(true); return; } if (!secondaries.containsKey("liquid")) { @@ -411,6 +419,7 @@ public void interact(FurnitureInteractEvent e) { danger = 0; temperature = 0; f.getLoc().getWorld().playSound(f.getLoc(), Sound.ITEM_BUCKET_FILL, 1f, 1f); + e.setCancelled(true); return; } } @@ -419,6 +428,7 @@ public void interact(FurnitureInteractEvent e) { String extraKey = incoming == null ? null : extraSlotKey(incoming.getCategory()); if (extraKey != null) { acceptExtra(p, item, extraKey); + e.setCancelled(true); return; } for(String slot : f.getType().getSlots().keySet()) { @@ -426,12 +436,22 @@ public void interact(FurnitureInteractEvent e) { updateModel(); p.swingMainHand(); thickenSoup(); + e.setCancelled(true); break; } } } } + /** Scooped soup keeps the ladle's paper item, so it must not be used as a ladle. */ + private static boolean isHeldSoup(ItemStack item) { + FoodItem food = FoodItem.fromItem(item); + if (food == null) { + return false; + } + return "soup".equalsIgnoreCase(food.getId()) || "soup".equalsIgnoreCase(food.getCategory()); + } + private void acceptExtra(Player p, ItemStack item, String extraKey) { ItemStack stored = item.clone(); stored.setAmount(1); diff --git a/src/main/java/net/tfminecraft/cooking/sausagemaker/CasingPaper.java b/src/main/java/net/tfminecraft/cooking/sausagemaker/CasingPaper.java new file mode 100644 index 0000000..c34d5ce --- /dev/null +++ b/src/main/java/net/tfminecraft/cooking/sausagemaker/CasingPaper.java @@ -0,0 +1,41 @@ +package net.tfminecraft.cooking.sausagemaker; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import net.tfminecraft.cooking.item.FoodItem; +import net.tfminecraft.cooking.util.LegacyModelData; + +/** + * Sausage casing is plain vanilla paper. Cooking tools and scooped soup use + * paper as their base item, and those must stay in the player's hand. + */ +final class CasingPaper { + + private CasingPaper() {} + + static boolean isCasing(ItemStack stack) { + if (stack == null || stack.getType() != Material.PAPER || stack.getAmount() <= 0) { + return false; + } + if (hasCustomIdentity(stack)) { + return false; + } + return FoodItem.fromItem(stack) == null; + } + + private static boolean hasCustomIdentity(ItemStack stack) { + if (!stack.hasItemMeta()) { + return false; + } + ItemMeta meta = stack.getItemMeta(); + if (meta == null) { + return false; + } + if (meta.hasDisplayName() || meta.hasItemModel() || LegacyModelData.has(meta)) { + return true; + } + return !meta.getPersistentDataContainer().isEmpty(); + } +} diff --git a/src/main/java/net/tfminecraft/cooking/sausagemaker/SausageMakerHandler.java b/src/main/java/net/tfminecraft/cooking/sausagemaker/SausageMakerHandler.java index d61e9a8..6264502 100644 --- a/src/main/java/net/tfminecraft/cooking/sausagemaker/SausageMakerHandler.java +++ b/src/main/java/net/tfminecraft/cooking/sausagemaker/SausageMakerHandler.java @@ -272,21 +272,19 @@ private static boolean hasAllMeats(Furniture furniture) { private static boolean hasPaper(Player player) { PlayerInventory inv = player.getInventory(); - ItemStack main = inv.getItemInMainHand(); - ItemStack off = inv.getItemInOffHand(); - return (main != null && main.getType() == Material.PAPER) - || (off != null && off.getType() == Material.PAPER); + return CasingPaper.isCasing(inv.getItemInMainHand()) + || CasingPaper.isCasing(inv.getItemInOffHand()); } private static void consumePaper(Player player) { PlayerInventory inv = player.getInventory(); ItemStack main = inv.getItemInMainHand(); - if (main != null && main.getType() == Material.PAPER) { + if (CasingPaper.isCasing(main)) { main.setAmount(main.getAmount() - 1); return; } ItemStack off = inv.getItemInOffHand(); - if (off != null && off.getType() == Material.PAPER) { + if (CasingPaper.isCasing(off)) { off.setAmount(off.getAmount() - 1); } } From b2fa8c7f4f04238ac5ff71e2f6c513274b69bad5 Mon Sep 17 00:00:00 2001 From: Drefvelin <54400154+Drefvelin@users.noreply.github.com> Date: Wed, 23 Sep 2026 21:41:04 +0000 Subject: [PATCH 2/2] fix: reject any custom model data on sausage casing paper A paper stack with only custom-model-data strings or an item name was still treated as casing. Those stacks now stay in hand. Co-authored-by: Cursor --- .../java/net/tfminecraft/cooking/sausagemaker/CasingPaper.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/tfminecraft/cooking/sausagemaker/CasingPaper.java b/src/main/java/net/tfminecraft/cooking/sausagemaker/CasingPaper.java index c34d5ce..165ce1d 100644 --- a/src/main/java/net/tfminecraft/cooking/sausagemaker/CasingPaper.java +++ b/src/main/java/net/tfminecraft/cooking/sausagemaker/CasingPaper.java @@ -33,7 +33,8 @@ private static boolean hasCustomIdentity(ItemStack stack) { if (meta == null) { return false; } - if (meta.hasDisplayName() || meta.hasItemModel() || LegacyModelData.has(meta)) { + if (meta.hasDisplayName() || meta.hasItemName() || meta.hasItemModel() + || meta.hasCustomModelDataComponent() || LegacyModelData.has(meta)) { return true; } return !meta.getPersistentDataContainer().isEmpty();