Créer un item simple



  • youtubeCe tutoriel est également disponible en vidéo.

    Sommaire

    Introduction

    Dans ce tutoriel vous allez apprendre à créer un item simple en 1.8, des méthodes utiles seront aussi données.

    Pré-requis

    Code

    La classe des items :

    Nous allons commencer par créer une classe qui regroupera tous nos items. Commencez par créer un nouveau package dans lequel nous allons mettre toutes les classes en rapport avec les items. Comme le package de mon mod est «fr.minecraftforgefrance.tutorial» je vais nommer le package «fr.minecraftforgefrance.tutorial.items»
    Dans ce package créez une classe nommée «VotreModidItems». Dans mon cas ce sera «TutorialItems»
    Dans cette classe nous allons ajouter deux fonctions, une fonction nommée registerItems dans laquelle nous allons nommer les items et une nommée registerItemsModels qui sera seulement présente côté client pour l'enregistrement des modèles :

    package fr.minecraftforgefrance.tutorial.items;
    
    import net.minecraftforge.fml.relauncher.Side;
    import net.minecraftforge.fml.relauncher.SideOnly;
    
    public class TutorialItems
    {
        // ici on va déclarer les items
    
        public static void registerItems()
        {
            // ici on va les enregistrer
    
        }
    
        @SideOnly(Side.CLIENT)
        public static void registerItemsModels()
        {
            // et ici on va enregistrer les modèles (fichiers json)
    
        }
    }
    

    Ce que nous venons de faire là servira pour tous les items du mod, ce code ne doit exister qu'une seul fois par mod.

    Par contre, la suite sera à refaire pour chaque item que vous souhaitez ajouter. En dessous du commentaire «ici on va déclarer les items» ajoutez la ligne suivante :

        public static final Item NOM = new ItemTutorial().setUnlocalizedName("nom non localisé").setCreativeTab(CreativeTabs.tabMisc);
    

    Ceci est la déclaration de l'item. Comme c'est une constante, par convention le nom de la variable est en majuscule (utilisez des tirets du bas pour séparer plusieurs mots). Dans la fonction setUnlocalizedName il doit y avoir le nom non-localisé, de préférence mettez-le en minuscule. Il sera utilisé pour les fichiers de langues. setCreativeTab permet de définir l'onglet créatif, il n'est pas obligé d'en avoir un.
    ItemTutorial est le nom de la classe de l'item, on va la créer par la suite.
    Ensuite dans la fonction registerItems (donc en dessous du commentaire «ici on va les enregistrer») on va enregistrer l'item :

            GameRegistry.registerItem(NOM, "nom_dans_le_registre");
    

    NOM est le nom de la variable (le même que dans la déclaration de l'item) et nom_dans_le_registre est, comme indiqué, le nom du registre. Ne mettez surtout pas d'espace dans le nom du registre, évitez également les majuscules pour être cohérent avec les noms de registres de mojang. Utilisez des tirets du bas pour les espaces.
    Et pour finir, dans la fonction registerItemsModels on va enregistrer le modèle avec la ligne suivante :

            ModelLoader.setCustomModelResourceLocation(NOM, 0, new ModelResourceLocation(ClassePrincipale.MODID + ":nom_dans_le_registre", "inventory"));
    

    Faites attention de bien utiliser le même nom que dans la fonction GameRegistry.registerItem. Pensez également à utiliser ctrl + shift + o pour importer ce qui manque.

    Voila à quoi ressemble la classe de mon côté :

    package fr.minecraftforgefrance.tutorial.items;
    
    import fr.minecraftforgefrance.tutorial.ModTutorial;
    import net.minecraft.client.resources.model.ModelResourceLocation;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.item.Item;
    import net.minecraftforge.client.model.ModelLoader;
    import net.minecraftforge.fml.common.registry.GameRegistry;
    import net.minecraftforge.fml.relauncher.Side;
    import net.minecraftforge.fml.relauncher.SideOnly;
    
    public class TutorialItems
    {
        public static final Item TUTORIAL = new ItemTutorial().setUnlocalizedName("tutorial").setCreativeTab(CreativeTabs.tabMisc);
    
        public static void registerItems()
        {
            GameRegistry.registerItem(TUTORIAL, "tutorial_item");
        }
    
        @SideOnly(Side.CLIENT)
        public static void registerItemsModels()
        {
            ModelLoader.setCustomModelResourceLocation(TUTORIAL, 0, new ModelResourceLocation(ModTutorial.MODID + ":tutorial_item", "inventory"));
        }
    }
    

    La classe de l'item :

    Créez la classe de votre item. Elle doit hériter de la classe Item.java :

    public class ItemTutorial extends Item
    {
    
    }
    

    Le but étant de créer un item simple, nous n'avons rien d'autre à ajouter. Pour ajouter des fonctionnalités à votre item vous pouvez override les différentes fonctions qui se trouvent dans la classe Item.java.
    Vous pouvez aussi ajouter un constructeur et modifier la valeur de certaines variables d'Item.java.
    Par exemple :

    package fr.minecraftforgefrance.tutorial.items;
    
    import net.minecraft.item.Item;
    
    public class ItemTutorial extends Item
    {
        public ItemTutorial()
        {
            this.maxStackSize = 1;
        }
    }
    

    Comme ceci, l'item ne se stackera que par 1.
    Un autre exemple :

    package fr.minecraftforgefrance.tutorial.items;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.ChatComponentText;
    import net.minecraft.util.ChatComponentTranslation;
    import net.minecraft.world.World;
    
    public class ItemTutorial extends Item
    {
        @Override
        public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player)
        {
            if(!world.isRemote)
            {
                player.addChatMessage(new ChatComponentText("bonjour " + player.getName()));
            }
            return stack;
        }
    }
    

    Comme ceci, l'item affichera "bonjour le nom du joueur" dans le chat si on fait un clic droit en ayant ce dernier en main.
    Je vous laisse explorer la classe Item.java, il y a plein de fonctions dedans !

    La classe commune et client :

    Dans la classe commune (aussi appelée common proxy), dans la fonction preInit appelez la fonction registerItems de la classe contenant vos items comme ceci :

    package fr.minecraftforgefrance.tutorial;
    
    import java.io.File;
    
    import fr.minecraftforgefrance.tutorial.items.TutorialItems;
    
    public class TutorialCommon
    {
        public void preInit(File configFile)
        {
            *TutorialItems.registerItems();*
        }
    
        public void init()
        {
    
        }
    }
    

    Il est essentiel d'ajouter cette ligne sinon vos items ne seront jamais enregistrés et donc jamais fonctionnels.
    De même, dans la classe client (ou client proxy) appelez la fonction registerItemsModels :

    package fr.minecraftforgefrance.tutorial.client;
    
    import java.io.File;
    
    import fr.minecraftforgefrance.tutorial.TutorialCommon;
    import fr.minecraftforgefrance.tutorial.items.TutorialItems;
    
    public class TutorialClient extends TutorialCommon
    {
        @Override
        public void preInit(File configFile)
        {
            super.preInit(configFile);
            TutorialItems.registerItemsModels();
        }
    
        @Override
        public void init()
        {
            super.init();
        }
    }
    

    Et voilà ! Si vous lancez votre jeu, l'item devrait être fonctionnel mais s’appellera item.nom non localisé.name et n'aura pas de texture. Il faut donc maintenant s'occuper des ressources.

    Le modèle et la texture :

    Dans un premier temps, voici le fichier JSON de cet item (tutoriel), c'est le fichier JSON de base pour les items basiques de Minecraft.

    {
        "parent": "builtin/generated",
        "textures": {
            "layer0": "tutorial:items/tutorial_item"
        },
        "display": {
            "thirdperson": {
                "rotation": [ 0, 90, -35 ],
                "translation": [ 0, 1.25, -3.5 ],
                "scale": [ 0.85, 0.85, 0.85 ]
            },
            "firstperson": {
                "rotation": [ 0, -135, 25 ],
                "translation": [ 0, 4, 2 ],
                "scale": [ 1.7, 1.7, 1.7 ]
            }
        }
    }
    

    Je vais vous expliquer les principales méthodes à changer,

    La ligne "layer0" sert à définir la texture de notre Item
    (équivalent, à l'époque de la 1.7.x, au this.setTextureName() )

    Changez "tutorial" et **"tutorial_item" **par le modid de votre mod et le nom de votre texture.

    La texture doit toujours se trouver dans vos assets ! (assets/modid/textures/items/nomdelatexture.png)

    Les autres lignes en dessous servent à définir la taille, la position et la rotation de votre item,

    "thirdperson"
    
    = rendu à la troisième personne
    
    "firstperson"
    
    = rendu à la première personne (rendu en main et inventaire)
    

    Si vous souhaitez modifier le fichier JSON tout en évitant les erreurs je vous conseille ce site qui corrigera vos erreurs si il y en a : http://jsoneditoronline.com

    Il y a aussi les détails complets pour modifier votre fichier JSON sur le wiki officiel de Minecraft
    Comme par exemple les particules, les layers...

    Vous avez maintenant tous les outils en main pour personnaliser le fichier JSON de votre item !

    Une dernière chose, modifier le fichier de langue de votre mod. Ajoutez la ligne suivante dedans :

    item.nom non localisé.name=Nom localisé
    

    Un exemple concret :

    • pour le fichier en_US.lang :
    item.tutorial.name=Tutorial Item
    
    • pour le fichier fr_FR.lang :
    item.tutorial.name=Item Tutoriel
    

    Et voila, le nom devrait apparaître en jeu !

    Résultat

    Voir le commit sur github
    Le commit sur github montre clairement où ont été placé les fichiers, ainsi que ce qui a été ajouté et retiré dans le fichier.

    En vidéo

    Youtube Video

    Crédits

    Rédaction :

    Correction :

    • Fine33
    • DiabolicaTrix
    • Toutoune1008

    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



  • Bonsoir, j'ai un problème quand j'arrive à l'étape de la fonction pour enregistré les rendus, cette fonction :

    ClassePrincipal.itemTest
    

    et celle la :

    ModelResourceLocation
    

    son souligné en rouge et voila pour les deux ce qu'il mes afficher quand je passe le curseur dessus :



  • Il va falloir apprendre à comprendre le code au lieu de le copier bêtement : ClassePrincipale c'est ta classe principale, tout simplement. Pour ModelResourceLocation : il faut l'importer, fait Alt + shift + O.



  • Je ne fait pas du copier coller loin de la ! j'essaye de comprendre et c'est normal qu'il est des parties du tuto que certaines personnes on du mal a comprendre ! Maintenant sa ne sert a rien d'être sur un forum pour remballé les gens pour des questions qui nous paraisses évidente !

    Merci quand même.



  • Je suis tout à fait d'accord pour aider les autres mais avant de demander de l'aide, il est demandé de connaître le java et de savoir un minimum ce que l'on fait. Ici il était évident que "ClassePrincipal" n'existait pas et que tu dois changer "modid" par ton modid.



  • Le fichier .json on le nomme comment et on le place ou?



  • Te le mets dans assets\ton modid\models\item\ et pour le nom, c'est le nom que t'a mis pour enregistrer le modèle.



  • Je n'arrive pas à visionner le résultat final. Pourrait-on me mettre les miniatures nécessaires svp afin que je puisse recopier :). Parce que j'ai du mal à comprendre le tuto en fait.
    Et si possible dire à quoi correspond exactement ItemTutoriel-Minecraft-Item-itemTutoriel car clairement après je suis assez perdu 😕

    Sinon vivement la vidéo :).


  • Administrateurs

    Les images étaient sur puush, elles ne sont plus disponible 😕
    @'conquerorguepard':

    Et si possible dire à quoi correspond exactement ItemTutoriel-Minecraft-Item-itemTutoriel car clairement après je suis assez perdu 😕

    Je n'ai pas comprit de quoi tu parles :s



  • Sinon du coup j'ai essayé de commencer ma classe principal et ma classe principale tout seul, à l'aide de ce tuto et de celui de l'item 1.7.
    Voici ce que cela donne (fichiers joints):

    Cela, comme vous le voyez, m'indique des erreurs:

    Principal:
    Type mismatch: cannot convert from MeatEpanterias to Item

    GameRegistry cannot be resolved

    Item:
    Multiple markers at this line
        - The type MeatEpanterias is already
         defined
        - The type MeatEpanterias is already
         defined

    Syntax error on token "}", delete this token

    Syntax error, insert "}" to complete ClassBody

    Proxy:
    itemTest cannot be resolved or is not a field
    (dans la dernière ligne)

    Je pense avoir tout mis :). Quelqu'un peut m'aider à les résoudre svp? (désolé de vous ennuyer avec mes appels à l'aide, je débute et j'ai du mal, mais je suis motivé et j'ai bien l'intention de finir en bon moddeur :))



  • Dans ton Item, tu as défini 2 fois la classe (tu as 2 public class MeatEpanterias) et pour le GameRegistry, il faut que tu l'importe (ctrl + shift + o) va importer tout ce qui est nécessaire.
    Pour le pb du proxy, il faut que tu remplaces itemTest par ton item



  • Proxy (fichier join):
    Multiple markers at this line
        - itemTest cannot be resolved or is not a
         field
        - meatEpanterias cannot be resolved or is
         not a field

    Item:
    Résolu

    Principal:
    Résolu



  • "MeatEpanterias.meatEpanterias", tu ne définis pas "meatEpanterias" dans la classe de ton item, mais dans ta classe principale, donc il faut que tu remplaces "MeatEpanterias" par ta classe principale.



  • C'est quoi exactement le nom de ma classe principal du coup? Je pensais que c'était "MeatEpanterias".
    J'ai essayé avec "public class", le nom de mon mod.
    ça me met:
    Multiple markers at this line
        - itemTest cannot be resolved or is
         not a field
        - Modzoic cannot be resolved to a
         variable



  • Le nom de ta classe c'est Modzoic donc il faut que tu mettes Modzoic.meatEpanterias (en pensant à bien importer).
    Et je précise les seuls endroits où tu auras besoin de ça : "public class" ça sera au début de tes classes et uniquement là.



  • Merci beaucoup à toi :D. Tout est bon, j'avais juste pas importé et sauvegardé.

    "Appliquer le fichier JSON :

    Dans un premier temps voici le fichier JSON de cet item (tutoriel), c'est le fichier JSON de base pour les items basiques de Minecraft".

    Je le trouve où?

    Et j'ai essayé de démarrer le  jeu pour voir ça me met ça:



  • J'ai l'impression que ton message est pas complet. (la pj s'était mal chargée)
    Pour trouver le fichier json, son contenu est juste en dessous de la phrase que tu as copié collé, je vois pas ce qui bloque…
    Et pour le message, d'erreur ton projet dois etre mal configuré... Refais le gradlew eclipse et si ça marche toujours pas, je pense que quelqu'un d'autre t'aidera mieux que moi  😄



  • {
       "parent": "builtin/generated",
       "textures": {
           "layer0": "modid:items/itemTutoriel"
       },
       "display": {
           "thirdperson": {
               "rotation": [ -90, 0, 0 ],
               "translation": [ 0, 1, -3 ],
               "scale": [ 0.55, 0.55, 0.55 ]
           },
           "firstperson": {
               "rotation": [ 0, -135, 25 ],
               "translation": [ 0, 4, 2 ],
               "scale": [ 1.7, 1.7, 1.7 ]
           }
       }
    }
    

    –---

    ^
     |
    ça je le trouve où dans eclipse?

    Et "Refais le gradlew eclipse", c'est à dire? Je dois faire quoi exactement :/?



  • Ah oui effectivement, il y a pas marqué dans le tuto où il faut mettre le json, il faut que t'ailles dans src/main/ressources/assets/tonmodid/models/item (créée les dossiers qu'il faut) et que tu y enregistres un fichier "LeNomDeLitem.json" où tu mets le contenu qu'il y a dans le tuto.

    Pour le gradlew eclipse, si t'a suivi le tuto "Installer et configurer l'espace de travail Forge", tu devrais savoir ce que c'est.



  • C'est tout bon. Pour gradlew eclipse je vais voir. Je m'en rappelle plus bien.

    J'ai tenté de redémarrer le jeu, ça à lancer le luncher et avant que ça marche (5/7), ça a crash et a marqué Using GL 1.3 texture combiners.
    Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
    Shaders are available because OpenGL 2.1 is supported.
    VBOs are available because OpenGL 1.5 is supported.

    Using VBOs: No
        Is Modded: Definitely; Client brand changed to 'fml,forge'
        Type: Client (map_client.txt)
        Resource Packs:
        Current Language: Français (France)
        Profiler Position: N/A (disabled)
        CPU: 2x Intel(R) Pentium(R) CPU 2020M @ 2.40GHz
    [16:06:15] [Client thread/INFO] [STDOUT]: [net.minecraft.init.Bootstrap:printToSYSOUT:612]: #@!@# Game crashed! Crash report saved to: #@!@# C:\Users\Conqueror\Documents\Modding\forge-1.8.8\run.\crash-reports\crash-2016-03-28_16.06.15-client.txt
    AL lib: (EE) alc_cleanup: 1 device not closed
    Java HotSpot(TM) 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release