• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    [1.15.x] Créer un item basique

    Les items
    item 1.15.2 forge
    5
    9
    853
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • ZomZD
      ZomZD dernière édition par robin4002

      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

      • Créer le Deferred Register
      • Créer l’item sans classe custom
      • Créer l’item avec classe custom
      • Ajout du model de l’item
      • Ajout de la texture de l’item
      • Localisation de l’item dans les fichiers lang (.json)
      • Résultats

      Prérequis

      • Créer la base d’un mod
      • Apprendre les bases du Java

      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

      retourSommaire des tutoriels

      1 réponse Dernière réponse Répondre Citer 4
      • Ck_Luky
        Ck_Luky dernière édition par

        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

        Je travail actuellement sur le Feurimod, un mod à l'origine pour un serveur entre potes en 1.12.2, mais le projet de serveur aillant été abandonné, je le termine pour mon propre plaisir.
        Je suis un membre apprécié et joueur, j'ai déjà obtenu 3 points de réputation.

        ZomZD 1 réponse Dernière réponse Répondre Citer 0
        • robin4002
          robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

          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.

          ZomZD 1 réponse Dernière réponse Répondre Citer 0
          • ZomZD
            ZomZD @robin4002 dernière édition par

            @robin4002 Super ! Merci beaucoup ^^

            1 réponse Dernière réponse Répondre Citer 0
            • ZomZD
              ZomZD @Ck_Luky dernière édition par

              @Ck_Luky Merci ça fait plaisir 🙂

              1 réponse Dernière réponse Répondre Citer 0
              • DiabolicaTrix
                DiabolicaTrix Correcteurs Moddeurs confirmés dernière édition par

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

                ZomZD 1 réponse Dernière réponse Répondre Citer 0
                • Mysterious_Dev
                  Mysterious_Dev dernière édition par

                  Ouais très bon tutoriel Zim… heu pardon Zom :grinning_face_with_sweat:

                  Adore taper sur les moddeurs 1.7.10.

                  ZomZD 1 réponse Dernière réponse Répondre Citer 0
                  • ZomZD
                    ZomZD @DiabolicaTrix dernière édition par

                    @DiabolicaTrix Merci ^^

                    1 réponse Dernière réponse Répondre Citer 0
                    • ZomZD
                      ZomZD @Mysterious_Dev dernière édition par

                      @Mysterious-Dev Mais qui est Zim ? :hushed_face:

                      1 réponse Dernière réponse Répondre Citer 0
                      • 1 / 1
                      • Premier message
                        Dernier message
                      Design by Woryk
                      Contact / Mentions Légales

                      MINECRAFT FORGE FRANCE © 2018

                      Powered by NodeBB