Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[SOLVED] Redstone Signal and Block Properties


 Share

Recommended Posts

Posted (edited)

Hallo all

I'm trying to create a machine that works on redstone signal. The basis block contains three properties; FACING, LIT and POWERED. The idea is that this machine can only work when connected to a redstone signal so I'm using hasNeighborSignal() (in the NeighborChanged() method) to find out if there's a redstone signal. I'm using the code found in the RedstoneLampBlock class (changed LIT into POWERED of course), but the POWERED property won't change.

1. What am I doing wrong?

2. Can anyone explain the pState.cycle() method? No idea what it really does.

 

Here's my code:

public class AlloyMixerBlock extends BaseEntityBlock
{
    public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING;
    public static final BooleanProperty POWERED = BlockStateProperties.POWERED;
    public static final BooleanProperty LIT = BlockStateProperties.LIT;

    public AlloyMixerBlock(Properties properties)
    {
        super(properties);
        this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(POWERED, Boolean.valueOf(false)).setValue(LIT, Boolean.valueOf(false)));
    }

    @Override
    public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit)
    {
        if (!pLevel.isClientSide())
        {
            BlockEntity entity = pLevel.getBlockEntity(pPos);
            if(entity instanceof AlloyMixerBlockEntity) {
                NetworkHooks.openGui(((ServerPlayer)pPlayer), (AlloyMixerBlockEntity)entity, pPos);
            } else {
                throw new IllegalStateException("Our Container provider is missing!");
            }
        }
        return InteractionResult.sidedSuccess(pLevel.isClientSide());
    }

    @Override
    public BlockState getStateForPlacement(BlockPlaceContext pContext)
    {
        return this.defaultBlockState().setValue(POWERED, Boolean.valueOf(pContext.getLevel().hasNeighborSignal(pContext.getClickedPos()))).setValue(FACING, pContext.getHorizontalDirection().getOpposite()).setValue(LIT, Boolean.valueOf(false));
    }

    @Override
    public BlockState rotate(BlockState pState, Rotation pRotation)
    {
        return pState.setValue(FACING, pRotation.rotate(pState.getValue(FACING)));
    }

    @Override
    public BlockState mirror(BlockState pState, Mirror pMirror)
    {
        return pState.rotate(pMirror.getRotation(pState.getValue(FACING)));
    }

    @Override
    protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> pBuilder)
    {
        pBuilder.add(FACING, POWERED, LIT);
    }

    @Override
    public RenderShape getRenderShape(BlockState pState)
    {
        return RenderShape.MODEL;
    }

    @Override
    public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving)
    {
        if (pState.getBlock() != pNewState.getBlock()) {
            BlockEntity blockEntity = pLevel.getBlockEntity(pPos);
            if (blockEntity instanceof AlloyMixerBlockEntity) {
                ((AlloyMixerBlockEntity) blockEntity).drops();
            }
        }
        super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving);
    }

    @Nullable
    @Override
    public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState)
    {
        return new AlloyMixerBlockEntity(pPos, pState);
    }

    @Override
    public void neighborChanged(BlockState pState, Level pLevel, BlockPos pPos, Block pBlock, BlockPos pFromPos, boolean pIsMoving)
    {
        ShowCurrentState("Before NeighborChanged:", pLevel, pState, pPos);
        if (!pLevel.isClientSide) {
            boolean flag = pState.getValue(POWERED);
            if (flag != pLevel.hasNeighborSignal(pPos)) {
                if (flag) {
                    Extreme_Survival.LOGGER.info("Flag != hasNeighborSignal and Flag = true");
                    pLevel.scheduleTick(pPos, this, 4);
                } else {
                    Extreme_Survival.LOGGER.info("Flag != hasNeighborSignal and Flag = false");
                    pLevel.setBlock(pPos, pState.cycle(POWERED), 2);
                }
            }
            else
            {
                Extreme_Survival.LOGGER.info("Flag equals pState");
            }
        }
        else

        {
            Extreme_Survival.LOGGER.info("Clientside!!!");
        }
        ShowCurrentState("After NeighborChanged:", pLevel, pState, pPos);
    }

 

// Just for debugging!

    private void ShowCurrentState(String title, Level pLevel, BlockState pState, BlockPos pPos)
    {
        Extreme_Survival.LOGGER.info(title);
        Extreme_Survival.LOGGER.info("======================================");
        Extreme_Survival.LOGGER.info("hasSignal: " + pLevel.hasNeighborSignal(pPos));
        Extreme_Survival.LOGGER.info("POWERED  : " + pState.getValue(POWERED));
        Extreme_Survival.LOGGER.info("LIT      : " + pState.getValue(LIT));
        Extreme_Survival.LOGGER.info("--------------------------------------");
        if (!pState.getValue(POWERED)) {
            pLevel.setBlock(pPos, pState.setValue(LIT, Boolean.valueOf(false)), 2);
        }
        Extreme_Survival.LOGGER.info("hasSignal: " + pLevel.hasNeighborSignal(pPos));
        Extreme_Survival.LOGGER.info("POWERED  : " + pState.getValue(POWERED));
        Extreme_Survival.LOGGER.info("LIT      : " + pState.getValue(LIT));
        Extreme_Survival.LOGGER.info("======================================");
    }
}

 

Edited by Def Daemon
Link to comment
Share on other sites

Well I added the following code, it doesn't change anything...

What does cycle() actually do?

 

public void tick(BlockState pState, ServerLevel pLevel, BlockPos pPos, Random pRand) {

    if (pState.getValue(POWERED) && !pLevel.hasNeighborSignal(pPos)) {

             pLevel.setBlock(pPos, pState.cycle(POWERED), 2); }

}

Link to comment
Share on other sites

The issue is your ShowCurrentState method. You call it with the previous state at the end of neighborChanged. It then sees "oh, this state has POWERED" at false, so I better turn the light off!". It then overwrites the current state at the position based on this state (which is still powered off!) with the light off. Undoing any previous change that neighborChanged did.

Link to comment
Share on other sites

Well changed the code into this and it works like a charm....thnx m8.... up to the fun part (BlockEntity)

    @Override
    public void neighborChanged(BlockState pState, Level pLevel, BlockPos pPos, Block pBlock, BlockPos pFromPos, boolean pIsMoving)
    {
        if (!pLevel.isClientSide) {
            boolean flag = pState.getValue(POWERED);
            if (flag != pLevel.hasNeighborSignal(pPos)) {
                if (flag) {
                    pLevel.scheduleTick(pPos, this, 4);
                } else {
                    pLevel.setBlock(pPos, pState.cycle(POWERED), 2);
                }
            }
        }
        UpdateCurrentState(pLevel, pState, pPos);
    }

    private void UpdateCurrentState(Level pLevel, BlockState pState, BlockPos pPos)
    {
        if(!pLevel.hasNeighborSignal(pPos))
        {
            pState.setValue(LIT, false);
        }
    }


    public void tick(BlockState pState, ServerLevel pLevel, BlockPos pPos, Random pRand)
    {
        if (pState.getValue(POWERED) && !pLevel.hasNeighborSignal(pPos))
        {
            pLevel.setBlock(pPos, pState.cycle(POWERED), 2);
        }
        UpdateCurrentState(pLevel, pState, pPos);
    }

 

Link to comment
Share on other sites

  • Def Daemon changed the title to [SOLVED] Redstone Signal and Block Properties

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.