• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Résolu Item à planter ET manger

    1.8.x
    1.8.9
    4
    9
    1519
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • VoraX
      VoraX dernière édition par

      [font=Ubuntu, sans-serifJe suis sur Eclipse avec forge-1.8.9-11.15.1.1722-mdk .]

      [font=Ubuntu, sans-serifBonjour, après avoir réussi à faire mon orge (planté avec des graines, avec 7 états de croissance, et dropant à maturité des graines et leur “fruit”), j’aimerais faire quelque chose dans le même genre, mais avec une variante.]

      [font=Ubuntu, sans-serifJ’ai farfouillé un peu dans les fichiers du jeu, Eclipse, à la recherche des codes relatifs aux carottes. ]
      Mes recherches m’ont apporté une seule chose: ItemSeedFood.
      Peut-être cela a-t’il un rapport avec ce que je veux faire?

      Car oui, mon but est là:
      Créer une un item qui se mange ET se plante, en sachant que la plante ne drope que cet item en quantité définie (ou entre telle et telle quantité).

      Merci!

      Je suis la terreur un quart née!
      #Diablo #HOTS

      1 réponse Dernière réponse Répondre Citer 0
      • BrokenSwing
        BrokenSwing Moddeurs confirmés Rédacteurs dernière édition par

        C’est simple, tu fait de la même façon que pour une culture normale sauf que ta graine n’est plus un ItemSeed mais un ItemSeedFood

        public class ItemSeedFood extends ItemFood implements net.minecraftforge.common.IPlantable {
        public ItemSeedFood(int healAmount, float saturation, Block crops, Block soil)
        }
        

        Et ton BlockCrops renvoie le même item pour getSeed() et getCrop() et pour le nombre d’item qui drop il me semble que c’est

        public java.util.List <itemstack>getDrops(net.minecraft.world.IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
        
        ```</itemstack>
        1 réponse Dernière réponse Répondre Citer 1
        • robin4002
          robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

          Salut,
          Il suffit de regarder le code de la carotte :

          package net.minecraft.block;
          
          import net.minecraft.init.Items;
          import net.minecraft.item.Item;
          
          public class BlockCarrot extends BlockCrops
          {
          protected Item getSeed()
          {
          return Items.carrot;
          }
          
          protected Item getCrop()
          {
          return Items.carrot;
          }
          }
          
          1 réponse Dernière réponse Répondre Citer 0
          • VoraX
            VoraX dernière édition par

            Tout fonctionne bien maintenant, mais je n’y arrive pas avec cette fonction pour le bloc ‘BlockOnion’ :

            [font=monospacepublic][font=monospace java][font=monospace.][font=monospaceutil][font=monospace.][font=monospaceList][font=monospace<][font=monospaceItemStack][font=monospace>][font=monospace getDrops][font=monospace(][font=monospacenet][font=monospace.][font=monospaceminecraft][font=monospace.][font=monospaceworld][font=monospace.][font=monospaceIBlockAccess][font=monospace world][font=monospace,] [font=monospaceBlockPos][font=monospace pos][font=monospace,] [font=monospaceIBlockState][font=monospace state][font=monospace,] [font=monospaceint][font=monospace fortune][font=monospace)]

            Disons par exemple que je veux droper 3 items nommés ‘onion’ , je mets quoi dans cette ligne exactement? Et il ne faut remplacer qu’un seul des mots de cette ligne?

            Je suis la terreur un quart née!
            #Diablo #HOTS

            1 réponse Dernière réponse Répondre Citer 0
            • BrokenSwing
              BrokenSwing Moddeurs confirmés Rédacteurs dernière édition par

              Normalement ça devrait marcher si t’override la fonction, un truc comme ça :

              
              @Override
              public java.util.List <itemstack>getDrops(net.minecraft.world.IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
              {
              java.util.List <itemstack>ret = super.getDrops(world, pos, state, fortune);
              int age = ((Integer)state.getValue(AGE)).intValue();
              
              if (age >= 7)
              {
              ret.add(new ItemStack(this.getSeed(), 3, 0)); //Là tu met ce que tu veut en paramètre, t'es pas débile d'après se que j'ai vu donc tu devrait comprendre
              }
              return ret;
              }
              
              ```</itemstack></itemstack>
              1 réponse Dernière réponse Répondre Citer 0
              • AymericRed
                AymericRed dernière édition par

                Non, il faut changer ce que retourne la fonction :

                public List<itemstack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
                {
                List <itemstack>list = new ArrayList();
                list.add(new ItemStack(l\'item, la quantité, la metadata)); 
                list.add(new ItemStack(un autre item, la quantité, la metadata)); 
                //Et ainsi de suite, tu peux aussi faire des loots random en fonction de la fortune
                return list;
                }
                

                Pense à utiliser le state pour savoir si la plante était à maturité.
                EDIT : avec ce que BrokenSwing a mis : “int age = ((Integer)state.getValue(AGE)).intValue();”</itemstack></itemstack>

                Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

                1 réponse Dernière réponse Répondre Citer 0
                • VoraX
                  VoraX dernière édition par

                  1ère solution, pas d’erreur, mais droppe beaucoup trop (5 le plus souvent) malgré les réglages à la ligne:
                   ret.add(new ItemStack(this.getSeed(), 1, 3));

                  3 c’est bien le maximum non?

                  Et puis quand j’utilise cette solution, il y a certains items dropés qui n’ont pas de textures, alors que d’autres si, et ce sont les mêmes items!

                  Et puis le ‘(age >= 7)’ comme il y a 0,1,2,3 de croissance, il ne faudrait pas remplacer par 3? Ou alors il se base par rapport au json, et considère qu’il y a 7 formes de croissance, mais qu’on ne voit pas comme il y a 4 textures de croissance?

                  package fr.vorax.egypte.common;
                  
                  import net.minecraft.block.BlockCrops;
                  import net.minecraft.block.state.IBlockState;
                  import net.minecraft.item.Item;
                  import net.minecraft.item.ItemStack;
                  import net.minecraft.util.BlockPos;
                  
                  public class BlockOnion extends BlockCrops
                  {
                      @Override
                      protected Item getSeed()
                      {
                      return ModEgypte.onion;
                      }    
                  
                      @Override
                      protected Item getCrop()
                      {
                          return ModEgypte.onion;
                      }
                  
                      @Override
                      public java.util.List <itemstack>getDrops(net.minecraft.world.IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
                      {
                          java.util.List <itemstack>ret = super.getDrops(world, pos, state, fortune);
                          int age = ((Integer)state.getValue(AGE)).intValue();
                  
                          if (age >= 7)
                          {
                                ret.add(new ItemStack(this.getSeed(), 1, 3));
                          }
                          return ret;
                      }
                  
                  }
                  
                  

                  2ème solution, une erreur à list.add(new ItemStack(onion, 2, 0));

                  package fr.vorax.egypte.common;
                  
                  import java.util.ArrayList;
                  import java.util.List;
                  
                  import net.minecraft.block.BlockCrops;
                  import net.minecraft.block.state.IBlockState;
                  import net.minecraft.item.Item;
                  import net.minecraft.item.ItemStack;
                  import net.minecraft.util.BlockPos;
                  import net.minecraft.world.IBlockAccess;
                  
                  public class BlockOnion extends BlockCrops
                  {
                      @Override
                      protected Item getSeed()
                      {
                      return ModEgypte.onion;
                      }    
                  
                      @Override
                      protected Item getCrop()
                      {
                          return ModEgypte.onion;
                      }
                  
                      public List <itemstack>getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
                      {
                      List <itemstack>list = new ArrayList();
                      list.add(new ItemStack(onion, 2, 0)); 
                      //Et ainsi de suite, tu peux aussi faire des loots random en fonction de la fortune
                      return list;
                      }
                  
                  }
                  
                  

                  Une autre petite chose dont je ne m’étais pas rendu compte, piétiner les cultures (sauter dessus quoi) enlève la terre cultivée pour remettre le bloc de terre d’origine, mais la plante reste en place.
                  Comment faire pour que cette plante disparaisse et drope un item quand elle n’est pas à maturité et plusieurs items quand elle est à maturité?</itemstack></itemstack></itemstack></itemstack>

                  Je suis la terreur un quart née!
                  #Diablo #HOTS

                  1 réponse Dernière réponse Répondre Citer 0
                  • BrokenSwing
                    BrokenSwing Moddeurs confirmés Rédacteurs dernière édition par

                    Oui, désolé j’avais pas vu le super, ça donne plus un truc comme ça :

                    
                    @Override
                    public java.util.List <itemstack>getDrops(net.minecraft.world.IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
                    {
                    java.util.List <itemstack>ret = new ArrayList<itemstack>();
                    int age = ((Integer)state.getValue(AGE)).intValue();
                    
                    if (age >= 7)
                    {
                    ret.add(new ItemStack(this.getSeed(), 3, 0)); //CTRL + CLIC sur ItemStack -> ItemStack(Item itemIn, int amount, int meta), si tu met 3 en metadata c'est normal qu'il y est des problèmes de texture
                    }
                    return ret;
                    }
                    
                    

                    Pour ce qui est que la plante reste, je ne sais pas je vais voir et si jamais lorsque la plante se casse (par exemple si tu casse le bloc sur lequel elle est posée) et que ça ne drop pas 1 graine (comme le font la plupart des plantes de minecraft) Il fait que tu rajoute 1 graine à la list de drop en dehors de la condition de maturité et le reste à l’intérieur de la condition. Pour ce qui est de la propriétée AGE, il y a bien 8 states de qui vont de 0 à 7 (cf net.minecraft.block.BlockCrops), même si on utilise seulement 4 textures se qui correspond à 1 texture = 2 states

                    Pour la deuxième solution, ton problème et que tu as mal compris, il faut remplacer onion par l’item de tu veut droper (au pire met this.getSeed())</itemstack></itemstack></itemstack>

                    1 réponse Dernière réponse Répondre Citer 0
                    • VoraX
                      VoraX dernière édition par

                      C’est vrai que j’aurais dû faire un ctrl + clic gauche, m’enfin c’est bon, comme la 1ère méthode (corrigée) fonctionne, je l’ai adoptée, mais je vous remercie tous quand-même.

                      Ma plante d’onion drope donc 3 onions (oignons en Français pour ceux qui pensent que je ne sais pas écrire!), voilà c’est tout bon, merci!
                      Oui, c’est bien ça alors, il se base au json, mais en temps que joueur lambda, on ne voit que la croissance de la plante via texture, alors que le jeu, lui il sait que la croissance change dans les données, même si la texture est la même.

                      Sujet résolu!

                      Je suis la terreur un quart née!
                      #Diablo #HOTS

                      1 réponse Dernière réponse Répondre Citer 0
                      • 1 / 1
                      • Premier message
                        Dernier message
                      Design by Woryk
                      Contact / Mentions Légales

                      MINECRAFT FORGE FRANCE © 2018

                      Powered by NodeBB