NBT Tag ne s'affiche pas



  • J'ai un problème avec les nbt tags ,
    La valeur ne s'affiche pas 😕

    package com.mod.infinitesword.client;
    
    import com.mod.infinitesword.init.ItemMod;
    
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    import net.minecraft.client.Minecraft;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemStack;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraftforge.client.event.RenderGameOverlayEvent;
    
    public class ElectroSwordEnergyDisplay
    {
        @SubscribeEvent
        public void eventHandler(RenderGameOverlayEvent event)
        {
           int posX = (event.resolution.getScaledWidth()) / 2;
           int posY = (event.resolution.getScaledHeight()) / 2;
    
           EntityPlayer player = Minecraft.getMinecraft().thePlayer;
    
           if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() == ItemMod.ElectroSword) {
              ItemStack stack = new ItemStack(ItemMod.ElectroSword);
              if(!stack.hasTagCompound())
              {
                  stack.setTagCompound(new NBTTagCompound());
              }
              Minecraft.getMinecraft().fontRenderer.drawString(stack.getTagCompound().getInteger("energy1") + " RF", posX + (-87), posY + (51), 0xffff00);
    
           }
    
        }
     }
    

    Ca affiche 0 au lieu de la valeur de energy1
    Si quelqu'un peut m'aider ça serait génial !



  • Nullement besoin d'un "onUpdate", puisque l'event est appelé à chaque tick.
    Je pense que le problème vient de l'endroit où t'enregistres la variable "energy1" dans les tags de l'itemstack.



  • Changes

    
    if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() == ItemMod.ElectroSword) {
             ItemStack stack = new ItemStack(ItemMod.ElectroSword);
             if(!stack.hasTagCompound())
             {
                 stack.setTagCompound(new NBTTagCompound());
             }
             Minecraft.getMinecraft().fontRenderer.drawString(stack.getTagCompound().getInteger("energy1") + " RF", posX + (-87), posY + (51), 0xffff00);
       }
    
    

    Par

    
    if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() == ItemMod.ElectroSword) {
             ItemStack stack = player.getCurrentEquippedItem();
             if(!stack.hasTagCompound())
             {
                 NBTTagCompound nbt = new NBTTagCompound();
                 nbt.setInteger("energy1", 100000);
                 stack.setTagCompound(nbt);
             } else if(!stack.getTagCompound().hasKey("energy1"))
                 stack.getTagCompound().setInteger("energy1", 1000000);
             Minecraft.getMinecraft().fontRenderer.drawString(stack.getTagCompound().getInteger("energy1") + " RF", posX + (-87), posY + (51), 0xffff00);
       }
    
    

    Les NBTTag sont reliés à l'ItemStack, or tu en créais un à chaque fois, normal donc que celui-ci n'en ai pas. Et comme tu les créais sans y mettre le tag, il va renvoyer 0.



  • Explication : j'ai créé le tag dans une autre class , la class de l'item et je voudrait donc pouvoir accéder a celui ci de la class avec l'event handler. La valeur de energy1 n'est pas constante , elle est de 1000000 originalement et est soustraite de 200 lorsque on tape une entité.

    En gros , je voudrais pouvoir recupérer mon tag que j'ai créé et set dans la class de mon item et l'utiliser pour l'afficher .J'ai une seconde solution : comme le tag est = a la durabilité de mon item ,je peux également utiliser stack.getItemDamage mais cette solution m'affiche également 0 !

    Voila j'éspère que ce que je viens d'écrire est compréhensible !  😄



  • Alors il te suffit d'override la méthode hitEntity, et dedans de faire baisser la valeur de energy1.
    Après je suis quasiment sûr que les NBTTag des itemstacks sont synchronisés avec le client grâce à la méthode Item#getShareTag. Donc essaie de print dans l'event RenderGameOverlayEvent, la valeur, et dis nous ce que t'affiches la console.



  • après plusieurs modifications , j'ai réussi a faire un code qui fonctionne !

    le voici :

    public class ElectroSwordEnergyDisplay
    {
        @SubscribeEvent
        public void eventHandler(RenderGameOverlayEvent event)
        {
           int posX = (event.resolution.getScaledWidth()) / 2;
           int posY = (event.resolution.getScaledHeight()) / 2;
    
           EntityPlayer player = Minecraft.getMinecraft().thePlayer;
    
           if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() == ItemMod.ElectroSword) {
               ItemStack stack = player.getCurrentEquippedItem();
    
               Minecraft.getMinecraft().fontRenderer.drawString(stack.getTagCompound().getInteger("energy1") + " RF", posX + (0), posY + (0), 0xffff00);
               System.out.println(stack.getTagCompound().getInteger("energy1"));
           }
        }
    }