Rajouté une durabilité un item lors d'un craft



  • Bonjours aujourd'hui je cherche a crée un item qui serai utilisé pour un craft mais lors de la réussite du craft je voudrais que l'item ne disparait pas mais qui perds de l'utilisation un peux comme le hammer de gregtech



  • j'ai trouvé ça mais bon je suis entrain de testé

    @Override
    public void takenFromCrafting(EntityPlayer player, ItemStack item, IInventory matrix)
    {
    for(int i=0; i<matrix.getsizeinventory(); i++)<br="">{
    if(matrix.getStackInSlot(i) != null)
    {
    ItemStack itemnew = matrix.getStackInSlot(i);
    if(itemnew != null && itemnew.getItem() == Item.pickaxeDiamond)
    {
    ItemStack k = new ItemStack(Item.pickaxeDiamond, 2);
    k.damageItem(itemnew.getItemDamage() + 1, player);
    matrix.setInventorySlotContents(i, k);
    }
    }
    }
    }
    ```</matrix.getsizeinventory();>

  • Administrateurs

    La question a déjà été posé.
    http://www.minecraftforgefrance.fr/showthread.php?tid=1594&highlight=getContainerItem
    Pour l'usure il faut passer par la fonction damageItem et ajouter un certains damage à l'outil (regarde la classe ItemTool de mc)



  • Merci mille fois j'ai regardé pourtant sur le forum avant de posé ma question mais je crois ne pas avoirs bien cherché je serais plus attentives a l’avenir



  • public class ItemShardIron extends Item {
    
    public void damageItem() {setMaxDamage(10);}
    
    public ItemStack getContainerItem(ItemStack itemStack)
       {
           return new ItemStack(this);
       }
       public boolean hasContainerItem(ItemStack stack)
       {
           return true;
       }
    public boolean doesContainerItemLeaveCraftingGrid(ItemStack stack)
    {
    return false;
    }
    }
    
    

    voila j'ai rajouté tout comme il faut mais l'items ne s'use pas je cherche de mon coté mais bon


  • Administrateurs

    Le setMaxDamage devrait être dans le constructeur :

    public ItemShardIron()
    {
       this.setMaxDamage(10);
    }
    

    Pour faire qu'il s'use il faut utiliser la fonction damageItem, pour ça il faudrait passer par l'event de craft.



  • GameRegistry.addRecipe(new ItemStack (Pickaxe_flint), new Object []{"FFF",
    "IS ",
    " S "
    
    ,'F', Items.flint,'S',Items.stick,'I',itemShardIron,
    
    });
    

    tu parle de cette event de craft ??? je suis un peux perdu même beaucoup j'ai testé de rajouté le damageItem a suite itemShardIron avec une valeur positifs et une valeur négative rien ne marche j'ai testé de le mettre dans la classe de l'item ou il se passe que l'items ne se consomme pas rien se passe


  • Administrateurs

    Non pas du tout, un event c'est ça : http://www.minecraftforgefrance.fr/showthread.php?tid=716 pas un GameRegistry …
    L'event en question est cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent
    C'est un event de fml, donc a enregistrer avec :
    FMLCommonHandler.instance().bus().register(new ClasseAvecTousVosEvent());

    Et dedans tu ajoutes cette fonction :

    @SubscribeEvent
    public void onCraft(PlayerEvent.ItemCraftedEvent event)
    {
    for(int i =0; i < event.craftMatrix.getSizeInventory(); i++)
    {
    ItemStack stack = event.craftMatrix.getStackInSlot(i);
    if(stack != null && stack.getItem() == ClassePrincipale.tonItem)
    {
    stack.damageItem(1, event.player);
    }
    }
    }
    

    Importes bien cpw.mods.fml.common.gameevent.PlayerEvent et non net.minecraftforge.event.entity.player.PlayerEvent !

    Et ton item qui s'use c'est itemShardIron ?
    Si oui, dans le code de ton craft remplace itemShardIron par new ItemStack(itemShardIron,1, OreDictionary.WILDCARD_VALUE)
    (pour faire en sorte que le craft fonctionne avec tout les metadatas, sinon il ne fonctionnera que quand l'outil est 100 % neuf).



  • Je teste ça de se pas et oui hier je me suis penché sur les events pour palier a mon problemes mais j'avais le morceau de code que tu a filais plus haut



  • j'ai tout bien fais comme tu me la dit avec l'aide isador nous avons testé de mettre un petit bout de code pour voir ce qui ne va pas

    public void onCraft(PlayerEvent.ItemCraftedEvent event) {
    for (int i = 0; i < event.craftMatrix.getSizeInventory(); i++) {
    ItemStack stack = event.craftMatrix.getStackInSlot(i);
    if (stack != null && stack.getItem() == SandBoxMod.itemShardIron) {
    System.out.println("valeur de la durablitité: "
    + stack.getItemDamage());
    
    stack.damageItem(1, event.player);
    System.out.println("valeur de la durablitité: "
    + stack.getItemDamage());
    }
    }
    
    [20:28:38] [Client thread/INFO] [STDOUT]: [fr.sandbox.EventHandlerCraft:onCraft:15]: valeur de la durablitité: 0
    [20:28:38] [Client thread/INFO] [STDOUT]: [fr.sandbox.EventHandlerCraft:onCraft:19]: valeur de la durablitité: 1
    [20:28:38] [Server thread/INFO] [STDOUT]: [fr.sandbox.EventHandlerCraft:onCraft:15]: valeur de la durablitité: 0
    [20:28:38] [Server thread/INFO] [STDOUT]: [fr.sandbox.EventHandlerCraft:onCraft:19]: valeur de la durablitité: 1
    

    voila ce qu'on obtiens quand on craft l'item , l'item ne perd toujours pas de durabilité  nous avons aussi testé de l'ajouté a une classe de tool material en lui donnant la fonction d'épée et l'item s'use quand je tape un mob et quand je craft il se répare


  • Administrateurs

    Tiens c'est étrange ça, je passe sur ts.



  • Lien du tutoriels dans quelques jours