1.6.4 Réparer un outil



  • Salut, oui c'est encore et toujours moi… que voulez vous, j'aime bien cette section 😄
    Mon nouveau soucis est le suivant enfin si je peux appeller cela un soucis à vrai dire,
    j'ai créée des outils en obsidienne, ayant une résistance de 12457, comme le montre:

    static EnumToolMaterial Obsidian = EnumHelper.addToolMaterial("Obsidian", 3, 12457, 12.0F, 8, 15);
    

    Voici la classe de la pioche en obsidienne par exemple:

    package Gallad.Mineald;
    
    import net.minecraft.item.EnumToolMaterial;
    import net.minecraft.item.ItemPickaxe;
    import net.minecraft.item.ItemStack;
    
    public class BasicPickaxe extends ItemPickaxe
    {
    
    public BasicPickaxe(int par1, EnumToolMaterial par2EnumToolMaterial)
    {
    super(par1, par2EnumToolMaterial);
    }
    
    public boolean getIsRepairable(ItemStack stack, ItemStack outputstack)
    {
    if(outputstack.itemID == Import.ObsidianPlate.itemID)
    {
    return true;
    }
    else
    {
    return false;
    }
    }
    }
    

    Et voici l'image expliquant le "bug":

    Ce qui est étrange c'est que cela marche en créatif, mais pas en survival!


  • Moddeurs confirmés Rédacteurs Administrateurs

    À mon avis c'est le système de calcule vanilla qui provoque ce problème, comme ton pioche à beaucoup de coup, ça devient trop chère. Et comme en créative on peut tout réparer, ça passe.
    Je ne sais pas du tout comment changer ça 😕



  • Solution deux:

    Tu met une résistance normal, genre 1.000, et grâce au TileEntity, tu fais en sorte que le "damageItem()" soit appliquer qu'un fois sur 12, par exemple, ce qui donnera une résistance de 12.000



  • @'Mugiwaxar':

    Solution deux:

    Tu met une résistance normal, genre 1.000, et grâce au TileEntity, tu fais en sorte que le "damageItem()" soit appliquer qu'un fois sur 12, par exemple, ce qui donnera une résistance de 12.000

    😮 jamais je n'aurai imaginais sa, sa va me donnai un sacré coup de main dans mais mods merci ^^.
    [Juste un truc, vous voudrez bien faire un petit tuto sur comment faire sa par contre ? ^^' merci d'avance :).]


  • Moddeurs confirmés

    grâce au TileEntity,

    Étant donné que les TileEntity sont uniquement pour les blocs, je veux bien voir comment tu vas l'appliquer à un item.



  • J'aurai bien une solution… recréer une forge en diminuant les coûts de réparation?

    Autre chose comment faire pour par exemple avoir une pioche au dessus du diamant, qui peut casser certains materieux que le minerai ne peux pas, j'avais essayé en mettant 4 au lieu de 3 et pareil dans l'harvest level, cela marchait bien mais étrangement je ne pouvais pas casser l'obsidienne



  • @'kevin_68':

    grâce au TileEntity,

    Étant donné que les TileEntity sont uniquement pour les blocs, je veux bien voir comment tu vas l'appliquer à un item.

    :huh:
    Chaque ItemStack a un tileEntity ^^

    Edit: item.getTagCompound()


  • Moddeurs confirmés Rédacteurs Administrateurs

    Ça c'est un tag NBT, pas un tile entity. Ce n'est pas la même chose.



  • C'est vrai
    Mais on peut quand même l'utiliser pour ma solution


  • Moddeurs confirmés Rédacteurs Administrateurs

    Oui.



  • Et donc, quel solution dois-je mieux utiliser?



  • @'sevenno07':

    @'Mugiwaxar':

    Solution deux:

    Tu met une résistance normal, genre 1.000, et grâce au TileEntity, tu fais en sorte que le "damageItem()" soit appliquer qu'un fois sur 12, par exemple, ce qui donnera une résistance de 12.000

    😮 jamais je n'aurai imaginais sa, sa va me donnai un sacré coup de main dans mais mods merci ^^.
    [Juste un truc, vous voudrez bien faire un petit tuto sur comment faire sa par contre ? ^^' merci d'avance :).]

    Bon voila, c'est KDO:

    
    @Override
    public boolean onItemUse(ItemStack item, EntityPlayer player, World world, int X, int Y, int Z, int side, float hitX, float hitY, float hitZ)
    {
    // –- Récupération du tag --- //
    NBTTagCompound tag = item.getTagCompound();
    if(tag == null)
    return;
    
    // --- Récupération d la "durabilité" --- //
    int durability = tag.getInteger("Durability");
    
    // --- Vérifie si les dommages doivent être appliqués --- //
    if(durability >= 4)
    {
    item.damageItem(1, player);
    durability = 0;
    }
    else
    durability++;
    
    // --- Enregistrement du tag --- //
    tag.setInteger("Durability", durability);
    item.setTagCompound(tag);
    
    }
    
    

    Sur un item simple, à toi de l'adapter

    Ps: Par contre j'ai pas eu le temps de tester 😄



  • Merci :D, je regarderai sa un peu plus tard par contre ;).
    Encor merci.


  • Moddeurs confirmés Rédacteurs Administrateurs

    @'Mugiwaxar':

    @'sevenno07':

    @'Mugiwaxar':

    Solution deux:

    Tu met une résistance normal, genre 1.000, et grâce au TileEntity, tu fais en sorte que le "damageItem()" soit appliquer qu'un fois sur 12, par exemple, ce qui donnera une résistance de 12.000

    😮 jamais je n'aurai imaginais sa, sa va me donnai un sacré coup de main dans mais mods merci ^^.
    [Juste un truc, vous voudrez bien faire un petit tuto sur comment faire sa par contre ? ^^' merci d'avance :).]

    Bon voila, c'est KDO:

    
    @Override
    public boolean onItemUse(ItemStack item, EntityPlayer player, World world, int X, int Y, int Z, int side, float hitX, float hitY, float hitZ)
    {
    // –- Récupération du tag --- //
    NBTTagCompound tag = item.getTagCompound();
    if(tag == null)
    return;
    
    // --- Récupération d la "durabilité" --- //
    int durability = tag.getInteger("Durability");
    
    // --- Vérifie si les dommages doivent être appliqués --- //
    if(durability >= 4)
    {
    item.damageItem(1, player);
    durability = 0;
    }
    else
    durability++;
    
    // --- Enregistrement du tag --- //
    tag.setInteger("Durability", durability);
    item.setTagCompound(tag);
    
    }
    
    

    Sur un item simple, à toi de l'adapter

    Ps: Par contre j'ai pas eu le temps de tester 😄

    C'est pas avec la fonction onItemUse, et ton return; ne fonctionnera jamais vu que la fonction est du type boolean. Il faudrait plutôt utiliser onBlockDestroyed. et hitEntity.
    Et sinon à la place de :
    NBTTagCompound tag = item.getTagCompound();
    if(tag == null)
    return;
    J'utiliserai plutôt :
    NBTTagCompound tag = item.hasTagCompound() ? item.getTagCompound() : new NBTTagCompound();

    Et à la place de :
    int durability = tag.getInteger("Durability");
    J'utiliserai :
    int durability = tag.hasKey("Durability") ? tag.getInteger("Durability") : 0;



  • @'robin4002':

    C'est pas avec la fonction onItemUse, et ton return; ne fonctionnera jamais vu que la fonction est du type boolean. Il faudrait plutôt utiliser onBlockDestroyed. et hitEntity.

    Sa je sais bien, c'est pour ça que je lui est dit d'adapter suivant sont cas

    @'robin4002':

    Et sinon à la place de :
    NBTTagCompound tag = item.getTagCompound();
    if(tag == null)
    return;
    J'utiliserai plutôt :
    NBTTagCompound tag = item.hasTagCompound() ? item.getTagCompound() : new NBTTagCompound();

    Si l'itemStack na pas de NBTTagCompound , c'est qu'il y a un problème, donc autan arrêter la fonction, il se créée par défaut
    Edit: Quoique, maintenant j'ai un doute

    @'robin4002':

    Et à la place de :
    int durability = tag.getInteger("Durability");
    J'utiliserai :
    int durability = tag.hasKey("Durability") ? tag.getInteger("Durability") : 0;

    Lol, la fonction tag.getInteger() retourne 0 si la clée n'existe pas, alors pourquoi s'embêter 🙂



  • Merci,
    en réalité oui, sans la modification de robin cela ne fonctionne pas
    ce qui me donne au final ce code la:

    
    NBTTagCompound tag = item.hasTagCompound() ? item.getTagCompound() : new NBTTagCompound();
    int durability = tag.hasKey("Durability") ? tag.getInteger("Durability") : 0;
    
    if(durability >= 12)
    {
    item.damageItem(1, player);
    durability = 0;
    }
    else
    durability++;
    
    tag.setInteger("Durability", durability);
    item.setTagCompound(tag);
    
    return true;
    
    

    A mettre dans soit hitEntity() pour une épée ou bien OnBlockDestroyed() pour un outil
    concernant les armures? quel est la fonction à utiliser?

    Quelqu'un a t'il une idée au sujet de l'obsidienne incassable en mettant un niveau de 4?


  • Moddeurs confirmés Rédacteurs Administrateurs

    @'Mugiwaxar':

    @'robin4002':

    Et sinon à la place de :
    NBTTagCompound tag = item.getTagCompound();
    if(tag == null)
    return;
    J'utiliserai plutôt :
    NBTTagCompound tag = item.hasTagCompound() ? item.getTagCompound() : new NBTTagCompound();

    Si l'itemStack na pas de NBTTagCompound , c'est qu'il y a un problème, donc autan arrêter la fonction, il se créée par défaut
    Edit: Quoique, maintenant j'ai un doute

    Non, un itemstack n'a pas obligatoirement un tag NBT, par défaut il n'en a pas. Sans ce code, NPE.

    @'Mugiwaxar':

    @'robin4002':

    Et à la place de :
    int durability = tag.getInteger("Durability");
    J'utiliserai :
    int durability = tag.hasKey("Durability") ? tag.getInteger("Durability") : 0;

    Lol, la fonction tag.getInteger() retourne 0 si la clée n'existe pas, alors pourquoi s'embêter 🙂

    En effet, j'avais jamais fait gaffe, merci !

    @'totos51':

    concernant les armures? quel est la fonction à utiliser?

    Quelqu'un a t'il une idée au sujet de l'obsidienne incassable en mettant un niveau de 4?

    Je pense qu'il faut passer par l'event EntityHurt de forge, car il n'y a pas de fonction dans ItemArmor
    Pour la deuxième question, surement un bug de forge, ça fonctionnait bien en 1.4.7 quand j'avais fait enderOre.



  • Merci :3
    Sujet résolu 😄


Log in to reply