• Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    Solved Problème Setblockstate

    1.8.x
    1.8.9
    3
    21
    2290
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Jerem_Tech
      Jerem_Tech last edited by

      Bonjour !

      Je viens vers vous car j’ai un soucis : j’ai créé un bloc qui permet de refaire pousser le tronc d’un arbre .
      Le problème est que les blocs que je fait apparaître sont des ghost blocs : on les casse il drops rien , et si on fait un clique comme si on voulait poser un bloc , il disparaît …
      J’ai essayer avec des blocs vanilla et même problème …

      Le code :

      @Override
         public void randomDisplayTick(World worldIn, BlockPos pos, IBlockState state, Random rand)
         {    
          if (rand.nextInt(5) < 0.9)
          {
          System.out.println("Execution");
          int numlog = 0;
          BlockPos pos1 = pos;
      
          for (int i = 1 ; i < 7 ; i++)
             {
          BlockPos posreplace = pos1.up(i);
          if (worldIn.getBlockState(posreplace).getBlock() == Blocks.air)
          {
          numlog++;
          }
          else if(worldIn.getBlockState(posreplace).getBlock() == Blocks.leaves)
          {
          numlog++;
          break;
          }
             }
      
          for (int i = 1 ; i < numlog ; i++)
          {
          BlockPos posreplace = pos1.up(i);
      
          if(worldIn.getBlockState(posreplace).getBlock() == Blocks.air)
          {
          worldIn.setBlockState(posreplace, BlockMod.natural_oak_log.getDefaultState(), 0);
          }
      
          if(i == numlog)
          {
          break;
          }
          }
          }
         }
      

      Merci d’avance !

      Cordialement ,

      Jeremy60800

      1 Reply Last reply Reply Quote 0
      • robin4002
        robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

        Salut,
        La raison est simple, randomDisplayTick n’est que appelé côté client.
        Donc les blocs sont juste sur ton world client, ils sont juste visuel.
        Si tu déco/reco ils vont aussi disparaitre.

        1 Reply Last reply Reply Quote 0
        • Jerem_Tech
          Jerem_Tech last edited by

          Re ,

          D’accord je comprned mieux 😄
          Du coup je peut passer par quel event pour fait côté serveur ?

          Cordialement ,

          Jeremy60800

          1 Reply Last reply Reply Quote 0
          • Deleted
            Deleted last edited by

            2 solutions envisageables je pense :
            -Soit associer une Tile Entity à ton block et te servir de la méthode invalide (ou updateEntity si le nom n’a pas encore changé), appelée côté serveur pour poser tes blocks…
            -Ou bien garder uniquement la classe de ton block, mais envoyer un packet au serveur, qui s’occupera alors de la pose des blocks.

            Je ne sais pas quelle option serait la + fluide, tout dépend si tu as beaucoup de ces blocks qui seraient en même temps sur la map, ou non.

            1 Reply Last reply Reply Quote 0
            • Jerem_Tech
              Jerem_Tech last edited by

              Re ,

              Merci . Du coup il risque d’y en avoir une assez grande quantité , quelle est la meilleure solution ?
              Et pour passer via des Packets , je peut setup ça comment ?

              Merci d’avance !

              Cordialeement ,

              Jeremy60800

              1 Reply Last reply Reply Quote 0
              • robin4002
                robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

                Il faut utiliser la fonction updateTick (pas de paquet (très mauvaise idée niveau sécurité), ni de tile entity (beaucoup trop lourd)).

                1 Reply Last reply Reply Quote 0
                • Jerem_Tech
                  Jerem_Tech last edited by

                  Re ,

                  J’ai donc tu mis dans la fonction UpdateTick mais elle n’est pas éxécuter …
                  Une idée pourquoi ?

                  public class DofusCraftOakLogRegenerator extends Block
                  {
                  public DofusCraftOakLogRegenerator(Material materialIn)
                     {
                         super(materialIn);
                         this.requiresUpdates();
                         this.setTickRandomly(true);
                     }
                  
                     @SideOnly(Side.CLIENT)
                     public EnumWorldBlockLayer getBlockLayer()
                     {
                         return EnumWorldBlockLayer.CUTOUT;
                     }
                  
                     public boolean isFullCube()
                     {
                         return true;
                     }
                  
                     public boolean isOpaqueCube()
                     {
                         return false;
                  
                     }
                  
                     public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand)
                     {    
                      System.out.println("Execution");
                      if (rand.nextInt(5) < 0.9)
                      {
                      System.out.println("Execution");
                      int numlog = 0;
                      BlockPos pos1 = pos;
                  
                      for (int i = 1 ; i < 7 ; i++)
                         {
                      BlockPos posreplace = pos1.up(i);
                      if (worldIn.getBlockState(posreplace).getBlock() == Blocks.air)
                      {
                      numlog++;
                      }
                      else if(worldIn.getBlockState(posreplace).getBlock() == Blocks.leaves)
                      {
                      numlog++;
                      break;
                      }
                         }
                  
                      for (int i = 1 ; i < numlog ; i++)
                      {
                      BlockPos posreplace = pos1.up(i);
                  
                      if(worldIn.getBlockState(posreplace).getBlock() == Blocks.air)
                      {
                      worldIn.setBlockState(posreplace, BlockMod.natural_oak_log.getDefaultState(), 0);
                      }
                  
                      if(i == numlog)
                      {
                      break;
                      }
                      }
                      }
                     }
                  }
                  
                  

                  Cordialement ,

                  Jeremy60800

                  1 Reply Last reply Reply Quote 0
                  • robin4002
                    robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

                    Si tu mets un @Override au dessus de updateTick ça passe où tu as une erreur ?

                    1 Reply Last reply Reply Quote 0
                    • Jerem_Tech
                      Jerem_Tech last edited by

                      Re ,

                      ça ne met pas d’erreur mais ça cha

                      1 Reply Last reply Reply Quote 0
                      • Jerem_Tech
                        Jerem_Tech last edited by

                        Re ,

                        Ça met pas d’erreur mais ça ne corrige pas le problème 😞

                        Cordialement ,

                        Jeremy60800

                        1 Reply Last reply Reply Quote 0
                        • robin4002
                          robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

                          Je ne vois pas pourquoi la fonction n’est pas appelé alors 😕

                          1 Reply Last reply Reply Quote 0
                          • Deleted
                            Deleted last edited by

                            Et ça donne quoi dans la console, tu reçois bien tes messages ?
                            Change tes différents println, afin qu’on puisse mieux se repérer, car tu as le même avant et après la condition. Change le 0.9 en un entier, on compare ici des integer et non des floats ou double.

                            1 Reply Last reply Reply Quote 0
                            • Jerem_Tech
                              Jerem_Tech last edited by

                              Re ,

                              Non rien dans la console , là est le problème 😞

                              Cordialement ,

                              Jeremy60800

                              1 Reply Last reply Reply Quote 0
                              • robin4002
                                robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

                                Tu as attendu combien de temps ?
                                Car la fonction updateTick n’est appelé très fréquemment.
                                Tu peux changer la fréquence avec la fonction int tickRate()

                                1 Reply Last reply Reply Quote 0
                                • Jerem_Tech
                                  Jerem_Tech last edited by

                                  Re ,

                                  A oui en effet en attendant plus ça s’exécute .

                                  Toutefois , le tick rate c’est plus le return est élevée , plus la fréquence est haute ?

                                  Cordialement ,

                                  Jeremy60800

                                  1 Reply Last reply Reply Quote 0
                                  • robin4002
                                    robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

                                    L’inverse si mes souvenirs sont bon.

                                    1 Reply Last reply Reply Quote 0
                                    • Jerem_Tech
                                      Jerem_Tech last edited by

                                      Re ,

                                      Alors que je le mette à 1 ou 500 , ça change rien 😞

                                      public class DofusCraftOakLogRegenerator extends Block
                                      {
                                      public DofusCraftOakLogRegenerator(Material materialIn)
                                         {
                                             super(materialIn);
                                             this.requiresUpdates();
                                             this.tickRate();
                                      
                                         }
                                      
                                         @SideOnly(Side.CLIENT)
                                         public EnumWorldBlockLayer getBlockLayer()
                                         {
                                             return EnumWorldBlockLayer.CUTOUT;
                                         }
                                      
                                         public boolean isFullCube()
                                         {
                                             return true;
                                         }
                                      
                                         public boolean isOpaqueCube()
                                         {
                                             return false;
                                      
                                         }
                                      
                                         int tickRate()
                                         {
                                      return 1;  
                                         }
                                      
                                         @Override
                                         public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand)
                                         {    
                                          System.out.println("Execution condition");
                                          int numlog = 0;
                                          BlockPos pos1 = pos;
                                      
                                          for (int i = 1 ; i < 7 ; i++)
                                             {
                                          BlockPos posreplace = pos1.up(i);
                                          if (worldIn.getBlockState(posreplace).getBlock() == Blocks.air)
                                          {
                                          numlog++;
                                          }
                                          else if(worldIn.getBlockState(posreplace).getBlock() == Blocks.leaves)
                                          {
                                          numlog++;
                                          break;
                                          }
                                             }
                                      
                                          for (int i = 1 ; i < numlog ; i++)
                                          {
                                          BlockPos posreplace = pos1.up(i);
                                      
                                          if(worldIn.getBlockState(posreplace).getBlock() == Blocks.air)
                                          {
                                          worldIn.setBlockState(posreplace, BlockMod.natural_oak_log.getDefaultState(), 0);
                                          worldIn.notifyNeighborsOfStateChange(posreplace, Blocks.air);
                                          }
                                      
                                          if(i == numlog)
                                          {
                                          break;
                                          }
                                          }
                                      
                                         }
                                      }
                                      
                                      

                                      Cordialement ,

                                      Jeremy60800

                                      1 Reply Last reply Reply Quote 0
                                      • robin4002
                                        robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

                                        La fonction exacte c’est ça :

                                        public int tickRate(World worldIn)
                                        {
                                        return 10;
                                        }
                                        

                                        (10 est la valeur par défaut).

                                        1 Reply Last reply Reply Quote 0
                                        • Jerem_Tech
                                          Jerem_Tech last edited by

                                          Re ,

                                          Si je veux éxécuter tout les ticks je fait comment ?
                                          J’ai l’impression que ça change rien toujours en plus 😞

                                          Autre chose : le setblock state fonctionne mais il faudrais update les blocks car sinon il sont invisible : possible ?

                                          Code actuelle (j’ai fait pas mal de modif peut-être qu’il y a un souci …)

                                          public class DofusCraftOakLogRegenerator extends Block
                                          {
                                          public DofusCraftOakLogRegenerator(Material materialIn)
                                             {
                                                 super(materialIn);
                                             }
                                          
                                             @SideOnly(Side.CLIENT)
                                             public EnumWorldBlockLayer getBlockLayer()
                                             {
                                                 return EnumWorldBlockLayer.CUTOUT;
                                             }
                                          
                                             public boolean isFullCube()
                                             {
                                                 return true;
                                             }
                                          
                                             public boolean isOpaqueCube()
                                             {
                                                 return false;
                                          
                                             }
                                          
                                             public int tickRate(World worldIn)
                                             {
                                                 return 0;
                                             }
                                          
                                             @Override
                                             public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand)
                                             {    
                                              System.out.println("Execution condition");
                                              int numlog = 0;
                                              BlockPos pos1 = pos;
                                          
                                              for (int i = 1 ; i < 7 ; i++)
                                                 {
                                              BlockPos posreplace = pos1.up(i);
                                              if (worldIn.getBlockState(posreplace).getBlock() == Blocks.air)
                                              {
                                              numlog++;
                                              }
                                              else if(worldIn.getBlockState(posreplace).getBlock() == Blocks.leaves)
                                              {
                                              numlog++;
                                              break;
                                              }
                                                 }
                                          
                                              for (int i = 1 ; i < numlog ; i++)
                                              {
                                              BlockPos posreplace = pos1.up(i);
                                          
                                              if(worldIn.getBlockState(posreplace).getBlock() == Blocks.air)
                                              {
                                              worldIn.setBlockState(posreplace, BlockMod.natural_oak_log.getDefaultState(), 0);
                                              worldIn.notifyNeighborsOfStateChange(posreplace, Blocks.air);
                                              }
                                          
                                              if(i == numlog)
                                              {
                                              break;
                                              }
                                              }
                                          
                                             }
                                          }
                                          
                                          

                                          Cordialement ,

                                          Jeremy60800

                                          1 Reply Last reply Reply Quote 0
                                          • robin4002
                                            robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

                                            worldIn.setBlockState(posreplace, BlockMod.natural_oak_log.getDefaultState(), 3);
                                            au lieu de
                                            worldIn.setBlockState(posreplace, BlockMod.natural_oak_log.getDefaultState(), 0);
                                            (le flag 3 fait une mise à jour alors que le 0 non).

                                            Pour la fréquence de tick je ne crois pas que c’est possible de le mettre à tous les ticks. Cette fonction n’est pas pensé pour ça à la base (elle est pensé pour avoir un appel de temps en temps, pour faire pousser les plantes principalement).
                                            Si tu as vraiment besoin d’update à chaque tick il faut un tile entity.

                                            1 Reply Last reply Reply Quote 0
                                            • 1
                                            • 2
                                            • 1 / 2
                                            • First post
                                              Last post
                                            Design by Woryk
                                            Contact / Mentions Légales

                                            MINECRAFT FORGE FRANCE © 2018

                                            Powered by NodeBB