From 948fd7d9250f7a037d4ce1dbd20908931ca3832a Mon Sep 17 00:00:00 2001 From: Justinas Launikonis <95593194+JustinasLa@users.noreply.github.com> Date: Sun, 1 Nov 2026 20:53:53 +0200 Subject: [PATCH 1/3] feat: grill octopus, cut jellyfish into strips and name seafood soups Octopus grilled in the frying pan now becomes Grilled Octopus (a pan cooking-option output, like grilled mushrooms); boiled in the pot it stays octopus. Jellyfish cubes cut on the cutting board become Jellyfish Strips, keeping their cooking, age and food. Both go into salads as a new seafood ingredient, where any jellyfish is just "Jellyfish". The pot can now name a soup by its kind: pot.yml ingredients and kinds, written like salads.yml's, give the soup its kind as origin, and a types.yml soup override names it. Boiled seafood mashed with a potato is a Seafood Chowder; with other vegetables or another seafood it is a Seafood Stew. Soups of one seafood alone, or with meat, keep their old names. Co-Authored-By: Claude Opus 5.5 --- .../tfmc_cooking/contents/categories.yml | 6 + .../tfmc_cooking/contents/ingredients.yml | 36 + .../ingredients/seafood/grilled_octopus.json | 424 ++++++++++++ .../seafood/jellyfish_strips_boiled.json | 636 ++++++++++++++++++ .../seafood/jellyfish_strips_burnt.json | 636 ++++++++++++++++++ .../seafood/jellyfish_strips_cooked.json | 636 ++++++++++++++++++ .../seafood/jellyfish_strips_raw.json | 636 ++++++++++++++++++ .../seafood/jellyfish_strips_rotten.json | 636 ++++++++++++++++++ .../ingredients/seafood/grilled_octopus.png | Bin 0 -> 291 bytes README.md | 1 + .../cooking/cooking/CookingReference.java | 3 +- .../cooking/cooking/PotReference.java | 9 + .../tfminecraft/cooking/item/FoodItem.java | 12 + .../tfminecraft/cooking/pot/PotConfig.java | 52 +- .../cooking/utils/ItemBuilder.java | 8 +- src/main/resources/crafting-stations.yml | 9 + src/main/resources/models.yml | 76 +++ src/main/resources/pot.yml | 38 ++ src/main/resources/salads.yml | 16 + src/main/resources/types.yml | 37 + .../cooking/SeafoodSoupCoverageTest.java | 101 +++ .../item/OctopusJellyfishAssetsTest.java | 56 ++ .../cooking/pot/PotSoupKindsTest.java | 91 +++ .../cooking/salad/SeafoodSaladTest.java | 82 +++ 24 files changed, 4227 insertions(+), 10 deletions(-) create mode 100644 ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/grilled_octopus.json create mode 100644 ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_boiled.json create mode 100644 ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_burnt.json create mode 100644 ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_cooked.json create mode 100644 ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_raw.json create mode 100644 ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_rotten.json create mode 100644 ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/textures/item/ingredients/seafood/grilled_octopus.png create mode 100644 src/test/java/net/tfminecraft/cooking/cooking/SeafoodSoupCoverageTest.java create mode 100644 src/test/java/net/tfminecraft/cooking/item/OctopusJellyfishAssetsTest.java create mode 100644 src/test/java/net/tfminecraft/cooking/pot/PotSoupKindsTest.java create mode 100644 src/test/java/net/tfminecraft/cooking/salad/SeafoodSaladTest.java diff --git a/ItemsAdder/tfmc_cooking/contents/categories.yml b/ItemsAdder/tfmc_cooking/contents/categories.yml index 75c5af0..a3ad856 100644 --- a/ItemsAdder/tfmc_cooking/contents/categories.yml +++ b/ItemsAdder/tfmc_cooking/contents/categories.yml @@ -344,3 +344,9 @@ categories: - tfmc_cooking:octopus_burnt - tfmc_cooking:octopus_boiled - tfmc_cooking:octopus_rotten + - tfmc_cooking:grilled_octopus + - tfmc_cooking:jellyfish_strips_raw + - tfmc_cooking:jellyfish_strips_cooked + - tfmc_cooking:jellyfish_strips_boiled + - tfmc_cooking:jellyfish_strips_burnt + - tfmc_cooking:jellyfish_strips_rotten diff --git a/ItemsAdder/tfmc_cooking/contents/ingredients.yml b/ItemsAdder/tfmc_cooking/contents/ingredients.yml index 2b9c11f..dcfdee2 100644 --- a/ItemsAdder/tfmc_cooking/contents/ingredients.yml +++ b/ItemsAdder/tfmc_cooking/contents/ingredients.yml @@ -280,6 +280,42 @@ items: material: APPLE generate: false model_path: item/ingredients/seafood/octopus_boiled + grilled_octopus: + display_name: "Grilled Octopus" + resource: + material: APPLE + generate: false + model_path: item/ingredients/seafood/grilled_octopus + jellyfish_strips_raw: + display_name: "Jellyfish Strips Raw" + resource: + material: APPLE + generate: false + model_path: item/ingredients/seafood/jellyfish_strips_raw + jellyfish_strips_cooked: + display_name: "Jellyfish Strips Cooked" + resource: + material: APPLE + generate: false + model_path: item/ingredients/seafood/jellyfish_strips_cooked + jellyfish_strips_boiled: + display_name: "Jellyfish Strips Boiled" + resource: + material: APPLE + generate: false + model_path: item/ingredients/seafood/jellyfish_strips_boiled + jellyfish_strips_burnt: + display_name: "Jellyfish Strips Burnt" + resource: + material: APPLE + generate: false + model_path: item/ingredients/seafood/jellyfish_strips_burnt + jellyfish_strips_rotten: + display_name: "Jellyfish Strips Rotten" + resource: + material: APPLE + generate: false + model_path: item/ingredients/seafood/jellyfish_strips_rotten red_meat_steak_boiled: display_name: "Red Meat Steak boiled" resource: diff --git a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/grilled_octopus.json b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/grilled_octopus.json new file mode 100644 index 0000000..6a0b032 --- /dev/null +++ b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/grilled_octopus.json @@ -0,0 +1,424 @@ +{ + "format_version": "26.3", + "credit": "TFMC grilled octopus: octopus_cooked.json with a grilled texture (octopus-jellyfish bin/gen.py)", + "textures": { + "0": "tfmc_cooking:item/ingredients/seafood/grilled_octopus", + "particle": "tfmc_cooking:item/ingredients/seafood/grilled_octopus" + }, + "elements": [ + { + "from": [ + 12, + 0, + 7 + ], + "to": [ + 15, + 2, + 9 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 13, + 0, + 7 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 4, + 7, + 10 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 1, + 3, + 4 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 6, + 10, + 11, + 13 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 1, + 3, + 4 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 10, + 5, + 13 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 10, + 5, + 13 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 7, + 0, + 6.75 + ], + "to": [ + 12, + 2.25, + 9.25 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 10, + 0, + 7 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 4.5, + 12, + 9.75 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 1, + 2.5, + 3.25 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 6, + 10, + 11, + 12.25 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 1, + 2.5, + 3.25 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 10, + 5, + 12.5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 10, + 5, + 12.5 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 4, + 0, + 5.75 + ], + "to": [ + 7, + 2.5, + 8.25 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 5, + 0, + 6 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 4, + 7, + 10 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 1, + 3, + 4 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 6, + 10, + 11, + 13 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 1, + 3, + 4 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 10, + 5, + 13 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 10, + 5, + 13 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 1, + 0, + 4.5 + ], + "to": [ + 4, + 2.75, + 7.5 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 2, + 0, + 5 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 4, + 7, + 10 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 1, + 3, + 4 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 6, + 10, + 11, + 13 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 0, + 8, + 4 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 10, + 5, + 13 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 10, + 5, + 13 + ], + "texture": "#0" + } + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [ + 50, + 0, + 0 + ], + "translation": [ + 0, + 3.25, + 1.75 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "thirdperson_lefthand": { + "rotation": [ + 50, + 0, + 0 + ], + "translation": [ + 0, + 3.25, + 1.75 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "firstperson_righthand": { + "translation": [ + 0, + 5.75, + 0 + ], + "scale": [ + 0.6, + 0.6, + 0.6 + ] + }, + "firstperson_lefthand": { + "translation": [ + 0, + 5.75, + 0 + ], + "scale": [ + 0.6, + 0.6, + 0.6 + ] + }, + "ground": { + "translation": [ + 0, + 3.75, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "gui": { + "rotation": [ + 29, + -143, + 0 + ], + "translation": [ + 0, + 1.75, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "fixed": { + "rotation": [ + -90, + 0, + 0 + ], + "translation": [ + 0, + 0, + -14 + ], + "scale": [ + 2, + 2, + 2 + ] + } + } +} diff --git a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_boiled.json b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_boiled.json new file mode 100644 index 0000000..f7b162c --- /dev/null +++ b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_boiled.json @@ -0,0 +1,636 @@ +{ + "credit": "TFMC jellyfish strips (octopus-jellyfish bin/gen.py)", + "textures": { + "0": "tfmc_cooking:item/ingredients/seafood/jellyfish_boiled", + "particle": "tfmc_cooking:item/ingredients/seafood/jellyfish_boiled" + }, + "elements": [ + { + "from": [ + 3.0, + 0.0, + 5.6 + ], + "to": [ + 12.0, + 0.6, + 7.0 + ], + "faces": { + "north": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 3, + 5, + 4 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 3, + 5, + 4 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": 22.5, + "axis": "y", + "origin": [ + 7.5, + 0.0, + 6.3 + ] + } + }, + { + "from": [ + 4.0, + 0.0, + 8.4 + ], + "to": [ + 13.0, + 0.6, + 9.8 + ], + "faces": { + "north": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 1, + 1, + 2 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 1, + 1, + 2 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": -22.5, + "axis": "y", + "origin": [ + 8.5, + 0.0, + 9.1 + ] + } + }, + { + "from": [ + 5.0, + 0.0, + 3.6 + ], + "to": [ + 12.0, + 0.6, + 4.9 + ], + "faces": { + "north": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 4, + 5, + 5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 4, + 5, + 5 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 4.5, + 0.0, + 10.4 + ], + "to": [ + 12.5, + 0.6, + 11.700000000000001 + ], + "faces": { + "north": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 3, + 1, + 4 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 3, + 1, + 4 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": 22.5, + "axis": "y", + "origin": [ + 8.5, + 0.0, + 11.05 + ] + } + }, + { + "from": [ + 3.5, + 0.6, + 6.9 + ], + "to": [ + 11.5, + 1.2, + 8.200000000000001 + ], + "faces": { + "north": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 1, + 1 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 1, + 1 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 7.5, + 0.6, + 7.550000000000001 + ] + } + }, + { + "from": [ + 6.0, + 0.6, + 6.4 + ], + "to": [ + 12.5, + 1.2, + 7.7 + ], + "faces": { + "north": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 1, + 5, + 2 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 1, + 5, + 2 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": 45, + "axis": "y", + "origin": [ + 9.25, + 0.6, + 7.050000000000001 + ] + } + }, + { + "from": [ + 5.5, + 1.2, + 8.0 + ], + "to": [ + 12.5, + 1.7999999999999998, + 9.2 + ], + "faces": { + "north": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 4, + 1, + 5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 4, + 1, + 5 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + } + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [ + 50, + 0, + 0 + ], + "translation": [ + 0, + 3.25, + 1.75 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "thirdperson_lefthand": { + "rotation": [ + 50, + 0, + 0 + ], + "translation": [ + 0, + 3.25, + 1.75 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "firstperson_righthand": { + "translation": [ + 0, + 5.75, + 0 + ], + "scale": [ + 0.6, + 0.6, + 0.6 + ] + }, + "firstperson_lefthand": { + "translation": [ + 0, + 5.75, + 0 + ], + "scale": [ + 0.6, + 0.6, + 0.6 + ] + }, + "ground": { + "translation": [ + 0, + 3.75, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "gui": { + "rotation": [ + 29, + -143, + 0 + ], + "translation": [ + 0, + 1.75, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "fixed": { + "rotation": [ + -90, + 0, + 0 + ], + "translation": [ + 0, + 0, + -14 + ], + "scale": [ + 2, + 2, + 2 + ] + } + } +} diff --git a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_burnt.json b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_burnt.json new file mode 100644 index 0000000..6f6e3ef --- /dev/null +++ b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_burnt.json @@ -0,0 +1,636 @@ +{ + "credit": "TFMC jellyfish strips (octopus-jellyfish bin/gen.py)", + "textures": { + "0": "tfmc_cooking:item/ingredients/seafood/jellyfish_burnt", + "particle": "tfmc_cooking:item/ingredients/seafood/jellyfish_burnt" + }, + "elements": [ + { + "from": [ + 3.0, + 0.0, + 5.6 + ], + "to": [ + 12.0, + 0.6, + 7.0 + ], + "faces": { + "north": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 3, + 5, + 4 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 3, + 5, + 4 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": 22.5, + "axis": "y", + "origin": [ + 7.5, + 0.0, + 6.3 + ] + } + }, + { + "from": [ + 4.0, + 0.0, + 8.4 + ], + "to": [ + 13.0, + 0.6, + 9.8 + ], + "faces": { + "north": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 1, + 1, + 2 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 1, + 1, + 2 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": -22.5, + "axis": "y", + "origin": [ + 8.5, + 0.0, + 9.1 + ] + } + }, + { + "from": [ + 5.0, + 0.0, + 3.6 + ], + "to": [ + 12.0, + 0.6, + 4.9 + ], + "faces": { + "north": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 4, + 5, + 5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 4, + 5, + 5 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 4.5, + 0.0, + 10.4 + ], + "to": [ + 12.5, + 0.6, + 11.700000000000001 + ], + "faces": { + "north": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 3, + 1, + 4 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 3, + 1, + 4 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": 22.5, + "axis": "y", + "origin": [ + 8.5, + 0.0, + 11.05 + ] + } + }, + { + "from": [ + 3.5, + 0.6, + 6.9 + ], + "to": [ + 11.5, + 1.2, + 8.200000000000001 + ], + "faces": { + "north": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 1, + 1 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 1, + 1 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 7.5, + 0.6, + 7.550000000000001 + ] + } + }, + { + "from": [ + 6.0, + 0.6, + 6.4 + ], + "to": [ + 12.5, + 1.2, + 7.7 + ], + "faces": { + "north": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 1, + 5, + 2 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 1, + 5, + 2 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": 45, + "axis": "y", + "origin": [ + 9.25, + 0.6, + 7.050000000000001 + ] + } + }, + { + "from": [ + 5.5, + 1.2, + 8.0 + ], + "to": [ + 12.5, + 1.7999999999999998, + 9.2 + ], + "faces": { + "north": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 4, + 1, + 5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 4, + 1, + 5 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + } + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [ + 50, + 0, + 0 + ], + "translation": [ + 0, + 3.25, + 1.75 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "thirdperson_lefthand": { + "rotation": [ + 50, + 0, + 0 + ], + "translation": [ + 0, + 3.25, + 1.75 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "firstperson_righthand": { + "translation": [ + 0, + 5.75, + 0 + ], + "scale": [ + 0.6, + 0.6, + 0.6 + ] + }, + "firstperson_lefthand": { + "translation": [ + 0, + 5.75, + 0 + ], + "scale": [ + 0.6, + 0.6, + 0.6 + ] + }, + "ground": { + "translation": [ + 0, + 3.75, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "gui": { + "rotation": [ + 29, + -143, + 0 + ], + "translation": [ + 0, + 1.75, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "fixed": { + "rotation": [ + -90, + 0, + 0 + ], + "translation": [ + 0, + 0, + -14 + ], + "scale": [ + 2, + 2, + 2 + ] + } + } +} diff --git a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_cooked.json b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_cooked.json new file mode 100644 index 0000000..997ac39 --- /dev/null +++ b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_cooked.json @@ -0,0 +1,636 @@ +{ + "credit": "TFMC jellyfish strips (octopus-jellyfish bin/gen.py)", + "textures": { + "0": "tfmc_cooking:item/ingredients/seafood/jellyfish_cooked", + "particle": "tfmc_cooking:item/ingredients/seafood/jellyfish_cooked" + }, + "elements": [ + { + "from": [ + 3.0, + 0.0, + 5.6 + ], + "to": [ + 12.0, + 0.6, + 7.0 + ], + "faces": { + "north": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 3, + 5, + 4 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 3, + 5, + 4 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": 22.5, + "axis": "y", + "origin": [ + 7.5, + 0.0, + 6.3 + ] + } + }, + { + "from": [ + 4.0, + 0.0, + 8.4 + ], + "to": [ + 13.0, + 0.6, + 9.8 + ], + "faces": { + "north": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 1, + 1, + 2 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 1, + 1, + 2 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": -22.5, + "axis": "y", + "origin": [ + 8.5, + 0.0, + 9.1 + ] + } + }, + { + "from": [ + 5.0, + 0.0, + 3.6 + ], + "to": [ + 12.0, + 0.6, + 4.9 + ], + "faces": { + "north": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 4, + 5, + 5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 4, + 5, + 5 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 4.5, + 0.0, + 10.4 + ], + "to": [ + 12.5, + 0.6, + 11.700000000000001 + ], + "faces": { + "north": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 3, + 1, + 4 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 3, + 1, + 4 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": 22.5, + "axis": "y", + "origin": [ + 8.5, + 0.0, + 11.05 + ] + } + }, + { + "from": [ + 3.5, + 0.6, + 6.9 + ], + "to": [ + 11.5, + 1.2, + 8.200000000000001 + ], + "faces": { + "north": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 1, + 1 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 1, + 1 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 7.5, + 0.6, + 7.550000000000001 + ] + } + }, + { + "from": [ + 6.0, + 0.6, + 6.4 + ], + "to": [ + 12.5, + 1.2, + 7.7 + ], + "faces": { + "north": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 1, + 5, + 2 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 1, + 5, + 2 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": 45, + "axis": "y", + "origin": [ + 9.25, + 0.6, + 7.050000000000001 + ] + } + }, + { + "from": [ + 5.5, + 1.2, + 8.0 + ], + "to": [ + 12.5, + 1.7999999999999998, + 9.2 + ], + "faces": { + "north": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 4, + 1, + 5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 4, + 1, + 5 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + } + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [ + 50, + 0, + 0 + ], + "translation": [ + 0, + 3.25, + 1.75 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "thirdperson_lefthand": { + "rotation": [ + 50, + 0, + 0 + ], + "translation": [ + 0, + 3.25, + 1.75 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "firstperson_righthand": { + "translation": [ + 0, + 5.75, + 0 + ], + "scale": [ + 0.6, + 0.6, + 0.6 + ] + }, + "firstperson_lefthand": { + "translation": [ + 0, + 5.75, + 0 + ], + "scale": [ + 0.6, + 0.6, + 0.6 + ] + }, + "ground": { + "translation": [ + 0, + 3.75, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "gui": { + "rotation": [ + 29, + -143, + 0 + ], + "translation": [ + 0, + 1.75, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "fixed": { + "rotation": [ + -90, + 0, + 0 + ], + "translation": [ + 0, + 0, + -14 + ], + "scale": [ + 2, + 2, + 2 + ] + } + } +} diff --git a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_raw.json b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_raw.json new file mode 100644 index 0000000..61a945e --- /dev/null +++ b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_raw.json @@ -0,0 +1,636 @@ +{ + "credit": "TFMC jellyfish strips (octopus-jellyfish bin/gen.py)", + "textures": { + "0": "tfmc_cooking:item/ingredients/seafood/jellyfish_raw", + "particle": "tfmc_cooking:item/ingredients/seafood/jellyfish_raw" + }, + "elements": [ + { + "from": [ + 3.0, + 0.0, + 5.6 + ], + "to": [ + 12.0, + 0.6, + 7.0 + ], + "faces": { + "north": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 3, + 5, + 4 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 3, + 5, + 4 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": 22.5, + "axis": "y", + "origin": [ + 7.5, + 0.0, + 6.3 + ] + } + }, + { + "from": [ + 4.0, + 0.0, + 8.4 + ], + "to": [ + 13.0, + 0.6, + 9.8 + ], + "faces": { + "north": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 1, + 1, + 2 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 1, + 1, + 2 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": -22.5, + "axis": "y", + "origin": [ + 8.5, + 0.0, + 9.1 + ] + } + }, + { + "from": [ + 5.0, + 0.0, + 3.6 + ], + "to": [ + 12.0, + 0.6, + 4.9 + ], + "faces": { + "north": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 4, + 5, + 5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 4, + 5, + 5 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 4.5, + 0.0, + 10.4 + ], + "to": [ + 12.5, + 0.6, + 11.700000000000001 + ], + "faces": { + "north": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 3, + 1, + 4 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 3, + 1, + 4 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": 22.5, + "axis": "y", + "origin": [ + 8.5, + 0.0, + 11.05 + ] + } + }, + { + "from": [ + 3.5, + 0.6, + 6.9 + ], + "to": [ + 11.5, + 1.2, + 8.200000000000001 + ], + "faces": { + "north": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 1, + 1 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 1, + 1 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 7.5, + 0.6, + 7.550000000000001 + ] + } + }, + { + "from": [ + 6.0, + 0.6, + 6.4 + ], + "to": [ + 12.5, + 1.2, + 7.7 + ], + "faces": { + "north": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 1, + 5, + 2 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 1, + 5, + 2 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": 45, + "axis": "y", + "origin": [ + 9.25, + 0.6, + 7.050000000000001 + ] + } + }, + { + "from": [ + 5.5, + 1.2, + 8.0 + ], + "to": [ + 12.5, + 1.7999999999999998, + 9.2 + ], + "faces": { + "north": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 4, + 1, + 5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 4, + 1, + 5 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + } + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [ + 50, + 0, + 0 + ], + "translation": [ + 0, + 3.25, + 1.75 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "thirdperson_lefthand": { + "rotation": [ + 50, + 0, + 0 + ], + "translation": [ + 0, + 3.25, + 1.75 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "firstperson_righthand": { + "translation": [ + 0, + 5.75, + 0 + ], + "scale": [ + 0.6, + 0.6, + 0.6 + ] + }, + "firstperson_lefthand": { + "translation": [ + 0, + 5.75, + 0 + ], + "scale": [ + 0.6, + 0.6, + 0.6 + ] + }, + "ground": { + "translation": [ + 0, + 3.75, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "gui": { + "rotation": [ + 29, + -143, + 0 + ], + "translation": [ + 0, + 1.75, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "fixed": { + "rotation": [ + -90, + 0, + 0 + ], + "translation": [ + 0, + 0, + -14 + ], + "scale": [ + 2, + 2, + 2 + ] + } + } +} diff --git a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_rotten.json b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_rotten.json new file mode 100644 index 0000000..834e447 --- /dev/null +++ b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_rotten.json @@ -0,0 +1,636 @@ +{ + "credit": "TFMC jellyfish strips (octopus-jellyfish bin/gen.py)", + "textures": { + "0": "tfmc_cooking:item/ingredients/seafood/jellyfish_rotten", + "particle": "tfmc_cooking:item/ingredients/seafood/jellyfish_rotten" + }, + "elements": [ + { + "from": [ + 3.0, + 0.0, + 5.6 + ], + "to": [ + 12.0, + 0.6, + 7.0 + ], + "faces": { + "north": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 3, + 5, + 4 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 3, + 5, + 4 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": 22.5, + "axis": "y", + "origin": [ + 7.5, + 0.0, + 6.3 + ] + } + }, + { + "from": [ + 4.0, + 0.0, + 8.4 + ], + "to": [ + 13.0, + 0.6, + 9.8 + ], + "faces": { + "north": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 1, + 1, + 2 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 1, + 1, + 2 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": -22.5, + "axis": "y", + "origin": [ + 8.5, + 0.0, + 9.1 + ] + } + }, + { + "from": [ + 5.0, + 0.0, + 3.6 + ], + "to": [ + 12.0, + 0.6, + 4.9 + ], + "faces": { + "north": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 4, + 5, + 5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 4, + 5, + 5 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 4.5, + 0.0, + 10.4 + ], + "to": [ + 12.5, + 0.6, + 11.700000000000001 + ], + "faces": { + "north": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 3, + 1, + 4 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 3, + 1, + 4 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4, + 3, + 7, + 4 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": 22.5, + "axis": "y", + "origin": [ + 8.5, + 0.0, + 11.05 + ] + } + }, + { + "from": [ + 3.5, + 0.6, + 6.9 + ], + "to": [ + 11.5, + 1.2, + 8.200000000000001 + ], + "faces": { + "north": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 3, + 1 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 1, + 1 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 1, + 1 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 1, + 3, + 2 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 7.5, + 0.6, + 7.550000000000001 + ] + } + }, + { + "from": [ + 6.0, + 0.6, + 6.4 + ], + "to": [ + 12.5, + 1.2, + 7.7 + ], + "faces": { + "north": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4, + 1, + 7, + 2 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 1, + 5, + 2 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 1, + 5, + 2 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4, + 4, + 7, + 5 + ], + "texture": "#0" + } + }, + "rotation": { + "angle": 45, + "axis": "y", + "origin": [ + 9.25, + 0.6, + 7.050000000000001 + ] + } + }, + { + "from": [ + 5.5, + 1.2, + 8.0 + ], + "to": [ + 12.5, + 1.7999999999999998, + 9.2 + ], + "faces": { + "north": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 4, + 3, + 5 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 4, + 1, + 5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 4, + 1, + 5 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 3, + 3, + 4 + ], + "texture": "#0" + } + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [ + 50, + 0, + 0 + ], + "translation": [ + 0, + 3.25, + 1.75 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "thirdperson_lefthand": { + "rotation": [ + 50, + 0, + 0 + ], + "translation": [ + 0, + 3.25, + 1.75 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "firstperson_righthand": { + "translation": [ + 0, + 5.75, + 0 + ], + "scale": [ + 0.6, + 0.6, + 0.6 + ] + }, + "firstperson_lefthand": { + "translation": [ + 0, + 5.75, + 0 + ], + "scale": [ + 0.6, + 0.6, + 0.6 + ] + }, + "ground": { + "translation": [ + 0, + 3.75, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "gui": { + "rotation": [ + 29, + -143, + 0 + ], + "translation": [ + 0, + 1.75, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "fixed": { + "rotation": [ + -90, + 0, + 0 + ], + "translation": [ + 0, + 0, + -14 + ], + "scale": [ + 2, + 2, + 2 + ] + } + } +} diff --git a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/textures/item/ingredients/seafood/grilled_octopus.png b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/textures/item/ingredients/seafood/grilled_octopus.png new file mode 100644 index 0000000000000000000000000000000000000000..a127c58178eb08f36ac1fdbe66cb8c2b525c6a62 GIT binary patch literal 291 zcmV+;0o?wHP)mk002ovPDHLkV1h*3X`cW9 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 43e1e69..4edcfed 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ Cooking makes food an interactive part of everyday life. Players grow and gather - **Stock and mashed potatoes** — boil two bones in a cup of water in the saucepan and bottle the stock (`condiments.yml`); a soup started with stock instead of water is Rich. Put four boiled cut potatoes and a butter (with milk or salt if you like) in an empty pot, mash them without water or heat, and ladle the mash onto a plate beside the other food (`pot.yml`). - **Pies** — line a pie tin with dough, fill it with fruit, meat, mashed potato, vegetables or cheese, and bake it in the oven like the bread tray. The whole pie comes out of the tin with an empty hand and is cut into four slices on the cutting board. Its fillings make its kind (Apple, Key Lime, Mixed Berry, Meat, Shepherd's) and name, and its food, quality and freshness come from its dough and fillings (`pies.yml`). - **Mushrooms and hidden poison** — grilled mushrooms go into sandwiches and salads, raw or grilled ones onto pizzas and into pies, and raw ones boil into soup; in a dish both kinds are just "Mushroom". Each red mushroom poisons the dish a step further (Tainted, Poisoned, Deadly: less and less nutrition, the same food, and nausea, then poison, then weakness for whoever eats it). In a dish of 3 stars or more with its red mushrooms grilled (or its own bake cooked, its soup boiled) the poison is hidden: the lore shows no tag and the Food and Nutrition it would have without it, but eating applies it. Any dish bonus can count an origin and hide its tag this way (`count: origin`, `hide-at-stars`, `hide-tags`, `hide-dish-tags` in the dishes' `bonuses`; `tags.yml` poison). Any tag step can make the eater ill with `effects` (`"poison 10 1"`: effect, seconds, level), hidden or not. +- **Octopus, jellyfish and seafood soups** — octopus and jellyfish come from warm-water catches cut on the cutting board like fish. Octopus grilled in the frying pan becomes Grilled Octopus; jellyfish cubes cut again on the board become Jellyfish Strips (raw, fried or boiled as the cubes were), and both go into salads. Boiled seafood mashed in the pot with a potato makes a Seafood Chowder, with other vegetables or another seafood a Seafood Stew: the pot's pieces make a kind of soup that names it (`ingredients` and `kinds` in `pot.yml`, `soup` overrides in `types.yml`). - **Serving and sharing** — plate dishes, ladle soup into bowls, and carve foods into portions for the table. - **Quality and freshness** — ingredient quality and composition influence finished dishes, while aging and food tags carry preparation history through the kitchen. - **Farming and husbandry** — crop fertility and harvest quality sit alongside animal care, breeding, genetics, and produce collection. diff --git a/src/main/java/net/tfminecraft/cooking/cooking/CookingReference.java b/src/main/java/net/tfminecraft/cooking/cooking/CookingReference.java index 3251364..e02f02c 100644 --- a/src/main/java/net/tfminecraft/cooking/cooking/CookingReference.java +++ b/src/main/java/net/tfminecraft/cooking/cooking/CookingReference.java @@ -331,8 +331,9 @@ public String getName(String type) { return NameComposer.formatFillerPhrase(getIngredients(), type); } + /** The product's name, from its origin's override name (a soup kind: Seafood Chowder) or else its type's. */ protected String applyNameTemplate(FoodItem product, String colour, String typeLabel) { - String displayName = product.getName(); + String displayName = product.getNameTemplate(); String fillers = NameComposer.formatFillerPhrase(getIngredients()); if (fillers.isEmpty()) { fillers = "Mixed "; diff --git a/src/main/java/net/tfminecraft/cooking/cooking/PotReference.java b/src/main/java/net/tfminecraft/cooking/cooking/PotReference.java index 5d5cb03..127b998 100644 --- a/src/main/java/net/tfminecraft/cooking/cooking/PotReference.java +++ b/src/main/java/net/tfminecraft/cooking/cooking/PotReference.java @@ -46,6 +46,7 @@ import net.tfminecraft.cooking.quality.CompositionApplier; import net.tfminecraft.cooking.quality.CompositionQualityResolver; import net.tfminecraft.cooking.quality.CompositionResult; +import net.tfminecraft.cooking.salad.SaladKind; import net.tfminecraft.cooking.sandwich.DishBonus; import net.tfminecraft.cooking.utils.DisplayUtils; import net.tfminecraft.cooking.utils.Encoder; @@ -239,6 +240,14 @@ public void scoop(Player p, ItemStack ladle) { setMain(mi); } + // Its kind (pot.yml kinds) names it through its origin's types.yml override: a Seafood Chowder. + List pieces = new ArrayList<>(); + for (Map.Entry entry : slots.entrySet()) { + if (!isExtraSlot(entry.getKey())) pieces.add(entry.getValue()); + } + SaladKind kind = PotConfig.kindFor(pieces); + if (kind != null) soup.setOrigin(kind.getOrigin()); + // ---------- BUILD RESULT ---------- List inputs = new ArrayList<>(slots.values()); if (liquidFood != null) inputs.add(liquidFood); diff --git a/src/main/java/net/tfminecraft/cooking/item/FoodItem.java b/src/main/java/net/tfminecraft/cooking/item/FoodItem.java index 89eafe1..80930d1 100644 --- a/src/main/java/net/tfminecraft/cooking/item/FoodItem.java +++ b/src/main/java/net/tfminecraft/cooking/item/FoodItem.java @@ -392,6 +392,18 @@ public ModelData getModelData() { } public Map getOverrides() { return overrides; } + + /** + * The name a food is built from: its origin's types.yml override name when it has one (a sandwich of origin + * Hamburger is "{prefixes}Hamburger", a soup of origin Seafood Chowder "{colour}Seafood Chowder"), else its type's. + */ + public String getNameTemplate() { + if (origin != null) { + OverrideData od = overrides.get(origin.toUpperCase(Locale.ROOT)); + if (od != null && od.getName() != null) return od.getName(); + } + return getName(); + } public List getIngredients() { return ingredients; } public IngredientLineage getLineage() { return lineage == null ? IngredientLineage.empty() : lineage; diff --git a/src/main/java/net/tfminecraft/cooking/pot/PotConfig.java b/src/main/java/net/tfminecraft/cooking/pot/PotConfig.java index 352f05c..8250987 100644 --- a/src/main/java/net/tfminecraft/cooking/pot/PotConfig.java +++ b/src/main/java/net/tfminecraft/cooking/pot/PotConfig.java @@ -8,16 +8,20 @@ import org.bukkit.configuration.file.YamlConfiguration; import net.tfminecraft.cooking.item.FoodItem; +import net.tfminecraft.cooking.salad.SaladKind; import net.tfminecraft.cooking.sandwich.DishBonus; +import net.tfminecraft.cooking.sandwich.SandwichLayer; /** - * pot.yml: what the soup pot takes besides a water bucket (stock), the dishes it mashes without water, and the tags a - * soup earns from what's in the pot (bonuses, such as a poison). + * pot.yml: what the soup pot takes besides a water bucket (stock), the dishes it mashes without water, the kinds of + * soup its pieces make (a Seafood Chowder) and the tags a soup earns from what's in the pot (bonuses, such as a poison). */ public final class PotConfig { private static List liquids = List.of(); private static List mashes = List.of(); private static List bonuses = List.of(); + private static List ingredients = List.of(); + private static List kinds = List.of(); public void load(File file) { YamlConfiguration config = YamlConfiguration.loadConfiguration(file); @@ -37,9 +41,53 @@ public void load(File file) { if (mash != null) recipes.add(new MashRecipe(id, mash)); } } + List layers = new ArrayList<>(); + ConfigurationSection layerSection = config.getConfigurationSection("ingredients"); + if (layerSection != null) { + for (String id : layerSection.getKeys(false)) { + ConfigurationSection layer = layerSection.getConfigurationSection(id); + if (layer != null) layers.add(new SandwichLayer(id, layer)); + } + } + List kinded = new ArrayList<>(); + ConfigurationSection kindSection = config.getConfigurationSection("kinds"); + if (kindSection != null) { + for (String origin : kindSection.getKeys(false)) { + ConfigurationSection kind = kindSection.getConfigurationSection(origin); + if (kind != null) kinded.add(new SaladKind(origin, kind)); + } + } liquids = poured; mashes = recipes; bonuses = DishBonus.load(config.getConfigurationSection("bonuses")); + ingredients = layers; + kinds = kinded; + } + + /** The ingredient (pot.yml ingredients) this boiled piece is to a soup's kind, or null. */ + public static SandwichLayer ingredientFor(FoodItem food) { + for (SandwichLayer layer : ingredients) { + if (layer.matches(food)) return layer; + } + return null; + } + + /** + * The first kind of soup (pot.yml kinds) these pieces make, or null when none takes them or a piece is no + * ingredient of any kind (so "only" means nothing else is in the pot). Extras (salt, stock) don't count. + */ + public static SaladKind kindFor(List pieces) { + if (pieces.isEmpty()) return null; + List made = new ArrayList<>(); + for (FoodItem piece : pieces) { + SandwichLayer layer = ingredientFor(piece); + if (layer == null) return null; + made.add(layer); + } + for (SaladKind kind : kinds) { + if (kind.matches(pieces, made)) return kind; + } + return null; } /** The tags a ladled soup earns from what's in the pot, written like sandwiches.yml's bonuses (count: origin). */ diff --git a/src/main/java/net/tfminecraft/cooking/utils/ItemBuilder.java b/src/main/java/net/tfminecraft/cooking/utils/ItemBuilder.java index 2b90def..1549518 100644 --- a/src/main/java/net/tfminecraft/cooking/utils/ItemBuilder.java +++ b/src/main/java/net/tfminecraft/cooking/utils/ItemBuilder.java @@ -9,7 +9,6 @@ import net.tfminecraft.cooking.item.model.ModelData; import net.tfminecraft.cooking.item.tag.TagStep; import net.tfminecraft.cooking.item.tag.TagTrack; -import net.tfminecraft.cooking.item.data.OverrideData; import org.apache.commons.lang.WordUtils; import org.bukkit.Material; @@ -77,12 +76,7 @@ public static ItemStack buildComposedWithQuality(FoodItem template, int quality) * Hamburger is "{prefixes}Hamburger"), else its type's name. */ static String nameTemplate(FoodItem item) { - String origin = item.getOrigin(); - if (origin != null) { - OverrideData od = item.getOverrides().get(origin.toUpperCase(Locale.ROOT)); - if (od != null && od.getName() != null) return od.getName(); - } - return item.getName(); + return item.getNameTemplate(); } public static ItemStack buildSingleWithQuality(FoodItem template, ItemStack base, int quality) { diff --git a/src/main/resources/crafting-stations.yml b/src/main/resources/crafting-stations.yml index 3aa8ad5..dc5edae 100644 --- a/src/main/resources/crafting-stations.yml +++ b/src/main/resources/crafting-stations.yml @@ -69,3 +69,12 @@ cutting_board: inputs: - c.seafood(type=seafood_whole) output: seafood(type=seafood_fish_filet;origin={origin};tags=freshness.0) + # Jellyfish cubes cut into strips for a salad, each stack where it lies. They stay raw, fried or boiled, keep + # their age and hold what the cubes did. + slice_jellyfish: + ratio: 1 + inherit: true + share-food: true + inputs: + - c.seafood(type=seafood_jellyfish) + output: seafood(type=jellyfish_strips;origin={origin}) diff --git a/src/main/resources/models.yml b/src/main/resources/models.yml index c18f3f1..4880762 100644 --- a/src/main/resources/models.yml +++ b/src/main/resources/models.yml @@ -3505,6 +3505,82 @@ seafood_octopus: display: item: ia.tfmc_cooking:octopus_rotten +# Grilled octopus (types.yml grilled_octopus): its own grilled look; burnt and rotten look like octopus gone that way. +grilled_octopus: + cooked: + weight: 1 + gui: + item: ia.tfmc_cooking:grilled_octopus + display: + item: ia.tfmc_cooking:grilled_octopus + burnt: + weight: 2 + tags: + - burnt + gui: + item: ia.tfmc_cooking:octopus_burnt + display: + item: ia.tfmc_cooking:octopus_burnt + rotten: + weight: 3 + tags: + - rotten + gui: + item: ia.tfmc_cooking:octopus_rotten + display: + item: ia.tfmc_cooking:octopus_rotten + +# Jellyfish strips (types.yml jellyfish_strips): thin strips with the cubes' textures, raw, fried, boiled, burnt, rotten. +jellyfish_strips: + fresh: + weight: 1 + tags: + - fresh + gui: + item: ia.tfmc_cooking:jellyfish_strips_raw + display: + item: ia.tfmc_cooking:jellyfish_strips_raw + stale: + weight: 1 + tags: + - stale + gui: + item: ia.tfmc_cooking:jellyfish_strips_raw + display: + item: ia.tfmc_cooking:jellyfish_strips_raw + cooked: + weight: 2 + tags: + - cooked + gui: + item: ia.tfmc_cooking:jellyfish_strips_cooked + display: + item: ia.tfmc_cooking:jellyfish_strips_cooked + burnt: + weight: 2 + tags: + - burnt + gui: + item: ia.tfmc_cooking:jellyfish_strips_burnt + display: + item: ia.tfmc_cooking:jellyfish_strips_burnt + boiled: + weight: 2 + tags: + - boiled + gui: + item: ia.tfmc_cooking:jellyfish_strips_boiled + display: + item: ia.tfmc_cooking:jellyfish_strips_boiled + rotten: + weight: 3 + tags: + - rotten + gui: + item: ia.tfmc_cooking:jellyfish_strips_rotten + display: + item: ia.tfmc_cooking:jellyfish_strips_rotten + egg: raw: weight: 1 diff --git a/src/main/resources/pot.yml b/src/main/resources/pot.yml index cd71708..e13c3d8 100644 --- a/src/main/resources/pot.yml +++ b/src/main/resources/pot.yml @@ -46,6 +46,44 @@ mashes: display: ia.tfmc_cooking:gray hint: 4 boiled cut potatoes and a butter +# Kinds of soup: what the pieces boiled and mashed in the pot (not its extras or stock) make, written like salads.yml +# kinds. The first kind that matches wins; a pot holding a piece that's no ingredient below makes no kind. A soup of a +# kind takes the kind as its origin, so a types.yml soup override names it ("Seafood Chowder" instead of "Octopus and +# Potato Soup"). Soups of no kind are named by their pieces as before. +# ingredients what each piece counts as, by types.yml type (as salads.yml ingredients; name and models unused) +# kinds layers, only, origins, any-origin, min-origins, mostly, as salads.yml kinds +ingredients: + seafood: + types: + - seafood_fish_filet + - seafood_octopus + - seafood_jellyfish + vegetable: + types: + - vegetable_cut + - vegetable_cut_2 + mushroom: + types: + - mushroom + meat: + types: + - meat_red_meat + - meat_poultry + - meat_poultry_leg + - meat_pork +kinds: + # Seafood with potatoes (and other vegetables or mushrooms). + Seafood Chowder: + layers: [seafood] + only: [seafood, vegetable, mushroom] + any-origin: [Potato] + # Seafood with anything else that isn't meat: two kinds of seafood, or seafood and vegetables. Seafood of one kind + # alone stays an "Octopus Soup". + Seafood Stew: + layers: [seafood] + only: [seafood, vegetable, mushroom] + min-origins: 2 + # Tags a soup earns from what's in the pot when it's ladled, written like sandwiches.yml's bonuses. The pot has no # layers, so only count: origin applies, over everything in it (pieces, extras and stock). bonuses: diff --git a/src/main/resources/salads.yml b/src/main/resources/salads.yml index 0be798a..3dac948 100644 --- a/src/main/resources/salads.yml +++ b/src/main/resources/salads.yml @@ -109,6 +109,22 @@ ingredients: - rotten ia.tfmc_cooking:salad_bowl_mushroom_rotten - burnt ia.tfmc_cooking:salad_bowl_mushroom_burnt - ia.tfmc_cooking:salad_bowl_mushroom + seafood: + # Grilled octopus (frying pan) and jellyfish strips (cutting board), both Jellyfish whatever their colour. + types: + - grilled_octopus + - jellyfish_strips + name: "{origin}" + names: + blue jellyfish: Jellyfish + pink jellyfish: Jellyfish + # Rounds of grilled tentacle; thin translucent strips of jellyfish, raw, fried or boiled as they were cut. + models: + - rotten ia.tfmc_cooking:salad_bowl_{type}_rotten + - burnt ia.tfmc_cooking:salad_bowl_{type}_burnt + - boiled ia.tfmc_cooking:salad_bowl_{type}_boiled + - cooked ia.tfmc_cooking:salad_bowl_{type}_cooked + - ia.tfmc_cooking:salad_bowl_{type}_raw # What goes in unseen and doesn't name the salad. # once only one food of this extra per salad (one dressing) # returns-bottle the player keeps the empty glass bottle diff --git a/src/main/resources/types.yml b/src/main/resources/types.yml index 803ad37..4482187 100644 --- a/src/main/resources/types.yml +++ b/src/main/resources/types.yml @@ -539,6 +539,12 @@ soup: warmth: 450 freshness: 2 name: "{colour}{prefixes}{fillers}Soup" + # Kinds of soup (pot.yml kinds) take their kind as origin and their name from here. + overrides: + SEAFOOD CHOWDER: + name: "{colour}{prefixes}Seafood Chowder" + SEAFOOD STEW: + name: "{colour}{prefixes}Seafood Stew" food: 26 nutrition: 8 @@ -629,11 +635,13 @@ seafood_octopus: food: 11 nutrition: 7 mashable: true + # Grilled in the frying pan it becomes grilled octopus (and burns as that); boiled in the pot it stays octopus. cooking-options: frying_pan: tag: 1 time: 15 burn: 30 + output: seafood(type=grilled_octopus) pot: tag: 3 time: 15 @@ -646,6 +654,35 @@ seafood_octopus: stale: "#c3db81Stale" rotten: "#8B7355Rotten" +###Grilled octopus: what octopus becomes in the frying pan; keeps its origin (Octopus). Salads take it (salads.yml). +grilled_octopus: + name: "#c8642aGrilled {inherit}" + model: grilled_octopus + food: 11 + nutrition: 7 + age: + warmth: 450 + freshness: 9.33 + tag-labels: + freshness: + stale: "#c3db81Stale" + rotten: "#8B7355Rotten" + +###Jellyfish strips: jellyfish cubes cut into strips on the cutting board (crafting-stations.yml slice_jellyfish). They +# stay as raw, fried or boiled as the cubes were; boiled (blanched) is how jellyfish goes into a salad (salads.yml). +jellyfish_strips: + name: "#87cefa{inherit} Strips" + model: jellyfish_strips + food: 9 + nutrition: 5 + age: + warmth: 450 + freshness: 9.33 + tag-labels: + freshness: + stale: "#c3db81Stale" + rotten: "#8B7355Rotten" + butter: name: "#f5f5f5{prefixes}Butter" model: butter diff --git a/src/test/java/net/tfminecraft/cooking/cooking/SeafoodSoupCoverageTest.java b/src/test/java/net/tfminecraft/cooking/cooking/SeafoodSoupCoverageTest.java new file mode 100644 index 0000000..56214d4 --- /dev/null +++ b/src/test/java/net/tfminecraft/cooking/cooking/SeafoodSoupCoverageTest.java @@ -0,0 +1,101 @@ +package net.tfminecraft.cooking.cooking; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; + +import java.io.File; +import java.nio.file.Path; + +import org.bukkit.Material; +import org.bukkit.configuration.MemoryConfiguration; +import org.bukkit.inventory.ItemStack; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import net.tfminecraft.cooking.enums.Method; +import net.tfminecraft.cooking.item.FoodItem; +import net.tfminecraft.cooking.item.model.FoodModel; +import net.tfminecraft.cooking.loader.TrackLoader; +import net.tfminecraft.cooking.pot.PotConfig; +import net.tfminecraft.cooking.utils.FoodParser; + +/** + * A soup ladled from a pot of seafood and a potato is a Seafood Chowder: its kind (pot.yml kinds) is its origin, and + * the soup type's override for that origin (types.yml) names it. Salt and other extras don't change its kind. + */ +class SeafoodSoupCoverageTest { + CookingReferencesTest.Environment env; + PotReference pot; + @TempDir Path directory; + + @BeforeEach void open() { + env = new CookingReferencesTest.Environment(); + new PotConfig().load(new File("src/main/resources/pot.yml")); + // The soup as types.yml has it, with its kinds' names. + env.parser.when(() -> FoodParser.parse(startsWith("soup"))).thenAnswer(inv -> { + MemoryConfiguration config = new MemoryConfiguration(); + config.set("name", "{colour}{prefixes}{fillers}Soup"); + config.set("update", false); + config.set("overrides.SEAFOOD CHOWDER.name", "{colour}{prefixes}Seafood Chowder"); + config.set("overrides.SEAFOOD STEW.name", "{colour}{prefixes}Seafood Stew"); + FoodItem soup = new FoodItem("soup", config); + soup.setCategory("soup"); + soup.setOrigin("Mixed"); + soup.setModel(new FoodModel(new ItemStack(Material.CARROT))); + soup.setBaseFood(8); + FoodParser.Result result = new FoodParser.Result(); + result.template = soup; + return result; + }); + pot = new PotReference(env.furniture, Method.POT); + } + + @AfterEach void close() { + new PotConfig().load(directory.resolve("missing.yml").toFile()); + env.close(); + } + + /** Mashed pieces in the pot (type:origin), and a salt as an extra. */ + String ladle(String... pieces) { + int slot = 1; + for (String entry : pieces) { + String[] parts = entry.split(":"); + FoodItem piece = env.food(parts[0], "seafood", parts[1], Method.POT); + piece.getTagTrack("cooked").forceSetValue(3); + piece.addOrModifyTrack(TrackLoader.getByString("mashed")); + pot.slots.put("input_" + slot, piece); + env.place("input_" + slot, env.stack(piece, Material.COD, 1)); + slot++; + } + FoodItem salt = env.food("salt", "salt", "Salt"); + pot.slots.put("extra_salt", salt); + env.place("extra_salt", env.stack(salt, Material.SUGAR, 1)); + env.player.getInventory().setItemInMainHand(new ItemStack(Material.PAPER)); + pot.interact(env.interaction()); + return env.player.getInventory().getItemInMainHand().getItemMeta().getDisplayName(); + } + + @Test + void octopusAndPotatoMakeASeafoodChowder() { + String name = ladle("seafood_octopus:Octopus", "vegetable_cut:Potato"); + assertEquals("Seafood Chowder", env.lastBuilt.getOrigin()); + assertTrue(name.endsWith("Seafood Chowder"), name); + assertFalse(name.contains("Soup"), name); + } + + @Test + void twoSeafoodsMakeASeafoodStew() { + assertTrue(ladle("seafood_fish_filet:Tuna", "seafood_jellyfish:Blue Jellyfish").endsWith("Seafood Stew")); + assertEquals("Seafood Stew", env.lastBuilt.getOrigin()); + } + + @Test + void octopusAloneIsStillAnOctopusSoup() { + String name = ladle("seafood_octopus:Octopus", "seafood_octopus:Octopus"); + assertEquals("Mixed", env.lastBuilt.getOrigin()); + assertTrue(name.endsWith("Soup"), name); + assertFalse(name.contains("Seafood"), name); + } +} diff --git a/src/test/java/net/tfminecraft/cooking/item/OctopusJellyfishAssetsTest.java b/src/test/java/net/tfminecraft/cooking/item/OctopusJellyfishAssetsTest.java new file mode 100644 index 0000000..5e4280a --- /dev/null +++ b/src/test/java/net/tfminecraft/cooking/item/OctopusJellyfishAssetsTest.java @@ -0,0 +1,56 @@ +package net.tfminecraft.cooking.item; + +import static org.junit.jupiter.api.Assertions.*; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +import org.bukkit.configuration.file.YamlConfiguration; +import org.junit.jupiter.api.Test; + +/** + * Grilled octopus and jellyfish strips as shipped: the frying pan turns octopus into grilled octopus, the cutting + * board cuts jellyfish cubes into strips, and every look models.yml names is an ItemsAdder item with its model. + */ +class OctopusJellyfishAssetsTest { + static final String PACK = "ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/"; + + @Test + void thePanGrillsOctopusAndTheBoardCutsJellyfishIntoStrips() { + YamlConfiguration types = YamlConfiguration.loadConfiguration(new File("src/main/resources/types.yml")); + assertEquals("seafood(type=grilled_octopus)", types.getString("seafood_octopus.cooking-options.frying_pan.output")); + assertNull(types.getString("seafood_octopus.cooking-options.pot.output"), "boiled octopus stays octopus"); + assertEquals("grilled_octopus", types.getString("grilled_octopus.model")); + assertEquals("jellyfish_strips", types.getString("jellyfish_strips.model")); + assertEquals("{colour}{prefixes}Seafood Chowder", types.getString("soup.overrides.SEAFOOD CHOWDER.name")); + assertEquals("{colour}{prefixes}Seafood Stew", types.getString("soup.overrides.SEAFOOD STEW.name")); + + YamlConfiguration stations = YamlConfiguration.loadConfiguration(new File("src/main/resources/crafting-stations.yml")); + String recipe = "cutting_board.recipes.slice_jellyfish."; + assertEquals(List.of("c.seafood(type=seafood_jellyfish)"), stations.getStringList(recipe + "inputs")); + assertEquals("seafood(type=jellyfish_strips;origin={origin})", stations.getString(recipe + "output")); + assertTrue(stations.getBoolean(recipe + "inherit")); + assertTrue(stations.getBoolean(recipe + "share-food")); + } + + @Test + void everyLookIsAnItemWithItsModelAndTexture() throws Exception { + YamlConfiguration models = YamlConfiguration.loadConfiguration(new File("src/main/resources/models.yml")); + String items = Files.readString(Path.of("ItemsAdder/tfmc_cooking/contents/ingredients.yml")); + String categories = Files.readString(Path.of("ItemsAdder/tfmc_cooking/contents/categories.yml")); + for (String type : List.of("grilled_octopus", "jellyfish_strips")) { + for (String state : models.getConfigurationSection(type).getKeys(false)) { + String item = models.getString(type + "." + state + ".gui.item"); + assertEquals(item, models.getString(type + "." + state + ".display.item")); + String id = item.substring("ia.tfmc_cooking:".length()); + assertTrue(items.contains("\n " + id + ":\n"), id); + assertTrue(categories.contains("tfmc_cooking:" + id + "\n"), id); + assertTrue(Files.exists(Path.of(PACK + "models/item/ingredients/seafood/" + id + ".json")), id); + } + } + assertEquals("ia.tfmc_cooking:jellyfish_strips_boiled", models.getString("jellyfish_strips.boiled.gui.item")); + assertTrue(Files.exists(Path.of(PACK + "textures/item/ingredients/seafood/grilled_octopus.png"))); + } +} diff --git a/src/test/java/net/tfminecraft/cooking/pot/PotSoupKindsTest.java b/src/test/java/net/tfminecraft/cooking/pot/PotSoupKindsTest.java new file mode 100644 index 0000000..13cedc3 --- /dev/null +++ b/src/test/java/net/tfminecraft/cooking/pot/PotSoupKindsTest.java @@ -0,0 +1,91 @@ +package net.tfminecraft.cooking.pot; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.io.File; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.configuration.MemoryConfiguration; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.mockbukkit.mockbukkit.MockBukkit; + +import net.tfminecraft.cooking.Cooking; +import net.tfminecraft.cooking.item.FoodItem; +import net.tfminecraft.cooking.salad.SaladKind; + +/** pot.yml kinds: the pieces boiled in the pot make a Seafood Chowder or a Seafood Stew, or no kind at all. */ +class PotSoupKindsTest { + @TempDir Path directory; + Cooking previousPlugin; + + @BeforeEach void open() { + MockBukkit.mock(); + previousPlugin = Cooking.plugin; + Cooking.plugin = mock(Cooking.class); + when(Cooking.plugin.getName()).thenReturn("Cooking"); + when(Cooking.plugin.namespace()).thenReturn("cooking"); + new PotConfig().load(new File("src/main/resources/pot.yml")); + } + + @AfterEach void close() { + new PotConfig().load(directory.resolve("missing.yml").toFile()); + Cooking.plugin = previousPlugin; + MockBukkit.unmock(); + } + + static FoodItem piece(String type, String origin) { + MemoryConfiguration config = new MemoryConfiguration(); + config.set("update", false); + FoodItem food = new FoodItem(type, config); + food.setOrigin(origin); + return food; + } + + static String kind(FoodItem... pieces) { + SaladKind kind = PotConfig.kindFor(new ArrayList<>(List.of(pieces))); + return kind == null ? null : kind.getOrigin(); + } + + @Test + void seafoodWithAPotatoIsAChowder() { + assertEquals("Seafood Chowder", kind(piece("seafood_octopus", "Octopus"), piece("vegetable_cut", "Potato"))); + assertEquals("Seafood Chowder", kind(piece("seafood_fish_filet", "Tuna"), piece("vegetable_cut", "Potato"), + piece("vegetable_cut_2", "Onion"), piece("mushroom", "Brown Mushroom"))); + } + + @Test + void seafoodWithOtherVegetablesOrAnotherSeafoodIsAStew() { + assertEquals("Seafood Stew", kind(piece("seafood_octopus", "Octopus"), piece("vegetable_cut", "Carrot"))); + assertEquals("Seafood Stew", kind(piece("seafood_fish_filet", "Tuna"), piece("seafood_octopus", "Octopus"))); + assertEquals("Seafood Stew", kind(piece("seafood_jellyfish", "Blue Jellyfish"), + piece("seafood_jellyfish", "Pink Jellyfish"))); + } + + @Test + void oneSeafoodAloneOrNoSeafoodIsNoKind() { + assertNull(kind(piece("seafood_octopus", "Octopus"), piece("seafood_octopus", "Octopus"))); + assertNull(kind(piece("vegetable_cut", "Potato"), piece("vegetable_cut", "Carrot"))); + assertNull(kind()); + } + + @Test + void meatOrAPieceNoIngredientNamesMakesNoKind() { + assertNull(kind(piece("seafood_octopus", "Octopus"), piece("meat_pork", "Pork"), piece("vegetable_cut", "Potato"))); + assertNull(kind(piece("seafood_octopus", "Octopus"), piece("vegetable_cut", "Potato"), piece("stew_bone", "Bone"))); + assertEquals("meat", PotConfig.ingredientFor(piece("meat_pork", "Pork")).getId()); + assertNull(PotConfig.ingredientFor(piece("stew_bone", "Bone"))); + } + + @Test + void withoutKindsInPotYmlEverySoupIsPlain() { + new PotConfig().load(directory.resolve("missing.yml").toFile()); + assertNull(kind(piece("seafood_octopus", "Octopus"), piece("vegetable_cut", "Potato"))); + assertNull(PotConfig.ingredientFor(piece("seafood_octopus", "Octopus"))); + } +} diff --git a/src/test/java/net/tfminecraft/cooking/salad/SeafoodSaladTest.java b/src/test/java/net/tfminecraft/cooking/salad/SeafoodSaladTest.java new file mode 100644 index 0000000..8533b01 --- /dev/null +++ b/src/test/java/net/tfminecraft/cooking/salad/SeafoodSaladTest.java @@ -0,0 +1,82 @@ +package net.tfminecraft.cooking.salad; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import net.tfminecraft.cooking.crafting.CraftingStationCoverageTest.Environment; +import net.tfminecraft.cooking.item.FoodItem; +import net.tfminecraft.cooking.loader.NamingLoader; +import net.tfminecraft.cooking.sandwich.SandwichLayer; +import net.tfminecraft.cooking.utils.ItemBuilder; +import net.tfminecraft.cooking.utils.NameComposer; + +/** The shipped salads.yml takes grilled octopus and jellyfish strips; any jellyfish is just "Jellyfish" in the name. */ +class SeafoodSaladTest { + Environment env; + FoodItem built; + @TempDir Path directory; + + @BeforeEach void open() { + env = new Environment(); + new NamingLoader().load(new File("src/main/resources/naming.yml")); + new SaladConfig().load(new File("src/main/resources/salads.yml")); + env.builder.when(() -> ItemBuilder.buildComposedWithQuality(any(), anyInt())).thenAnswer(inv -> { + built = inv.getArgument(0); + return env.stack(built, Material.BOWL, 1); + }); + } + + @AfterEach void close() throws Exception { + new SaladConfig().load(directory.resolve("missing.yml").toFile()); + Path empty = directory.resolve("naming.yml"); + Files.writeString(empty, ""); + new NamingLoader().load(empty.toFile()); + env.close(); + } + + FoodItem food(String type, String origin) { + FoodItem food = env.food(type, origin); + food.setCategory("seafood"); + return food; + } + + @Test + void grilledOctopusAndJellyfishStripsAreSeafoodIngredients() { + SandwichLayer octopus = SaladConfig.ingredientFor(food("grilled_octopus", "Octopus")); + assertEquals("seafood", octopus.getId()); + assertEquals("Octopus", octopus.fillerName(food("grilled_octopus", "Octopus"))); + assertEquals("Jellyfish", octopus.fillerName(food("jellyfish_strips", "Blue Jellyfish"))); + assertEquals("Jellyfish", octopus.fillerName(food("jellyfish_strips", "Pink Jellyfish"))); + // Raw octopus and jellyfish cubes aren't salad ingredients: grill the one and cut the other into strips. + assertNull(SaladConfig.ingredientFor(food("seafood_octopus", "Octopus"))); + assertNull(SaladConfig.ingredientFor(food("seafood_jellyfish", "Blue Jellyfish"))); + } + + @Test + void aSaladOfOctopusJellyfishAndTomatoIsNamedByThem() { + List in = new ArrayList<>(); + in.add(env.stack(food("grilled_octopus", "Octopus"), Material.PAPER, 1)); + in.add(env.stack(food("jellyfish_strips", "Pink Jellyfish"), Material.PAPER, 1)); + FoodItem tomato = env.food("vegetable_chopped_2", "Tomato"); + tomato.setCategory("garnish"); + in.add(env.stack(tomato, Material.PAPER, 1)); + assertNotNull(SaladItems.build(env.player, in, List.of())); + assertEquals("Mixed", built.getOrigin()); + assertEquals("Octopus, Jellyfish and Tomato Salad", + NameComposer.compose(built, "{prefixes}{fillers}Salad", Map.of())); + } +} From 5a1262dbd77841d5cee94cd4ddab2393f9dcc636 Mon Sep 17 00:00:00 2001 From: Justinas Launikonis <95593194+JustinasLa@users.noreply.github.com> Date: Sun, 1 Nov 2026 20:54:42 +0200 Subject: [PATCH 2/3] refactor: leave soup kinds to pot.yml kinds from the Borscht change Co-Authored-By: Claude Opus 5.5 --- .../cooking/cooking/CookingReference.java | 3 +- .../cooking/cooking/PotReference.java | 9 -- .../tfminecraft/cooking/item/FoodItem.java | 12 --- .../tfminecraft/cooking/pot/PotConfig.java | 52 +---------- .../cooking/utils/ItemBuilder.java | 8 +- src/main/resources/pot.yml | 38 -------- src/main/resources/types.yml | 6 -- .../item/OctopusJellyfishAssetsTest.java | 2 - .../cooking/pot/PotSoupKindsTest.java | 91 ------------------- 9 files changed, 10 insertions(+), 211 deletions(-) delete mode 100644 src/test/java/net/tfminecraft/cooking/pot/PotSoupKindsTest.java diff --git a/src/main/java/net/tfminecraft/cooking/cooking/CookingReference.java b/src/main/java/net/tfminecraft/cooking/cooking/CookingReference.java index e02f02c..3251364 100644 --- a/src/main/java/net/tfminecraft/cooking/cooking/CookingReference.java +++ b/src/main/java/net/tfminecraft/cooking/cooking/CookingReference.java @@ -331,9 +331,8 @@ public String getName(String type) { return NameComposer.formatFillerPhrase(getIngredients(), type); } - /** The product's name, from its origin's override name (a soup kind: Seafood Chowder) or else its type's. */ protected String applyNameTemplate(FoodItem product, String colour, String typeLabel) { - String displayName = product.getNameTemplate(); + String displayName = product.getName(); String fillers = NameComposer.formatFillerPhrase(getIngredients()); if (fillers.isEmpty()) { fillers = "Mixed "; diff --git a/src/main/java/net/tfminecraft/cooking/cooking/PotReference.java b/src/main/java/net/tfminecraft/cooking/cooking/PotReference.java index 127b998..5d5cb03 100644 --- a/src/main/java/net/tfminecraft/cooking/cooking/PotReference.java +++ b/src/main/java/net/tfminecraft/cooking/cooking/PotReference.java @@ -46,7 +46,6 @@ import net.tfminecraft.cooking.quality.CompositionApplier; import net.tfminecraft.cooking.quality.CompositionQualityResolver; import net.tfminecraft.cooking.quality.CompositionResult; -import net.tfminecraft.cooking.salad.SaladKind; import net.tfminecraft.cooking.sandwich.DishBonus; import net.tfminecraft.cooking.utils.DisplayUtils; import net.tfminecraft.cooking.utils.Encoder; @@ -240,14 +239,6 @@ public void scoop(Player p, ItemStack ladle) { setMain(mi); } - // Its kind (pot.yml kinds) names it through its origin's types.yml override: a Seafood Chowder. - List pieces = new ArrayList<>(); - for (Map.Entry entry : slots.entrySet()) { - if (!isExtraSlot(entry.getKey())) pieces.add(entry.getValue()); - } - SaladKind kind = PotConfig.kindFor(pieces); - if (kind != null) soup.setOrigin(kind.getOrigin()); - // ---------- BUILD RESULT ---------- List inputs = new ArrayList<>(slots.values()); if (liquidFood != null) inputs.add(liquidFood); diff --git a/src/main/java/net/tfminecraft/cooking/item/FoodItem.java b/src/main/java/net/tfminecraft/cooking/item/FoodItem.java index 80930d1..89eafe1 100644 --- a/src/main/java/net/tfminecraft/cooking/item/FoodItem.java +++ b/src/main/java/net/tfminecraft/cooking/item/FoodItem.java @@ -392,18 +392,6 @@ public ModelData getModelData() { } public Map getOverrides() { return overrides; } - - /** - * The name a food is built from: its origin's types.yml override name when it has one (a sandwich of origin - * Hamburger is "{prefixes}Hamburger", a soup of origin Seafood Chowder "{colour}Seafood Chowder"), else its type's. - */ - public String getNameTemplate() { - if (origin != null) { - OverrideData od = overrides.get(origin.toUpperCase(Locale.ROOT)); - if (od != null && od.getName() != null) return od.getName(); - } - return getName(); - } public List getIngredients() { return ingredients; } public IngredientLineage getLineage() { return lineage == null ? IngredientLineage.empty() : lineage; diff --git a/src/main/java/net/tfminecraft/cooking/pot/PotConfig.java b/src/main/java/net/tfminecraft/cooking/pot/PotConfig.java index 8250987..352f05c 100644 --- a/src/main/java/net/tfminecraft/cooking/pot/PotConfig.java +++ b/src/main/java/net/tfminecraft/cooking/pot/PotConfig.java @@ -8,20 +8,16 @@ import org.bukkit.configuration.file.YamlConfiguration; import net.tfminecraft.cooking.item.FoodItem; -import net.tfminecraft.cooking.salad.SaladKind; import net.tfminecraft.cooking.sandwich.DishBonus; -import net.tfminecraft.cooking.sandwich.SandwichLayer; /** - * pot.yml: what the soup pot takes besides a water bucket (stock), the dishes it mashes without water, the kinds of - * soup its pieces make (a Seafood Chowder) and the tags a soup earns from what's in the pot (bonuses, such as a poison). + * pot.yml: what the soup pot takes besides a water bucket (stock), the dishes it mashes without water, and the tags a + * soup earns from what's in the pot (bonuses, such as a poison). */ public final class PotConfig { private static List liquids = List.of(); private static List mashes = List.of(); private static List bonuses = List.of(); - private static List ingredients = List.of(); - private static List kinds = List.of(); public void load(File file) { YamlConfiguration config = YamlConfiguration.loadConfiguration(file); @@ -41,53 +37,9 @@ public void load(File file) { if (mash != null) recipes.add(new MashRecipe(id, mash)); } } - List layers = new ArrayList<>(); - ConfigurationSection layerSection = config.getConfigurationSection("ingredients"); - if (layerSection != null) { - for (String id : layerSection.getKeys(false)) { - ConfigurationSection layer = layerSection.getConfigurationSection(id); - if (layer != null) layers.add(new SandwichLayer(id, layer)); - } - } - List kinded = new ArrayList<>(); - ConfigurationSection kindSection = config.getConfigurationSection("kinds"); - if (kindSection != null) { - for (String origin : kindSection.getKeys(false)) { - ConfigurationSection kind = kindSection.getConfigurationSection(origin); - if (kind != null) kinded.add(new SaladKind(origin, kind)); - } - } liquids = poured; mashes = recipes; bonuses = DishBonus.load(config.getConfigurationSection("bonuses")); - ingredients = layers; - kinds = kinded; - } - - /** The ingredient (pot.yml ingredients) this boiled piece is to a soup's kind, or null. */ - public static SandwichLayer ingredientFor(FoodItem food) { - for (SandwichLayer layer : ingredients) { - if (layer.matches(food)) return layer; - } - return null; - } - - /** - * The first kind of soup (pot.yml kinds) these pieces make, or null when none takes them or a piece is no - * ingredient of any kind (so "only" means nothing else is in the pot). Extras (salt, stock) don't count. - */ - public static SaladKind kindFor(List pieces) { - if (pieces.isEmpty()) return null; - List made = new ArrayList<>(); - for (FoodItem piece : pieces) { - SandwichLayer layer = ingredientFor(piece); - if (layer == null) return null; - made.add(layer); - } - for (SaladKind kind : kinds) { - if (kind.matches(pieces, made)) return kind; - } - return null; } /** The tags a ladled soup earns from what's in the pot, written like sandwiches.yml's bonuses (count: origin). */ diff --git a/src/main/java/net/tfminecraft/cooking/utils/ItemBuilder.java b/src/main/java/net/tfminecraft/cooking/utils/ItemBuilder.java index 1549518..2b90def 100644 --- a/src/main/java/net/tfminecraft/cooking/utils/ItemBuilder.java +++ b/src/main/java/net/tfminecraft/cooking/utils/ItemBuilder.java @@ -9,6 +9,7 @@ import net.tfminecraft.cooking.item.model.ModelData; import net.tfminecraft.cooking.item.tag.TagStep; import net.tfminecraft.cooking.item.tag.TagTrack; +import net.tfminecraft.cooking.item.data.OverrideData; import org.apache.commons.lang.WordUtils; import org.bukkit.Material; @@ -76,7 +77,12 @@ public static ItemStack buildComposedWithQuality(FoodItem template, int quality) * Hamburger is "{prefixes}Hamburger"), else its type's name. */ static String nameTemplate(FoodItem item) { - return item.getNameTemplate(); + String origin = item.getOrigin(); + if (origin != null) { + OverrideData od = item.getOverrides().get(origin.toUpperCase(Locale.ROOT)); + if (od != null && od.getName() != null) return od.getName(); + } + return item.getName(); } public static ItemStack buildSingleWithQuality(FoodItem template, ItemStack base, int quality) { diff --git a/src/main/resources/pot.yml b/src/main/resources/pot.yml index e13c3d8..cd71708 100644 --- a/src/main/resources/pot.yml +++ b/src/main/resources/pot.yml @@ -46,44 +46,6 @@ mashes: display: ia.tfmc_cooking:gray hint: 4 boiled cut potatoes and a butter -# Kinds of soup: what the pieces boiled and mashed in the pot (not its extras or stock) make, written like salads.yml -# kinds. The first kind that matches wins; a pot holding a piece that's no ingredient below makes no kind. A soup of a -# kind takes the kind as its origin, so a types.yml soup override names it ("Seafood Chowder" instead of "Octopus and -# Potato Soup"). Soups of no kind are named by their pieces as before. -# ingredients what each piece counts as, by types.yml type (as salads.yml ingredients; name and models unused) -# kinds layers, only, origins, any-origin, min-origins, mostly, as salads.yml kinds -ingredients: - seafood: - types: - - seafood_fish_filet - - seafood_octopus - - seafood_jellyfish - vegetable: - types: - - vegetable_cut - - vegetable_cut_2 - mushroom: - types: - - mushroom - meat: - types: - - meat_red_meat - - meat_poultry - - meat_poultry_leg - - meat_pork -kinds: - # Seafood with potatoes (and other vegetables or mushrooms). - Seafood Chowder: - layers: [seafood] - only: [seafood, vegetable, mushroom] - any-origin: [Potato] - # Seafood with anything else that isn't meat: two kinds of seafood, or seafood and vegetables. Seafood of one kind - # alone stays an "Octopus Soup". - Seafood Stew: - layers: [seafood] - only: [seafood, vegetable, mushroom] - min-origins: 2 - # Tags a soup earns from what's in the pot when it's ladled, written like sandwiches.yml's bonuses. The pot has no # layers, so only count: origin applies, over everything in it (pieces, extras and stock). bonuses: diff --git a/src/main/resources/types.yml b/src/main/resources/types.yml index 4482187..eea1705 100644 --- a/src/main/resources/types.yml +++ b/src/main/resources/types.yml @@ -539,12 +539,6 @@ soup: warmth: 450 freshness: 2 name: "{colour}{prefixes}{fillers}Soup" - # Kinds of soup (pot.yml kinds) take their kind as origin and their name from here. - overrides: - SEAFOOD CHOWDER: - name: "{colour}{prefixes}Seafood Chowder" - SEAFOOD STEW: - name: "{colour}{prefixes}Seafood Stew" food: 26 nutrition: 8 diff --git a/src/test/java/net/tfminecraft/cooking/item/OctopusJellyfishAssetsTest.java b/src/test/java/net/tfminecraft/cooking/item/OctopusJellyfishAssetsTest.java index 5e4280a..25faaf6 100644 --- a/src/test/java/net/tfminecraft/cooking/item/OctopusJellyfishAssetsTest.java +++ b/src/test/java/net/tfminecraft/cooking/item/OctopusJellyfishAssetsTest.java @@ -24,8 +24,6 @@ void thePanGrillsOctopusAndTheBoardCutsJellyfishIntoStrips() { assertNull(types.getString("seafood_octopus.cooking-options.pot.output"), "boiled octopus stays octopus"); assertEquals("grilled_octopus", types.getString("grilled_octopus.model")); assertEquals("jellyfish_strips", types.getString("jellyfish_strips.model")); - assertEquals("{colour}{prefixes}Seafood Chowder", types.getString("soup.overrides.SEAFOOD CHOWDER.name")); - assertEquals("{colour}{prefixes}Seafood Stew", types.getString("soup.overrides.SEAFOOD STEW.name")); YamlConfiguration stations = YamlConfiguration.loadConfiguration(new File("src/main/resources/crafting-stations.yml")); String recipe = "cutting_board.recipes.slice_jellyfish."; diff --git a/src/test/java/net/tfminecraft/cooking/pot/PotSoupKindsTest.java b/src/test/java/net/tfminecraft/cooking/pot/PotSoupKindsTest.java deleted file mode 100644 index 13cedc3..0000000 --- a/src/test/java/net/tfminecraft/cooking/pot/PotSoupKindsTest.java +++ /dev/null @@ -1,91 +0,0 @@ -package net.tfminecraft.cooking.pot; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.io.File; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -import org.bukkit.configuration.MemoryConfiguration; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; -import org.mockbukkit.mockbukkit.MockBukkit; - -import net.tfminecraft.cooking.Cooking; -import net.tfminecraft.cooking.item.FoodItem; -import net.tfminecraft.cooking.salad.SaladKind; - -/** pot.yml kinds: the pieces boiled in the pot make a Seafood Chowder or a Seafood Stew, or no kind at all. */ -class PotSoupKindsTest { - @TempDir Path directory; - Cooking previousPlugin; - - @BeforeEach void open() { - MockBukkit.mock(); - previousPlugin = Cooking.plugin; - Cooking.plugin = mock(Cooking.class); - when(Cooking.plugin.getName()).thenReturn("Cooking"); - when(Cooking.plugin.namespace()).thenReturn("cooking"); - new PotConfig().load(new File("src/main/resources/pot.yml")); - } - - @AfterEach void close() { - new PotConfig().load(directory.resolve("missing.yml").toFile()); - Cooking.plugin = previousPlugin; - MockBukkit.unmock(); - } - - static FoodItem piece(String type, String origin) { - MemoryConfiguration config = new MemoryConfiguration(); - config.set("update", false); - FoodItem food = new FoodItem(type, config); - food.setOrigin(origin); - return food; - } - - static String kind(FoodItem... pieces) { - SaladKind kind = PotConfig.kindFor(new ArrayList<>(List.of(pieces))); - return kind == null ? null : kind.getOrigin(); - } - - @Test - void seafoodWithAPotatoIsAChowder() { - assertEquals("Seafood Chowder", kind(piece("seafood_octopus", "Octopus"), piece("vegetable_cut", "Potato"))); - assertEquals("Seafood Chowder", kind(piece("seafood_fish_filet", "Tuna"), piece("vegetable_cut", "Potato"), - piece("vegetable_cut_2", "Onion"), piece("mushroom", "Brown Mushroom"))); - } - - @Test - void seafoodWithOtherVegetablesOrAnotherSeafoodIsAStew() { - assertEquals("Seafood Stew", kind(piece("seafood_octopus", "Octopus"), piece("vegetable_cut", "Carrot"))); - assertEquals("Seafood Stew", kind(piece("seafood_fish_filet", "Tuna"), piece("seafood_octopus", "Octopus"))); - assertEquals("Seafood Stew", kind(piece("seafood_jellyfish", "Blue Jellyfish"), - piece("seafood_jellyfish", "Pink Jellyfish"))); - } - - @Test - void oneSeafoodAloneOrNoSeafoodIsNoKind() { - assertNull(kind(piece("seafood_octopus", "Octopus"), piece("seafood_octopus", "Octopus"))); - assertNull(kind(piece("vegetable_cut", "Potato"), piece("vegetable_cut", "Carrot"))); - assertNull(kind()); - } - - @Test - void meatOrAPieceNoIngredientNamesMakesNoKind() { - assertNull(kind(piece("seafood_octopus", "Octopus"), piece("meat_pork", "Pork"), piece("vegetable_cut", "Potato"))); - assertNull(kind(piece("seafood_octopus", "Octopus"), piece("vegetable_cut", "Potato"), piece("stew_bone", "Bone"))); - assertEquals("meat", PotConfig.ingredientFor(piece("meat_pork", "Pork")).getId()); - assertNull(PotConfig.ingredientFor(piece("stew_bone", "Bone"))); - } - - @Test - void withoutKindsInPotYmlEverySoupIsPlain() { - new PotConfig().load(directory.resolve("missing.yml").toFile()); - assertNull(kind(piece("seafood_octopus", "Octopus"), piece("vegetable_cut", "Potato"))); - assertNull(PotConfig.ingredientFor(piece("seafood_octopus", "Octopus"))); - } -} From 917a4a1db48ea6458fe2b023ea088bb28e3a45a6 Mon Sep 17 00:00:00 2001 From: Justinas Launikonis <95593194+JustinasLa@users.noreply.github.com> Date: Sun, 1 Nov 2026 20:59:07 +0200 Subject: [PATCH 3/3] feat: name seafood soups Seafood Chowder and Seafood Stew with pot.yml kinds Co-Authored-By: Claude Opus 5.5 --- .../ingredients/seafood/grilled_octopus.json | 428 +----------- .../seafood/jellyfish_strips_boiled.json | 644 +----------------- .../seafood/jellyfish_strips_burnt.json | 644 +----------------- .../seafood/jellyfish_strips_cooked.json | 644 +----------------- .../seafood/jellyfish_strips_raw.json | 644 +----------------- .../seafood/jellyfish_strips_rotten.json | 644 +----------------- README.md | 2 +- src/main/resources/pot.yml | 12 + .../cooking/SeafoodSoupCoverageTest.java | 64 +- 9 files changed, 129 insertions(+), 3597 deletions(-) diff --git a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/grilled_octopus.json b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/grilled_octopus.json index 6a0b032..b0d1aa3 100644 --- a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/grilled_octopus.json +++ b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/grilled_octopus.json @@ -1,424 +1,20 @@ { "format_version": "26.3", "credit": "TFMC grilled octopus: octopus_cooked.json with a grilled texture (octopus-jellyfish bin/gen.py)", - "textures": { - "0": "tfmc_cooking:item/ingredients/seafood/grilled_octopus", - "particle": "tfmc_cooking:item/ingredients/seafood/grilled_octopus" - }, + "textures": {"0": "tfmc_cooking:item/ingredients/seafood/grilled_octopus", "particle": "tfmc_cooking:item/ingredients/seafood/grilled_octopus"}, "elements": [ - { - "from": [ - 12, - 0, - 7 - ], - "to": [ - 15, - 2, - 9 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 13, - 0, - 7 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 4, - 7, - 10 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 1, - 3, - 4 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 6, - 10, - 11, - 13 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 1, - 3, - 4 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 10, - 5, - 13 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 10, - 5, - 13 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 7, - 0, - 6.75 - ], - "to": [ - 12, - 2.25, - 9.25 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 10, - 0, - 7 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 4.5, - 12, - 9.75 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 1, - 2.5, - 3.25 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 6, - 10, - 11, - 12.25 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 1, - 2.5, - 3.25 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 10, - 5, - 12.5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 10, - 5, - 12.5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 4, - 0, - 5.75 - ], - "to": [ - 7, - 2.5, - 8.25 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 5, - 0, - 6 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 4, - 7, - 10 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 1, - 3, - 4 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 6, - 10, - 11, - 13 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 1, - 3, - 4 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 10, - 5, - 13 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 10, - 5, - 13 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 1, - 0, - 4.5 - ], - "to": [ - 4, - 2.75, - 7.5 - ], - "rotation": { - "angle": 0, - "axis": "y", - "origin": [ - 2, - 0, - 5 - ] - }, - "faces": { - "north": { - "uv": [ - 0, - 4, - 7, - 10 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 1, - 3, - 4 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 6, - 10, - 11, - 13 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 4, - 0, - 8, - 4 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 10, - 5, - 13 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 10, - 5, - 13 - ], - "texture": "#0" - } - } - } + {"from": [12, 0, 7], "to": [15, 2, 9], "rotation": {"angle": 0, "axis": "y", "origin": [13, 0, 7]}, "faces": {"north": {"uv": [0, 4, 7, 10], "texture": "#0"}, "east": {"uv": [0, 1, 3, 4], "texture": "#0"}, "south": {"uv": [6, 10, 11, 13], "texture": "#0"}, "west": {"uv": [0, 1, 3, 4], "texture": "#0"}, "up": {"uv": [0, 10, 5, 13], "texture": "#0"}, "down": {"uv": [0, 10, 5, 13], "texture": "#0"}}}, + {"from": [7, 0, 6.75], "to": [12, 2.25, 9.25], "rotation": {"angle": 0, "axis": "y", "origin": [10, 0, 7]}, "faces": {"north": {"uv": [0, 4.5, 12, 9.75], "texture": "#0"}, "east": {"uv": [0, 1, 2.5, 3.25], "texture": "#0"}, "south": {"uv": [6, 10, 11, 12.25], "texture": "#0"}, "west": {"uv": [0, 1, 2.5, 3.25], "texture": "#0"}, "up": {"uv": [0, 10, 5, 12.5], "texture": "#0"}, "down": {"uv": [0, 10, 5, 12.5], "texture": "#0"}}}, + {"from": [4, 0, 5.75], "to": [7, 2.5, 8.25], "rotation": {"angle": 0, "axis": "y", "origin": [5, 0, 6]}, "faces": {"north": {"uv": [0, 4, 7, 10], "texture": "#0"}, "east": {"uv": [0, 1, 3, 4], "texture": "#0"}, "south": {"uv": [6, 10, 11, 13], "texture": "#0"}, "west": {"uv": [0, 1, 3, 4], "texture": "#0"}, "up": {"uv": [0, 10, 5, 13], "texture": "#0"}, "down": {"uv": [0, 10, 5, 13], "texture": "#0"}}}, + {"from": [1, 0, 4.5], "to": [4, 2.75, 7.5], "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 5]}, "faces": {"north": {"uv": [0, 4, 7, 10], "texture": "#0"}, "east": {"uv": [0, 1, 3, 4], "texture": "#0"}, "south": {"uv": [6, 10, 11, 13], "texture": "#0"}, "west": {"uv": [4, 0, 8, 4], "texture": "#0"}, "up": {"uv": [0, 10, 5, 13], "texture": "#0"}, "down": {"uv": [0, 10, 5, 13], "texture": "#0"}}} ], "display": { - "thirdperson_righthand": { - "rotation": [ - 50, - 0, - 0 - ], - "translation": [ - 0, - 3.25, - 1.75 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "thirdperson_lefthand": { - "rotation": [ - 50, - 0, - 0 - ], - "translation": [ - 0, - 3.25, - 1.75 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "firstperson_righthand": { - "translation": [ - 0, - 5.75, - 0 - ], - "scale": [ - 0.6, - 0.6, - 0.6 - ] - }, - "firstperson_lefthand": { - "translation": [ - 0, - 5.75, - 0 - ], - "scale": [ - 0.6, - 0.6, - 0.6 - ] - }, - "ground": { - "translation": [ - 0, - 3.75, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "gui": { - "rotation": [ - 29, - -143, - 0 - ], - "translation": [ - 0, - 1.75, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "fixed": { - "rotation": [ - -90, - 0, - 0 - ], - "translation": [ - 0, - 0, - -14 - ], - "scale": [ - 2, - 2, - 2 - ] - } + "thirdperson_righthand": {"rotation": [50, 0, 0], "translation": [0, 3.25, 1.75], "scale": [0.5, 0.5, 0.5]}, + "thirdperson_lefthand": {"rotation": [50, 0, 0], "translation": [0, 3.25, 1.75], "scale": [0.5, 0.5, 0.5]}, + "firstperson_righthand": {"translation": [0, 5.75, 0], "scale": [0.6, 0.6, 0.6]}, + "firstperson_lefthand": {"translation": [0, 5.75, 0], "scale": [0.6, 0.6, 0.6]}, + "ground": {"translation": [0, 3.75, 0], "scale": [0.5, 0.5, 0.5]}, + "gui": {"rotation": [29, -143, 0], "translation": [0, 1.75, 0], "scale": [0.5, 0.5, 0.5]}, + "fixed": {"rotation": [-90, 0, 0], "translation": [0, 0, -14], "scale": [2, 2, 2]} } } diff --git a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_boiled.json b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_boiled.json index f7b162c..98a5f18 100644 --- a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_boiled.json +++ b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_boiled.json @@ -1,636 +1,22 @@ { "credit": "TFMC jellyfish strips (octopus-jellyfish bin/gen.py)", - "textures": { - "0": "tfmc_cooking:item/ingredients/seafood/jellyfish_boiled", - "particle": "tfmc_cooking:item/ingredients/seafood/jellyfish_boiled" - }, + "textures": {"0": "tfmc_cooking:item/ingredients/seafood/jellyfish_boiled", "particle": "tfmc_cooking:item/ingredients/seafood/jellyfish_boiled"}, "elements": [ - { - "from": [ - 3.0, - 0.0, - 5.6 - ], - "to": [ - 12.0, - 0.6, - 7.0 - ], - "faces": { - "north": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 4, - 3, - 5, - 4 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 4, - 3, - 5, - 4 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": 22.5, - "axis": "y", - "origin": [ - 7.5, - 0.0, - 6.3 - ] - } - }, - { - "from": [ - 4.0, - 0.0, - 8.4 - ], - "to": [ - 13.0, - 0.6, - 9.8 - ], - "faces": { - "north": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 1, - 1, - 2 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 1, - 1, - 2 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": -22.5, - "axis": "y", - "origin": [ - 8.5, - 0.0, - 9.1 - ] - } - }, - { - "from": [ - 5.0, - 0.0, - 3.6 - ], - "to": [ - 12.0, - 0.6, - 4.9 - ], - "faces": { - "north": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 4, - 4, - 5, - 5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 4, - 4, - 5, - 5 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 4.5, - 0.0, - 10.4 - ], - "to": [ - 12.5, - 0.6, - 11.700000000000001 - ], - "faces": { - "north": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 3, - 1, - 4 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 3, - 1, - 4 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": 22.5, - "axis": "y", - "origin": [ - 8.5, - 0.0, - 11.05 - ] - } - }, - { - "from": [ - 3.5, - 0.6, - 6.9 - ], - "to": [ - 11.5, - 1.2, - 8.200000000000001 - ], - "faces": { - "north": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1, - 1 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1, - 1 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": -45, - "axis": "y", - "origin": [ - 7.5, - 0.6, - 7.550000000000001 - ] - } - }, - { - "from": [ - 6.0, - 0.6, - 6.4 - ], - "to": [ - 12.5, - 1.2, - 7.7 - ], - "faces": { - "north": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 4, - 1, - 5, - 2 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 4, - 1, - 5, - 2 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": 45, - "axis": "y", - "origin": [ - 9.25, - 0.6, - 7.050000000000001 - ] - } - }, - { - "from": [ - 5.5, - 1.2, - 8.0 - ], - "to": [ - 12.5, - 1.7999999999999998, - 9.2 - ], - "faces": { - "north": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 4, - 1, - 5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 4, - 1, - 5 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - } - } - } + {"from": [3.0, 0.0, 5.6], "to": [12.0, 0.6, 7.0], "faces": {"north": {"uv": [4, 3, 7, 4], "texture": "#0"}, "south": {"uv": [4, 3, 7, 4], "texture": "#0"}, "east": {"uv": [4, 3, 5, 4], "texture": "#0"}, "west": {"uv": [4, 3, 5, 4], "texture": "#0"}, "up": {"uv": [0, 0, 3, 1], "texture": "#0"}, "down": {"uv": [0, 0, 3, 1], "texture": "#0"}}, "rotation": {"angle": 22.5, "axis": "y", "origin": [7.5, 0.0, 6.3]}}, + {"from": [4.0, 0.0, 8.4], "to": [13.0, 0.6, 9.8], "faces": {"north": {"uv": [0, 1, 3, 2], "texture": "#0"}, "south": {"uv": [0, 1, 3, 2], "texture": "#0"}, "east": {"uv": [0, 1, 1, 2], "texture": "#0"}, "west": {"uv": [0, 1, 1, 2], "texture": "#0"}, "up": {"uv": [4, 1, 7, 2], "texture": "#0"}, "down": {"uv": [4, 1, 7, 2], "texture": "#0"}}, "rotation": {"angle": -22.5, "axis": "y", "origin": [8.5, 0.0, 9.1]}}, + {"from": [5.0, 0.0, 3.6], "to": [12.0, 0.6, 4.9], "faces": {"north": {"uv": [4, 4, 7, 5], "texture": "#0"}, "south": {"uv": [4, 4, 7, 5], "texture": "#0"}, "east": {"uv": [4, 4, 5, 5], "texture": "#0"}, "west": {"uv": [4, 4, 5, 5], "texture": "#0"}, "up": {"uv": [0, 4, 3, 5], "texture": "#0"}, "down": {"uv": [0, 4, 3, 5], "texture": "#0"}}}, + {"from": [4.5, 0.0, 10.4], "to": [12.5, 0.6, 11.7], "faces": {"north": {"uv": [0, 3, 3, 4], "texture": "#0"}, "south": {"uv": [0, 3, 3, 4], "texture": "#0"}, "east": {"uv": [0, 3, 1, 4], "texture": "#0"}, "west": {"uv": [0, 3, 1, 4], "texture": "#0"}, "up": {"uv": [4, 3, 7, 4], "texture": "#0"}, "down": {"uv": [4, 3, 7, 4], "texture": "#0"}}, "rotation": {"angle": 22.5, "axis": "y", "origin": [8.5, 0.0, 11.05]}}, + {"from": [3.5, 0.6, 6.9], "to": [11.5, 1.2, 8.2], "faces": {"north": {"uv": [0, 0, 3, 1], "texture": "#0"}, "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, "east": {"uv": [0, 0, 1, 1], "texture": "#0"}, "west": {"uv": [0, 0, 1, 1], "texture": "#0"}, "up": {"uv": [0, 1, 3, 2], "texture": "#0"}, "down": {"uv": [0, 1, 3, 2], "texture": "#0"}}, "rotation": {"angle": -45, "axis": "y", "origin": [7.5, 0.6, 7.55]}}, + {"from": [6.0, 0.6, 6.4], "to": [12.5, 1.2, 7.7], "faces": {"north": {"uv": [4, 1, 7, 2], "texture": "#0"}, "south": {"uv": [4, 1, 7, 2], "texture": "#0"}, "east": {"uv": [4, 1, 5, 2], "texture": "#0"}, "west": {"uv": [4, 1, 5, 2], "texture": "#0"}, "up": {"uv": [4, 4, 7, 5], "texture": "#0"}, "down": {"uv": [4, 4, 7, 5], "texture": "#0"}}, "rotation": {"angle": 45, "axis": "y", "origin": [9.25, 0.6, 7.05]}}, + {"from": [5.5, 1.2, 8.0], "to": [12.5, 1.8, 9.2], "faces": {"north": {"uv": [0, 4, 3, 5], "texture": "#0"}, "south": {"uv": [0, 4, 3, 5], "texture": "#0"}, "east": {"uv": [0, 4, 1, 5], "texture": "#0"}, "west": {"uv": [0, 4, 1, 5], "texture": "#0"}, "up": {"uv": [0, 3, 3, 4], "texture": "#0"}, "down": {"uv": [0, 3, 3, 4], "texture": "#0"}}} ], "display": { - "thirdperson_righthand": { - "rotation": [ - 50, - 0, - 0 - ], - "translation": [ - 0, - 3.25, - 1.75 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "thirdperson_lefthand": { - "rotation": [ - 50, - 0, - 0 - ], - "translation": [ - 0, - 3.25, - 1.75 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "firstperson_righthand": { - "translation": [ - 0, - 5.75, - 0 - ], - "scale": [ - 0.6, - 0.6, - 0.6 - ] - }, - "firstperson_lefthand": { - "translation": [ - 0, - 5.75, - 0 - ], - "scale": [ - 0.6, - 0.6, - 0.6 - ] - }, - "ground": { - "translation": [ - 0, - 3.75, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "gui": { - "rotation": [ - 29, - -143, - 0 - ], - "translation": [ - 0, - 1.75, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "fixed": { - "rotation": [ - -90, - 0, - 0 - ], - "translation": [ - 0, - 0, - -14 - ], - "scale": [ - 2, - 2, - 2 - ] - } + "thirdperson_righthand": {"rotation": [50, 0, 0], "translation": [0, 3.25, 1.75], "scale": [0.5, 0.5, 0.5]}, + "thirdperson_lefthand": {"rotation": [50, 0, 0], "translation": [0, 3.25, 1.75], "scale": [0.5, 0.5, 0.5]}, + "firstperson_righthand": {"translation": [0, 5.75, 0], "scale": [0.6, 0.6, 0.6]}, + "firstperson_lefthand": {"translation": [0, 5.75, 0], "scale": [0.6, 0.6, 0.6]}, + "ground": {"translation": [0, 3.75, 0], "scale": [0.5, 0.5, 0.5]}, + "gui": {"rotation": [29, -143, 0], "translation": [0, 1.75, 0], "scale": [0.5, 0.5, 0.5]}, + "fixed": {"rotation": [-90, 0, 0], "translation": [0, 0, -14], "scale": [2, 2, 2]} } } diff --git a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_burnt.json b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_burnt.json index 6f6e3ef..05708de 100644 --- a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_burnt.json +++ b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_burnt.json @@ -1,636 +1,22 @@ { "credit": "TFMC jellyfish strips (octopus-jellyfish bin/gen.py)", - "textures": { - "0": "tfmc_cooking:item/ingredients/seafood/jellyfish_burnt", - "particle": "tfmc_cooking:item/ingredients/seafood/jellyfish_burnt" - }, + "textures": {"0": "tfmc_cooking:item/ingredients/seafood/jellyfish_burnt", "particle": "tfmc_cooking:item/ingredients/seafood/jellyfish_burnt"}, "elements": [ - { - "from": [ - 3.0, - 0.0, - 5.6 - ], - "to": [ - 12.0, - 0.6, - 7.0 - ], - "faces": { - "north": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 4, - 3, - 5, - 4 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 4, - 3, - 5, - 4 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": 22.5, - "axis": "y", - "origin": [ - 7.5, - 0.0, - 6.3 - ] - } - }, - { - "from": [ - 4.0, - 0.0, - 8.4 - ], - "to": [ - 13.0, - 0.6, - 9.8 - ], - "faces": { - "north": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 1, - 1, - 2 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 1, - 1, - 2 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": -22.5, - "axis": "y", - "origin": [ - 8.5, - 0.0, - 9.1 - ] - } - }, - { - "from": [ - 5.0, - 0.0, - 3.6 - ], - "to": [ - 12.0, - 0.6, - 4.9 - ], - "faces": { - "north": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 4, - 4, - 5, - 5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 4, - 4, - 5, - 5 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 4.5, - 0.0, - 10.4 - ], - "to": [ - 12.5, - 0.6, - 11.700000000000001 - ], - "faces": { - "north": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 3, - 1, - 4 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 3, - 1, - 4 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": 22.5, - "axis": "y", - "origin": [ - 8.5, - 0.0, - 11.05 - ] - } - }, - { - "from": [ - 3.5, - 0.6, - 6.9 - ], - "to": [ - 11.5, - 1.2, - 8.200000000000001 - ], - "faces": { - "north": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1, - 1 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1, - 1 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": -45, - "axis": "y", - "origin": [ - 7.5, - 0.6, - 7.550000000000001 - ] - } - }, - { - "from": [ - 6.0, - 0.6, - 6.4 - ], - "to": [ - 12.5, - 1.2, - 7.7 - ], - "faces": { - "north": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 4, - 1, - 5, - 2 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 4, - 1, - 5, - 2 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": 45, - "axis": "y", - "origin": [ - 9.25, - 0.6, - 7.050000000000001 - ] - } - }, - { - "from": [ - 5.5, - 1.2, - 8.0 - ], - "to": [ - 12.5, - 1.7999999999999998, - 9.2 - ], - "faces": { - "north": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 4, - 1, - 5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 4, - 1, - 5 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - } - } - } + {"from": [3.0, 0.0, 5.6], "to": [12.0, 0.6, 7.0], "faces": {"north": {"uv": [4, 3, 7, 4], "texture": "#0"}, "south": {"uv": [4, 3, 7, 4], "texture": "#0"}, "east": {"uv": [4, 3, 5, 4], "texture": "#0"}, "west": {"uv": [4, 3, 5, 4], "texture": "#0"}, "up": {"uv": [0, 0, 3, 1], "texture": "#0"}, "down": {"uv": [0, 0, 3, 1], "texture": "#0"}}, "rotation": {"angle": 22.5, "axis": "y", "origin": [7.5, 0.0, 6.3]}}, + {"from": [4.0, 0.0, 8.4], "to": [13.0, 0.6, 9.8], "faces": {"north": {"uv": [0, 1, 3, 2], "texture": "#0"}, "south": {"uv": [0, 1, 3, 2], "texture": "#0"}, "east": {"uv": [0, 1, 1, 2], "texture": "#0"}, "west": {"uv": [0, 1, 1, 2], "texture": "#0"}, "up": {"uv": [4, 1, 7, 2], "texture": "#0"}, "down": {"uv": [4, 1, 7, 2], "texture": "#0"}}, "rotation": {"angle": -22.5, "axis": "y", "origin": [8.5, 0.0, 9.1]}}, + {"from": [5.0, 0.0, 3.6], "to": [12.0, 0.6, 4.9], "faces": {"north": {"uv": [4, 4, 7, 5], "texture": "#0"}, "south": {"uv": [4, 4, 7, 5], "texture": "#0"}, "east": {"uv": [4, 4, 5, 5], "texture": "#0"}, "west": {"uv": [4, 4, 5, 5], "texture": "#0"}, "up": {"uv": [0, 4, 3, 5], "texture": "#0"}, "down": {"uv": [0, 4, 3, 5], "texture": "#0"}}}, + {"from": [4.5, 0.0, 10.4], "to": [12.5, 0.6, 11.7], "faces": {"north": {"uv": [0, 3, 3, 4], "texture": "#0"}, "south": {"uv": [0, 3, 3, 4], "texture": "#0"}, "east": {"uv": [0, 3, 1, 4], "texture": "#0"}, "west": {"uv": [0, 3, 1, 4], "texture": "#0"}, "up": {"uv": [4, 3, 7, 4], "texture": "#0"}, "down": {"uv": [4, 3, 7, 4], "texture": "#0"}}, "rotation": {"angle": 22.5, "axis": "y", "origin": [8.5, 0.0, 11.05]}}, + {"from": [3.5, 0.6, 6.9], "to": [11.5, 1.2, 8.2], "faces": {"north": {"uv": [0, 0, 3, 1], "texture": "#0"}, "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, "east": {"uv": [0, 0, 1, 1], "texture": "#0"}, "west": {"uv": [0, 0, 1, 1], "texture": "#0"}, "up": {"uv": [0, 1, 3, 2], "texture": "#0"}, "down": {"uv": [0, 1, 3, 2], "texture": "#0"}}, "rotation": {"angle": -45, "axis": "y", "origin": [7.5, 0.6, 7.55]}}, + {"from": [6.0, 0.6, 6.4], "to": [12.5, 1.2, 7.7], "faces": {"north": {"uv": [4, 1, 7, 2], "texture": "#0"}, "south": {"uv": [4, 1, 7, 2], "texture": "#0"}, "east": {"uv": [4, 1, 5, 2], "texture": "#0"}, "west": {"uv": [4, 1, 5, 2], "texture": "#0"}, "up": {"uv": [4, 4, 7, 5], "texture": "#0"}, "down": {"uv": [4, 4, 7, 5], "texture": "#0"}}, "rotation": {"angle": 45, "axis": "y", "origin": [9.25, 0.6, 7.05]}}, + {"from": [5.5, 1.2, 8.0], "to": [12.5, 1.8, 9.2], "faces": {"north": {"uv": [0, 4, 3, 5], "texture": "#0"}, "south": {"uv": [0, 4, 3, 5], "texture": "#0"}, "east": {"uv": [0, 4, 1, 5], "texture": "#0"}, "west": {"uv": [0, 4, 1, 5], "texture": "#0"}, "up": {"uv": [0, 3, 3, 4], "texture": "#0"}, "down": {"uv": [0, 3, 3, 4], "texture": "#0"}}} ], "display": { - "thirdperson_righthand": { - "rotation": [ - 50, - 0, - 0 - ], - "translation": [ - 0, - 3.25, - 1.75 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "thirdperson_lefthand": { - "rotation": [ - 50, - 0, - 0 - ], - "translation": [ - 0, - 3.25, - 1.75 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "firstperson_righthand": { - "translation": [ - 0, - 5.75, - 0 - ], - "scale": [ - 0.6, - 0.6, - 0.6 - ] - }, - "firstperson_lefthand": { - "translation": [ - 0, - 5.75, - 0 - ], - "scale": [ - 0.6, - 0.6, - 0.6 - ] - }, - "ground": { - "translation": [ - 0, - 3.75, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "gui": { - "rotation": [ - 29, - -143, - 0 - ], - "translation": [ - 0, - 1.75, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "fixed": { - "rotation": [ - -90, - 0, - 0 - ], - "translation": [ - 0, - 0, - -14 - ], - "scale": [ - 2, - 2, - 2 - ] - } + "thirdperson_righthand": {"rotation": [50, 0, 0], "translation": [0, 3.25, 1.75], "scale": [0.5, 0.5, 0.5]}, + "thirdperson_lefthand": {"rotation": [50, 0, 0], "translation": [0, 3.25, 1.75], "scale": [0.5, 0.5, 0.5]}, + "firstperson_righthand": {"translation": [0, 5.75, 0], "scale": [0.6, 0.6, 0.6]}, + "firstperson_lefthand": {"translation": [0, 5.75, 0], "scale": [0.6, 0.6, 0.6]}, + "ground": {"translation": [0, 3.75, 0], "scale": [0.5, 0.5, 0.5]}, + "gui": {"rotation": [29, -143, 0], "translation": [0, 1.75, 0], "scale": [0.5, 0.5, 0.5]}, + "fixed": {"rotation": [-90, 0, 0], "translation": [0, 0, -14], "scale": [2, 2, 2]} } } diff --git a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_cooked.json b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_cooked.json index 997ac39..67da686 100644 --- a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_cooked.json +++ b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_cooked.json @@ -1,636 +1,22 @@ { "credit": "TFMC jellyfish strips (octopus-jellyfish bin/gen.py)", - "textures": { - "0": "tfmc_cooking:item/ingredients/seafood/jellyfish_cooked", - "particle": "tfmc_cooking:item/ingredients/seafood/jellyfish_cooked" - }, + "textures": {"0": "tfmc_cooking:item/ingredients/seafood/jellyfish_cooked", "particle": "tfmc_cooking:item/ingredients/seafood/jellyfish_cooked"}, "elements": [ - { - "from": [ - 3.0, - 0.0, - 5.6 - ], - "to": [ - 12.0, - 0.6, - 7.0 - ], - "faces": { - "north": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 4, - 3, - 5, - 4 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 4, - 3, - 5, - 4 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": 22.5, - "axis": "y", - "origin": [ - 7.5, - 0.0, - 6.3 - ] - } - }, - { - "from": [ - 4.0, - 0.0, - 8.4 - ], - "to": [ - 13.0, - 0.6, - 9.8 - ], - "faces": { - "north": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 1, - 1, - 2 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 1, - 1, - 2 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": -22.5, - "axis": "y", - "origin": [ - 8.5, - 0.0, - 9.1 - ] - } - }, - { - "from": [ - 5.0, - 0.0, - 3.6 - ], - "to": [ - 12.0, - 0.6, - 4.9 - ], - "faces": { - "north": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 4, - 4, - 5, - 5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 4, - 4, - 5, - 5 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 4.5, - 0.0, - 10.4 - ], - "to": [ - 12.5, - 0.6, - 11.700000000000001 - ], - "faces": { - "north": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 3, - 1, - 4 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 3, - 1, - 4 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": 22.5, - "axis": "y", - "origin": [ - 8.5, - 0.0, - 11.05 - ] - } - }, - { - "from": [ - 3.5, - 0.6, - 6.9 - ], - "to": [ - 11.5, - 1.2, - 8.200000000000001 - ], - "faces": { - "north": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1, - 1 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1, - 1 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": -45, - "axis": "y", - "origin": [ - 7.5, - 0.6, - 7.550000000000001 - ] - } - }, - { - "from": [ - 6.0, - 0.6, - 6.4 - ], - "to": [ - 12.5, - 1.2, - 7.7 - ], - "faces": { - "north": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 4, - 1, - 5, - 2 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 4, - 1, - 5, - 2 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": 45, - "axis": "y", - "origin": [ - 9.25, - 0.6, - 7.050000000000001 - ] - } - }, - { - "from": [ - 5.5, - 1.2, - 8.0 - ], - "to": [ - 12.5, - 1.7999999999999998, - 9.2 - ], - "faces": { - "north": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 4, - 1, - 5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 4, - 1, - 5 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - } - } - } + {"from": [3.0, 0.0, 5.6], "to": [12.0, 0.6, 7.0], "faces": {"north": {"uv": [4, 3, 7, 4], "texture": "#0"}, "south": {"uv": [4, 3, 7, 4], "texture": "#0"}, "east": {"uv": [4, 3, 5, 4], "texture": "#0"}, "west": {"uv": [4, 3, 5, 4], "texture": "#0"}, "up": {"uv": [0, 0, 3, 1], "texture": "#0"}, "down": {"uv": [0, 0, 3, 1], "texture": "#0"}}, "rotation": {"angle": 22.5, "axis": "y", "origin": [7.5, 0.0, 6.3]}}, + {"from": [4.0, 0.0, 8.4], "to": [13.0, 0.6, 9.8], "faces": {"north": {"uv": [0, 1, 3, 2], "texture": "#0"}, "south": {"uv": [0, 1, 3, 2], "texture": "#0"}, "east": {"uv": [0, 1, 1, 2], "texture": "#0"}, "west": {"uv": [0, 1, 1, 2], "texture": "#0"}, "up": {"uv": [4, 1, 7, 2], "texture": "#0"}, "down": {"uv": [4, 1, 7, 2], "texture": "#0"}}, "rotation": {"angle": -22.5, "axis": "y", "origin": [8.5, 0.0, 9.1]}}, + {"from": [5.0, 0.0, 3.6], "to": [12.0, 0.6, 4.9], "faces": {"north": {"uv": [4, 4, 7, 5], "texture": "#0"}, "south": {"uv": [4, 4, 7, 5], "texture": "#0"}, "east": {"uv": [4, 4, 5, 5], "texture": "#0"}, "west": {"uv": [4, 4, 5, 5], "texture": "#0"}, "up": {"uv": [0, 4, 3, 5], "texture": "#0"}, "down": {"uv": [0, 4, 3, 5], "texture": "#0"}}}, + {"from": [4.5, 0.0, 10.4], "to": [12.5, 0.6, 11.7], "faces": {"north": {"uv": [0, 3, 3, 4], "texture": "#0"}, "south": {"uv": [0, 3, 3, 4], "texture": "#0"}, "east": {"uv": [0, 3, 1, 4], "texture": "#0"}, "west": {"uv": [0, 3, 1, 4], "texture": "#0"}, "up": {"uv": [4, 3, 7, 4], "texture": "#0"}, "down": {"uv": [4, 3, 7, 4], "texture": "#0"}}, "rotation": {"angle": 22.5, "axis": "y", "origin": [8.5, 0.0, 11.05]}}, + {"from": [3.5, 0.6, 6.9], "to": [11.5, 1.2, 8.2], "faces": {"north": {"uv": [0, 0, 3, 1], "texture": "#0"}, "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, "east": {"uv": [0, 0, 1, 1], "texture": "#0"}, "west": {"uv": [0, 0, 1, 1], "texture": "#0"}, "up": {"uv": [0, 1, 3, 2], "texture": "#0"}, "down": {"uv": [0, 1, 3, 2], "texture": "#0"}}, "rotation": {"angle": -45, "axis": "y", "origin": [7.5, 0.6, 7.55]}}, + {"from": [6.0, 0.6, 6.4], "to": [12.5, 1.2, 7.7], "faces": {"north": {"uv": [4, 1, 7, 2], "texture": "#0"}, "south": {"uv": [4, 1, 7, 2], "texture": "#0"}, "east": {"uv": [4, 1, 5, 2], "texture": "#0"}, "west": {"uv": [4, 1, 5, 2], "texture": "#0"}, "up": {"uv": [4, 4, 7, 5], "texture": "#0"}, "down": {"uv": [4, 4, 7, 5], "texture": "#0"}}, "rotation": {"angle": 45, "axis": "y", "origin": [9.25, 0.6, 7.05]}}, + {"from": [5.5, 1.2, 8.0], "to": [12.5, 1.8, 9.2], "faces": {"north": {"uv": [0, 4, 3, 5], "texture": "#0"}, "south": {"uv": [0, 4, 3, 5], "texture": "#0"}, "east": {"uv": [0, 4, 1, 5], "texture": "#0"}, "west": {"uv": [0, 4, 1, 5], "texture": "#0"}, "up": {"uv": [0, 3, 3, 4], "texture": "#0"}, "down": {"uv": [0, 3, 3, 4], "texture": "#0"}}} ], "display": { - "thirdperson_righthand": { - "rotation": [ - 50, - 0, - 0 - ], - "translation": [ - 0, - 3.25, - 1.75 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "thirdperson_lefthand": { - "rotation": [ - 50, - 0, - 0 - ], - "translation": [ - 0, - 3.25, - 1.75 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "firstperson_righthand": { - "translation": [ - 0, - 5.75, - 0 - ], - "scale": [ - 0.6, - 0.6, - 0.6 - ] - }, - "firstperson_lefthand": { - "translation": [ - 0, - 5.75, - 0 - ], - "scale": [ - 0.6, - 0.6, - 0.6 - ] - }, - "ground": { - "translation": [ - 0, - 3.75, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "gui": { - "rotation": [ - 29, - -143, - 0 - ], - "translation": [ - 0, - 1.75, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "fixed": { - "rotation": [ - -90, - 0, - 0 - ], - "translation": [ - 0, - 0, - -14 - ], - "scale": [ - 2, - 2, - 2 - ] - } + "thirdperson_righthand": {"rotation": [50, 0, 0], "translation": [0, 3.25, 1.75], "scale": [0.5, 0.5, 0.5]}, + "thirdperson_lefthand": {"rotation": [50, 0, 0], "translation": [0, 3.25, 1.75], "scale": [0.5, 0.5, 0.5]}, + "firstperson_righthand": {"translation": [0, 5.75, 0], "scale": [0.6, 0.6, 0.6]}, + "firstperson_lefthand": {"translation": [0, 5.75, 0], "scale": [0.6, 0.6, 0.6]}, + "ground": {"translation": [0, 3.75, 0], "scale": [0.5, 0.5, 0.5]}, + "gui": {"rotation": [29, -143, 0], "translation": [0, 1.75, 0], "scale": [0.5, 0.5, 0.5]}, + "fixed": {"rotation": [-90, 0, 0], "translation": [0, 0, -14], "scale": [2, 2, 2]} } } diff --git a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_raw.json b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_raw.json index 61a945e..066c851 100644 --- a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_raw.json +++ b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_raw.json @@ -1,636 +1,22 @@ { "credit": "TFMC jellyfish strips (octopus-jellyfish bin/gen.py)", - "textures": { - "0": "tfmc_cooking:item/ingredients/seafood/jellyfish_raw", - "particle": "tfmc_cooking:item/ingredients/seafood/jellyfish_raw" - }, + "textures": {"0": "tfmc_cooking:item/ingredients/seafood/jellyfish_raw", "particle": "tfmc_cooking:item/ingredients/seafood/jellyfish_raw"}, "elements": [ - { - "from": [ - 3.0, - 0.0, - 5.6 - ], - "to": [ - 12.0, - 0.6, - 7.0 - ], - "faces": { - "north": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 4, - 3, - 5, - 4 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 4, - 3, - 5, - 4 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": 22.5, - "axis": "y", - "origin": [ - 7.5, - 0.0, - 6.3 - ] - } - }, - { - "from": [ - 4.0, - 0.0, - 8.4 - ], - "to": [ - 13.0, - 0.6, - 9.8 - ], - "faces": { - "north": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 1, - 1, - 2 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 1, - 1, - 2 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": -22.5, - "axis": "y", - "origin": [ - 8.5, - 0.0, - 9.1 - ] - } - }, - { - "from": [ - 5.0, - 0.0, - 3.6 - ], - "to": [ - 12.0, - 0.6, - 4.9 - ], - "faces": { - "north": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 4, - 4, - 5, - 5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 4, - 4, - 5, - 5 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 4.5, - 0.0, - 10.4 - ], - "to": [ - 12.5, - 0.6, - 11.700000000000001 - ], - "faces": { - "north": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 3, - 1, - 4 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 3, - 1, - 4 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": 22.5, - "axis": "y", - "origin": [ - 8.5, - 0.0, - 11.05 - ] - } - }, - { - "from": [ - 3.5, - 0.6, - 6.9 - ], - "to": [ - 11.5, - 1.2, - 8.200000000000001 - ], - "faces": { - "north": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1, - 1 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1, - 1 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": -45, - "axis": "y", - "origin": [ - 7.5, - 0.6, - 7.550000000000001 - ] - } - }, - { - "from": [ - 6.0, - 0.6, - 6.4 - ], - "to": [ - 12.5, - 1.2, - 7.7 - ], - "faces": { - "north": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 4, - 1, - 5, - 2 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 4, - 1, - 5, - 2 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": 45, - "axis": "y", - "origin": [ - 9.25, - 0.6, - 7.050000000000001 - ] - } - }, - { - "from": [ - 5.5, - 1.2, - 8.0 - ], - "to": [ - 12.5, - 1.7999999999999998, - 9.2 - ], - "faces": { - "north": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 4, - 1, - 5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 4, - 1, - 5 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - } - } - } + {"from": [3.0, 0.0, 5.6], "to": [12.0, 0.6, 7.0], "faces": {"north": {"uv": [4, 3, 7, 4], "texture": "#0"}, "south": {"uv": [4, 3, 7, 4], "texture": "#0"}, "east": {"uv": [4, 3, 5, 4], "texture": "#0"}, "west": {"uv": [4, 3, 5, 4], "texture": "#0"}, "up": {"uv": [0, 0, 3, 1], "texture": "#0"}, "down": {"uv": [0, 0, 3, 1], "texture": "#0"}}, "rotation": {"angle": 22.5, "axis": "y", "origin": [7.5, 0.0, 6.3]}}, + {"from": [4.0, 0.0, 8.4], "to": [13.0, 0.6, 9.8], "faces": {"north": {"uv": [0, 1, 3, 2], "texture": "#0"}, "south": {"uv": [0, 1, 3, 2], "texture": "#0"}, "east": {"uv": [0, 1, 1, 2], "texture": "#0"}, "west": {"uv": [0, 1, 1, 2], "texture": "#0"}, "up": {"uv": [4, 1, 7, 2], "texture": "#0"}, "down": {"uv": [4, 1, 7, 2], "texture": "#0"}}, "rotation": {"angle": -22.5, "axis": "y", "origin": [8.5, 0.0, 9.1]}}, + {"from": [5.0, 0.0, 3.6], "to": [12.0, 0.6, 4.9], "faces": {"north": {"uv": [4, 4, 7, 5], "texture": "#0"}, "south": {"uv": [4, 4, 7, 5], "texture": "#0"}, "east": {"uv": [4, 4, 5, 5], "texture": "#0"}, "west": {"uv": [4, 4, 5, 5], "texture": "#0"}, "up": {"uv": [0, 4, 3, 5], "texture": "#0"}, "down": {"uv": [0, 4, 3, 5], "texture": "#0"}}}, + {"from": [4.5, 0.0, 10.4], "to": [12.5, 0.6, 11.7], "faces": {"north": {"uv": [0, 3, 3, 4], "texture": "#0"}, "south": {"uv": [0, 3, 3, 4], "texture": "#0"}, "east": {"uv": [0, 3, 1, 4], "texture": "#0"}, "west": {"uv": [0, 3, 1, 4], "texture": "#0"}, "up": {"uv": [4, 3, 7, 4], "texture": "#0"}, "down": {"uv": [4, 3, 7, 4], "texture": "#0"}}, "rotation": {"angle": 22.5, "axis": "y", "origin": [8.5, 0.0, 11.05]}}, + {"from": [3.5, 0.6, 6.9], "to": [11.5, 1.2, 8.2], "faces": {"north": {"uv": [0, 0, 3, 1], "texture": "#0"}, "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, "east": {"uv": [0, 0, 1, 1], "texture": "#0"}, "west": {"uv": [0, 0, 1, 1], "texture": "#0"}, "up": {"uv": [0, 1, 3, 2], "texture": "#0"}, "down": {"uv": [0, 1, 3, 2], "texture": "#0"}}, "rotation": {"angle": -45, "axis": "y", "origin": [7.5, 0.6, 7.55]}}, + {"from": [6.0, 0.6, 6.4], "to": [12.5, 1.2, 7.7], "faces": {"north": {"uv": [4, 1, 7, 2], "texture": "#0"}, "south": {"uv": [4, 1, 7, 2], "texture": "#0"}, "east": {"uv": [4, 1, 5, 2], "texture": "#0"}, "west": {"uv": [4, 1, 5, 2], "texture": "#0"}, "up": {"uv": [4, 4, 7, 5], "texture": "#0"}, "down": {"uv": [4, 4, 7, 5], "texture": "#0"}}, "rotation": {"angle": 45, "axis": "y", "origin": [9.25, 0.6, 7.05]}}, + {"from": [5.5, 1.2, 8.0], "to": [12.5, 1.8, 9.2], "faces": {"north": {"uv": [0, 4, 3, 5], "texture": "#0"}, "south": {"uv": [0, 4, 3, 5], "texture": "#0"}, "east": {"uv": [0, 4, 1, 5], "texture": "#0"}, "west": {"uv": [0, 4, 1, 5], "texture": "#0"}, "up": {"uv": [0, 3, 3, 4], "texture": "#0"}, "down": {"uv": [0, 3, 3, 4], "texture": "#0"}}} ], "display": { - "thirdperson_righthand": { - "rotation": [ - 50, - 0, - 0 - ], - "translation": [ - 0, - 3.25, - 1.75 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "thirdperson_lefthand": { - "rotation": [ - 50, - 0, - 0 - ], - "translation": [ - 0, - 3.25, - 1.75 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "firstperson_righthand": { - "translation": [ - 0, - 5.75, - 0 - ], - "scale": [ - 0.6, - 0.6, - 0.6 - ] - }, - "firstperson_lefthand": { - "translation": [ - 0, - 5.75, - 0 - ], - "scale": [ - 0.6, - 0.6, - 0.6 - ] - }, - "ground": { - "translation": [ - 0, - 3.75, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "gui": { - "rotation": [ - 29, - -143, - 0 - ], - "translation": [ - 0, - 1.75, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "fixed": { - "rotation": [ - -90, - 0, - 0 - ], - "translation": [ - 0, - 0, - -14 - ], - "scale": [ - 2, - 2, - 2 - ] - } + "thirdperson_righthand": {"rotation": [50, 0, 0], "translation": [0, 3.25, 1.75], "scale": [0.5, 0.5, 0.5]}, + "thirdperson_lefthand": {"rotation": [50, 0, 0], "translation": [0, 3.25, 1.75], "scale": [0.5, 0.5, 0.5]}, + "firstperson_righthand": {"translation": [0, 5.75, 0], "scale": [0.6, 0.6, 0.6]}, + "firstperson_lefthand": {"translation": [0, 5.75, 0], "scale": [0.6, 0.6, 0.6]}, + "ground": {"translation": [0, 3.75, 0], "scale": [0.5, 0.5, 0.5]}, + "gui": {"rotation": [29, -143, 0], "translation": [0, 1.75, 0], "scale": [0.5, 0.5, 0.5]}, + "fixed": {"rotation": [-90, 0, 0], "translation": [0, 0, -14], "scale": [2, 2, 2]} } } diff --git a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_rotten.json b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_rotten.json index 834e447..640941e 100644 --- a/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_rotten.json +++ b/ItemsAdder/tfmc_cooking/resourcepack/assets/tfmc_cooking/models/item/ingredients/seafood/jellyfish_strips_rotten.json @@ -1,636 +1,22 @@ { "credit": "TFMC jellyfish strips (octopus-jellyfish bin/gen.py)", - "textures": { - "0": "tfmc_cooking:item/ingredients/seafood/jellyfish_rotten", - "particle": "tfmc_cooking:item/ingredients/seafood/jellyfish_rotten" - }, + "textures": {"0": "tfmc_cooking:item/ingredients/seafood/jellyfish_rotten", "particle": "tfmc_cooking:item/ingredients/seafood/jellyfish_rotten"}, "elements": [ - { - "from": [ - 3.0, - 0.0, - 5.6 - ], - "to": [ - 12.0, - 0.6, - 7.0 - ], - "faces": { - "north": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 4, - 3, - 5, - 4 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 4, - 3, - 5, - 4 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": 22.5, - "axis": "y", - "origin": [ - 7.5, - 0.0, - 6.3 - ] - } - }, - { - "from": [ - 4.0, - 0.0, - 8.4 - ], - "to": [ - 13.0, - 0.6, - 9.8 - ], - "faces": { - "north": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 1, - 1, - 2 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 1, - 1, - 2 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": -22.5, - "axis": "y", - "origin": [ - 8.5, - 0.0, - 9.1 - ] - } - }, - { - "from": [ - 5.0, - 0.0, - 3.6 - ], - "to": [ - 12.0, - 0.6, - 4.9 - ], - "faces": { - "north": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 4, - 4, - 5, - 5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 4, - 4, - 5, - 5 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - } - } - }, - { - "from": [ - 4.5, - 0.0, - 10.4 - ], - "to": [ - 12.5, - 0.6, - 11.700000000000001 - ], - "faces": { - "north": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 3, - 1, - 4 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 3, - 1, - 4 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 4, - 3, - 7, - 4 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": 22.5, - "axis": "y", - "origin": [ - 8.5, - 0.0, - 11.05 - ] - } - }, - { - "from": [ - 3.5, - 0.6, - 6.9 - ], - "to": [ - 11.5, - 1.2, - 8.200000000000001 - ], - "faces": { - "north": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 0, - 3, - 1 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 0, - 1, - 1 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1, - 1 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 1, - 3, - 2 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": -45, - "axis": "y", - "origin": [ - 7.5, - 0.6, - 7.550000000000001 - ] - } - }, - { - "from": [ - 6.0, - 0.6, - 6.4 - ], - "to": [ - 12.5, - 1.2, - 7.7 - ], - "faces": { - "north": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 4, - 1, - 7, - 2 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 4, - 1, - 5, - 2 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 4, - 1, - 5, - 2 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 4, - 4, - 7, - 5 - ], - "texture": "#0" - } - }, - "rotation": { - "angle": 45, - "axis": "y", - "origin": [ - 9.25, - 0.6, - 7.050000000000001 - ] - } - }, - { - "from": [ - 5.5, - 1.2, - 8.0 - ], - "to": [ - 12.5, - 1.7999999999999998, - 9.2 - ], - "faces": { - "north": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 4, - 3, - 5 - ], - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 4, - 1, - 5 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 4, - 1, - 5 - ], - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 3, - 3, - 4 - ], - "texture": "#0" - } - } - } + {"from": [3.0, 0.0, 5.6], "to": [12.0, 0.6, 7.0], "faces": {"north": {"uv": [4, 3, 7, 4], "texture": "#0"}, "south": {"uv": [4, 3, 7, 4], "texture": "#0"}, "east": {"uv": [4, 3, 5, 4], "texture": "#0"}, "west": {"uv": [4, 3, 5, 4], "texture": "#0"}, "up": {"uv": [0, 0, 3, 1], "texture": "#0"}, "down": {"uv": [0, 0, 3, 1], "texture": "#0"}}, "rotation": {"angle": 22.5, "axis": "y", "origin": [7.5, 0.0, 6.3]}}, + {"from": [4.0, 0.0, 8.4], "to": [13.0, 0.6, 9.8], "faces": {"north": {"uv": [0, 1, 3, 2], "texture": "#0"}, "south": {"uv": [0, 1, 3, 2], "texture": "#0"}, "east": {"uv": [0, 1, 1, 2], "texture": "#0"}, "west": {"uv": [0, 1, 1, 2], "texture": "#0"}, "up": {"uv": [4, 1, 7, 2], "texture": "#0"}, "down": {"uv": [4, 1, 7, 2], "texture": "#0"}}, "rotation": {"angle": -22.5, "axis": "y", "origin": [8.5, 0.0, 9.1]}}, + {"from": [5.0, 0.0, 3.6], "to": [12.0, 0.6, 4.9], "faces": {"north": {"uv": [4, 4, 7, 5], "texture": "#0"}, "south": {"uv": [4, 4, 7, 5], "texture": "#0"}, "east": {"uv": [4, 4, 5, 5], "texture": "#0"}, "west": {"uv": [4, 4, 5, 5], "texture": "#0"}, "up": {"uv": [0, 4, 3, 5], "texture": "#0"}, "down": {"uv": [0, 4, 3, 5], "texture": "#0"}}}, + {"from": [4.5, 0.0, 10.4], "to": [12.5, 0.6, 11.7], "faces": {"north": {"uv": [0, 3, 3, 4], "texture": "#0"}, "south": {"uv": [0, 3, 3, 4], "texture": "#0"}, "east": {"uv": [0, 3, 1, 4], "texture": "#0"}, "west": {"uv": [0, 3, 1, 4], "texture": "#0"}, "up": {"uv": [4, 3, 7, 4], "texture": "#0"}, "down": {"uv": [4, 3, 7, 4], "texture": "#0"}}, "rotation": {"angle": 22.5, "axis": "y", "origin": [8.5, 0.0, 11.05]}}, + {"from": [3.5, 0.6, 6.9], "to": [11.5, 1.2, 8.2], "faces": {"north": {"uv": [0, 0, 3, 1], "texture": "#0"}, "south": {"uv": [0, 0, 3, 1], "texture": "#0"}, "east": {"uv": [0, 0, 1, 1], "texture": "#0"}, "west": {"uv": [0, 0, 1, 1], "texture": "#0"}, "up": {"uv": [0, 1, 3, 2], "texture": "#0"}, "down": {"uv": [0, 1, 3, 2], "texture": "#0"}}, "rotation": {"angle": -45, "axis": "y", "origin": [7.5, 0.6, 7.55]}}, + {"from": [6.0, 0.6, 6.4], "to": [12.5, 1.2, 7.7], "faces": {"north": {"uv": [4, 1, 7, 2], "texture": "#0"}, "south": {"uv": [4, 1, 7, 2], "texture": "#0"}, "east": {"uv": [4, 1, 5, 2], "texture": "#0"}, "west": {"uv": [4, 1, 5, 2], "texture": "#0"}, "up": {"uv": [4, 4, 7, 5], "texture": "#0"}, "down": {"uv": [4, 4, 7, 5], "texture": "#0"}}, "rotation": {"angle": 45, "axis": "y", "origin": [9.25, 0.6, 7.05]}}, + {"from": [5.5, 1.2, 8.0], "to": [12.5, 1.8, 9.2], "faces": {"north": {"uv": [0, 4, 3, 5], "texture": "#0"}, "south": {"uv": [0, 4, 3, 5], "texture": "#0"}, "east": {"uv": [0, 4, 1, 5], "texture": "#0"}, "west": {"uv": [0, 4, 1, 5], "texture": "#0"}, "up": {"uv": [0, 3, 3, 4], "texture": "#0"}, "down": {"uv": [0, 3, 3, 4], "texture": "#0"}}} ], "display": { - "thirdperson_righthand": { - "rotation": [ - 50, - 0, - 0 - ], - "translation": [ - 0, - 3.25, - 1.75 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "thirdperson_lefthand": { - "rotation": [ - 50, - 0, - 0 - ], - "translation": [ - 0, - 3.25, - 1.75 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "firstperson_righthand": { - "translation": [ - 0, - 5.75, - 0 - ], - "scale": [ - 0.6, - 0.6, - 0.6 - ] - }, - "firstperson_lefthand": { - "translation": [ - 0, - 5.75, - 0 - ], - "scale": [ - 0.6, - 0.6, - 0.6 - ] - }, - "ground": { - "translation": [ - 0, - 3.75, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "gui": { - "rotation": [ - 29, - -143, - 0 - ], - "translation": [ - 0, - 1.75, - 0 - ], - "scale": [ - 0.5, - 0.5, - 0.5 - ] - }, - "fixed": { - "rotation": [ - -90, - 0, - 0 - ], - "translation": [ - 0, - 0, - -14 - ], - "scale": [ - 2, - 2, - 2 - ] - } + "thirdperson_righthand": {"rotation": [50, 0, 0], "translation": [0, 3.25, 1.75], "scale": [0.5, 0.5, 0.5]}, + "thirdperson_lefthand": {"rotation": [50, 0, 0], "translation": [0, 3.25, 1.75], "scale": [0.5, 0.5, 0.5]}, + "firstperson_righthand": {"translation": [0, 5.75, 0], "scale": [0.6, 0.6, 0.6]}, + "firstperson_lefthand": {"translation": [0, 5.75, 0], "scale": [0.6, 0.6, 0.6]}, + "ground": {"translation": [0, 3.75, 0], "scale": [0.5, 0.5, 0.5]}, + "gui": {"rotation": [29, -143, 0], "translation": [0, 1.75, 0], "scale": [0.5, 0.5, 0.5]}, + "fixed": {"rotation": [-90, 0, 0], "translation": [0, 0, -14], "scale": [2, 2, 2]} } } diff --git a/README.md b/README.md index 8d29345..a50f1a2 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Cooking makes food an interactive part of everyday life. Players grow and gather - **Pies** — line a pie tin with dough, fill it with fruit, meat, mashed potato, vegetables or cheese, and bake it in the oven like the bread tray. The whole pie comes out of the tin with an empty hand and is cut into four slices on the cutting board. Its fillings make its kind (Apple, Key Lime, Mixed Berry, Meat, Shepherd's) and name, and its food, quality and freshness come from its dough and fillings (`pies.yml`). - **Sweet berries, sugar cane and beetroot** — sweet berries become Cooking fruit on pickup (`conversions.yml`), so they go into salads, pies (Mixed Berry) and jam sandwiches (Sweet Berry Jam). The milling stone holds several recipes (`milling-recipes.yml`): 8 wheat grind into flour, and 8 sugar cane into 8 sugar, the same sweetener vanilla sugar becomes on pickup; each recipe sets its result's category, origin and amount, what the stone shows, and what a broken stone gives back. A soup that is at least half beetroot is ladled as Borscht: `pot.yml` `kinds` name a soup from its boiled pieces, as `pies.yml` kinds name pies. - **Mushrooms and hidden poison** — grilled mushrooms go into sandwiches and salads, raw or grilled ones onto pizzas and into pies, and raw ones boil into soup; in a dish both kinds are just "Mushroom". Each red mushroom poisons the dish a step further (Tainted, Poisoned, Deadly: less and less nutrition, the same food, and nausea, then poison, then weakness for whoever eats it). In a dish of 3 stars or more with its red mushrooms grilled (or its own bake cooked, its soup boiled) the poison is hidden: the lore shows no tag and the Food and Nutrition it would have without it, but eating applies it. Any dish bonus can count an origin and hide its tag this way (`count: origin`, `hide-at-stars`, `hide-tags`, `hide-dish-tags` in the dishes' `bonuses`; `tags.yml` poison). Any tag step can make the eater ill with `effects` (`"poison 10 1"`: effect, seconds, level), hidden or not. -- **Octopus, jellyfish and seafood soups** — octopus and jellyfish come from warm-water catches cut on the cutting board like fish. Octopus grilled in the frying pan becomes Grilled Octopus; jellyfish cubes cut again on the board become Jellyfish Strips (raw, fried or boiled as the cubes were), and both go into salads. Boiled seafood mashed in the pot with a potato makes a Seafood Chowder, with other vegetables or another seafood a Seafood Stew: the pot's pieces make a kind of soup that names it (`ingredients` and `kinds` in `pot.yml`, `soup` overrides in `types.yml`). +- **Octopus, jellyfish and seafood soups** — octopus and jellyfish come from warm-water catches cut on the cutting board like fish. Octopus grilled in the frying pan becomes Grilled Octopus; jellyfish cubes cut again on the board become Jellyfish Strips (raw, fried or boiled as the cubes were), and both go into salads. Boiled seafood mashed in the pot with a potato makes a Seafood Chowder, with other vegetables or another seafood a Seafood Stew (`kinds` in `pot.yml`). - **Serving and sharing** — plate dishes, ladle soup into bowls, and carve foods into portions for the table. - **Quality and freshness** — ingredient quality and composition influence finished dishes, while aging and food tags carry preparation history through the kitchen. - **Farming and husbandry** — crop fertility and harvest quality sit alongside animal care, breeding, genetics, and produce collection. diff --git a/src/main/resources/pot.yml b/src/main/resources/pot.yml index e18c41d..2a8d7ba 100644 --- a/src/main/resources/pot.yml +++ b/src/main/resources/pot.yml @@ -56,6 +56,18 @@ kinds: Borscht: name: Borscht mostly: Beetroot + # Boiled seafood (fish filets, octopus, jellyfish) with a potato, and other vegetables or mushrooms if you like. + Seafood Chowder: + name: Seafood Chowder + layers: [seafood] + only: [seafood, vegetable] + any-origin: [Potato] + # Seafood with other vegetables, or two kinds of seafood. One seafood alone stays an "Octopus Soup". + Seafood Stew: + name: Seafood Stew + layers: [seafood] + only: [seafood, vegetable] + min-origins: 2 # Tags a soup earns from what's in the pot when it's ladled, written like sandwiches.yml's bonuses. The pot has no # layers, so only count: origin applies, over everything in it (pieces, extras and stock). diff --git a/src/test/java/net/tfminecraft/cooking/cooking/SeafoodSoupCoverageTest.java b/src/test/java/net/tfminecraft/cooking/cooking/SeafoodSoupCoverageTest.java index 56214d4..002e378 100644 --- a/src/test/java/net/tfminecraft/cooking/cooking/SeafoodSoupCoverageTest.java +++ b/src/test/java/net/tfminecraft/cooking/cooking/SeafoodSoupCoverageTest.java @@ -1,13 +1,11 @@ package net.tfminecraft.cooking.cooking; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; import java.io.File; import java.nio.file.Path; import org.bukkit.Material; -import org.bukkit.configuration.MemoryConfiguration; import org.bukkit.inventory.ItemStack; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -16,14 +14,12 @@ import net.tfminecraft.cooking.enums.Method; import net.tfminecraft.cooking.item.FoodItem; -import net.tfminecraft.cooking.item.model.FoodModel; import net.tfminecraft.cooking.loader.TrackLoader; import net.tfminecraft.cooking.pot.PotConfig; -import net.tfminecraft.cooking.utils.FoodParser; /** - * A soup ladled from a pot of seafood and a potato is a Seafood Chowder: its kind (pot.yml kinds) is its origin, and - * the soup type's override for that origin (types.yml) names it. Salt and other extras don't change its kind. + * The shipped pot.yml kinds: boiled seafood mashed with a potato is a Seafood Chowder, with other vegetables or another + * seafood a Seafood Stew. One seafood alone, or seafood with meat, is still named by its pieces. Salt doesn't count. */ class SeafoodSoupCoverageTest { CookingReferencesTest.Environment env; @@ -33,22 +29,6 @@ class SeafoodSoupCoverageTest { @BeforeEach void open() { env = new CookingReferencesTest.Environment(); new PotConfig().load(new File("src/main/resources/pot.yml")); - // The soup as types.yml has it, with its kinds' names. - env.parser.when(() -> FoodParser.parse(startsWith("soup"))).thenAnswer(inv -> { - MemoryConfiguration config = new MemoryConfiguration(); - config.set("name", "{colour}{prefixes}{fillers}Soup"); - config.set("update", false); - config.set("overrides.SEAFOOD CHOWDER.name", "{colour}{prefixes}Seafood Chowder"); - config.set("overrides.SEAFOOD STEW.name", "{colour}{prefixes}Seafood Stew"); - FoodItem soup = new FoodItem("soup", config); - soup.setCategory("soup"); - soup.setOrigin("Mixed"); - soup.setModel(new FoodModel(new ItemStack(Material.CARROT))); - soup.setBaseFood(8); - FoodParser.Result result = new FoodParser.Result(); - result.template = soup; - return result; - }); pot = new PotReference(env.furniture, Method.POT); } @@ -57,12 +37,13 @@ class SeafoodSoupCoverageTest { env.close(); } - /** Mashed pieces in the pot (type:origin), and a salt as an extra. */ + /** Mashed pieces in the pot ("Origin/category"), and a salt. Returns the ladled soup's name. */ + @SuppressWarnings("deprecation") String ladle(String... pieces) { int slot = 1; for (String entry : pieces) { - String[] parts = entry.split(":"); - FoodItem piece = env.food(parts[0], "seafood", parts[1], Method.POT); + String[] parts = entry.split("/"); + FoodItem piece = env.food("piece", parts[1], parts[0], Method.POT); piece.getTagTrack("cooked").forceSetValue(3); piece.addOrModifyTrack(TrackLoader.getByString("mashed")); pot.slots.put("input_" + slot, piece); @@ -74,28 +55,41 @@ String ladle(String... pieces) { env.place("extra_salt", env.stack(salt, Material.SUGAR, 1)); env.player.getInventory().setItemInMainHand(new ItemStack(Material.PAPER)); pot.interact(env.interaction()); - return env.player.getInventory().getItemInMainHand().getItemMeta().getDisplayName(); + return org.bukkit.ChatColor.stripColor(env.player.getInventory().getItemInMainHand().getItemMeta().getDisplayName()); } @Test void octopusAndPotatoMakeASeafoodChowder() { - String name = ladle("seafood_octopus:Octopus", "vegetable_cut:Potato"); + assertEquals("Seafood Chowder", ladle("Octopus/seafood", "Potato/vegetable")); assertEquals("Seafood Chowder", env.lastBuilt.getOrigin()); - assertTrue(name.endsWith("Seafood Chowder"), name); - assertFalse(name.contains("Soup"), name); } @Test - void twoSeafoodsMakeASeafoodStew() { - assertTrue(ladle("seafood_fish_filet:Tuna", "seafood_jellyfish:Blue Jellyfish").endsWith("Seafood Stew")); - assertEquals("Seafood Stew", env.lastBuilt.getOrigin()); + void fishWithPotatoOnionAndAMushroomIsStillAChowder() { + assertEquals("Seafood Chowder", ladle("Tuna/seafood", "Potato/vegetable", "Onion/vegetable", "Brown Mushroom/vegetable")); } @Test - void octopusAloneIsStillAnOctopusSoup() { - String name = ladle("seafood_octopus:Octopus", "seafood_octopus:Octopus"); + void seafoodWithOtherVegetablesOrAnotherSeafoodIsAStew() { + assertEquals("Seafood Stew", ladle("Octopus/seafood", "Carrot/vegetable")); + } + + @Test + void twoSeafoodsAreAStew() { + assertEquals("Seafood Stew", ladle("Blue Jellyfish/seafood", "Pink Jellyfish/seafood")); + } + + @Test + void oneSeafoodAloneIsStillNamedByIt() { + String name = ladle("Octopus/seafood", "Octopus/seafood"); + assertEquals("Mixed", env.lastBuilt.getOrigin()); + assertTrue(name.endsWith("Soup") && name.contains("Octopus"), name); + } + + @Test + void seafoodWithMeatIsNoSeafoodDish() { + String name = ladle("Octopus/seafood", "Pork/meat", "Potato/vegetable"); assertEquals("Mixed", env.lastBuilt.getOrigin()); assertTrue(name.endsWith("Soup"), name); - assertFalse(name.contains("Seafood"), name); } }