MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Problème Setblockstate

    Planifier Épinglé Verrouillé Déplacé Résolu 1.8.x
    1.8.9
    21 Messages 3 Publieurs 3.0k Vues 1 Watching
    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.
    • robin4002R Hors-ligne
      robin4002 Moddeurs confirmés Rédacteurs Administrateurs
      dernière édition par

      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 réponse Dernière réponse Répondre Citer 0
      • Jerem_TechJ Hors-ligne
        Jerem_Tech
        dernière édition par

        Re ,

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

        Cordialement ,

        Jeremy60800

        1 réponse Dernière réponse Répondre Citer 0
        • DeletedD Hors-ligne
          Deleted
          dernière édition par

          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 réponse Dernière réponse Répondre Citer 0
          • Jerem_TechJ Hors-ligne
            Jerem_Tech
            dernière édition par

            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 réponse Dernière réponse Répondre Citer 0
            • robin4002R Hors-ligne
              robin4002 Moddeurs confirmés Rédacteurs Administrateurs
              dernière édition par

              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 réponse Dernière réponse Répondre Citer 0
              • Jerem_TechJ Hors-ligne
                Jerem_Tech
                dernière édition par

                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 réponse Dernière réponse Répondre Citer 0
                • robin4002R Hors-ligne
                  robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                  dernière édition par

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

                  1 réponse Dernière réponse Répondre Citer 0
                  • Jerem_TechJ Hors-ligne
                    Jerem_Tech
                    dernière édition par

                    Re ,

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

                    1 réponse Dernière réponse Répondre Citer 0
                    • Jerem_TechJ Hors-ligne
                      Jerem_Tech
                      dernière édition par

                      Re ,

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

                      Cordialement ,

                      Jeremy60800

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

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

                        1 réponse Dernière réponse Répondre Citer 0
                        • DeletedD Hors-ligne
                          Deleted
                          dernière édition par

                          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 réponse Dernière réponse Répondre Citer 0
                          • Jerem_TechJ Hors-ligne
                            Jerem_Tech
                            dernière édition par

                            Re ,

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

                            Cordialement ,

                            Jeremy60800

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

                              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 réponse Dernière réponse Répondre Citer 0
                              • Jerem_TechJ Hors-ligne
                                Jerem_Tech
                                dernière édition par

                                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 réponse Dernière réponse Répondre Citer 0
                                • robin4002R Hors-ligne
                                  robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                                  dernière édition par

                                  L’inverse si mes souvenirs sont bon.

                                  1 réponse Dernière réponse Répondre Citer 0
                                  • Jerem_TechJ Hors-ligne
                                    Jerem_Tech
                                    dernière édition par

                                    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 réponse Dernière réponse Répondre Citer 0
                                    • robin4002R Hors-ligne
                                      robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                                      dernière édition par

                                      La fonction exacte c’est ça :

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

                                      (10 est la valeur par défaut).

                                      1 réponse Dernière réponse Répondre Citer 0
                                      • Jerem_TechJ Hors-ligne
                                        Jerem_Tech
                                        dernière édition par

                                        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 réponse Dernière réponse Répondre Citer 0
                                        • robin4002R Hors-ligne
                                          robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                                          dernière édition par

                                          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 réponse Dernière réponse Répondre Citer 0
                                          • Jerem_TechJ Hors-ligne
                                            Jerem_Tech
                                            dernière édition par

                                            Re ,

                                            Pour le tickrate j’ai pas nécessairement besoin tout les ticks , c’était pour tester , vu que l’arbre doit pousser au bout d’un temps relativement long 😄
                                            Sinon pour l’update des blocks posé : parfait 😄

                                            Je passe ce sujet en résolu , merci pour votre aide !

                                            Cordialement ,

                                            Jeremy60800

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

                                            MINECRAFT FORGE FRANCE © 2024

                                            Powered by NodeBB