Créer des crafts customs avec l'interface IRecipe



  • Sommaire

    Introduction

    Vous voulez rajouter un craft plus complexe que ceux proposés par Minecraft ? Voici comment créer son IRecipe custom.

    Pré-requis

    Code

    Classe principale / Classe d'enregistrement de vos crafts :

    Personnellement je mets les crafts dans la classe des Items. Vous pouvez les mettre à n'importe quel endroit tant qu'ils sont appelés après l'enregistrement de vos items.

    package fr.scarex.tutorialmod.item;
    
    import cpw.mods.fml.common.registry.GameRegistry;
    import fr.scarex.tutorialmod.recipe.BackpackRecipe;
    import net.minecraft.item.Item;
    
    /**
        * @author SCAREX
        * 
        */
    public class TutorialModItems
    {
        public static Item ITEM_BACKPACK;
    
        public static final void registerItems() {
            ITEM_BACKPACK = new ItemBackPack();
        }
    
        public static final void registerItemsCrafts() {
            GameRegistry.addRecipe(new BackpackRecipe());
        }
    }
    

    Classe du Recipe

    Cette classe doit simplement implémenter l'interface IRecipe.

    package fr.scarex.tutorialmod.recipe;
    
    import fr.scarex.tutorialmod.item.TutorialModItems;
    import net.minecraft.block.BlockColored;
    import net.minecraft.init.Items;
    import net.minecraft.inventory.InventoryCrafting;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.item.crafting.IRecipe;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.world.World;
    
    /**
        * @author SCAREX
        *
        */
    public class BackpackRecipe implements IRecipe
    {
        /**
            * The craft matrix
            */
        public static final Item[][] matrix = new Item[][] {
                new Item[] { Items.paper,
                        Items.paper,
                        Items.paper },
                new Item[] { Items.paper,
                        Items.dye,
                        Items.paper },
                new Item[] { Items.paper,
                        Items.paper,
                        Items.paper } };
    
        /**
            * This method is used to check if the matrix corresponds to your craft
            * 
            * @param inv
            *            The crafting table's inventory
            * @param world
            *            The world
            * @return true if the matrix corresponds
            */
        @Override
        public boolean matches(InventoryCrafting inv, World world) {
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    if (!BackpackRecipe.corresponds(BackpackRecipe.matrix[ i ][j], inv.getStackInSlot(i * 3 + j))) return false;
                }
            }
            return true;
        }
    
        /**
            * This method is used to get the result from the craft relatively to the
            * given inventory
            * 
            * @param inv
            *            The crafting table's inventory
            * @return The result from the craft
            */
        @Override
        public ItemStack getCraftingResult(InventoryCrafting inv) {
            ItemStack stack = new ItemStack(TutorialModItems.ITEM_BACKPACK);
            if (!stack.hasTagCompound()) stack.setTagCompound(new NBTTagCompound());
            stack.getTagCompound().setInteger("Color", BlockColored.func_150032_b(inv.getStackInSlot(4).getItemDamage()));
            return stack;
        }
    
        /**
            * This method should return the size used for the craft
            * 
            * @return The requested size
            */
        @Override
        public int getRecipeSize() {
            return 9;
        }
    
        /**
            * @return An ItemStack to identify the craft
            */
        @Override
        public ItemStack getRecipeOutput() {
            return new ItemStack(TutorialModItems.ITEM_BACKPACK);
        }
    
        /**
            * @param item
            *            The item from your matrix
            * @param stack
            *            The ItemStack from the crafting inventory
            * @return true if the 2 objects correspond
            */
        public static boolean corresponds(Item item, ItemStack stack) {
            // Si les 2 sont "null", on retourne true car il ne doit rien y avoir dans ce slot et il n'y a rien.
            if (stack == null && item == null) return true;
            // Si l'un est null mais pas l'autre, on retourne false (ici j'ai séparé la condition en 2 parties pour plus de clarté)
            if (stack == null && item != null) return false;
            if (stack != null && item == null) return false;
            // Et pour finir si les 2 ne sont pas égaux, on retourne false
            if (stack.getItem() != item) return false;
            // Sinon, on retourne true
            return true;
        }
    }
    
    

    Cette classe doit simplement implémenter l'interface IRecipe.
    Vous allez devoir ré-écrire ces méthodes :

    • matches : cette méthode doit retourner "true" si le craft correspond. ATTENTION : cette méthode est très importante car c'est elle qui va constituer la recette de votre craft.
    • getCraftingResult : cette méthode doit retourner un ItemStack contenant le résultat du craft en fonction de ce qui se trouve dans l'inventaire de la table de craft.
    • getRecipeSize : cette méthode retourne la taille dont vous avez besoin pour votre craft. Si vous n'avez besoin que 2 slots, retournez 2. Cette méthode importe assez peu.
    • getRecipeOutput : retourne un ItemStack pour identifier le craft. Cette méthode a assez peu d'importance mais il faut absolument la compléter.

    La fontion"corresponds" retourne true si l'ItemStack et l'Item correspond, vous devrez changer cette fonction selon vos besoins.

    ATTENTION : Si vous utilisez une variable pour les méthodes getRecipeOutput et getCraftingResult, il faut penser à faire votreItemStack.copy(), sinon vous risquez de modifier le craft de base.

    Résultat

    0_1531658697841_javaw 05-08-2015 00-46-34-937.png

    Liste des commits GitHub :
    Commit initial
    Les commits sur github montrent clairement où ont été placés les fichiers, ainsi que ce qui a été ajouté et retiré dans le fichier.

    Crédits

    Rédaction :

    • SCAREX


    Ce tutoriel de SCAREX publié sur 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

    Retour vers le sommaire des tutoriels



  • Tuto très utile ! Je suppose que ca marche avec une table de craft personnalisé ? C'est Eryah qui va etre content !!



  • Tant que la table de craft en question passe par la classe CraftingManager, oui. Par contre çà marche pas avec NEI, çà fera l'objet d'un bonus.



  • @'Legrandfifou':

    Tuto très utile ! Je suppose que ca marche avec une table de craft personnalisé ? C'est Eryah qui va etre content !!

    Je n'utiliserais pas le tuto ( Désolé Scarex :)) Car pour moi, inutile.
    Je me ferais pas chier a faire une classe en plus ( Déjà que c'est le bordel !), alors que je peut faire juste un addCrafting
    Je vois pas l'utilité du truc en plus.
    Je peut comprendre que c'est pour eviter de faire 16 lignes, mais bon.
    Après, je viens de me reveiller, et ma compréhension n'est pas a 100%



  • Cette classe ne sera pas utile pour la plupart des gens. Mais elle permet de transférer certaines données lors du craft. Dans ce tuto, je transfer la couleur du colorant dans les NBT du sac. Ce qui n'est pas possible sans cette classe



  • Bonjour,

    J'ai du mal à comprendre le tutoriel.Comment pourrais-je faire pour que la sortie de la recette soit comme celle du block de fer. Lorsque je met mon bloque cela me donne 9 minerais ?



  • Salut, tu n'es pas au bon endroit, pour les recettes "simples", c'est ici https://www.minecraftforgefrance.fr/showthread.php?tid=3917 (ou un endroit différent si tu es en 1.12)


Log in to reply