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

    Résolu onBlockDestroy ?

    1.7.x
    1.7.x
    3
    22
    3174
    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.
    • Flow
      Flow dernière édition par robin4002

      Hello, encore moi , toujours moi et cependant je fais des efforts juré !

      Je reviens avec un problème assez ennuyant , je pense avoir trouvé le gros de la fonction grâce aux tutos de robin sur l’effet sur la hache cet à dire que lorsqu’on casse un block sa effectue une action j’ai donc essayer de modifier le code à ma façon pour faire ce que je veut !

      Cependant j’aimerais vérifier le block que le joueur détruit par exemple vérifier que le block détruit est bien du bois de mon mod j’ai donc chercher partout et j’ai rien trouver pour faire ca et je ne suis pas un pro du modding je le répète , je suis en apprentissage 🙂

      voici le code que j’ai fait pour le moment ! 😉

      public void onBlockDestroy(World world, int x, int i , int z, EntityPlayer player)
      {
          ***ICI UNE CONDITION POUR VERIFIER***
          {
              world.setBlockToAir(x, i, z);
              player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false);
          }
      }
      

      Je ne sais pas quoi faire pour vérifier que si le block détruit est ce block alors il drop de facon random ( par après ) soit itemSevewithmosquito ou itemSeve ?

      De plus il faut qu’il soit détruit avec un outil spécial que j’ai créer ,le code est donc dans ma classe itemSuperAxe!

      Merci de votre aide 🙂

      Oui ce gif est drôle.

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

        if(world.getBlock(x, i, z) == TaClassePrincipale.tonBlock) // vérifie le bloc
        {
        world.setBlockToAir(x, i, z);
        if(world.rand.nextInt(2) == 0) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1)
        { //si il est égale à 0
        player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false);
        }
        else
        { //sinon il est forcement égale à 1
        player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSeve ), false);
        }
        }
        
        1 réponse Dernière réponse Répondre Citer 0
        • Flow
          Flow dernière édition par robin4002

          Oké j’ai compris le code avec le systeme de choix soit 0 ou 1 , mais quand je casse le block avec mon itemSuperAxe rien ne drop 😕

          Voici donc le code complet :

          public void onBlockDestroy(World world, int x, int i , int z, EntityPlayer player)
          {
          if(world.getBlock(x, i, z) == Blocks.wooden_slab) // vérifie le bloc
          {
          world.setBlockToAir(x, i, z);
          if(world.rand.nextInt(2) == 0) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1)
          { //si il est égale à 0
          player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false);
          }
          else
          { //sinon il est forcement égale à 1
          player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSeve ), false);
          }
          }
          }
          

          Oui ce gif est drôle.

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

            public void onBlockDestroy(World world, int x, int i , int z, EntityPlayer player)
            {
            if(world.getBlock(x, i, z) == Blocks.wooden_slab) // vérifie le bloc
            {
            System.out.println("je vais drop");
            world.setBlockToAir(x, i, z);
            if(world.rand.nextInt(2) == 0) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1)
            { //si il est égale à 0
            player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false);
            }
            else
            { //sinon il est forcement égale à 1
            player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSeve ), false);
            }
            }
            else
            {
            System.out.println("le bloc correspond pas, je drop rien " + world.getBlock(x, i, z).getUnlocalizedName());
            }
            }
            

            Il affiche quoi ?

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

              Wait, t’es bien dans la classe de ton bloc la non ?

              –------------------------------------------------------------------------------------
              Si tu trouves mon intervention pertinente, n'hésite pas a m…

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

                Ca ne drop rien et sa n’affiche rien également 😕

                Oui ce gif est drôle.

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

                  Tu l’as placés où ce code ?

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

                    Dans mon itemSuperAxe j’ai préciser “De plus il faut qu’il soit détruit avec un outil spécial que j’ai créer ,le code est donc dans ma classe itemSuperAxe!” Donc je suppose qu’il doit être dans la classe du block ?

                    Oui ce gif est drôle.

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

                      Normalement non, mets un @Override au dessus ?

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

                        Si je met un override au dessus sa souligne rouge et ca met qu’il faut remove le override 😕 Voici mon code complet

                        package mod.common;
                        import net.minecraft.entity.player.EntityPlayer;
                        import net.minecraft.block.Block;
                        import net.minecraft.client.renderer.texture.IIconRegister;
                        import net.minecraft.entity.EntityLivingBase;
                        import net.minecraft.entity.item.EntityItem;
                        import net.minecraft.init.Blocks;
                        import net.minecraft.init.Items;
                        import net.minecraft.item.Item;
                        import net.minecraft.item.ItemAxe;
                        import net.minecraft.item.ItemStack;
                        import net.minecraft.world.World;
                        
                        public class itemSuperAxe extends ItemAxe
                        {
                        public itemSuperAxe(ToolMaterial material)
                        {
                        super(material);
                        }
                        
                        @Override
                        public void onBlockDestroy(World world, int x, int i , int z, EntityPlayer player)
                        {
                        if(world.getBlock(x, i, z) == Blocks.planks) // vérifie le bloc
                        {
                        System.out.println("je vais drop");
                        world.setBlockToAir(x, i, z);
                        if(world.rand.nextInt(2) == 0) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1)
                        { //si il est égale à 0
                        player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false);
                        }
                        else
                        { //sinon il est forcement égale à 1
                        player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSeve ), false);
                        }
                        }
                        else
                        {
                        System.out.println("le bloc correspond pas, je drop rien " + world.getBlock(x, i, z).getUnlocalizedName());
                        }
                        }
                        
                        @Override
                        public void registerIcons(IIconRegister iconregister)
                        {
                        this.itemIcon = iconregister.registerIcon(ModMinecraft.MODID + ":itemSuperAxe");
                        }
                        
                        }
                        
                        

                        J’ai testé avec un block plein pour savoir si il y avais une différence…

                        Oui ce gif est drôle.

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

                          Ok, le problème c’est que c’est :
                          public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase living)
                          Et non
                          public void onBlockDestroy(World world, int x, int i , int z, EntityPlayer player)

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

                            Si je met public boolean , il me le souligne en rouge donc j’ai supposé qu’il fallait return quelques choses j’ai donc return tout ce que j’avais dans ma parenthèses du public boolean cependant , le return se souligne en rouge car il dit qu’il faut add arguments to match…

                            public boolean onBlockDestroyed(World world, int x, int i , int z, EntityPlayer player)
                            {
                            if(world.getBlock(x, i, z) == Blocks.planks) // vérifie le bloc
                            {
                            System.out.println("je vais drop");
                            world.setBlockToAir(x, i, z);
                            if(world.rand.nextInt(2) == 0) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1)
                            { //si il est égale à 0
                            player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false);
                            }
                            else
                            { //sinon il est forcement égale à 1
                            player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSeve ), false);
                            }
                            }
                            else
                            {
                            System.out.println("le bloc correspond pas, je drop rien " + world.getBlock(x, i, z).getUnlocalizedName());
                            
                            }
                            return super.onBlockDestroyed(world, x, i, z);
                            }
                            

                            EDIT EDIT EDIT

                            J’ai modifier comme ceci et ca ne me met plus aucune erreur est-ce que c’est bon comme cela ?

                            public boolean onBlockDestroyed(World world, int x, int i , int z, EntityPlayer player)
                            {
                            if(world.getBlock(x, i, z) == Blocks.planks) // vérifie le bloc
                            {
                            System.out.println("je vais drop");
                            world.setBlockToAir(x, i, z);
                            if(world.rand.nextInt(2) == 0) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1)
                            { //si il est égale à 0
                            player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false);
                            }
                            else
                            { //sinon il est forcement égale à 1
                            player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSeve ), false);
                            }
                            }
                            else
                            {
                            System.out.println("le bloc correspond pas, je drop rien " + world.getBlock(x, i, z).getUnlocalizedName());
                            }
                            return onBlockDestroyed(world, x, i, z, player);
                            }
                            
                            

                            Oui ce gif est drôle.

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

                              Non, absolument pas.
                              On peut pas inventer des méthodes comme ça, sauf si tu l’appelle quelque part.
                              Or public boolean onBlockDestroyed(World world, int x, int i , int z, EntityPlayer player) n’existe pas dans ItemTool.java, c’est :
                              public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase living)

                              Attention, les arguments change tout :

                              public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase living)
                              {
                              if(world.getBlock(x, y, z) == Blocks.planks) // vérifie le bloc
                              {
                              System.out.println("je vais drop");
                              world.setBlockToAir(x, y, z);
                              if(living instanceof EntityPlayer)
                              {
                              EntityPlayer player = (EntityPlayer)living;
                              if(world.rand.nextInt(2) == 0) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1)
                              { //si il est égale à 0
                              player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false);
                              }
                              else
                              { //sinon il est forcement égale à 1
                              player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSeve ), false);
                              }
                              }
                              }
                              else
                              {
                              System.out.println("le bloc correspond pas, je drop rien " + world.getBlock(x, i, z).getUnlocalizedName());
                              
                              }
                              return super.onBlockDestroyed(stack, world, block, x, y, z, living);
                              }
                              
                              1 réponse Dernière réponse Répondre Citer 0
                              • Flow
                                Flow dernière édition par

                                Ok sa drop l’item de facon random maintenant !! 😄 J’ai juste rajouter un autre if(world.rand.netInt(3) == 2) pour que parfois ils ne drop rien , il y a moyen de faire en sorte que l’item sevewithmosquito soit plus rare a drop ? De plus la c’est le player qui drop l’item et j’aimerais que se soit le “block” qui le drop , c’est possible ?

                                C’est bon du coup comme ca ?

                                if(living instanceof EntityPlayer)
                                {
                                EntityPlayer player = (EntityPlayer)living;
                                if(world.rand.nextInt(3) == 0) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1)
                                { //si il est égale à 0
                                player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSevewithmosquito), false);
                                }
                                
                                if(world.rand.nextInt(3) == 2) // génére un nombre entre 0 inclut et 2 exclut (donc 0 ou 1)
                                { //si il est égale à 0
                                
                                }
                                else
                                { //sinon il est forcement égale à 1
                                player.dropPlayerItemWithRandomChoice(new ItemStack(ModMinecraft.itemSeve ), false);
                                }
                                }
                                }
                                

                                Oui ce gif est drôle.

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

                                  int randInt = world.rand.nextInt(3)
                                  if(randInt == 0)
                                  {
                                  première action
                                  }
                                  else if(randInt == 1)
                                  {
                                  deuxième action
                                  }
                                  else
                                  {
                                  rien ou troisième action
                                  }
                                  

                                  Pour le drop, vire ta fonction actuel avec le joueur et remplace par :

                                  float f = 0.7F;
                                  double d0 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D;
                                  double d1 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D;
                                  double d2 = (double)(world.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D;
                                  EntityItem entityitem = new EntityItem(world, (double)x + d0, (double)y + d1, (double)z + d2, new ItemStack(world.getBlock(x, y, z), 1)); // instancie une nouvelle entité item avec les coordonnées + l'id et le metadata du bois
                                  entityitem.delayBeforeCanPickup = 10;
                                  world.spawnEntityInWorld(entityitem); // spawn l'entité item
                                  

                                  En plus j’ai donné cette fonction dans le tutoriel sur les outils …

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

                                    Je comprend la fonction ce que je comprend pas c’est comme je choisis l’item à droppé je viens de lire l’effet sur la hache dans Créer un kit d’outils et je vois toujours pas 😕 Je suis un peu perdu en fait la je dois t’avouer xD

                                    Oui ce gif est drôle.

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

                                      EntityItem entityitem = new EntityItem(world, (double)x + d0, (double)y + d1, (double)z + d2, new ItemStack(world.getBlock(x, i, z), 1));

                                      new ItemStack(bloc ou item, quantité, metadata)

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

                                        Et pour la fonction d’un qui est plus rare a drop que l’autre c’est possible ?

                                        Oui ce gif est drôle.

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

                                          Change le random …

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

                                            C’est à dire un code a rajouter ou dans le code que tu ma donner il y a une fonction précise , désoler je suis un gros boulet xD

                                            Oui ce gif est drôle.

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

                                            MINECRAFT FORGE FRANCE © 2018

                                            Powered by NodeBB