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

    Résolu Problème de connection avec la redstone

    1.8.x
    1.8
    2
    10
    2429
    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.
    • LeBossMax2
      LeBossMax2 dernière édition par robin4002

      Bonjour ! J’ai créer un mod avec forge 11.14.4.1563 mdk pour minecraft 1.8 dans lequel j’ai créé un détecteur de block qui active la redstone si il y a un block solide devant lui.
      Mon block se comporte comme une dalle: la redstone placée sur mon détecteur et la redstone placé dessous se connectent mal à la redstone à coté de mon détecteur.
      0_1537627719235_2016-01-08_21.43.19.png
      Ce qui fait que lorsque l’on alimente la redstone au dessus, ça active aucune redstone (alors que ça devrais activer celle à coté)
      0_1537627739026_2016-01-08_21.43.28.png
      et lorsque l’on alimente la redstone au dessous, ça active les deux autres redstone (alors que c’est censé en activé aucune).
      0_1537627757218_2016-01-08_21.43.40.png

      J’ai remarqué que si j’enlève se qui permet à mon block de se connecter à la redstone :

      public boolean canProvidePower()
          {
              return true;
          }
      

      ou que j’ajoute :

      public boolean isNormalCube()
          {
              return true;
          }
      

      Mon block n’active plus la redstone si il y a un block devant mais il n’y a plus le problème de connexion entre les redstones.
      Aidez-moi, s’il vous plais !

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

        Normalement il faut juste la fonction isNormalCube.
        Tu peux envoyer le code complet du bloc.

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

          @‘robin4002’:

          Normalement il faut juste la fonction isNormalCube.
          Tu peux envoyer le code complet du bloc.

          Si je met isNarmal Cube, je ne sais pas pourquoi mais ça désactive le détection de block.

          Code du block :

          package com.nomdemonmod.mod.blocks;
          
          import net.minecraft.block.Block;
          import net.minecraft.block.BlockDirectional;
          import net.minecraft.block.material.Material;
          import net.minecraft.block.properties.IProperty;
          import net.minecraft.block.properties.PropertyBool;
          import net.minecraft.block.properties.PropertyEnum;
          import net.minecraft.block.state.BlockState;
          import net.minecraft.block.state.IBlockState;
          import net.minecraft.entity.EntityLivingBase;
          import net.minecraft.util.BlockPos;
          import net.minecraft.util.EnumFacing;
          import net.minecraft.util.IStringSerializable;
          import net.minecraft.world.IBlockAccess;
          import net.minecraft.world.World;
          
          public class BlockDetector extends BlockDirectional
          {
          
              public static final PropertyBool POWERED = PropertyBool.create("powered");
          
              public BlockDetector(Material materialIn)
              {
                  super(materialIn);
                  this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH).withProperty(POWERED, Boolean.valueOf(false)));
              }
          
              public void onBlockAdded(World worldIn, BlockPos pos, IBlockState state)
              {
                  if (!worldIn.isRemote)
                  {
                      this.checkForBlock(worldIn, pos, state);
                  }
              }
          
              public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
              {
                  return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite());
              }
          
              public IBlockState getStateFromMeta(int meta)
              {
                  return this.getDefaultState().withProperty(FACING, EnumFacing.getHorizontal(meta)).withProperty(POWERED, Boolean.valueOf((meta & 4) > 0));
              }
          
              public int getMetaFromState(IBlockState state)
              {
                  byte b0 = 0;
                  int i = b0 | ((EnumFacing)state.getValue(FACING)).getHorizontalIndex();
          
                  if (((Boolean)state.getValue(POWERED)).booleanValue())
                  {
                      i |= 4;
                  }
                  return i;
              }
          
              protected BlockState createBlockState()
              {
                  return new BlockState(this, new IProperty[] {FACING, POWERED});
              }
          
              public boolean canProvidePower()
              {
                  return true;
              }
          
              public void onNeighborBlockChange(World worldIn, BlockPos pos, IBlockState state, Block neighborBlock)
              {
                  if (!worldIn.isRemote)
                  {
                      this.checkForBlock(worldIn, pos, state);
                  }
              }
          
              private void checkForBlock(World worldIn, BlockPos pos, IBlockState state)
              {
                  EnumFacing dir = (EnumFacing)state.getValue(FACING);
                  boolean isOn = ((Boolean)state.getValue(POWERED)).booleanValue();
                  Boolean shouldBeOn;
          
                  if (worldIn.isSideSolid(pos.offset(dir), dir.getOpposite()))
                  {
                      shouldBeOn = true;
                  }
                  else
                  {
                      shouldBeOn = false;
                  }
          
                  if (shouldBeOn != isOn)
                  {
                      worldIn.setBlockState(pos, this.getDefaultState().withProperty(FACING, dir).withProperty(POWERED, shouldBeOn), 4);
                      worldIn.notifyNeighborsOfStateChange(pos, this);
                  }
              }
          
              public int isProvidingWeakPower(IBlockAccess worldIn, BlockPos pos, IBlockState state, EnumFacing side)
              {
                  return (((Boolean)state.getValue(POWERED)).booleanValue()) ? 15: 0;
              }
          
              public boolean isSideSolid(IBlockAccess world, BlockPos pos, EnumFacing side)
              {
                  return true;
              }
          
          }
          
          1 réponse Dernière réponse Répondre Citer 0
          • robin4002
            robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

            if (worldIn.isSideSolid(pos.offset(dir), dir.getOpposite()))
            Pourquoi tu utilises ça ?
            Vérifies simplement que le bloc n’est pas de l’air.

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

              @‘robin4002’:

              if (worldIn.isSideSolid(pos.offset(dir), dir.getOpposite()))
              Pourquoi tu utilises ça ?
              Vérifies simplement que le bloc n’est pas de l’air.

              C’est juste pour pouvoir détecter le sens dans lequel est un escalier ou par exemple pour ne pas détecter le verre.

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

                Sauf que le problème vient sûrement aussi de la. Je vais voir de mon côté comment faire des que je serais de retour devant mon PC.

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

                  J’ai déjà essayé avec : if (worldIn.isAirBlock(pos.offset(dir))) mais j’ai toujours le même problème.

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

                    Bon par défaut shouldCheckWeakPower return isNormalCube, donc c’est true si c’est isNormalCube et false sinon.
                    Sauf que la condition est étrangement inversé dans la classe world :

                    public int getRedstonePower(BlockPos pos, EnumFacing facing)
                    {
                    IBlockState iblockstate = this.getBlockState(pos);
                    Block block = iblockstate.getBlock();
                    return block.shouldCheckWeakPower(this, pos, facing) ? this.getStrongPower(pos) : block.isProvidingWeakPower(this, pos, iblockstate, facing);
                    }
                    

                    du-coup il check isProvidingWeakPower si shouldCheckWeakPower est false.

                    Donc tu as juste à mettre ses deux fonctions dans ton bloc :

                    public boolean isNormalCube()
                    {
                    return true;
                    }
                    
                    public boolean shouldCheckWeakPower(IBlockAccess world, BlockPos pos, EnumFacing side)
                    {
                    return false;
                    }
                    
                    1 réponse Dernière réponse Répondre Citer 0
                    • LeBossMax2
                      LeBossMax2 dernière édition par

                      Merci pour ta réponse, je ne peut pas encore essayer ça car je ne peut pas aller sur mon ordinateur en semaine, mais se week-end, je testerais. ( si ça fonctionne, j’enverrais un petit message et je mettrais le sujet en résolu.)

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

                        Encore merci ronin4002, ça fonctionne bien, j’ai juste modifié de manière a ce que mon block puisse transmettre les signal redstone lorsqu’il est activé par un repeater ou une torche :

                        public boolean shouldCheckWeakPower(IBlockAccess world, BlockPos pos, EnumFacing side)
                            {
                                return !((Boolean)world.getBlockState(pos).getValue(POWERED)).booleanValue();
                            }
                        

                        Je suis contant de voir que le premier vrais block que je code fonctionne bien. Je me met maintenant au travail pour un tapi roulant !

                        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