From 26360b23e4c7e21035e1b87af911563f138fc98c Mon Sep 17 00:00:00 2001 From: Ryan Barlow <7389646+ryanbarlow97@users.noreply.github.com> Date: Fri, 25 Sep 2026 09:08:17 +0000 Subject: [PATCH 1/3] fix: skip unrecognized plate items when checking sauce --- .../cooking/manager/PlateManager.java | 1 + .../cooking/manager/PlateManagerTest.java | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/test/java/net/tfminecraft/cooking/manager/PlateManagerTest.java diff --git a/src/main/java/net/tfminecraft/cooking/manager/PlateManager.java b/src/main/java/net/tfminecraft/cooking/manager/PlateManager.java index 46faad6..066a2b3 100644 --- a/src/main/java/net/tfminecraft/cooking/manager/PlateManager.java +++ b/src/main/java/net/tfminecraft/cooking/manager/PlateManager.java @@ -90,6 +90,7 @@ public boolean hasSauce(Furniture f) { ItemStack item = slot.getCurrentItem(); if(item == null) continue; FoodItem sauce = FoodItem.fromItem(item); + if(sauce == null) continue; if(sauce.getCategory().equalsIgnoreCase("sauce")) return true; } } diff --git a/src/test/java/net/tfminecraft/cooking/manager/PlateManagerTest.java b/src/test/java/net/tfminecraft/cooking/manager/PlateManagerTest.java new file mode 100644 index 0000000..65bc2cd --- /dev/null +++ b/src/test/java/net/tfminecraft/cooking/manager/PlateManagerTest.java @@ -0,0 +1,50 @@ +package net.tfminecraft.cooking.manager; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertSame; + +import java.util.UUID; + +import org.bukkit.inventory.ItemStack; +import org.junit.jupiter.api.Test; + +import net.tfminecraft.interactiblefurniture.furniture.Furniture; +import net.tfminecraft.interactiblefurniture.furniture.PlacedSlot; + +class PlateManagerTest { + + @Test + void sauceCheckIgnoresUnrecognizedItemsWithoutRemovingThem() { + Furniture plate = new Furniture("plate", null, UUID.randomUUID()); + ItemStack unrecognized = new ItemStack() { + @Override + public boolean hasItemMeta() { + return false; + } + }; + PlacedSlot slot = new PlacedSlot(plate, "food_item"); + slot.setModel(unrecognized); + plate.getActiveSlots().put(slot.getId(), slot); + + assertFalse(new PlateManager().hasSauce(plate)); + assertSame(unrecognized, slot.getCurrentItem()); + assertSame(slot, plate.getActiveSlots().get("food_item")); + } + + @Test + void sauceCheckStillIgnoresEmptyAndDisplaySlots() { + Furniture plate = new Furniture("plate", null, UUID.randomUUID()); + PlacedSlot empty = new PlacedSlot(plate, "food_item"); + plate.getActiveSlots().put(empty.getId(), empty); + PlacedSlot display = new PlacedSlot(plate, "display_1"); + display.setModel(new ItemStack() { + @Override + public boolean hasItemMeta() { + throw new AssertionError("Display items must not be checked for sauce"); + } + }); + plate.getActiveSlots().put(display.getId(), display); + + assertFalse(new PlateManager().hasSauce(plate)); + } +} From c8745b6bf8258f0b6560348bcda67533e90b1330 Mon Sep 17 00:00:00 2001 From: Ryan Barlow <7389646+ryanbarlow97@users.noreply.github.com> Date: Fri, 25 Sep 2026 09:14:37 +0000 Subject: [PATCH 2/3] fix: recognize existing plate sauce visuals before food parsing --- .../cooking/manager/PlateManager.java | 2 + .../cooking/manager/PlateManagerTest.java | 40 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/main/java/net/tfminecraft/cooking/manager/PlateManager.java b/src/main/java/net/tfminecraft/cooking/manager/PlateManager.java index 066a2b3..15f08a8 100644 --- a/src/main/java/net/tfminecraft/cooking/manager/PlateManager.java +++ b/src/main/java/net/tfminecraft/cooking/manager/PlateManager.java @@ -89,6 +89,8 @@ public boolean hasSauce(Furniture f) { if(!slot.getId().contains("display")) { ItemStack item = slot.getCurrentItem(); if(item == null) continue; + // addSauce stores an ItemsAdder visual here, without Cooking food metadata. + if(slot.getId().equals("sauce")) return true; FoodItem sauce = FoodItem.fromItem(item); if(sauce == null) continue; if(sauce.getCategory().equalsIgnoreCase("sauce")) return true; diff --git a/src/test/java/net/tfminecraft/cooking/manager/PlateManagerTest.java b/src/test/java/net/tfminecraft/cooking/manager/PlateManagerTest.java index 65bc2cd..c50c19b 100644 --- a/src/test/java/net/tfminecraft/cooking/manager/PlateManagerTest.java +++ b/src/test/java/net/tfminecraft/cooking/manager/PlateManagerTest.java @@ -2,6 +2,8 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import java.util.UUID; @@ -13,6 +15,44 @@ class PlateManagerTest { + @Test + void occupiedSauceSlotCountsAsSauceWithoutFoodMetadata() { + Furniture plate = plateWithSauceVisual(); + + assertTrue(new PlateManager().hasSauce(plate)); + } + + @Test + void existingSauceReturnsBeforeTouchingThePlayerOrLadle() { + Furniture plate = plateWithSauceVisual(); + ItemStack visual = plate.getActiveSlots().get("sauce").getCurrentItem(); + + // Null interaction arguments ensure the duplicate attempt exits before using them. + assertDoesNotThrow(() -> new PlateManager().addSauce(null, plate, null, null)); + assertSame(visual, plate.getActiveSlots().get("sauce").getCurrentItem()); + } + + @Test + void emptySauceSlotDoesNotCountAsSauce() { + Furniture plate = new Furniture("plate", null, UUID.randomUUID()); + plate.getActiveSlots().put("sauce", new PlacedSlot(plate, "sauce")); + + assertFalse(new PlateManager().hasSauce(plate)); + } + + private Furniture plateWithSauceVisual() { + Furniture plate = new Furniture("plate", null, UUID.randomUUID()); + PlacedSlot sauce = new PlacedSlot(plate, "sauce"); + sauce.setModel(new ItemStack() { + @Override + public boolean hasItemMeta() { + throw new AssertionError("Sauce visuals must not be parsed as food"); + } + }); + plate.getActiveSlots().put("sauce", sauce); + return plate; + } + @Test void sauceCheckIgnoresUnrecognizedItemsWithoutRemovingThem() { Furniture plate = new Furniture("plate", null, UUID.randomUUID()); From 37c55c6e6cebd6b297f99e1fcf8618e01b8874a9 Mon Sep 17 00:00:00 2001 From: Ryan Barlow <7389646+ryanbarlow97@users.noreply.github.com> Date: Fri, 25 Sep 2026 09:19:29 +0000 Subject: [PATCH 3/3] test: check sauce after an unrecognized plate item --- .../cooking/manager/PlateManagerTest.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/test/java/net/tfminecraft/cooking/manager/PlateManagerTest.java b/src/test/java/net/tfminecraft/cooking/manager/PlateManagerTest.java index c50c19b..1522813 100644 --- a/src/test/java/net/tfminecraft/cooking/manager/PlateManagerTest.java +++ b/src/test/java/net/tfminecraft/cooking/manager/PlateManagerTest.java @@ -1,10 +1,12 @@ package net.tfminecraft.cooking.manager; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.UUID; import org.bukkit.inventory.ItemStack; @@ -15,6 +17,33 @@ class PlateManagerTest { + @Test + void unrecognizedItemDoesNotHideLaterSauce() { + Map slots = new LinkedHashMap<>(); + Furniture plate = new Furniture("plate", null, UUID.randomUUID()) { + @Override + public Map getActiveSlots() { + return slots; + } + }; + ItemStack unrecognized = new ItemStack() { + @Override + public boolean hasItemMeta() { + return false; + } + }; + PlacedSlot food = new PlacedSlot(plate, "food_item"); + food.setModel(unrecognized); + slots.put("food_item", food); + PlacedSlot sauce = new PlacedSlot(plate, "sauce"); + sauce.setModel(new ItemStack() {}); + slots.put("sauce", sauce); + + assertTrue(new PlateManager().hasSauce(plate)); + assertSame(unrecognized, food.getCurrentItem()); + assertSame(food, slots.get("food_item")); + } + @Test void occupiedSauceSlotCountsAsSauceWithoutFoodMetadata() { Furniture plate = plateWithSauceVisual();