1. Le forum de Minecraft-France va définitivement fermer ses portes. Celui-ci restera en lecture seule mais vous ne pourrez plus y apporter de nouveaux topics. Nous vous invitons à nous rejoindre sur le Discord de Minecraft-France qui permet de présenter vos projets, discuter avec la communauté etc.. Merci à tous d'avoir fait vivre ce forum de nombreuses années. Pour nous rejoindre sur Discord, Cliquez ici

Résolu NBT tags + condition "l'objet est tenu dans la main"

Discussion dans 'Aide à la création de mod' créé par Nolan-XX, 7 Juil 2015.

  1. Nolan-XX

    Nolan-XX Modérateur
    Staff

    Inscrit:
    29 Déc 2012
    Messages:
    10 234
    Points:
    304
    Sexe:
    Homme
    Bon, me revoilà pour la dernière fois j'espère. J'ai résolu mon problème d'input (Vous savez comment ? J'avais oublié que j'avais remmapé ma touche IG ...), mais il me reste un problème (deux en fait).

    Je me suis débrouillé pour faire en sorte que mes variables soient écrites dans le NBT de l'objet -donc techniquement chaque objet a ses propres variables- sauf, et bien ça ne fonctionne pas, j'ai deux faux dans la main, si j'en transforme une, l'autre se transforme aussi ... Voici ma classe W_Scythe :
    Code (Java):

    package rwby.Weapons;

    import net.minecraft.item.ItemSword;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.nbt.NBTTagList;

    public class W_Scythe extends ItemSword
       {
         public static int is_transformed;
         private int ammo_max;
         protected int ammo_actual;
         private int cooldown;
         private int cooldown_actual;
         
         public W_Scythe(ToolMaterial material, int Rammo_max, int Cooldown_Time)
           {
             super(material);
           
             
           }
           
           
          public void writeToNBT(NBTTagCompound compound)
          {
          //super.writeToNBT(compound);
          NBTTagList nbttaglist = new NBTTagList();
           
          compound.setTag("Items", nbttaglist);
       
          compound.setShort("ammo_actual",(short)this.ammo_actual); //On les enregistrent en short
          compound.setShort("ammo_max", (short)this.ammo_max);
          compound.setShort("is_transformed", (short)this.is_transformed);
          compound.setShort("cooldown", (short)this.cooldown);
          compound.setShort("cooldown_actual", (short)this.cooldown_actual);
           
           
          }
           
           @SuppressWarnings("unused")
           public void readFromNBT(NBTTagCompound compound)
          {
          //super.readFromNBT(compound);
           
          NBTTagList nbttaglist = compound.getTagList("Items", 10);
          //this.contents = new ItemStack[this.getSizeInventory()];

           
          this.ammo_actual = compound.getShort("ammo_actual"); //On lit nos valeurs
          this.ammo_max = compound.getShort("ammo_max");
          this.is_transformed = compound.getShort("is_transformed");
          this.cooldown = compound.getShort("cooldown");
          this.cooldown_actual = compound.getShort("cooldown_actual");
          }
           
           public void onItemRightClick()
             {
               if(is_transformed == 1) //=mode lame
                 {
                   
                 }
               else //=mode fusil
                 {
                 
                 }
             }

       }
     
    .

    Et j'en profite aussi, je n'ai pas trouvé la condition "objet tenu dans la main" ...
    J'ai essayé if(event.itemStack.getItem() == Main.Crescent_Rose) mais c'était pas ça
     
  2. robin4002

    robin4002 Support Technique
    Staff

    Inscrit:
    17 Août 2012
    Messages:
    5 478
    Points:
    229
    Sexe:
    Homme
    event.player.getCurrentItem() != null && event.player.getCurrentItem().getItem() == itemVoulu.

    Tu n'as pas compris comment utiliser les tags nbt. Les tags sont enregistrés dans l'itemstack, pas dans l'item. La classe de l'item n'a qu'une instance pour tous les items.
    Donc tes variables :
    public static int is_transformed;
    private int ammo_max;
    protected int ammo_actual;
    private int cooldown;
    private int cooldown_actual;
    ne devrait pas exister.
     
  3. Nolan-XX

    Nolan-XX Modérateur
    Staff

    Inscrit:
    29 Déc 2012
    Messages:
    10 234
    Points:
    304
    Sexe:
    Homme
    Il me mets une erreur sur le event.player : player cannot be resolved or is not a field. Pourtant, j'ai bien EntityPlayer player dans mon event :
    Code (Java):

          @SubscribeEvent
          public void onEvent(KeyInputEvent event, EntityPlayer player)
             {

               
                   if(ClientProxy.Weap_Trans.isPressed())
                     {
                       if (event.player.getCurrentItem() != null && event.player.getCurrentItem().getItem() == Main.Crescent_Rose)
                         {
                           
                         }
                       
                       if(W_Scythe.is_transformed == 0)
                         {
                           W_Scythe.is_transformed++;
                         }
                       else
                         {
                           W_Scythe.is_transformed--;
                         }


                       Minecraft.getMinecraft().thePlayer.addChatComponentMessage(new ChatComponentText("" + W_Scythe.is_transformed));
                     }
                   
                 
               
             }
     
     
  4. robin4002

    robin4002 Support Technique
    Staff

    Inscrit:
    17 Août 2012
    Messages:
    5 478
    Points:
    229
    Sexe:
    Homme
    Oula, une fonction d'event ne doit pas avoir deux arguments. Retires directement EntityPlayer player.
    Utilise plutôt Minecraft.getMinecraft().thePlayer.getCurrentItem() != null
     
  5. Nolan-XX

    Nolan-XX Modérateur
    Staff

    Inscrit:
    29 Déc 2012
    Messages:
    10 234
    Points:
    304
    Sexe:
    Homme
    Bon bon bon, je dois avouer que je ne pige plus rien a ce qu'il ce passe (ton code ne marchait pas, j'ai trouvé un autre truc qui a l'air de marcher) au niveau des NBT

    J'ai suivi ce tuto (http://www.minecraftforge.net/wiki/Item_nbt), essayé de l'adapater ... et je tombe sur une npe a la ligne 63 :
    Code (Java):

    package rwby.Weapons;

    import java.util.List;

    import rwby.Main;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemStack;
    import net.minecraft.item.ItemSword;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.world.World;

    public class W_Scythe extends ItemSword
       {

         public static short transformed; // False = Lame; True = Fusil

         public W_Scythe(ToolMaterial material, int Rammo_max, int Cooldown_Time)
           {
             super(material);

           }

         public void onItemRightClick(ItemStack itemStack)
           {
             boolean is_transformed = itemStack.stackTagCompound.getBoolean("is_transformed");
             if (is_transformed == true) // =mode lame
               {

               }
             else // =mode fusil
               {

               }
           }

         public void onCreated(ItemStack itemStack, World world, EntityPlayer player)
           {
             itemStack.stackTagCompound = new NBTTagCompound();
             itemStack.stackTagCompound.setBoolean("is_transformed", false);
           }

         public void addInformation(ItemStack itemStack, EntityPlayer player, List list, boolean par4)
           {
             boolean is_transformed = itemStack.stackTagCompound.getBoolean("is_transformed");
             if (is_transformed == true)
               {
                 // List.add("");
               }
             else
               {

               }
           }

         public void onUpdate(ItemStack itemStack)
           {
             boolean is_transformed = itemStack.stackTagCompound.getBoolean("is_transformed");

           }
         
         public static boolean getTransformationState(EntityPlayer player, ItemStack itemStack)
           {
          boolean is_transformed = itemStack.stackTagCompound.getBoolean("is_transformed");
           
          if(is_transformed == true)
          {
          return true;
          }

          return false;
         }

       }
     
    Les autres morceaux de codes concernés :
    Code (Java):

    package rwby.Renders;

    import net.minecraft.client.Minecraft;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.ResourceLocation;
    import net.minecraftforge.client.IItemRenderer;

    import org.lwjgl.opengl.GL11;

    import rwby.Models.ModelCrescent_Rose;
    import rwby.Models.ModelCrescent_Rose_Gun_form;
    import rwby.Weapons.W_Crescent_Rose;
    import rwby.Weapons.W_Scythe;

    public class W_Crescent_Rose_Renderer implements IItemRenderer

       {

         protected ModelCrescent_Rose model;
         protected ModelCrescent_Rose_Gun_form model_Alt;
         protected static final ResourceLocation texture = new ResourceLocation("rwby:textures/Models/items/Crescent_Rose.png");

         public W_Crescent_Rose_Renderer()
           {
             model = new ModelCrescent_Rose();
             model_Alt = new ModelCrescent_Rose_Gun_form();
           }

         @Override
         public boolean handleRenderType(ItemStack item, ItemRenderType type)
           {
             switch (type)
               {
               case EQUIPPED:
                 return true;
               case ENTITY:
                 return true;
               case EQUIPPED_FIRST_PERSON:
                 return true;

               default:
                 return false;
               }

           }

         @Override
         public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper)
           {
             return true;
           }

         @Override
         public void renderItem(ItemRenderType type, ItemStack item, Object... data)
           {


             switch (type)
               {
                 
             
               case EQUIPPED:
                 {

                   if(W_Scythe.getTransformationState(null, item) == true)
                     {
                       GL11.glPushMatrix();
                       GL11.glTranslated(0.5D, 1.0D, 0.5D);
                       GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
                       GL11.glRotatef(-45F, 0.0F, 1.0F, 0.0F);
                       GL11.glRotatef(60F, 1.0F, 0.0F, 0.0F);
                       GL11.glScalef(0.075F, 0.075F, 0.075F);
                       Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                       model.renderAll(1);
                       GL11.glPopMatrix();
                       break;
                     }
                   else if (W_Scythe.getTransformationState(null, item) == false)
                     {
                       GL11.glPushMatrix();
                       GL11.glTranslated(0.5D, 1.0D, 0.5D);
                       GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
                       GL11.glRotatef(-45F, 0.0F, 1.0F, 0.0F);
                       GL11.glRotatef(60F, 1.0F, 0.0F, 0.0F);
                       GL11.glScalef(0.075F, 0.075F, 0.075F);
                       Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                       model_Alt.renderAll(1);
                       GL11.glPopMatrix();
                       break;
                     }

                 }
               case EQUIPPED_FIRST_PERSON:
                 {
                   if (W_Scythe.getTransformationState(null, item) == true)
                     {
                       GL11.glPushMatrix();
                       GL11.glTranslated(0.5D, 1.0D, 0.5D);
                       GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
                       GL11.glScalef(0.05F, 0.05F, 0.05F);
                       Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                       model.renderAll(1);
                       GL11.glPopMatrix();
                       break;
                     }
                   else if (W_Scythe.getTransformationState(null, item) == false)
                     {
                       GL11.glPushMatrix();
                       GL11.glTranslated(0.5D, 1.0D, 0.5D);
                       GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
                       GL11.glScalef(0.05F, 0.05F, 0.05F);
                       Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                       model_Alt.renderAll(1);
                       GL11.glPopMatrix();
                       break;
                     }

                 }

               case ENTITY:
                 {
                   if (W_Scythe.getTransformationState(null, item) == true)
                     {
                       GL11.glPushMatrix();
                       GL11.glTranslated(0.5D, 1.7D, 0.5D);
                       GL11.glRotatef(180F, 0.0F, 0.5F, 1.0F);
                       GL11.glScalef(0.05F, 0.05F, 0.05F);
                       Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                       model.renderAll(1);
                       GL11.glPopMatrix();
                       break;
                     }
                   else if (W_Scythe.getTransformationState(null, item) == false)
                     {
                       GL11.glPushMatrix();
                       GL11.glTranslated(0.5D, 1.7D, 0.5D);
                       GL11.glRotatef(180F, 0.0F, 0.5F, 1.0F);
                       GL11.glScalef(0.05F, 0.05F, 0.05F);
                       Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                       model_Alt.renderAll(1);
                       GL11.glPopMatrix();
                       break;
                     }

                 }

               default:
                 break;
               }

           }
       }
     
    Code (Java):

        @SubscribeEvent
          public void onEvent(KeyInputEvent event)
             {          
                   if(ClientProxy.Weap_Trans.isPressed())
                     {
                        ItemStack hold = player.inventory.getCurrentItem();
                        if(hold.getItem() == Main.Crescent_Rose)
                         {
                           if(W_Scythe.getTransformationState(player, hold) == true)
                             {
                               Minecraft.getMinecraft().thePlayer.addChatComponentMessage(new ChatComponentText("Crescent rose is now a Scythe"));
                             }
                          else
                             {
                               Minecraft.getMinecraft().thePlayer.addChatComponentMessage(new ChatComponentText("Crescent rose is now a gun"));
                             }                      
                         }                
                     }
                   
                 
               
             }
     
  6. robin4002

    robin4002 Support Technique
    Staff

    Inscrit:
    17 Août 2012
    Messages:
    5 478
    Points:
    229
    Sexe:
    Homme
    C'est déjà mieux qu'avant. Par contre c'est laquelle la ligne 63 ?
     
  7. Nolan-XX

    Nolan-XX Modérateur
    Staff

    Inscrit:
    29 Déc 2012
    Messages:
    10 234
    Points:
    304
    Sexe:
    Homme
    Dans cette fonction
    Code (Java):

    public static boolean getTransformationState(EntityPlayer player, ItemStack itemStack)
           {
          boolean is_transformed = itemStack.stackTagCompound.getBoolean("is_transformed");
           
          if(is_transformed == true)
          {
          return true;
          }

          return false;
         }
    a boolean is_transformed = itemStack.stackTagCompound.getBoolean("is_transformed");
     
  8. pifou92000

    pifou92000 Mineur de Diamants

    Inscrit:
    23 Juin 2011
    Messages:
    2 690
    Points:
    195
    Sexe:
    Homme
    A mon avis c'est le NBTTag qui est nul, du coup tu devrais faire :
    Code (cpp):
    boolean is_transformed = itemStack.stackTagCompound != null && itemStack.stackTagCompound.getBoolean("is_transformed");
    Edit : et peut-être aussi vérifier si le tag existe avant de récupérer sa valeur, de mémoire je crois que c'est itemStack.stackTagCompound.hasKey("is_transformed"), ou quelque chose d'assez proche.
     
  9. Nolan-XX

    Nolan-XX Modérateur
    Staff

    Inscrit:
    29 Déc 2012
    Messages:
    10 234
    Points:
    304
    Sexe:
    Homme
    ça marche, mais j'ai de nouveau une npe à cette ligne : ItemStack hold = player.inventory.getCurrentItem();

    Code (Java):

     @SubscribeEvent
          public void onEvent(KeyInputEvent event)
             {

               
                   if(ClientProxy.Weap_Trans.isPressed())
                     {
                        ItemStack hold = player.inventory.getCurrentItem();
                        if(hold.getItem() == Main.Crescent_Rose)
                         {
                           if(W_Scythe.getTransformationState(player, hold) == true)
                             {
                               Minecraft.getMinecraft().thePlayer.addChatComponentMessage(new ChatComponentText("Crescent rose is now a Scythe"));
                             }
                          else
                             {
                               Minecraft.getMinecraft().thePlayer.addChatComponentMessage(new ChatComponentText("Crescent rose is now a gun"));
                             }                      
                         }
                       
                       
                       
                       /*if(is_transformed == true)
                         {
                           is_transformed = false;
                         }
                       else
                         {
                           is_transformed = true;
                         }*/



                       
                     }
                   
                 
               
             }
     
  10. pifou92000

    pifou92000 Mineur de Diamants

    Inscrit:
    23 Juin 2011
    Messages:
    2 690
    Points:
    195
    Sexe:
    Homme
    Je ne comprends pas d'où vient ta variable "player", je ne vois sa déclaration nulle part.
     
  11. Nolan-XX

    Nolan-XX Modérateur
    Staff

    Inscrit:
    29 Déc 2012
    Messages:
    10 234
    Points:
    304
    Sexe:
    Homme
    C'est parce qu'avant j'avais EntityPlayer player, mais
    Étrangement, Eclipse ne m'a pas signalé d'erreur
     
  12. pifou92000

    pifou92000 Mineur de Diamants

    Inscrit:
    23 Juin 2011
    Messages:
    2 690
    Points:
    195
    Sexe:
    Homme
    Ah ouais c'est bizarre.
    Du coup utilise "Minecraft.getMinecraft().thePlayer" ici aussi, et pense à vérifier que l'ItemStack hold n'est pas nul avant de faire hold.getItem(), sinon tu risques encore d'avoir une NPE.
     
  13. Nolan-XX

    Nolan-XX Modérateur
    Staff

    Inscrit:
    29 Déc 2012
    Messages:
    10 234
    Points:
    304
    Sexe:
    Homme
    Bon, ça marche, sauf que j'ai l'impression que l'event ne change pas les tags de l'item ... Ma variable reste a False, par conséquent mon arme sur le mode fusil
    Je remets mes codes :
    Code (Java):

    ItemStack hold = Minecraft.getMinecraft().thePlayer.inventory.getCurrentItem();
                        if(hold.getItem() == Main.Crescent_Rose && hold.getItem() != null)
                         {
                           if(W_Scythe.getTransformationState(player, hold) == true)
                             {
                               Minecraft.getMinecraft().thePlayer.addChatComponentMessage(new ChatComponentText("Crescent rose is now a Scythe"));
                             }
                          else
                             {
                               Minecraft.getMinecraft().thePlayer.addChatComponentMessage(new ChatComponentText("Crescent rose is now a gun"));
                             }                    
                         }
     
    Code (Java):

    package rwby.Weapons;

    import java.util.List;

    import rwby.Main;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemStack;
    import net.minecraft.item.ItemSword;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.world.World;

    public class W_Scythe extends ItemSword
       {

         public static short transformed; // False = Lame; True = Fusil

         public W_Scythe(ToolMaterial material, int Rammo_max, int Cooldown_Time)
           {
             super(material);

           }

         public void onItemRightClick(ItemStack itemStack)
           {
             boolean is_transformed = itemStack.stackTagCompound.getBoolean("is_transformed");
             if (is_transformed == true) // =mode lame
               {

               }
             else // =mode fusil
               {

               }
           }

         public void onCreated(ItemStack itemStack, World world, EntityPlayer player)
           {
             itemStack.stackTagCompound = new NBTTagCompound();
             itemStack.stackTagCompound.setBoolean("is_transformed", false);
           }

         public void addInformation(ItemStack itemStack, EntityPlayer player, List list, boolean par4)
           {
             boolean is_transformed = itemStack.stackTagCompound.getBoolean("is_transformed");
             if (is_transformed == true)
               {
                 // List.add("");
               }
             else
               {

               }
           }

         public void onUpdate(ItemStack itemStack)
           {
             boolean is_transformed = itemStack.stackTagCompound.getBoolean("is_transformed");

           }
       
         public static boolean getTransformationState(EntityPlayer player, ItemStack itemStack)
           {
             boolean is_transformed = itemStack.stackTagCompound != null && itemStack.stackTagCompound.getBoolean("is_transformed");
         
          if(is_transformed == true)
          {
          return true;
          }

          return false;
         }

       }

     
    EDIT : si je mets pas le code pour changer la variable, ça va pas marcher :facepalm:
    EDIT 2 : Mais ... Je suis censé mettre quoi ? (diantre que c'est dur les NBT)
     
  14. pifou92000

    pifou92000 Mineur de Diamants

    Inscrit:
    23 Juin 2011
    Messages:
    2 690
    Points:
    195
    Sexe:
    Homme
    C'est normal, à aucun moment tu ne changes le tag de l'item. Dans l'événement d'appui de touche, tu ne fais que récupérer la valeur.
    Aussi, il y a quelques problèmes.
    Dans la condition : if(hold.getItem()== Main.Crescent_Rose&& hold.getItem()!=null)
    il faut inverser les 2 parties, tu dois d'abord vérifier si l'ItemStack existe, puis récupérer l'item. D'ailleurs c'est bien l'ItemStack qui peut être nul, donc "hold != null".
    Ça donne donc :
    Code (cpp):
     if(hold != null && hold.getItem()== Main.Crescent_Rose)
    Tu peux aussi supprimer le public static short transformed; de la classe de ton item, il ne sert à rien.

    Après tu peux simplifier des choses, par exemple, tout ce code :
    Code (cpp):
    if(is_transformed == true)
          {
          return true;
          }

          return false;
         }
    peut simplement être remplacé par "return is_transformed;".


    Maintenant tu devrais créer une fonction "setTransformationState" qui modifiera les tags, et appeler cette fonction depuis l'event.
     
  15. Nolan-XX

    Nolan-XX Modérateur
    Staff

    Inscrit:
    29 Déc 2012
    Messages:
    10 234
    Points:
    304
    Sexe:
    Homme
    Pfff, que c'est compliqué
    Code (Java):

    public static boolean getTransformationState(EntityPlayer player, ItemStack itemStack)
           {
             boolean is_transformed = itemStack.stackTagCompound != null && itemStack.stackTagCompound.getBoolean("is_transformed");
             return is_transformed;
          }
         public static void setTransformationState(EntityPlayer player, ItemStack item)
           {
             boolean is_transformed = item.stackTagCompound != null && item.stackTagCompound.getBoolean("is_transformed");
             if(is_transformed == false)
               {
                 item.stackTagCompound.setBoolean("is_transformed", true);
                 Minecraft.getMinecraft().thePlayer.addChatComponentMessage(new ChatComponentText("Your weapon is now a Scythe"));
               }
             if(is_transformed == true)
               {
                 item.stackTagCompound.setBoolean("is_transformed", false);
                 Minecraft.getMinecraft().thePlayer.addChatComponentMessage(new ChatComponentText("Your weapon is now a Scythe"));
               }

           }
    Code (Java):

          @SubscribeEvent
          public void onEvent(KeyInputEvent event)
             {          
                   if(ClientProxy.Weap_Trans.isPressed())
                     {
                       
                        ItemStack hold = Minecraft.getMinecraft().thePlayer.inventory.getCurrentItem();
                          if(hold != null && hold.getItem()== Main.Crescent_Rose)
                         {                      
                           W_Scythe.setTransformationState(player, hold);                
                         }                                                      
                     }                                    
             }
    Une npe a item.stackTagCompound.setBoolean("is_transformed", true);, pourtant, item est bien ItemStack ?
     

Partager cette page