Créer une armure


  • Administrateurs

    youtubeCe tutoriel est également disponible en vidéo.

    Sommaire

    Introduction

    Une armure est composée de 4 items. Ces items ne peuvent pas être mis en metadata car le système de dégâts de l'armure utilise déjà les metadatas. Il existe deux façons pour créer une armure, une passant par la méthode de FML ou l'autre en passant par la méthode de forge. Dans ce tutoriel, nous allons faire une armure avec la méthode de forge car elle permet de mettre les textures dans le dossier assets/modid alors que celle de fml met les textures dans /assets/minecraft. Nous allons aussi voir comment ajouter des effets à cette armure.

    Pré-requis

    Code

    La classe principale :

    À la suite de la déclaration des items déjà existant :

        public static Item itemTutoriel, itemTutoriel2;
    

    Ajoutez quatre items, le casque, le plastron, les jambières et les bottes :

        public static Item itemTutoriel, itemTutoriel2, helmetTuto, chestPlateTuto, leggingsTuto, bootsTuto;
    

    Il faut également déclarer le matériel de l'armure :

        public static ArmorMaterial armorTuto = EnumHelper.addArmorMaterial("armorTuto", 25, new int[] {4, 6, 5, 4}, 20);
    

    Dans l'ordre :

    • armorTuto : le nom du field.
    • EnumHelper.addArmorMaterial : une fonction de forge pour ajouter un matériel d'armure. Pensez d'ailleurs à importer net.minecraftforge.common.util.EnumHelper et net.minecraft.item.ItemArmor.ArmorMaterial.
    • 25 est la durée de l'armure. Si vous souhaitez connaître les valeurs des armures de minecraft, ctrl + clic sur ArmorMaterial.
    • new int[] {4, 6, 5, 4} : l'absorption de l'armure, dans l'ordre, celle du casque, puis celle du plastron, puis celle des jambières et enfin celle des bottes.
    • 20 correspond à la facilité d'enchantement, plus la valeur est élevée, plus il sera facile d'avoir de bons enchantements.

    Ensuite initialisez ces quatre items, dans la fonction init, à la suite des autres items :

            helmetTuto = new ItemTutoArmor(armorTuto, 0).setUnlocalizedName("helmetTuto").setTextureName(MODID + ":helmet_tutoriel");
            chestPlateTuto = new ItemTutoArmor(armorTuto, 1).setUnlocalizedName("chestPlateTuto").setTextureName(MODID + ":chestplate_tutoriel");
            leggingsTuto = new ItemTutoArmor(armorTuto, 2).setUnlocalizedName("leggingsTuto").setTextureName(MODID + ":leggings_tutoriel");
            bootsTuto = new ItemTutoArmor(armorTuto, 3).setUnlocalizedName("bootsTuto").setTextureName(MODID + ":boots_tutoriel");
    

    Vous pouvez constater que c'est presque la même ligne qu'un item basique, la seule différence est qu'il y a un int en plus dans le constructeur. C'est lui qui va définir le type de l'armure (0 pour le casque, 1 pour le plastron, 2 pour les jambières, 3 pour les bottes). Vous devez normalement reconnaître le reste du code, si ce n'est pas le cas je vous invite à revoir les pré-requis. Vous devez également enregistrer ces items (voir pré-requis, créer un item basique).

    La classe de l'armure :

    Créez la classe de votre armure, en superclass mettez net.minecraft.item.ItemArmor.

    Vous allez avoir une erreur sur la classe, ajoutez un constructeur :

        public ItemTutoArmor(ArmorMaterial material, int type)
        {
            super(material, 0, type);
        }
    

    Le 0 correspond en fait à l'index de la texture, mais comme nous utilisons forge cette int ne nous concerne pas.
    Ensuite, ajoutez la fonction pour la texture sur le joueur :

        public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type)
        {
            if(slot == 2)
            {
                return ModTutoriel.MODID + ":textures/models/armor/tutorial_layer_2.png";
            }
            return ModTutoriel.MODID + ":textures/models/armor/tutorial_layer_1.png";
        }
    

    Explication du code : si le slot est égale à 2 (donc les jambières) alors je lui dis de chercher la texture tutorial_layer_2. Sinon, il va continuer le code, et donc chercher tutorial_layer_1.
    Vous pouvez faire la même chose avec une comparaison d'objet :

        public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type)
        {
            if(stack.getItem() == ModTutoriel.leggingsTuto)
            {
                return ModTutoriel.MODID + ":textures/models/armor/tutorial_layer_2.png";
            }
            return ModTutoriel.MODID + ":textures/models/armor/tutorial_layer_1.png";
        }
    

    D'ailleurs la comparaison avec l'objet de l'item offre un avantage : vous pouvez utiliser la même classe pour plusieurs armures. Il suffit de faire des conditions à chaque fois, si stack.getItem() est égal aux jambières de l'armure tuto1, alors la fonction renvoie tuto1_layer_2 sinon si stack.getItem() est le casque, ou le plastron, ou les bottes de l'armure tuto1 la fonction renvoie tuto1_layer_1, sinon si stack.getItem() sont les jambières de l'armure tuto2 alors la fonction renvoie tuto2_layer_2, etc ...
    Le chemin de la texture est sous la forme d'une ResourceLocation, comme pour les mobs. On utilise "modid:chemin vers la texture avec le .png"
    Vous n'êtes pas obligé d'utiliser le même chemin que moi, dans le tutoriel j'utilise le même que minecraft.

    La texture et le nom :

    Pour les noms de vos items, il suffit de les ajouter dans vos fichiers de lang. Dans mon cas :

    item.helmetTuto.name=Tutorial Helmet
    item.chestPlateTuto.name=Tutorial ChestPlate
    item.leggingsTuto.name=Tutorial Leggings
    item.bootsTuto.name=Tutorial Boots
    

    Je ne vais pas rentrer dans les détails, c'est quelque chose que vous devrez maîtriser, si ce n'est pas le cas, retournez voir les pré-requis.
    Pour la texture dans l'inventaire, je ne vais pas non plus entrer dans les détails, les explications étant déjà faites dans le tutoriel sur l'item basique.
    En revanche, pour les textures sur le rendu de l'entité, vous ne pouviez pas deviner.
    Allez donc dans votre dossier forge/src/main/resources/assets/votre id de mod/. À partir de ce dossier, il suffit de créer l'arborescence de ce que nous avons mis après le : de la fonction getArmorTexture. Dans mon cas, j'ai textures/models/armor/tutorial_layer_2.png et textures/models/armor/tutorial_layer_2.png, donc j'ouvre le dossier textures, dans ce dossier je crée un nouveau dossier nommé "models" puis à l'intérieur de ce dossier, je fais un dossier "armor". Pour finir, je place mes deux textures dans ce dossier. Je vous conseil de vous baser sur les .png de minecraft, vous pouvez les trouvées dans le .jar de minecraft, dans le même dossier mais avec minecraft à la place du modid (assets/minecraft/textures/models/armor/).

    Rendre l'armure réparable :

    Actuellement si vous mettez votre armure dans une enclume, elle ne sera pas réparable. Pour la rendre réparable, il faut ajouter cette fonction dans la classe de l'armure :

        public boolean getIsRepairable(ItemStack input, ItemStack repair)
        {
            if(repair.getItem() == ModTutoriel.itemTutoriel)
            {
                return true;
            }
            return false;
        }
    

    repair correspond à l'item mis à gauche de l'enclume, il suffit de vérifier qu'il correspond à l'item avec lequel vous souhaitez rendre votre armure réparable. Vous pouvez aussi faire ça :

        public boolean getIsRepairable(ItemStack input, ItemStack repair)
        {
            if(repair.getItem() == ModTutoriel.itemTutoriel || repair.getItem() == ModTutoriel.itemTutoriel2)
            {
                return true;
            }
            return false;
        }
    

    Pour rendre votre armure réparable avec deux items différents.
    input correspond à l'item mis à gauche de l'enclume, il sera toujours égal à celui de la classe même. Il peut toujours vous servir si vous voulez utiliser la même classe pour plusieurs armures, par exemple :

        public boolean getIsRepairable(ItemStack input, ItemStack repair)
        {
            if(((input.getItem() == ModTutoriel.helmetTuto1 || les autres pièces d armures1) && repair.getItem() == ModTutoriel.itemTutoriel1) || ((input.getItem() == ModTutoriel.helmetTuto2 || les autres pièces d armures2) && repair.getItem() == ModTutoriel.itemTutoriel2))
            {
                return true;
            }
            return false;
        }
    

    Pour rendre les armures 1 réparables avec mon item 1 et les armures 2 avec mon item 2. J'ai raccourci la condition, il faut mettre les 3 autres pièces d'armure à la place de "les autres pièces d'armures". Attention quand même de ne pas vous perdre dans toutes ces parenthèses, une deuxième classe sera bien plus simple si vous avez peur de vous perdre.

    Bonus

    Quelques effets avec la fonction onArmorTick :

    Dans la classe de votre item, ajoutez cette fonction :

        public void onArmorTick(World world, EntityPlayer player, ItemStack stack)
        {
    
        }
    

    Elle va être appelée à chaque tick lorsque le joueur porte l'armure sur lui. En argument il y a le monde, l'instance du joueur et le stack de l'armure. Donc il y a de quoi faire. Tous les codes que je vais vous donner vont se placer dans cette fonction.
    On va commencer par quelque chose de simple, nous allons ajouter un effet de potion si le joueur porte une pièce de l'armure sur lui.

            player.addPotionEffect(new PotionEffect(Potion.resistance.id, 20, 0));
    

    Ce code ajoute l'effet resistance pendant une seconde. Comme ce code est exécuté à chaque tick, l'effet va rester temps que le joueur à l'armure sur lui. Potion.resistance.id correspond à l'id de la potion, 20 à la durée en tick (20 = une seconde, 40 = deux secondes, etc ...) et 0 à l'amplificateur. Avec amplificateur de 0, la potion sera de niveau 1. Avec un amplificateur de 1, la potion sera de niveau 2. L'amplificateur monte jusqu'à 4, au-delà le niveau de la potion ne s'affiche plus en jeu.

    Un peu plus poussé, je veux donner au joueur l'effet de vision de nuit si la luminosité est faible, et que le joueur porte le casque :

            if(this.armorType == 0 && world.getBlockLightValue(MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ)) < 8)
            {
                player.addPotionEffect(new PotionEffect(Potion.nightVision.id, 220, 0));
            }
    

    Si le type d'armure est 0 (donc le casque) et que la luminosité au niveau du joueur est inférieure à 8, alors je donne l'effet de potion vision de nuit pendant 11 secondes. Pourquoi 11 ? Car en dessous de 10, l'effet clignote, et donc ce n'est pas agréable pour le joueur.
    Vous souhaitez que si le joueur porte les jambières il puisse courir plus vite ? Pas de problème, il suffit de vérifier si le joueur porte les jambières et si il court, et dans ce cas on augmente son mouvement x et son mouvement z :

            if(this.armorType == 2 && player.isSprinting() && player.onGround)
            {
                player.motionX *= 1.1F;
                player.motionZ *= 1.1F;
            }
    

    (multiplier par 1.1F = vitesse augmenter de 10 %)
    A l'inverse, vous pouvez ralentir le joueur ( *= 0.5F) par exemple pour le ralentir si votre armure est lourde.

    Les possibilités avec cette méthode sont énormes, je n'ai montré ici qu'un échantillon de ce qu'on peut faire. Tapez player. et faites ctrl + espace, vous allez avoir la liste de toutes les variables et fonctions du joueur que vous pouvez utiliser. Même chose pour world, même chose pour stack. Attention quand même de ne pas mettre des méthodes qui ne sont que présent en client, les ticks se font aussi sur le serveur.

    Quelques effets avec les events :

    Pour commencer avec les events, il faut enregistrer dans la fonction init de la classe principale la classe où il y aura les event :

            MinecraftForge.EVENT_BUS.register(new LivingEventHandler());
    

    LivingEventHandler est le nom de la classe où je vais regrouper tous les événements qui concernent les entités vivantes. Créez ensuite cette classe.
    Elle n'a pas d'héritage, pour que votre événement soit détecté il suffit d'utiliser l'annotation @SubscribeEvent.

    package fr.minecraftforgefrance.tutoriel.common;
    
    import net.minecraftforge.event.entity.living.LivingFallEvent;
    import net.minecraftforge.event.entity.living.LivingHurtEvent;
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    
    public class LivingEventHandler
    {
        @SubscribeEvent
        public void onLivingHurt(LivingHurtEvent event)
        {
    
        }
    
        @SubscribeEvent
        public void onLivingFall(LivingFallEvent event)
        {
    
        }
    }
    

    Voila à quoi ressemble ma classe après y avoir ajouté deux événements. Le nom de la fonction importe peu, l'essentiel est que le @SubscribeEvent soit présent et que la fonction ait un event en argument. LivingHurtEvent est déclenché quand l'entité prend des dégâts et LivingFallEvent quand l'entité tombe.
    Nous allons commencer par compléter l'event fall, en effet, je souhaite que les dégâts de chute soit annulé si l'entité à les bottes tutoriel sur lui.

            ItemStack boots = event.entityLiving.getEquipmentInSlot(1); // récupère les bottes
            if(boots != null && boots.getItem() == ModTutoriel.bootsTuto) // on vérifie que l'entité à des bottes avec le null check puis si elle a des bottes, on vérifie si celles-ci sont les bottes tuto
            {
                boots.damageItem(MathHelper.floor_float(event.distance), event.entityLiving); // on endommage les bottes en fonction de la puissance de la chute
                event.distance = 0F; // on défini la distance à 0 pour pas que l'entité prenne de dégâts
                if(boots.stackSize == 0) // si le stack size est de 0 (donc que les bottes ont cassé)
                {
                    event.entityLiving.setCurrentItemOrArmor(1, null); // on met un item null au niveau des bottes, c'est pour éviter un bug d'affichage 
                }
            }
    

    Tout le code est commenté pour expliquer à quoi sert chaque ligne. Attention, le null check (boots != null) est très important, si vous le mettez pas cette condition avant boots.getItem(), vous allez avoir un NPE (NullPointerException) si l'entité n'a pas de bottes. Donc si votre jeu crash avec un NullPointerException, vérifiez ça.
    Ici j'ai réduit totalement les dégâts de chute, mais on aurait pu par exemple les diviser par deux en remplaçant event.distance = 0F; par event.distance = event.distance / 2;
    J'ai aussi endommagé les bottes en fonction de la chute, on aurait pu aussi multiplier ou diviser par deux cette valeur.

    Ceci n'est qu'un exemple, il y a pleins d'autres possibilités, une fois de plus, à vous d'utiliser votre imagination.

    Ensuite nous allons compléter la fonction onLivingHurt. Cette fois je fais appliquer mes effets seulement si le joueur à toute l'armure sur lui. On commence par obtenir l'instance des ItemStack de toute l'armure. Ensuite dans une condition, je vérifie à chaque que fois que l'armure n'est pas null et qu'elle correspond à l'item voulu :

            ItemStack boots = event.entityLiving.getEquipmentInSlot(1);
            ItemStack leggings = event.entityLiving.getEquipmentInSlot(2);
            ItemStack chestPlate = event.entityLiving.getEquipmentInSlot(3);
            ItemStack helmet = event.entityLiving.getEquipmentInSlot(4);
    
            if(boots != null && boots.getItem() == ModTutoriel.bootsTuto && leggings != null && leggings.getItem() == ModTutoriel.leggingsTuto && chestPlate != null && chestPlate.getItem() == ModTutoriel.chestPlateTuto && helmet != null && helmet.getItem() == ModTutoriel.helmetTuto)
            {
                // La suite ici
            }
    

    Cette event à 3 variables intéressantes : entityLiving, l'instance de l'entité qui vient de prendre des dégâts, source, le DamageSource que l'entité vient de se prendre, et ammount le nombre de dégât que l'entité vient de prendre. Je souhaite faire que si l'entité vient de se faire attaqué par un creeper, alors cela endommage l'armure, et les dégâts sont réduis à 0. À la place de la suite ici, je mets ça :

                if(event.source.getEntity() != null && event.source.getEntity() instanceof EntityCreeper) // vérifie que l'entité qui a causée les dégâts n'est pas null (elle sera null si les dégâts sont causés pas une chute, ou par le feu, ou par la lave, etc ...) et si elle n'est pas null, vérifie que l'entité qui a causée les dégâts est un creeper.
                {
                    boots.damageItem(MathHelper.floor_float(event.ammount / 4), event.entityLiving); // endommage les bottes
                    leggings.damageItem(MathHelper.floor_float(event.ammount / 4), event.entityLiving); // endommage les jambières
                    chestPlate.damageItem(MathHelper.floor_float(event.ammount / 4), event.entityLiving); // endommage le plastron
                    helmet.damageItem(MathHelper.floor_float(event.ammount / 4), event.entityLiving); // endommage le casque
                    event.ammount = 0F; // réduit les dégâts à 0
                }
    

    Autre exemple, si la source des dégâts est un cactus, ça explose ! :

                if(event.source.getDamageType().equals("cactus"))
                {
                    event.entityLiving.worldObj.newExplosion(event.entityLiving, event.entityLiving.posX, event.entityLiving.posY, event.entityLiving.posZ, event.ammount, true, true);
                }
    

    Vous pouvez détecter le type de dégât avec if(event.source.getDamageType().equals("nom du dégât")), je vous laisse faire un tour dans la classe DamageSource.java.
    Voila, c'est tout pour les événements.

    Résultat

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

    Crédits

    Rédaction :

    Correction :

    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



  • Merci beaucoup :D, je vais devoir utilisé certaine chose de la partit bonus :).



  • Avis aux amateurs : Ne mettez jamais player.motionY *= 1.5F;

    Sinon ça fait ça :



  • Bonjour,
    J'ai un problème, une erreur apparait au niveau de .setTextureName(MODID + ":boots_tutoriel");
    Quand je mets l'ID de mon mod, eclipse me dis : "cannot be resolved to a variable"

    Et j'ai une autre question, je ne comprends pas ce qu'il faut mettre exactement ici :

    return ModTutoriel.MODID + ":textures/models/armor/tutorial_layer_2.png";
    

    D'après ce que j'ai compris, je dois mettre : iddumod.iddumod après return ?
    Je ne vois pas la différence entre le MODID et ce qui précède

    J'ai lu également le tutoriel sur la création d'un item basique et pourtant je ne comprends pas.

    Merci d'avance 🙂


  • Administrateurs

    ModTutoriel est le nom de la class principale et MODID est une constance définie dans la class principale.



  • Merci !
    Mais j'ai une nouvelle erreur maintenant : "modid cannot be resolved or is not a field"
    Et eclipse me propose create field et create constant


  • Administrateurs

    Envois ta class principale.


  • Administrateurs

    Soit dans ta classe principale tu mets :
    public static final String MODID = "ton id de mod"; comme expliqué dans le tutoriel sur l'item basique.
    Soit dans la classe de l'armure, tu remplaces ClassePrincipale.MODID par "ton id de mod".



  • Merci ! 🙂



  • Pas énormément de changements par rapport a la 1.6 😉



  • Bonjour à tous, j'ai tenté ce code en modifiant deux trois trucs comme les noms et les textures, mais les objets fonctionnent correctement, cependant, il est impossible de les revêtir en temps qu'armure, il est également impossible de le réparer sur une enclume, je vous met le contenu des deux classes dans un fichier texte: http://dl.pokemon-dimension.com/classes.txt

    Merci d'avance 👼


  • Administrateurs

    Déjà, tu as fail dans le nom de la méthode pour réparer.
    Ensuite, tu as fail dans l'initialisation des éléments de ton armure.


  • Administrateurs

    helmet = 0, chestplate = 1, leggings = 2, boots = 3.
    Seul ton casque est bon, les autres tu as mit les mauvais nombres (dans la classe principale).
    Et pour l'enclume, voir un message plus haut.



  • j'ai tout fais sa marche sauf que je voi pas la texture … help me please


  • Administrateurs

    Code de ton armure ? Emplacement des fichiers png ?



  • Salut !

    J'ai presque réussi a faire tout ce que tu fait dans ton tutoriel mais j'ai rencontré un problème : les textures de mon armure ne s'affiche pas sur mon joueur.
    Je te passe ma classe principale et ma class "Armures":

    package fr.blackpandagaming.dragonadventure.common;
    
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemArmor.ArmorMaterial;
    import net.minecraftforge.common.util.EnumHelper;
    import cpw.mods.fml.common.Mod;
    import cpw.mods.fml.common.Mod.EventHandler;
    import cpw.mods.fml.common.Mod.Instance;
    import cpw.mods.fml.common.SidedProxy;
    import cpw.mods.fml.common.event.FMLInitializationEvent;
    import cpw.mods.fml.common.event.FMLPostInitializationEvent;
    import cpw.mods.fml.common.event.FMLPreInitializationEvent;
    import cpw.mods.fml.common.registry.GameRegistry;
    import fr.blackpandagaming.dragonadventure.proxy.CommonProxy;
    
    @Mod(modid = DragonAdventure.MODID, name = "Dragon Adventure", version = "1.0.0")
    
    public class DragonAdventure
    {
    public static final String MODID = "dragonadventure";
    @Instance(MODID)
    public static DragonAdventure instance;
    
    @SidedProxy(clientSide = "fr.blackpandagaming.dragonadventure.proxy.ClientProxy", serverSide = "fr.blackpandagaming.dragonadventure.proxy.CommonProxy")
    public static CommonProxy proxy;
    
    public static Item batonVert, batonRouge, batonBleu, batonBlanc, batonNoir, dragoniteVerte, dragoniteRouge, dragoniteBleue, dragoniteBlanche, dragoniteNoire, casqueDragoniteBlanche, plastronDragoniteBlanche, pentalonDragoniteBlanche, bottesDragoniteBlanche;
    
    public static ArmorMaterial Armures = EnumHelper.addArmorMaterial("Armures", 25, new int[]{4, 6, 5, 4}, 35);
    
    @EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
    batonVert = new Batons().setUnlocalizedName("batonVert").setTextureName(MODID + ":baton_vert").setCreativeTab(CreativeTabs.tabMaterials);
    batonRouge = new Batons().setUnlocalizedName("batonRouge").setTextureName(MODID + ":baton_rouge").setCreativeTab(CreativeTabs.tabMaterials);
    batonBleu = new Batons().setUnlocalizedName("batonBleu").setTextureName(MODID + ":baton_bleu").setCreativeTab(CreativeTabs.tabMaterials);
    batonBlanc = new Batons().setUnlocalizedName("batonBlanc").setTextureName(MODID + ":baton_blanc").setCreativeTab(CreativeTabs.tabMaterials);
    batonNoir = new Batons().setUnlocalizedName("batonNoir").setTextureName(MODID + ":baton_noir").setCreativeTab(CreativeTabs.tabMaterials);
    
    dragoniteVerte = new Batons().setUnlocalizedName("dragoniteVerte").setTextureName(MODID + ":dragonite_verte").setCreativeTab(CreativeTabs.tabMaterials);
    dragoniteRouge = new Batons().setUnlocalizedName("dragoniteRouge").setTextureName(MODID + ":dragonite_rouge").setCreativeTab(CreativeTabs.tabMaterials);
    dragoniteBleue = new Batons().setUnlocalizedName("dragoniteBleue").setTextureName(MODID + ":dragonite_bleue").setCreativeTab(CreativeTabs.tabMaterials);
    dragoniteBlanche = new Batons().setUnlocalizedName("dragoniteBlanche").setTextureName(MODID + ":dragonite_blanche").setCreativeTab(CreativeTabs.tabMaterials);
    dragoniteNoire = new Batons().setUnlocalizedName("dragoniteNoire").setTextureName(MODID + ":dragonite_noire").setCreativeTab(CreativeTabs.tabMaterials);
    
    casqueDragoniteBlanche = new Armures(Armures, 0).setUnlocalizedName("casqueDragoniteBlanche").setTextureName(MODID + ":casquedragonite_blanche");
    plastronDragoniteBlanche = new Armures(Armures, 1).setUnlocalizedName("plastronDragoniteBlanche").setTextureName(MODID + ":plastrondragonite_blanche");
    pentalonDragoniteBlanche = new Armures(Armures, 2).setUnlocalizedName("pentalonDragoniteBlanche").setTextureName(MODID + ":pentalondragonite_blanche");
    bottesDragoniteBlanche = new Armures(Armures, 3).setUnlocalizedName("bottesDragoniteBlanche").setTextureName(MODID + ":bottesdragonite_blanche");
    
    GameRegistry.registerItem(batonVert, "baton_vert");
    GameRegistry.registerItem(batonRouge, "baton_rouge");
    GameRegistry.registerItem(batonBleu, "baton_bleu");
    GameRegistry.registerItem(batonBlanc, "baton_blanc");
    GameRegistry.registerItem(batonNoir, "baton_noir");
    
    GameRegistry.registerItem(dragoniteVerte, "dragonite_verte");
    GameRegistry.registerItem(dragoniteRouge, "dragonite_rouge");
    GameRegistry.registerItem(dragoniteBleue, "dragonite_bleue");
    GameRegistry.registerItem(dragoniteBlanche, "dragonite_blanche");
    GameRegistry.registerItem(dragoniteNoire, "dragonite_noire");
    
    GameRegistry.registerItem(casqueDragoniteBlanche, "casquedragonite_blanche");
    GameRegistry.registerItem(plastronDragoniteBlanche, "plastrondragonite_blanche");
    GameRegistry.registerItem(pentalonDragoniteBlanche, "pentalondragonite_blanche");
    GameRegistry.registerItem(bottesDragoniteBlanche, "bottesdragonite_blanche");
    }
    
    @EventHandler
    public void init(FMLInitializationEvent event)
    {
    proxy.registerRender();
    }
    
    @EventHandler
    public void postInit(FMLPostInitializationEvent event)
    {
    
    }
    }
    

    Et voici ma class "Armures":

    package fr.blackpandagaming.dragonadventure.common;
    
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemArmor;
    import net.minecraft.item.ItemStack;
    import net.minecraft.potion.Potion;
    import net.minecraft.potion.PotionEffect;
    import net.minecraft.world.World;
    
    public class Armures extends ItemArmor
    {
    
    public Armures(ArmorMaterial material, int type)
    {
    super(material, 0, type);
    }
    
    public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type)
    {
    if(slot == 2)
    {
    return DragonAdventure.MODID + ":textures/models/armor/DragoniteBlanche_leyer_2";
    }
    return DragonAdventure.MODID + ":textures/models/armor/DragoniteBlanche_leyer_1";
    }
    
    public boolean getIsRepairable(ItemStack input, ItemStack repair)
    {
    if(repair.getItem() == DragonAdventure.dragoniteBlanche || repair.getItem() == DragonAdventure.dragoniteBlanche)
    {
    return true;
    }
    return false;
    }
    
    public void onArmorTick(World world, EntityPlayer player, ItemStack stack)
    {
    player.addPotionEffect(new PotionEffect(Potion.nightVision.id, 210, 2));
    }
    }
    
    

    Petite précision : mes textures ( DragoniteBlanche_leyer_1 et DragoniteBlanche_leyer_2 ) ont était faites avec novaskin, juste au cas ou… 🙂

    Cordialement.


  • Administrateurs

    Il manque les .png dans la fonction getArmorTexture



  • Merci infiniment ! C'est quand même fou de foirer des textures in game juste pour 3 lettres 😕

    Cordialement.



  • Salut,

    Je suis désolé de vous déranger encore une foie mais j'aimerais créer plusieurs armures avec des effets ( si possible dans la même class ) mais je n'ais pas très bien compris comment il faut faire, quelqu'un peut-il m'aider ?

    Cordialement.



  • @'BlackPanda':

    Salut,

    Je suis désolé de vous déranger encore une foie mais j'aimerais créer plusieurs armures avec des effets ( si possible dans la même class ) mais je n'ais pas très bien compris comment il faut faire, quelqu'un peut-il m'aider ?

    Cordialement.

    tien sa devrais marcher ^^

    
    public class NomDeTaClasse extends ItemArmor
    {
    private ItemArmor.ArmorMaterial material;
    {
    super(material, 0, type);
    this.material = material;
    this.setCreativeTab(Class.Tabs);
    }
    
    // ton rendu
    
    //ta fonction pour réparer l'item
    
    //la fonction de l'effet
    
    public void onArmorTick(World world, EntityPlayer player, ItemStack stack)
    {
    if(this.armorType == 0 && this.material == classDeTonArmoreMaterial.ArmoreMaterial)
    {
    player.addPotionEffect(new PotionEffect(Potion.nightVision.id, 240, 0));
    }
    
    

    voilà ^^

    if(this.armorType == 0 && this.material == classDeTonArmoreMaterial.ArmoreMaterial)
    

    sa veut dire que si l'armure est un casque ET que il est de material quelque chose (exemple classPrincipale.armorBlack)