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..165ce1d --- /dev/null +++ b/src/main/java/net/tfminecraft/cooking/sausagemaker/CasingPaper.java @@ -0,0 +1,42 @@ +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.hasItemName() || meta.hasItemModel() + || meta.hasCustomModelDataComponent() || 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); } }