Créer un item simple



  • Merci beaucoup tout marche maintenant 🙂



  • Bonjour,
    Ma première question est plus de l'ordre de la vérification. L'ajout de l'annotation @SubscribeEvent depuis la version 1.12.2, concernant la fonction registerItemModels, si je comprends bien, c'est parce qu'à partir de la 1.12.2, quelque chose (fml, je suppose), attend un événement bien particulier, celui qui signale qu'il est prêt à register, pour faire le register de tous les items du mod, c'est ça ? Et est-ce que du coup cela explique qu'on ait plus besoin à partir de la 1.12.2 d'appeler registerItemsModels dans la pré-initialisation du fichier client ?

    Ma deuxième question est concernant cette syntaxe :

    item.setRegistryName(ClassePrincipale.MODID, name).setUnlocalizedName(ClassePrincipale.MODID + "." + name);
    

    À la base, je code plutôt en C++, même si j'ai les bases de java. Pour moi, cette syntaxe signifie qu'on set le registryName de l'item et que ce "set" renvoit un objet qui possède une méthode permettant d'initialiser son unlocalized name. Est-ce que c'est bien ça, ou bien est-ce que ça fonctionne autrement sous java ? (D'ailleurs, tandis que je dis ça, je suis en train de regarder les fichiers java correspondant, et ça ne peut pas être ça puisque setRegistryName renvoit un String et que setUnlocalizedName est une méthode de l'objet item, donc rien à voir avec un String... )

    [Tu feras attention, il manque une parenthèse fermée, sur ce bout de code :

    ModelLoader.setCustomModelResourceLocation(item, metadata, new ModelResourceLocation(resourceName, "inventory");
    

    ]

    Ma troisième question est peut-être un poil flemmarde dans la mesure où je suppose que je pourrais chercher par moi-même (je comprendrais qu'on me réponde : "Bah va chercher !" ^^') : c'est quoi un fichier .json ?

    Et puis enfin, ma quatrième question : j'arrive ni à afficher une texture, ni à afficher un nom correct. Le jeu se lance sans problème, mais sans texture pour mon item et avec un nom standardisé de type "item.modid.nom_de_mon_item.name". Pour le nom d'item, j'ai crée mes fichiers fr_fr.lang et en_us.lang et dans les deux, j'ai essayé le format "item.modid.nom_de_mon_item.name=Nom de l'item" ainsi que "item.nom_de_mon_item.name=Nom de l'item" et même "item.modid.name=Nom de l'item". Et puis pour la texture, je ne sais pas quoi dire, j'ai suivi le tutoriel à la lettre...

    Merci par avance pour les réponse et la patience de celui qui me répondra ! 😃


  • Administrateurs

    1. En effet, l'annotation SubscribeEvent indique que ta méthode va écoute un event, forge va donc l'appeler quand cette event sera déclenché. Par contre pour qu'il sache que ta classe contient des event il faut l'indiquer, avec @EventBusSubscriber ou la fonction MinecraftForge.EVENT_BUS.register.

    2. Tu peux faire un ctrl + clic sur la fonction pour que ton IDE ouvre la classe Block et voir sa définition. En fait la méthode setRegistryName renvoie this (le bloc lui même donc) ce qui te permet de chaîner une autre fonction de la classe directement après, sans le faire sur une nouvelle ligne.

    3. Le json est un format conçu pour représenter un objet, à la base fait pour le JS, mais désormais largement utilisé dans tout le monde informatique pour représenter des données.

    4. Toutes les ressources se trouve bien dans le dossier src/main/resources ? puis ensuite dans le bon package ? (assets.tonmodid.lang ) ?



  • Ouah ! Merci ! Je m'attendais pas à une réponse aussi tard !

    Pour la seconde question, autant pour moi, je viens de vérifier et effectivement, la fonction renvoie "this" et c'est donc beaucoup plus logique ainsi.

    Et pour la dernière, après vérification avec ce que tu m'as transmis comme nom de package, je me suis rendu compte que j'avais créé un dossier "asset" au lieu de "assets". Ce qui règle mon problème de .lang, mais pas mon problème de texture.

    Encore merci pour ton aide, vraiment !

    P.S. : Après vérification, je ne comprends pas bien pourquoi mais ma fonction registerItemModels n'est jamais appelée. Si j'ai bien compris, elle devrait être appelée automatiquement à l'appel de l'événement auquel elle est liée, non ?

    P.S. 2 : Après avoir étudié en long en large et en travers la documentation de forge, j'ai finis par mettre dans ma fonction de pré-initialisation un :

    MinecraftForge.EVENT_BUS.register(<modid>Items.class);
    

    Et il semblerait que ça marche. Est-ce que c'est un oubli dans le tutoriel que j'ai réussis à retrouver seul ou bien est-ce que j'ai fais une manipulation imprévue qui fonctionne ? Voire même est-ce que je devrais pas faire ça ?


  • Administrateurs

    Salut,
    Ce n'est pas un oublie du tutoriel, qui lui utilise la ligne suivante :

    @EventBusSubscriber(value = Side.CLIENT, modid = ModTutorial.MODID) // En 1.12+
    

    en haut de la déclaration de la classe qui réalise la même chose (ou presque, si ta ligne de se trouve dans ton client proxy c'est bien la même chose, sinon tu l'as mis dans la classe principale ou en commun, cela risque de causer des problèmes pour si ton mod est installé sur un serveur)



  • Super ! Je comprends maintenant, j'avais effectivement loupé cette information. Merci beaucoup !