1.15.2 forge item [1.15.x] Créer un item basique



  • Bonjour à tous ! Forge ayant sorti récemment sa deuxième version stable pour la 1.15.2, j’ai décidé d’en profiter pour rédiger ce tuto qui vous permettra de créer votre item, avec les ajouts de la 1.15 par rapport à la 1.14 ou la 1.12.
    Pour commencer, vous aurez juste besoin de la base de votre mod prête, et c’est parti !

    Sommaire

    Prérequis

    Créer le Deferred Register

    Si vous aviez l'habitude en 1.14 ou même en 1.12 d'utiliser les events pour enregistrer vos items, et bien sachez qu'il y a un nouveau moyen plus simple qui vous permet d'économiser un bon paquet de lignes de code.
    Auparavant, vous aviez une classe pour vos items qui tenait au minimum dans une dizaine de lignes. Avec ce qu'on appelle les DeferredRegister, c'est désormais une seule ligne ! Alors, pour ce qui est de l'explication de ce qu'est un DeferredRegister, honnêtement, je ne saurais pas l'expliquer, mais si vous avez la réponse je mettrai à jour le sujet tout en vous citant bien sûr 🙂
    Sachez juste que c'est un moyen de communiquer directement avec les registres de Forge sans passer par les events.
    Bref, passons au code.

    Pour commencer, vous allez avoir besoin de créer une nouvelle classe qui, dans mon cas, s'appellera ModItems, mais le nom importe peu.

    public class ModItems {
    
    }
    

    Cette classe n'aura pas de classe mère spécifique, on se servira de la classe telle qu'elle est.
    Et maintenant, on attaque la seule ligne de code (en tout cas pour cette partie).

    public class ModItems
    {
      public static final DeferredRegister<Item> ITEMS = new DeferredRegister<>(ForgeRegistries.ITEMS, "modid")
    }
    


    Pour expliquer ce qu'on a fait ici, on a simplement créé une variable de type DeferredRegister à laquelle est attachée la classe Item (vérifiez que vous avez importé la classe de Forge). On l'a instanciée directement dans la déclaration de la variable (qui est en static car on aura besoin d'y accéder dans les autres classes et final car la variable ne devra surtout pas être redéfinie par la suite). En paramètre, le ForgeRegistries.ITEMS indique le registre dans lequel seront enregistrés nos objets, dans le cas présent, c'est dans le registre des items.

    Vous pourrez remarquer qu'il y a un bon nombre de registres prévus par Forge, et je vous laisse bidouiller si l'envie vous prend, mais on va se concentrer ici uniquement sur les items.

    Enfin, le "modid", vous le remplacerez avec votre modid, que je vous conseille de stocker dans une variable static et final dans une de vos classes

    Et voilà, plutôt rapide non ? En réalité, on a pas totalement fini.
    Dans votre classe principale, vous devriez avoir votre constructeur.

    @Mod("modid")
    public class ClassePrincipale
    {
    
     public ClassePrincipale()
     {
       // Vous devriez avoir vos lignes ici
     }
    
    }
    

    Dans ce même constructeur, on va enregistrer notre DeferredRegister et le faire détecter par Forge.

    @Mod("modid")
    public class ClassePrincipale
    {
    
     public ClassePrincipale()
     {
       // Vous devriez avoir vos lignes ici
    
       IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();
    
       ModItems.ITEMS.register(bus)
     }
    
    }
    

    Ici, on a besoin de l'event bus de Forge pour enregistrer notre DeferredRegister. Je ne vais pas vous expliquer en détail ce qu'il se passe, mais en gros, retenez juste que les DeferredRegister ont besoin de l'event bus de forge pour fonctionner.

    Normalement, si vous avez bien suivi, votre DeferredRegister devrait fonctionner. Comment le vérifier ? En créant un item !

    Créer l’item sans classe custom

    Il y a "2 manières" de créer un item. Je mets ça entre guillemets parce qu'il y a une infinité de possibilités de création, mais on va dire qu'il y a deux manières basiques de faire. Soit on crée une classe personnalisée ou on ne crée pas de classe.

    Ici, on va se concentrer sur le cas où on utilisera pas de classes persos.
    Pour ma part, je me rends dans ma classe ModItems qui est la classe où j'ai déclaré mon DeferredRegister

    public class ModItems
    {
      public static final DeferredRegister<Item> ITEMS = new DeferredRegister<>(ForgeRegistries.ITEMS, "modid")
    
      public static final RegistryObject<Item> MON_ITEM = ITEMS.register("mon_item", () -> new Item(new Item.Properties()))  
    
    }
    

    Bon et bien c'est pas banal comme code, hein ? Si vous comparez à la 1.12, ça n'a absolument plus rien à voir. Au lieu de créer une variable de type Item, on en crée une de type RegistryObject<Item>. C'est un type assez spécial qui est apparu avec les Deferred Registries, ce n'est pas exactement un item, mais plutôt une variable qui contient un item, auquel vous pourrez accéder avec, par exemple, MON_ITEM.get().

    Le premier paramètre définit le nom délocalisé de votre item et aussi son identifiant (ce n'est pas le nom définitif de l'item dans le jeu), c'est à dire le nom de base de l'item que vous pourrez traduire par la suite avec les fichiers lang (qui sont maintenant en .json)

    Le second paramètre est un Supplier, c'est un type un peu bizarre qui requiert l'utilisation des lambdas, et je vous conseille de regarder plus en détail ces derniers si vous ne savez pas ce que c'est. On instancie cependant la classe Item de Minecraft avec en paramètre un Item.Properties que nous verrons plus en détail dans la partie sur la classe personnalisée

    Et voilà, vous avez votre item qui est normalement enregistré dans le jeu. Vous pouvez tester de votre côté en lançant le client, mais vous devriez avoir une texture buguée et c'est normal !

    Je m'attarderai sur les textures et les modèles dans la section dédiée de ce tutoriel. On va donc passer à la création d'items avec classe personnalisée

    Créer l’item avec classe custom

    Bon, le point cool c'est que la méthode avec classe personnalisée est assez ressemblante à la méthode sans classe.

    public class ModItems {
    
      public static final DeferredRegister<Item> ITEMS = new DeferredRegister<>(ForgeRegistries.ITEMS, "modid")
    
      public static final RegistryObject<Item> MON_ITEM = ITEMS.register("mon_item", MonItem::new)  
    
    }
    

    Et là, vous allez me dire "Wouah mais qu'est ce que c'est que ce MonItem::new ?
    Et bien voyez ça comme une contraction du () -> new MonItem().
    Normalement, à ce stade, vous devriez avoir une erreur et c'est normal car on doit encore créer la classe en elle-même. Je vous invite donc à créer un package que vous pourrez appeler "items" ou comme vous le souhaitez, mais faites en sorte que ce soit logique et compréhensible.

    public class MonItem extends Item
    {
      public MonItem()
      {
         super(new Item.Properties().group(ItemGroup.MATERIALS).maxStackSize(16));
      }
    }
    

    Passons aux explications 🤔. Tout d'abord, on hérite de la classe Item de Minecraft afin que ce soit compatible avec notre DeferredRegister.
    Ensuite, le constructeur va peut-être vous interpeller notamment en voyant les paramètres... et bien... inexistants. C'est très important, autrement on va avoir une erreur dans notre classe ModItems.

    En contrepartie, on va devoir spécifier un paramètre dans le super() qui sera un Item.Properties. C'est une classe contenant des propriétés pour les items.
    Ici, j'ai mis seulement deux propriétés, je ferai peut-être un article sur chacune des propriétés.

    .group(votreCreativeTab) : Permet de spécifier l'onglet dans lequel va se trouver l'item en mode créatif

    .maxStackSize(tailleMax) : Permet de spécifier une taille de stack max (les épées se stack seulement par 1)

    Et voilà, votre item est prêt et vous pouvez lancer le jeu. Bien qu'il manque votre texture, l'item devrait être présent dans l'onglet spécifié. Pour régler cette immonde texture rose et noire, on va s'attaquer par la suite au modèle de notre item.

    Ajout du model de l’item

    Avec les dernières mises à jours (>1.12.2), on n'a plus besoin de spécifier dans le code la localisation de notre modèle JSON, et tant mieux 😌. Maintenant, il sera automatiquement redirigé dans le dossier "assets/modid/models/item/" présent dans le dossier resources de votre workspace.

    Ma workspace

    Voici comment devrait s'organiser votre dossier resources pour la suite du cours. Remplacez "tutomff" par votre modid, bien entendu.

    Une fois votre dossier organisé, vous allez dans le dossier models/item et vous créez un fichier "votre_item.json" où "votre_item" équivaudra au nom que vous avez mis à l'enregistrement de l'item dans le DeferredRegister.
    À ce moment-là, vous avez le choix soit d'importer un modèle custom en JSON réalisé à l'aide de BlockBench, par exemple, ou alors vous allez vous baser sur les modèles vanilla, ce qui est le plus fréquent.

    Dans le cas de ce tuto, je vais me baser sur le modèle de base des items vanilla, à savoir le modèle "item/generated".

    {
        "parent": "item/generated",
        "textures": {
            "layer0": "modid:item/mon_item"
        }
    }
    

    Voilà à quoi devrait ressembler votre modèle si vous souhaitez avoir un rendu une fois en jeu du genre de la pomme, par exemple. Si jamais votre item est une épée ou alors comme un stick vous pouvez remplacer "item/generated" par "item/handheld".

    Bien sûr, ne copiez-collez pas bêtement ce que j'ai mis, et remplacez bien "modid" par votre modid et "mon_item" par le nom délocalisé exact de votre item.

    workspace modele json tuto mff items.png

    Ajout de la texture de l’item

    Sans transition, on passe à la texture. Cela va être relativement rapide, vous n'aurez qu'à déplacer votre texture dans le dossier "textures/item" avec le nom délocalisé de votre item

    workspace texture tuto mff items.png

    Localisation de l'item

    Avant de passer au résultat, il reste la localisation de notre item à faire. Localiser c'est quoi ? C'est simplement traduire le nom des éléments de notre mod pour chaque langue qui existe. Enfin, je vous rassure, on ne fera que le français et l'anglais ici, je ne parle pas encore toutes les langues du monde 😄.

    Pour faire ça, il suffit de créer un nouveau dossier "assets/modid/lang/" dans lequel vous allez créer au moins le fichier "en_us.json", et ensuite le fichier "fr_fr.json". Les deux fichiers seront, en réalité, une copie l'un de l'autre mis à part les noms localisés qui seront différents.

    Fichier anglais

    fichier lang anglais

    Fichier français

    fichier lang français

    Fiou ! Et voilà, votre premier item est enfin créé et finalisé ! Reste plus qu'à tester !

    Résultats

    item dans la creative tab mff items.png

    nom et texture item mff items.png

    item drop mff items.png

    Licence et attribution

    Creative Commons

    Ce tutoriel rédigé par ZomZD, corrigé par DiabolicaTrix et 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 Sommaire des tutoriels



  • Super tuto surtout pour ceux qui se lancent dans la création d'un mod en 1.15.2

    Personnelement je dévoloppe en 1.12.2 et j'ai aprris grace a ta série de tuto


  • Moddeurs confirmés Rédacteurs Administrateurs

    Merci pour ta contribution !
    Le tutoriel est complet et bien rédiger, je vais le faire passer en relecture puis le publier avec les autres tutoriels d'items.



  • @robin4002 Super ! Merci beaucoup ^^



  • @Ck_Luky Merci ça fait plaisir 🙂


  • Correcteurs Moddeurs confirmés

    Bravo, très bien rédigé ! J'ai corrigé quelques erreurs, il pourra bientôt être publié !



  • Ouais très bon tutoriel Zim.... heu pardon Zom 😅



  • @DiabolicaTrix Merci ^^



  • @Mysterious-Dev Mais qui est Zim ? 😯