Item pour réparer l'armure équipée



  • Bonjour/Bonsoir,

    J'aurais voulus savoir si c'était possible de créer un item "Gemme de Réparation" que quand on fais clique droit deçu sa utilise la durat "De l'item 'Gemme de réparation' qui a par Exemple 4 de durat" mais que sa répare Exemple "400" de durat "Par clique" de l''armure ÉQUIPÉE sur le joueur qui l'utilise.

    Si vous pouvez m'expliquer comment faire ceci sa serai vraiment sympa de votre part
    Merci.


  • Administrateurs

    Salut,
    Oui c'est possible, il y a déjà eu des demandes d'aides similaire, cherches dans les discussions résolus.



  • Oui j'ai déja poser la question sur le forum, le but est de faire un onitemrightclick et de consumer la durabiliter de ton item puis de sois la répartir (100 /pieces d'armures) ou 400/pièces



  • @'robin4002':

    Salut,
    Oui c'est possible, il y a déjà eu des demandes d'aides similaire, cherches dans les discussions résolus.

    Bé justement je n'y arrive pas :c

    Voilà ma classe:


    package com.mod.arenalyce.items;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.potion.Potion;
    import net.minecraft.potion.PotionEffect;
    import net.minecraft.world.World;
    import scala.tools.nsc.doc.model.Entity;
    
    public class GemmeReparation extends Item
    {
    
        public GemmeReparation()
        {
         this.setMaxDamage(500);
            this.setMaxStackSize(1);
        }
    
        public void onItemRightClick(ItemStack stack, World world, Entity entity, int slot, boolean selected)
        {
            if(entity instanceof EntityPlayer)
            {
                EntityPlayer player = (EntityPlayer)entity;
                for(int i = 0; i < 4; i++)
                {
                    ItemStack armor = player.getCurrentArmor(i);
                    if(armor != null && armor.getItemDamage() > 0 && stack.getItemDamage() < stack.getMaxDamage())
                    {
                        stack.setItemDamage(stack.getItemDamage() + 1);
                        armor.setItemDamage(armor.getItemDamage() - 1);
                    }
                }
    
            }
        }
    }
    

  • Rédacteurs

    Et ça ne marche pas ?



  • int slot, boolean selected c'est quoi ça me semble pas que ça y soit dans mon code


  • Administrateurs

    En effet il y a prit les arguments de la fonction onUpdate de l'item, ça ne risque pas de fonctionner.

    Normalement c'est :
    public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player)
    Et il faut faire return stack; à la fin de la fonction.



  • Oui ça donnera plutot ça :

       package com.mod.arenalyce.items;
    
       import net.minecraft.entity.player.EntityPlayer;
       import net.minecraft.item.Item;
       import net.minecraft.item.ItemStack;
       import net.minecraft.potion.Potion;
       import net.minecraft.potion.PotionEffect;
       import net.minecraft.world.World;
       import scala.tools.nsc.doc.model.Entity;
    
       public class GemmeReparation extends Item
       {
           public GemmeReparation()
           {
            this.setMaxDamage(500);
               this.setMaxStackSize(1);
           }
    
           public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer entity)
           {
               if(entity instanceof EntityPlayer)
               {
                   EntityPlayer player = entity;
    
                   for(int i = 0; i < 4; i++)
                   {
                       ItemStack armor = player.getCurrentArmor(i);
    
                       if(armor != null && armor.getItemDamage() > 0 && stack.getItemDamage() < stack.getMaxDamage())
                       {
                           stack.setItemDamage(stack.getItemDamage() + 1);
                           armor.setItemDamage(armor.getItemDamage() - 1);
                       }
                   }
               }
               return stack;
           }
       }
    

    Mais fais gaffe se code la fais autre chose que se que tu demande il rendra 1 de dura /cliques et non 400 cherche un peut et tu trouveras la solution
    Ensuite personnellement j'aurais plutot fais lors que la déclaration de ton item dans supposons (main.class)
    J'aurais fais :
    GemmeReparation = new GemmeReparation(durabiliter max de l'item)…..
    Et après dans cette class j'aurais fais :

    package com.mod.arenalyce.items;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.potion.Potion;
    import net.minecraft.potion.PotionEffect;
    import net.minecraft.world.World;
    import scala.tools.nsc.doc.model.Entity;
    
    public class GemmeReparation extends Item
    {
       public GemmeReparation(duramax)
       {
            this.setMaxDamage(duramax);
            this.setMaxStackSize(1);
       }
    
        public void onItemRightClick(ItemStack stack, World world, EntityPlayer entity)
        {
           if(entity instanceof EntityPlayer)
           {
    
               EntityPlayer player = entity;
               for(int i = 0; i < 4; i++)
               {
                    ItemStack armor = player.getCurrentArmor(i);
    
                    if(armor != null && armor.getItemDamage() > 0 && stack.getItemDamage() < stack.getMaxDamage())
                    {
                        stack.setItemDamage(stack.getItemDamage() + 1);
                        armor.setItemDamage(armor.getItemDamage() - 1);
                    }
                }
           }
        }
    }
    

    Après c'est mon avis c'est juste plus classe comme ça et si tu fais plusieurs gemmes si tu optimise comme je viens de le faire tu pourras faire plus qu'un item dans ta classe (1 classe pour 5 items)



  • Merci beaucoup les gars vous m'avez grandement aidez !!

    Par contre quand elle est a 0 de durat elle ne se broke pas comment faire pour qu'elle se broke svp ?
    Et aussi j'ai mit que sa utiliser 1 de durat sur la gemme

    stack.setItemDamage(stack.getItemDamage() + 1);

    armor.setItemDamage(armor.getItemDamage() - 10);

    Mais sa m'utilise 4 de durat a chaque clique droit je comprend : http://prntscr.com/bhkyxx



  • bah change la balise dans le titre



  • Il faut que tu mettes la baliser Résolu ("Editer" sur ton premier post puis tu changes la balise).



  • Merci beaucoup les gars vous m'avez grandement aidez !!

    Par contre quand elle est a 0 de durat elle ne se broke pas comment faire pour qu'elle se broke svp ?
    Et aussi j'ai mit que sa utiliser 1 de durat sur la gemme

    stack.setItemDamage(stack.getItemDamage() + 1);

    armor.setItemDamage(armor.getItemDamage() - 10);

    Mais sa m'utilise 4 de durat a chaque clique droit je comprend : http://prntscr.com/bhkyxx


  • Administrateurs

    La fonction
    "stack.setItemDamage(stack.getItemDamage() + 1);"
    se trouve dans la boucle for qui va de 0 à 3, donc ce code est exécuté 4 fois.
    Il faut le mettre en-dehors de la boucle.
    Pour la démolition de l'item il faut utiliser stack.damageItem(player, 1); au lieu de stack.setItemDamage(stack.getItemDamage() + 1);