Rendu 3D différent avec clic gauche / Rendu Custom d'Item


  • Correcteurs

    Plop les gens, je suis assez actif ces derniers jours mais je n'invente rien pour autant. 
    J'aurais besoin de votre expertise quant à une fonctionnalité que j'aimerais apporter.

    Je fais des armes, j'aimerais que le clic gauche me permette de changer le rendu (tant qu'il est enfoncé).
    J'ai déjà une classe event du genre qui me permet de zoomer (Le tuto qui va bien😞
    :::

    @SubscribeEvent
    public void mouseInput(InputEvent.MouseInputEvent event)
    {
    ItemStack itemstack = Minecraft.getMinecraft().thePlayer.getCurrentEquippedItem();
    if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemRailGun && Minecraft.getMinecraft().currentScreen == null)
    {
    ModPg2.zoom2 = !ModPg2.zoom2;
    }
    if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemPlasmaGun && Minecraft.getMinecraft().currentScreen == null)
    {
    ModPg2.zoom3 = !ModPg2.zoom3;
    }
    }
    

    :::

    Sinon j'ai une classe de rendu d'Item quelconque:
    :::

    public class RenderPompe implements IItemRenderer
    {
    protected ModelPompe model;
    protected static final ResourceLocation texture = new ResourceLocation("ModPg2:textures/models/items/Pompe.png");
    
        public RenderPompe()
        {
    model = new ModelPompe();
        }
    
    @Override
    public boolean handleRenderType(ItemStack item, ItemRenderType type)
    {
    switch(type)
    {
            case EQUIPPED:
                return true;
            case EQUIPPED_FIRST_PERSON:
                return true;
            default:
                return false;
    }
    }
    
    @Override
    public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper)
    {
    return false;
    }
    
    @Override
    public void renderItem(ItemRenderType type, ItemStack item, Object… data)
    {
    switch(type)
    {
    case EQUIPPED:
            {
                GL11.glPushMatrix();
                GL11.glRotatef(90.F, 1.0F, 0.2F, 0.0F);
                GL11.glRotatef(100.F, 1.0F, 0.0F, 0.0F);
                GL11.glTranslatef(0.5F, -0.35F, -0.75F);
                GL11.glScaled(0.5F, 0.5F, 0.5F);
                Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                model.render((Entity)data[1], 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
                GL11.glPopMatrix();
                break;
            }
            case EQUIPPED_FIRST_PERSON:
            {
                GL11.glPushMatrix();
                GL11.glRotatef(90.F, 1.0F, -0.2F, 0.0F);
                GL11.glRotatef(100.F, 0.5F, -0.2F, -0.65F);
                GL11.glRotatef(30.F, -0.2F, -1.2F, 0.0F);
                GL11.glTranslatef(-0.25F, 0.55F, -2.8F);
                GL11.glScaled(1F, 1F, 1F);
                Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                model.render((Entity)null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
                GL11.glPopMatrix();
                break;
            }
            default:
                break;
            }
    }
    }
    

    :::

    Et je me demandais si il était possible de jouer sur cette classe et faisant deux "Matrix" différents par une case avec une mise en condition.



  • Tu fais varier le model 3d de ton item à rendre en fonction des tags de celui-ci. Les tags de l'item tu les modifies dans l'event du clic gauche. Sers toi d'un boolean 🙂


  • Administrateurs

    Il doit avoir un moyen de check si le bouton de la souris est appuyé (surement Mouse.quelquechose). Il faut aussi check que l'item que le joueur a en main et le l'item qui est en train d'être rendu.
    EDIT : l'idée de plaigon est pas mal aussi


  • Correcteurs

    Toute ma question était là en fait, savoir si c'est forcément un event ou si y'a moyen de récupérer ça directement dans ma classe.


  • Correcteurs

    Chui nul avec les nbt (y'a qu'avec les entités que j'arrive à faire qqs trucs seulement).

    Alors du coup, j'en suis rendu -blagounette- à ces codes là, non fonctionnels:

    :::

    public void writeToNBT(NBTTagCompound nbt) 
    {
    nbt.setBoolean("onUse", true);
    }
    
    public void readFromNBT(NBTTagCompound nbt) 
    {
    nbt.getBoolean("onUse");
    }
    

    :::

    :::

    
    @SubscribeEvent
    public void mouseInput(InputEvent.MouseInputEvent event)
    {
    ItemStack itemstack = Minecraft.getMinecraft().thePlayer.getCurrentEquippedItem();
    if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemPompe && Minecraft.getMinecraft().currentScreen == null)
    {
        itemstack.getTagCompound().setBoolean("onUse", true);
        System.out.println(itemstack.getTagCompound().getBoolean("onUse"));
        System.out.println("Eh eh, alors?");
    }
    }
    
    

    :::
    Même pas appelée visiblement

    :::

    case EQUIPPED:
            {
                if(item.getTagCompound().getBoolean("onUse") == true)
                {
                GL11.glPushMatrix();
                    GL11.glRotatef(90.F, 1.0F, 0.2F, 0.0F);
                    GL11.glRotatef(100.F, 1.0F, 0.0F, 0.0F);
                    GL11.glTranslatef(0.5F, -0.35F, -0.75F);
                    GL11.glScaled(0.5F, 0.5F, 0.5F);
                    Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                    model.render((Entity)data[1], 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
                    GL11.glPopMatrix();
                    break;
                }
                else
                {
                GL11.glPushMatrix();
                    GL11.glRotatef(90.F, 1.0F, 0.2F, 0.0F);
                    GL11.glRotatef(100.F, 1.0F, 0.0F, 0.0F);
                    GL11.glTranslatef(0.5F, -0.35F, -0.75F);
                    GL11.glScaled(2.5F, 2.5F, 2.5F);
                    Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                    model.render((Entity)data[1], 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
                    GL11.glPopMatrix();
                    break;
                }
            }
    

    :::

    J'ai voulu tenter un boolean dans la classe principale
    " public static boolean zoom4;"

    puis:
    :::

    
    ```@SubscribeEvent
    public void mouseInput(InputEvent.MouseInputEvent event)
    {
    ItemStack itemstack = Minecraft.getMinecraft().thePlayer.getCurrentEquippedItem();
    if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemRailGun && Minecraft.getMinecraft().currentScreen == null)
    {
    ModPg2.zoom2 = !ModPg2.zoom2;
    }
    if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemPlasmaGun && Minecraft.getMinecraft().currentScreen == null)
    {
    ModPg2.zoom3 = !ModPg2.zoom3;
    }
    if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemPompe)
    {
    ModPg2.zoom4 = !ModPg2.zoom4;
    }
    }
    :::
    
    :::
    ```java
    
    MinecraftForgeClient.registerItemRenderer(ModPg2.itemRailGun, (IItemRenderer)new RenderRailGun());
    MinecraftForgeClient.registerItemRenderer(ModPg2.itemPlasmaGun, (IItemRenderer)new RenderPlasmaGun());
    MinecraftForgeClient.registerItemRenderer(ModPg2.itemThomson, (IItemRenderer)new RenderThomson());
    if(!ModPg2.zoom4)
    {
          MinecraftForgeClient.registerItemRenderer(ModPg2.itemPompe, (IItemRenderer)new RenderPompe());
    }
    if(ModPg2.zoom4)
    {
          MinecraftForgeClient.registerItemRenderer(ModPg2.itemPompe, (IItemRenderer)new RenderPompe2());
    }
    

    :::

    Mais ça marche pas non plus



  • itemstack.getTagCompound().setBoolean("onUse", true); –> itemstack.getTagCompound().setBoolean("onUse", !(itemstack.getTagCompound().getBoolean("onUse"));

    Mais n'oublie pas de check si les tag ont bien été initialisés, sinon charge-toi en :

    if(stack.getTagCompound == null)
    stack.setTagCompound(new NBTTagCompound());
    else
    //ton code pour set la valeur actuelle inverse


  • Correcteurs

    :::

    
    public class ItemPompe extends Item 
    {
        public void onUsingTick(ItemStack stack, EntityPlayer player, int count)
        {
        if(!stack.hasTagCompound())
            {
            stack.setTagCompound(new NBTTagCompound());
            }
        else
        stack.getTagCompound().setBoolean("onUse", !(stack.getTagCompound().getBoolean("onUse")));
    if (count % 10 == 1 && player.inventory.hasItem(ModPg2.itemBullet2) && count > 69)
    {
    player.worldObj.playSoundAtEntity(player, "modPg2:thomson", 0.5F, 0.5F);
    }
        for(int j = 0 ; j < 8; ++j)
    {  
        if (count % 10 == 1 && player.inventory.hasItem(ModPg2.itemBullet2) && count > 69)
        {
        EntityBulletPompe entityBulletPompe = new EntityBulletPompe(player.worldObj, player);
        if(!player.capabilities.isCreativeMode)
        {
        player.inventory.consumeInventoryItem(ModPg2.itemBullet2);      
        }
        if (!player.worldObj.isRemote)
        {
        player.worldObj.spawnEntityInWorld(entityBulletPompe);
        }
        }
    }
        }
    
        public ItemStack onEaten(ItemStack stack, World world, EntityPlayer player)
        {
            return stack;
        }
    
    public int getMaxItemUseDuration(ItemStack stack)
        {
            return 100;
        }
    
    public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity)
    {
    return true;
    }
    
    public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player)
    {
    player.setItemInUse(stack, this.getMaxItemUseDuration(stack));
    return stack;
    }
    
    public void writeToNBT(NBTTagCompound nbt) 
    {
    nbt.setBoolean("onUse", true);
    }
    
    public void readFromNBT(NBTTagCompound nbt) 
    {
    nbt.getBoolean("onUse");
    }
    }
    
    

    :::

    J'avoue ne pas être sûr de tout avoir compris.



  • En fait tout se passe dans ton event InputEvent.MouseInputEvent

    Dès que tu fais clic droit, on va vérifier si l'itemstack de l'item tenu par le joueur a bien init ses tags, d'où ma condition :

    
    if(stack.getTagCompound == null)
    //Si ils sont nuls, tu les sets
    itemstack.setTagCompound(new NBTTagCompound());
    else
    //Sinon c'est qu'ils sont bien déjà initialisés, donc il suffit juste d'inverser leur valeur de boolean, qui agira directement sur le model à rendre
    itemstack.getTagCompound().setBoolean("onUse", !(itemstack.getTagCompound().getBoolean("onUse"));
    
    

    Pour la gestion d'un des 2 modèles à rendre, c'est à voir avec ce tuto
    Crées un tableau de ModelBase puis voies avec les tags de ton itemstack, lequel tu souhaites rendre, ce n'est vraiment pas compliqué 😃


  • Correcteurs

    Du coup,

    :::

    @SubscribeEvent
    public void mouseInput(InputEvent.MouseInputEvent event)
    {
    ItemStack itemstack = Minecraft.getMinecraft().thePlayer.getCurrentEquippedItem();
    if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemRailGun && Minecraft.getMinecraft().currentScreen == null)
    {
    ModPg2.zoom2 = !ModPg2.zoom2;
    }
    if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemPlasmaGun && Minecraft.getMinecraft().currentScreen == null)
    {
    ModPg2.zoom3 = !ModPg2.zoom3;
    }
    if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemPompe && Minecraft.getMinecraft().currentScreen == null)
    {
    if(itemstack.getTagCompound() == null)
    itemstack.setTagCompound(new NBTTagCompound());
    else
       itemstack.getTagCompound().setBoolean("onUse", !(itemstack.getTagCompound().getBoolean("onUse")));
       System.out.println(itemstack.getTagCompound().getBoolean("onUse"));
       System.out.println("Eh eh, alors?");
    }
    }
    

    :::

    La méthode semble appelée 2 fois et le rendu reste le même.

    :::

    public class RenderPompe implements IItemRenderer
    {
    protected ModelPompe model;
    protected static final ResourceLocation texture = new ResourceLocation("ModPg2:textures/models/items/Pompe.png");
    
        public RenderPompe()
        {
    model = new ModelPompe();
        }
    
    @Override
    public boolean handleRenderType(ItemStack item, ItemRenderType type)
    {
    switch(type)
    {
            case EQUIPPED:
                return true;
            case EQUIPPED_FIRST_PERSON:
                return true;
            default:
                return false;
    }
    }
    
    @Override
    public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper)
    {
    return false;
    }
    
    @Override
    public void renderItem(ItemRenderType type, ItemStack item, Object… data)
    {
    switch(type)
    {
    case EQUIPPED:
            {
            if(item.getTagCompound().getBoolean("onUse") == true)
                {
                GL11.glPushMatrix();
                    GL11.glRotatef(90.F, 1.0F, 0.2F, 0.0F);
                    GL11.glRotatef(100.F, 1.0F, 0.0F, 0.0F);
                    GL11.glTranslatef(0.5F, -0.35F, -0.75F);
                    GL11.glScaled(0.5F, 0.5F, 0.5F);
                    Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                    model.render((Entity)data[1], 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
                    GL11.glPopMatrix();
                    break;
                }
                else
                {
                GL11.glPushMatrix();
                    GL11.glRotatef(90.F, 1.0F, 0.2F, 0.0F);
                    GL11.glRotatef(100.F, 1.0F, 0.0F, 0.0F);
                    GL11.glTranslatef(0.5F, -0.35F, -0.75F);
                    GL11.glScaled(2.5F, 2.5F, 2.5F);
                    Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                    model.render((Entity)data[1], 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
                    GL11.glPopMatrix();
                    break;
                }      
            }
            case EQUIPPED_FIRST_PERSON:
            {
                GL11.glPushMatrix();
                GL11.glRotatef(90.F, 1.0F, -0.2F, 0.0F);
                GL11.glRotatef(100.F, 0.5F, -0.2F, -0.65F);
                GL11.glRotatef(30.F, -0.2F, -1.2F, 0.0F);
                GL11.glTranslatef(-0.25F, 0.55F, -2.8F);
                GL11.glScaled(1F, 1F, 1F);
                Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                model.render((Entity)null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
                GL11.glPopMatrix();
                break;
            }
            default:
                break;
            }
    }
    }
    
    

    :::

    Edit: La méthode est appelée quand j'appuie et quand je relâche (c'est le fontionnement que j'espérais alors ce n'est pas un problème). Reste le rendu Xd



  • Que dit la console, la valeur change bien ? Check aussi si les tag son bien init ou si ils sont toujours nuls…
    Quant aux models, il me faudrait ta classe implémentant IItemRenderer pour voir deprès 🙂


  • Correcteurs

    Résolu!

    Erreur de manip' avec la fatigue. Je modifiais le mauvais type de rendu (3ème personne_ EQUIPED)

    Du coup, un grand merci pour ce gros coup de pouce pour les nbt ^^



  • Que dit la console, la valeur change bien ? Check aussi si les tag son bien init ou si ils sont toujours nuls…
    Quant aux models, il me faudrait ta classe implémentant IItemRenderer pour voir de + près 🙂

    EDIT = Normal que ton modèle ne change pas, tu n'en as pas ajouté de deuxième…Si aucun changement, print et debug à fond, c'est la meilleure solution


  • Correcteurs

    Bon avec un item ça va, avec plusieurs ça crash. Je ne comprends pas le soucis (qui est un NPE: pastebin)

    :::

    
    @SubscribeEvent
    public void mouseInput(InputEvent.MouseInputEvent event)
    {
       ItemStack itemstack = Minecraft.getMinecraft().thePlayer.getCurrentEquippedItem();
       if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemRailGun && Minecraft.getMinecraft().currentScreen == null)
       {
             ModPg2.zoom2 = !ModPg2.zoom2;
       }
       if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemPlasmaGun && Minecraft.getMinecraft().currentScreen == null)
       {
              ModPg2.zoom3 = !ModPg2.zoom3;
       }
       if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemPompe && Minecraft.getMinecraft().currentScreen == null)
       {
              if(itemstack.getTagCompound() == null)
              itemstack.setTagCompound(new NBTTagCompound());
              else
              itemstack.getTagCompound().setBoolean("onUse1", !(itemstack.getTagCompound().getBoolean("onUse1")));
       }
       if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemThomson && Minecraft.getMinecraft().currentScreen == null)
       {
              if(itemstack.getTagCompound() == null)
              itemstack.setTagCompound(new NBTTagCompound());
              else
              itemstack.getTagCompound().setBoolean("onUse2", !(itemstack.getTagCompound().getBoolean("onUse2")));
       }
       if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemPistolet && Minecraft.getMinecraft().currentScreen == null)
       {
             if(itemstack.getTagCompound() == null)
             itemstack.setTagCompound(new NBTTagCompound());
             else
             itemstack.getTagCompound().setBoolean("onUse3", !(itemstack.getTagCompound().getBoolean("onUse3")));
       }
    }
    

    :::

    :::

    public class ItemPompe extends Item 
    {
        public void onUsingTick(ItemStack stack, EntityPlayer player, int count)
        {
    if (count % 10 == 1 && player.inventory.hasItem(ModPg2.itemBullet2) && count > 69)
    {
    player.worldObj.playSoundAtEntity(player, "modPg2:thomson", 0.5F, 0.5F);
    }
        for(int j = 0 ; j < 8; ++j)
    {  
        if (count % 10 == 1 && player.inventory.hasItem(ModPg2.itemBullet2) && count > 69)
        {
        EntityBulletPompe entityBulletPompe = new EntityBulletPompe(player.worldObj, player);
        if(!player.capabilities.isCreativeMode)
        {
        player.inventory.consumeInventoryItem(ModPg2.itemBullet2);      
        }
        if (!player.worldObj.isRemote)
        {
        player.worldObj.spawnEntityInWorld(entityBulletPompe);
        }
        }
    }
        }
    
        public ItemStack onEaten(ItemStack stack, World world, EntityPlayer player)
        {
            return stack;
        }
    
    public int getMaxItemUseDuration(ItemStack stack)
        {
            return 100;
        }
    
    public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity)
    {
    return true;
    }
    
    public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player)
    {
    player.setItemInUse(stack, this.getMaxItemUseDuration(stack));
    return stack;
    }
    
    public void writeToNBT(NBTTagCompound nbt) 
    {
    nbt.setBoolean("onUse1", false);
    }
    
    public void readFromNBT(NBTTagCompound nbt) 
    {
    nbt.getBoolean("onUse1");
    }
    }
    

    :::

    :::

    public class RenderPompe implements IItemRenderer
    {
    protected ModelPompe model;
    protected static final ResourceLocation texture = new ResourceLocation("ModPg2:textures/models/items/Pompe.png");
    
        public RenderPompe()
        {
    model = new ModelPompe();
        }
    
    @Override
    public boolean handleRenderType(ItemStack item, ItemRenderType type)
    {
    switch(type)
    {
            case EQUIPPED:
                return true;
            case EQUIPPED_FIRST_PERSON:
                return true;
            default:
                return false;
    }
    }
    
    @Override
    public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper)
    {
    return false;
    }
    
    @Override
    public void renderItem(ItemRenderType type, ItemStack item, Object… data)
    {
    switch(type)
    {
    case EQUIPPED:
            {
                GL11.glPushMatrix();
                GL11.glRotatef(90.F, 1.0F, 0.2F, 0.0F);
                GL11.glRotatef(100.F, 1.0F, 0.0F, 0.0F);
                GL11.glTranslatef(0.5F, -0.35F, -0.75F);
                GL11.glScaled(0.5F, 0.5F, 0.5F);
                Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                model.render((Entity)data[1], 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
                GL11.glPopMatrix();
                break;   
            }
            case EQUIPPED_FIRST_PERSON:
            {
            if(item.getTagCompound().getBoolean("onUse1") == true)
                {
            GL11.glPushMatrix();
                    GL11.glRotatef(90.F, 1.0F, -0.2F, 0.0F);
                    GL11.glRotatef(100.F, 0.5F, -0.2F, -0.65F);
                    GL11.glRotatef(30.F, -0.2F, -1.2F, 0.0F);
                    GL11.glTranslatef(-0.25F, 0.55F, -2.8F);
                    GL11.glScaled(1F, 1F, 1F);
                    Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                    model.render((Entity)null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
                    GL11.glPopMatrix();
                    break;
                }
                else
                {
            GL11.glPushMatrix();
                    GL11.glRotatef(90.F, 1.0F, -0.2F, 0.0F);
                    GL11.glRotatef(100.F, 0.59F, -0.2F, -0.7F);
                    GL11.glRotatef(30.F, 0F, -1.0F, 0.0F);
                    GL11.glTranslatef(1F, 0.1F, -2.0F);
                    GL11.glScaled(1F, 1F, 1F);
                    Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                    model.render((Entity)null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
                    GL11.glPopMatrix();
                    break;
                }      
            }
            default:
                break;
            }
    }
    }
    

    :::

    Voilà donc, tout marchait, quand j'ai voulu m'attaquer aux items suivant j'ai simplement refais tout pareil en changeant simplement le nom du nbt (onUse1/2/3, changé correctement partout), mais visiblement il ne suffit pas de vouloir.


  • Rédacteurs

    Lorsque tu as une erreur, met aussi les imports, ici tu as un NPE dans la classe RenderPistolet, dans la méthode renderItem à la ligne 60, ce pendant sans les imports la ligne 60 c'est GL11.glPopMatrix(); et ça m'étonnerai que ce soit ça qui pose problème


  • Correcteurs

    Nope en effet c'est

             if(item.getTagCompound().getBoolean("onUse3") == true)
    
    

    edit: je mettrai les imports à l'avenir ^^


  • Rédacteurs

    Essai, au début de ta fonction renderItem de mettre :

    
    if(item.getTagCompound() == null) {
    itemstack.setTagCompound(new NBTTagCompound());
    }
    else {
    ton code
    }
    
    

  • Correcteurs

    Décidément, faut en mettre partout de ces nullCheck.

    Soirée de +2, merci les gars.


  • Rédacteurs

    Dès que tu utilise les NBT d'un item il faut que tu vérifie si l'item si il en a, il si il en a pas tu lui en met, faut vraiment pas oublier