5 oct. 2014, 17:05

youtubeCe tutoriel est également disponible en vidéo.

Sommaire

Introduction

Bonjour à tous, dans ce nouveau tutoriel je vais vous apprendre à faire des recettes.
En effet, dans Minecraft il y a quatre manières d’obtenir un bloc (block) ou un objet (item) :
La première est de le trouver en jeu, par exemple : trouver dans un coffre, la seconde est de le dropper en tuant une entité (mob), c’est le cas de la nether star, la troisième est de se le donner par une commande ou par l’intermédiaire de l’inventaire créatif. Enfin la dernière façon de l’obtenir est de le « créer ».

Pré-requis

Code

Vous avez plusieurs manières de créer un objet, à l’aide d’une table de craft, d’un four ou d’une enclume.
Pour les crafts, à l’aide d’une table de craft, il faut différencier deux cas :
Le cas où les composants de la recette sont à la même position les uns par rapport aux autres (statique), et le cas où juste leur présence dans la matrix de craft compte (dynamique).

Initialiser des recettes se fait généralement dans la méthode «init(FMLInitializationEvent event)» après l’initialisation des blocs et des objets, sauf si vous avez besoin d’un autre mod pour votre recette alors il faut initialiser les recettes dans la méthode «postInit(FMLPostInitializationEvent event)».

Les recettes de craft avec un positionnement statique :

    GameRegistry.addRecipe(new ItemStack(blockTutoriel), new Object[]{
    "XXX",
    "ZYZ",
    "XXX",
    'X', Blocks.blockLapis,
    'Y', new ItemStack(Items.dyePowder, 1, 15),
    'Z', new ItemStack(Items.dyePowder, 1, 6)});

On a comme paramètre un ItemStack blockTutoriel, c’est la sortie, et ensuite un tableau d’objet qui sont l’entrée. Il y a 3 String qui se suivent : la ligne du haut, celle du milieu, puis celle du bas. Ensuite on définit 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 metadatas vous devez créer un itemstack, comme je l’ai fait pour les colorants : «new ItemStack(item ou bloc, quantité, metadata)».

Note :
GameRegistry.addRecipe revient au même que GameRegistry.addShapedRecipe.

Ce qui nous donne :
Exemple de recette

Vous pouvez également ainsi “forcer” le craft d’un bloc dans un coin de la matrix de craft, ce qui donne :

    GameRegistry.addRecipe(new ItemStack(blockTutoriel), new Object[]{"XXX", "XXX", 'X', Block.dirt});

Exemple de recette
Autre exemple de recette

Même principe pour les lignes de gauche à droite, vous pouvez faire : “XX”, “XX”, “YY”, …; le craft fonctionnera soit à droite, soit à gauche de la table de craft.

Les recettes de craft avec un positionnement dynamique :

    GameRegistry.addShapelessRecipe(new ItemStack(ItemTutorial, 2), new Object[]{ new ItemStack(Item.dyePowder, 1, 15), new ItemStack(Item.dyePowder, 1, 6)});

Vous avez juste à préciser les items, blocs ou les ItemStacks que vous souhaitez avoir dans votre recette, vous n’avez plus besoin de mettre leur position.
Ainsi dès que les deux colorants sont dans la matrix de craft, le résultat de la recette est disponible dans la sortie, dans le slot du résultat.

Exemple de recette avec positionnement dynamique
Exemple de recette avec positionnement dynamique

Les recettes de cuissons :

Vous pouvez également créer des recettes via le four, il vous suffit d’utiliser ce code :

    GameRegistry.addSmelting(input, output, experience);

L’input peut être un bloc, un objet ou un ItemStack.
L’output est obligatoirement un ItemStack de la forme ItemStack(objet, nombre, damage).
Enfin l’expérience est une variable flottante du type 1.0F ou 5.3F.

L’OreDictionary :

  • Enregistrer un item dans L’OreDictionary
    Pour rajouter vous propre item à L’OreDictionary il faut juste faire cela :

        OreDictionary.registerOre("ingotIron", ItemTutorial);
    
  • Réaliser un craft en ignorant la durabilité
    Dans certaines situations nous avons besoin de réaliser un craft en ignorant la durabilité de l’objet utilisé. Pour cela l’OreDictionary dispose d’une constante très utile : WILDCARD_VALUE
    Préciser cette valeur à la place du damage de l’itemStack et tous les damages de celui-ci pourront être utilisés.

      GameRegistry.addRecipe(new ItemStack(blockTutoriel), new Object[]{"XXX", "XXX", 'X', new ItemStack(Blocks.wool,1,OreDictionary.WILDCARD_VALUE});
    
  • Craft avec un nom
    L’OreDictionary enregistre certains objets avec un nom dans le but que certaines recettes soient possibles avec d’autres objets enregistrés avec le même nom; ce qui est très pratique lorsque l’on joue avec beaucoup de mods. En effet si un mod rajoute un bloc de stone qui comme la version vanilla drop l’équivalent de la cobblestone et que cette cobblestone est enregistrée avec le même nom que celui de la cobblestone, nous pouvons par exemple fabriquer les outils en pierre à partir de cette pierre.
    Pour utiliser cette fonctionnalité il va nous falloir ajouter un IRecipe un peu particulier :

      GameRegistry.addRecipe(new ShapedOreRecipe(Items.bucket, new Object[]{"F F", 'F', "ingotIron"}));
    

    Exemple de recette via l'ore directionary
    L’objet ShapedOreRecipe se comporte comme une recette normal à positionnement statique, si vous voulez utiliser la version avec le positionnement dynamique prenez l’objet ShapelessOreRecipe.

Bonus

Retirer une recette

Il peut s’avérer utile de retirer la recette d’un objet ou d’un bloc; voici comment il faut s’y prendre :
nous allons utiliser cette méthode :

    public static void removeRecipe(ItemStack stack)
    {
        List <irecipe>recipes = CraftingManager.getInstance().getRecipeList();
        Iterator <irecipe>iterator = recipes.iterator();
        while(iterator.hasNext())
        {
            ItemStack is = iterator.next().getRecipeOutput();
            if(is != null && is == stack)
                iterator.remove();
        }
    }

Cette méthode va rechercher dans la liste des recettes si l’une d’entre elles donne pour résultat l’ItemStack que l’on a précisé en paramètre, une fois trouvée on supprime simplement la recette de la liste.

Vous pouvez modifier la méthode afin d’avoir en argument un bloc ou un objet, vous obtenez ainsi ces méthodes :

    public static void removeRecipe(Item item)
    {
        List <irecipe>recipes = CraftingManager.getInstance().getRecipeList();
        Iterator <irecipe>iterator = recipes.iterator();
        while(iterator.hasNext())
        {
        ItemStack is = iterator.next().getRecipeOutput();
        if(is != null && is.getItem() == item)
            iterator.remove();
        }
    }

    public static void removeRecipe(Block block)
    {
        List <irecipe>recipes = CraftingManager.getInstance().getRecipeList();
        Iterator <irecipe>iterator = recipes.iterator();
        while(iterator.hasNext())
        {
            ItemStack is = iterator.next().getRecipeOutput();
            if(is != null && is.getItem() == Item.getItemFromBlock(block))
                iterator.remove();
        }
    }

Récupérer un objet lors du craft

Vous avez la possibilité de récupérer un objet différent du résultat de la recette lorsque celle-ci est réalisée :

Il faut pour cela préciser dans la classe de l’objet qu’il doit retourner comme ceci :

    this.setContainerItem(<l'item que="" vous="" voulez="" retourner="">)

Par exemple le seau de lait utilisé dans la recette du gâteau retourne un sceau vide :

    this.setContainerItem(bucket)

Vous pouvez également retourner un ItemStack en fonction de celui qui vient d’être utilisé, ici on endommage l’objet :

    public ItemStack getContainerItem(ItemStack itemStack) {
           return new ItemStack(this, 1, itemStack.getItemDamage() + 1);
       }

En vidéo

https://www.youtube.com/watch?v=oa2ZK3x6E60

Crédits

Rédaction :

Correction :

cc
Ce tutoriel de Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International

retourRetour vers le sommaire des tutoriels