Crafting Recipes with RecipeBuilders
Adding Recipes with Builders
Crafting also has a RecipeBuilder. If you don't know what a builder is, check this out!
You start the builder chain with either shapedBuilder()
or shapelessBuilder()
. This determines the kind of recipe you want to add.
crafting.shapedBuilder()
crafting.shapelessBuilder()
Then you call additional methods onto the builder (.name(), .replace(), etc), to build up the end result. See the examples below for a complete picture.
Set the recipe name (optional):
name(String name)
If not provided, a recipe name will be autogenerated for you.
Set the recipe output (required):
output(ItemStack item)
Set the recipe function (optional):
recipeFunction(Closure<ItemStack> recipeFunction)
See the Recipe Function and Action page for more details.
Set the recipe action (optional):
recipeFunction(Closure<Void> recipeAction)
See the [Recipe Function and Action page] for more details.
TODO
This page is not yet created!
Set the recipe to replace others (optional):
replace()
See the Crafting page for details about these.
Set the recipe to replace others by name (optional):
replaceByName()
See the Crafting page for details about these. It functions the same as the one above, except that it matches the provided recipe name.
Set the recipe to allow the grid to be mirrored (optional, shaped only):
mirrored()
mirrored(boolean mirrored) // (1)!
- Choose whether the recipe is mirrored or not, default false
Creating the recipe's layout (required, shaped only):
matrix(String... matrix)
shape(String... matrix) // does the same thing as matrix()
// to input a matrix in the style of non-builder shaped addition
matrix(List<List<IIngredient>> matrix)
shape(List<List<IIngredient>> matrix)
Matching ingredients to the recipe layout (required, shaped only):
key(String c, IIngredient ingredient) // (1)!
- Please see the examples below to better understand how this works
Adding inputs to the recipe (required, shapeless only):
input(IIngredient ingredient)
input(IIngredient... ingredients)
input(Collection<IIngredient> ingredients)
Registering the recipe (required):
register()
Reading the above makes this seem quite complicated. We promise it's not!
Shaped
Example
// Shaped Recipes
crafting.shapedBuilder() // create a new shaped recipe
.name('balanced_clay') // name the recipe 'balanced_clay'
.output(item('minecraft:clay') * 32) // output 32 clay
.matrix('NIN', // create the layout for the recipe
'DSD', // each character represents a slot
'NIN')
.key('N', item('minecraft:nether_star')) // everywhere there is an 'N' in the layout, use a nether star
.key('I', ore('ingotIron')) // all 'I' characters are iron ingots
.key('D', item('minecraft:diamond')) // all 'D' characters are diamonds
.key('S', ore('stone')) // all 'I' characters are stone
.register() // register the recipe
Shapeless
Example
// Shapeless Recipes
crafting.shapelessBuilder() // add a new shapeless recipe
.name('balanced_clay_v3') // name the recipe 'balanced_clay_v3'
.output('minecraft:clay' * 2) // output 2 clay
.input('minecraft:iron_ingot') // add an iron ingot to the inputs
.input('minecraft:iron_ingot') // add a second iron ingot to the inputs
.input('minecraft:gold_nugget', 'minecraft:diamond') // add a gold nugget and a diamond to the inputs
.register()
Empty Spaces
INFO
If you want the slot to be empty, don't use a key and null, but instead just use a space!
Example
The matrix should look like this:
crafting.shapedBuilder()
.name('balanced_clay_v2')
.output(item('minecraft:clay') * 64)
.matrix(' B ', // use a space for an empty slot
'X X') // (1)!
.key('B', item('minecraft:glass_bottle'))
.key('X', item('minecraft:gold_nugget'))
.register()
- You can omit rows and columns for smaller recipes - this one's 3x2. Just make sure it's not jagged (different lengths for each row/col).