Problème de connection avec la redstone



  • 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 !


  • Administrateurs

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



  • @'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;
        }
    
    }
    

  • Administrateurs

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



  • @'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.


  • Administrateurs

    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.



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


  • Administrateurs

    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;
    }
    


  • 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.)



  • 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 !