Vous savez maintenant créer des blocs et des items plus ou moins complexes mais … vous ne pouvez que les obtenir en créatif ou par give. Nous allons donc voir comment ajouter une recette.
À la fin de la méthode Init(FMLInitializationEvent event), après le commentaire //recipe, ajoutez ceci :
| GameRegistry.addRecipe(new ItemStack(BlockTutorial), new Object[]{"XXX", "ZYZ", "XXX", 'X', Block.blockLapis, |
| 'Y', new ItemStack(Item.dyePowder, 1, 15), 'Z', new ItemStack(Item.dyePowder, 1, 6)}); |
GameRegistry.addRecipe revient au même que GameRegistry.addShapedRecipe
On a comme paramètre un ItemStack BlockTutorial, c’est la sortie, et ensuite un tableau d’objet qui sont l’entré. Il y a 3 String qui se suivent : la ligne du haut, celle du milieu, puis celle du bas. Ensuite on défini chaque caractère. Le caractère ‘X’ correspond au bloc Block.blockLapis, ‘Y’ correspond à un ItemStack(Item.dyePowder, 1, 15).
Vous pouvez faire correspondre un caractère à un bloc, item ou à un itemstack.
Pour utiliser les metadata vous devez créer un itemstack, comme je l’ai fais pour les colorants : new ItemStack(item ou bloc, quantité, metadata).
Résultat :

Autre exemple avec une sortie en metadata :
GameRegistry.addRecipe(new ItemStack(TutorialMetadata, 4, 2), new Object[]{"XXX", "XXX", " ", 'X', Block.stone});
D’ailleurs vous pouvez aussi voir que j’ai laissé la troisième ligne vide, le résultat est donc :
Ne fonctionne pas. | Fonctionne 
Même principe pour les lignes de gauche à droite, vous pouvez faire : "XX ", "XX ", "YY ", …
En revanche, si je ne met pas de troisième ligne, comme ceci :
GameRegistry.addRecipe(new ItemStack(TutorialMetadata, 4, 1), new Object[]{"XXX", "XXX", 'X', Block.dirt});
Fonctionne | Fonctionne aussi 
Même principe pour les lignes de gauche à droite, vous pouvez faire : “XX”, “XX”, “YY”, … et le craft fonctionnera soit à droite, soit à gauche de la table de craft.
Et pour finir, les sharpeless recipe :
GameRegistry.addShapelessRecipe(new ItemStack(ItemTutorial, 2), new Object[]{ new ItemStack(Item.dyePowder, 1, 15), new ItemStack(Item.dyePowder, 1, 6)});
Cette fois-ci, pas de caractère (char) ni de chaîne de caractère (String), on met tout à la suite, et le résultat est qu’il n’y a pas de sens pour la recette :

Il suffit juste que les 2 colorants soient dans la table de craft pour que la recette fonctionne.
Voir sur github