Recipe Blueprints
Every file under plugins/AstralRecipes/recipes/ (recursive) is deserialized into a RecipeBlueprint implementation, picked by the file's required type key — see Recipe types for the full id table and the loading lifecycle. This page covers the YAML shape of each type.
Item fields (result, output, input, and ingredients values below) all use the standard AstralCore item-stack node — material/copy-from + name, lore, enchantments, item-flags, amount, and components; see Menu Items § item-stack.
Shaped — shaped
ShapedRecipeBlueprint(ItemStackWrapper result, List<String> pattern, Map<String, ItemStackWrapper> ingredients)
Field | Type | Required | Description |
|---|---|---|---|
| String | Yes | Must be |
| item-stack | Yes | The crafted output. |
|
| Yes | Maps a pattern symbol to the item that fills it. Only the key's first character is used as the symbol — keys should be single characters. |
|
| Yes | 1–3 row strings. Each character in a row must be a key from |
build() constructs new ShapedRecipe(key, result), calls .shape(pattern), then .setIngredient(symbol.charAt(0), new RecipeChoice.ExactChoice(item)) per ingredients entry, and sets the recipe-book category to MISC. Because every ingredient is wrapped in an exact-match RecipeChoice, an ingredient that sets name, lore, or enchantments requires the crafted item to match those exactly, not just the material.
Shapeless — shapeless
ShapelessRecipeBlueprint(ItemStackWrapper result, Map<String, ItemStackWrapper> ingredients) — no pattern.
Field | Type | Required | Description |
|---|---|---|---|
| String | Yes | Must be |
| item-stack | Yes | The crafted output. |
|
| Yes | The map key is a free-form id with no functional meaning — only the item values are used. |
build() calls ShapelessRecipe#addIngredient(RecipeChoice) once per ingredients value.
Registers 2 diamonds anywhere in the crafting grid craft into a nether wart.
Stonecutting — stonecutter
StoneCutterRecipeBlueprint(ItemStackWrapper output, ItemStackWrapper input) — note the field names: output/input, not result/ingredients, and the type value is stonecutter (not stonecutting).
Field | Type | Required | Description |
|---|---|---|---|
| String | Yes | Must be |
| item-stack | Yes | The item produced. |
| item-stack | Yes | The item consumed. Wrapped in a |
Stonecutting recipes only surface in the stonecutter GUI — they never appear in the crafting-table recipe book.
Cooking recipes
furnace, campfire, and smoking all share the same field shape, inherited from the abstract CookingRecipeBlueprint:
Field | Type | Required | Description |
|---|---|---|---|
| String | Yes |
|
| item-stack | Yes | The item consumed. Wrapped in a |
| item-stack | Yes | The item produced. |
| Float | Yes | XP granted per smelt/cook. |
| Integer | Yes | Ticks required to finish, before any furnace/campfire speed modifiers. |
Validation
The loader rejects individual recipe files without blocking the rest of recipes/:
Missing or unrecognized
type—Missing or unknown recipe blueprint type: <value>, logged, skipped.Any other deserialization failure (missing required field, bad material name, malformed pattern, …) — logged as
Failed to load recipe from <file>: <error>, skipped.A recipe whose computed
NamespacedKeycollides with one already registered in the same load pass (two files with the same base name) — logged asDuplicate recipe key <key> found in <file>. Skipping., not an exception.
Reloading
/core reload AstralRecipes (see Reload) re-runs the full unload/read/register sequence — a recipe file added, edited, or removed on disk takes effect immediately, without a server restart.