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

    Résolu Block

    1.8.x
    1.8
    4
    9
    2070
    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.
    • Gabs
      Gabs dernière édition par

      Bonjour,

      Alors je rencontre un problème: Je fait un bloc propre (en l’occurrence block1) qui se salit au bout de 6 secondes en block sale (bloc de bedrock), une fois le block1 (bloc propre) remplasser par le bloc de bedrock (bloc sale) il faut le nettoyer avec un item balai en fessant un clic droit sur le bloc de bedrock pour le remplacer par un bloc propre (block1) et remettre le timer .

      Tout ça marche mais y’a un problème c’est que le timer reste a -1 et se remet pas a 6*20

      Code (Vous comprendrez mieux ^^):

      package com.CSC.net.item;
      
      import java.util.Random;
      
      import net.minecraft.block.Block;
      import net.minecraft.block.material.Material;
      import net.minecraft.block.state.IBlockState;
      import net.minecraft.entity.player.EntityPlayer;
      import net.minecraft.init.Blocks;
      import net.minecraft.util.BlockPos;
      import net.minecraft.util.EnumFacing;
      import net.minecraft.world.World;
      import net.minecraftforge.fml.relauncher.Side;
      import net.minecraftforge.fml.relauncher.SideOnly;
      
      public class block1 extends Block {
      
      protected block1(Material materialIn) {
      super(materialIn);
      this.setTickRandomly(true);
      }
      private int timer = 6 * 20; // timer 6 * 20 donc 6 secondes.
      
      @SideOnly(Side.CLIENT)
          public void randomDisplayTick(World world, BlockPos pos, IBlockState state, Random rand) 
      {
      if(timer > 0) // Si le timer et plus grand que 0
      {
      timer–; // on soustrait le timer tant qu'il n'atteint pas 0
      System.out.println(timer);
      }
      else if(timer == 0) // quand le timer atteint 0
      {
      world.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), Blocks.bedrock.getDefaultState()); // On remplace le block1 (propre) en bloc de bedrock (sale)
      timer = -1;// et on met le timer a -1.
      }
      }
      
      public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ)
         {
      if(state.getBlock() == Blocks.bedrock && playerIn.getItemInUse().getItem() == CSCItems.balai && timer == -1)
      {
      worldIn.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), CSCBlocks.block1.getDefaultState()); // on remplace le bloc sale par un bloc propre
      timer = 6 * 20; // et on remet le timer a 6 * 20 pour re rentrer dans la boucle timer > 0 Le soucis est que le timer reste a -1 et que meme si le joueur clique droit sans l'item balai ça marche.
      //J'ai essayer avec l'event PlayerInteractEvent c'était le même soucis le timer restait a -1
      
      }
      System.out.println(timer);
             return false;
         }
      
      }
      
      

      Merci

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

        Ton timer est un variable global à la classe, or ta classe n’a qu’une seule instance partagé entre tous les blocs.
        Donc ta variable timer est partagé entre tous les blocs.
        D’où l’intérêt des tile entity.
        Mais ton cas ce n’est pas nécessaire, car on peut se passer de cette variable grâce à la fonction tickRate et updateTick.

        Ah et utiliser randomDisplayTick pour faire un setBlockState c’est du n’importe quoi.
        On ne fait pas un setBlockState côté client …

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

          Salut
          Tu as fais en sorte que si le timer est à zéro, ça le met à -1. Sauf que tu l’as mis dans la fonction randomDisplayTick, qui est appelé à chaque tick. Du coup, dès que le timer passe à 0, ça le met à -1.

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

            @‘robin4002’:

            Ton timer est un variable global à la classe, or ta classe n’a qu’une seule instance partagé entre tous les blocs.
            Donc ta variable timer est partagé entre tous les blocs.
            D’où l’intérêt des tile entity.
            Mais ton cas ce n’est pas nécessaire, car on peut se passer de cette variable grâce à la fonction tickRate et updateTick.

            Ah et utiliser randomDisplayTick pour faire un setBlockState c’est du n’importe quoi.
            On ne fait pas un setBlockState côté client …

            Comment je peux faire alors que au bout de 6 secondes le bloc change ?

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

              Avec la fonction tickRate, tu return l’équivalent de 6 secondes (1sec = 20ticks), et dans updateTick, tu set le block “sale”.

              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 1
              • Gabs
                Gabs dernière édition par

                @‘AymericRed’:

                Avec la fonction tickRate, tu return l’équivalent de 6 secondes (1sec = 20ticks), et dans updateTick, tu set le block “sale”.

                thx

                edit:

                Petite question: Normal que c’est pas vraiment juste le tickRate des fois il met du temps des fois non un peu bizarre.

                Et j’ai une question aussi si je veux faire spawn un bloc sur les blocs sale mais pas sur tout les blocs sale sur quelques un aléatoirement quoi, comment je peux faire ?

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

                  Oui c’est un peu aléatoire, je crois pas qu’on puisse le retirer.
                  Pour le spawn aléatoire, tu fais un ```java
                  if(world.rand.nextInt(2) == 0) //Là tu auras une chance sur deux

                  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
                  • robin4002
                    robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

                    Si, on peut enlever le random. Il suffit d’utiliser la méthode world.scheduleUpdate(pos, this, this.tickRate(world)); à l’intérieur de la fonction update et de la fonction onBlockAdded
                    C’est comme ça que les liquides fonctionnent.

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

                      super merci ?!

                      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