Astral Realms Documentation Help

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

type

String

Yes

Must be shaped.

result

item-stack

Yes

The crafted output.

ingredients

Map<String, item-stack>

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.

pattern

List<String>

Yes

1–3 row strings. Each character in a row must be a key from ingredients or a space for an empty cell.

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.

type: shaped result: material: nether_wart amount: 1 ingredients: a: material: "diamond" amount: 2 b: material: "stick" amount: 1 pattern: - " a " - " b " - " a "

Shapeless — shapeless

ShapelessRecipeBlueprint(ItemStackWrapper result, Map<String, ItemStackWrapper> ingredients) — no pattern.

Field

Type

Required

Description

type

String

Yes

Must be shapeless.

result

item-stack

Yes

The crafted output.

ingredients

Map<String, item-stack>

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.

type: shapeless result: material: nether_wart amount: 1 ingredients: a: material: "diamond" b: material: "diamond"

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

type

String

Yes

Must be stonecutter.

output

item-stack

Yes

The item produced.

input

item-stack

Yes

The item consumed. Wrapped in a RecipeChoice.ExactChoice, so name/lore/enchantments on input are matched exactly.

type: stonecutter input: material: "andesite" amount: 1 output: material: "polished_andesite" amount: 2

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

type

String

Yes

furnace, campfire, or smoking.

input

item-stack

Yes

The item consumed. Wrapped in a RecipeChoice.ExactChoice.

output

item-stack

Yes

The item produced.

experience

Float

Yes

XP granted per smelt/cook.

cooking-time

Integer

Yes

Ticks required to finish, before any furnace/campfire speed modifiers.

type: furnace input: material: "raw_iron" output: material: "iron_ingot" experience: 0.7 cooking-time: 200

Validation

The loader rejects individual recipe files without blocking the rest of recipes/:

  • Missing or unrecognized typeMissing 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 NamespacedKey collides with one already registered in the same load pass (two files with the same base name) — logged as Duplicate 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.

Last modified: 25 July 2026