Les recettes - simples


  • Rédacteurs

    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 : le 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 ».

    Ce tutoriel va traiter quasiment toutes les recettes possibles, à l'exception de l'interface IRecipe, qui aura le droit à son propre tutoriel.

    Sachez que ces mécaniques ne changent que très peu, voire pas du tout, entre deux versions. À quelques exceptions près, le tutoriel est également valide en 1.7.10, 1.8, 1.9 ou 1.10.

    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 (statiques), 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 pattern :

        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'objets 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 :
    Recette avec pattern

    Le système de recette de Minecraft va essayer de reconnaître un pattern, vous n'êtes donc pas obligé de mettre trois lignes pour la recette :

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

    Recette avec pattern avec deux lignes
    Autre recette avec pattern avec deux lignes

    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.
    Notez que si le pattern fait au plus 2x2, il sera également réalisable dans les slots de craft du joueur.

    Les recettes de craft sans pattern :

        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.

    Recette sans pattern
    Autre recette sans pattern

    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.

    Par exemple :

        GameRegistry.addSmelting(new ItemStack(Blocks.DIRT), new ItemStack(Blocks.DIRT, 1, 1), 1);
    

    Recette de four

    L'alchimie :

    Vous pouvez rajouter une recette à l'alambic comme ceci :

        BrewingRecipeRegistry.addRecipe(input, ingredient, output);
    

    Les trois paramètres sont des ItemStack, néanmoins, le paramètre input doit avoir un stacksize de 1, sinon le système refusera la recette.

    Par exemple :

        BrewingRecipeRegistry.addRecipe(new ItemStack(Items.WATER_BUCKET), new ItemStack(Items.NETHER_WART), PotionHelper.getPotion(EnumVanilliaPotion.INSTANT_HEALTH_POTION));
    

    Ne faîtes pas attention à la méthode PotionHelper.getPotion, elle n'existe pas dans minecraft, c'est une méthode custom qui renvoie l'ItemStack correspondant à la potion.

    L'OreDictionary :

    • Enregistrer un item dans L'OreDictionary
      Pour rajouter vos propres items à 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"}));
      


      L'objet ShapedOreRecipe se comporte comme une recette normale à 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

    Youtube Video

    Crédits

    Rédaction :

    Correction :

    Creative Commons
    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



  • J'ai un problème avec une recette de craft car je voudrais mettre de l'argile coloré rouge en ingrédient mais cela ne marche pas . J'aurais besoin d'aide svp .


  • Administrateurs

    Salut,
    Il faut utiliser un metadata :
    new ItemStack(Blocks.STAINED_HARDENED_CLAY,1,EnumDyeColor.RED.getMetadata())



  • Et pour un craft avec de l'andesite, granite, diorite je fait comment c'il vous plait .


  • Rédacteurs

    Même méthode : mais avec BlockStone.EnumType


  • Administrateurs

    Le granite (metadata 1) et l'andesite (metadata 5) sont des variantes de la pierre.
    Donc :
    new ItemStack(Blocks.STONE,1,1)  ou encore  new ItemStack(Blocks.STONE,1,BlockStone.EnumType.GRANITE.getMetadata()) pour le granite.
    et :
    new ItemStack(Blocks.STONE,1,5)  ou encore  new ItemStack(Blocks.STONE,1,BlockStone.EnumType.ANDESITE.getMetadata()) pour l'andesite.

    Concernant le diorite je ne sais pas quelle variante de bloc c'est, faudrait regarder en jeu avec quel bloc son id est en commun.



  • La diorite est elle aussi une variante de la pierre normalement.



  • Et aussi il y a un petit problème je ne trouve pas le moyen de faire une recette comme celle des plaque de pression . Vous pouvez m'aider sur ce coup ?


  • Administrateurs

    Pas compliqué à faire :
    GameRegistry.addRecipe(new ItemStack(blockTutoriel), new Object[]{"XX", 'X', Block.dirt});



  • Bon j'ai essayer différente chose mais je n'arrive pas a créer des recettes utilisant comme ingrédient de la pierre taillée moussue et craquelée .

    Pourriez vous m'aider s'il vous plait .


  • Administrateurs

    new ItemStack(Blocks.STONEBRICK, 1, 1) -> mousse
    new ItemStack(Blocks.STONEBRICK, 1, 2) -> craquelé
    new ItemStack(Blocks.STONEBRICK, 1, 3) -> taillé



  • Ok merci c'est cool .