From 6898f932a0ea1c3eaa5180edf15d749a774eb9d1 Mon Sep 17 00:00:00 2001 From: SquidDev Date: Mon, 22 Apr 2019 11:40:19 +0100 Subject: [PATCH 1/2] Remove redstone blocked checks This has been returning false for almost 2 years (since 8abff95441b87df733df839eca6c373513e0487b). At this point, it's probably worth just dropping it entirely. --- .../computer/blocks/TileComputerBase.java | 25 ++++++------------- .../shared/turtle/blocks/TileTurtle.java | 6 ----- 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java index 91913ae72e..f9d7ae66eb 100644 --- a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java +++ b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java @@ -124,16 +124,14 @@ else if( !player.isSneaking() ) @Override public boolean getRedstoneConnectivity( EnumFacing side ) { - if( side == null ) return false; - ComputerSide localDir = remapLocalSide( DirectionUtil.toLocal( this, side.getOpposite() ) ); - return !isRedstoneBlockedOnSide( localDir ); + return true; } @Override public int getRedstoneOutput( EnumFacing side ) { ComputerSide localDir = remapLocalSide( DirectionUtil.toLocal( this, side ) ); - if( !isRedstoneBlockedOnSide( localDir ) && world != null && !world.isRemote ) + if( world != null && !world.isRemote ) { ServerComputer computer = getServerComputer(); if( computer != null ) return computer.getRedstoneOutput( localDir ); @@ -144,15 +142,14 @@ public int getRedstoneOutput( EnumFacing side ) @Override public boolean getBundledRedstoneConnectivity( @Nonnull EnumFacing side ) { - ComputerSide localDir = remapLocalSide( DirectionUtil.toLocal( this, side ) ); - return !isRedstoneBlockedOnSide( localDir ); + return true; } @Override public int getBundledRedstoneOutput( @Nonnull EnumFacing side ) { ComputerSide localDir = remapLocalSide( DirectionUtil.toLocal( this, side ) ); - if( !isRedstoneBlockedOnSide( localDir ) && !world.isRemote ) + if( !world.isRemote ) { ServerComputer computer = getServerComputer(); if( computer != null ) return computer.getBundledRedstoneOutput( localDir ); @@ -259,11 +256,6 @@ protected boolean isPeripheralBlockedOnSide( ComputerSide localSide ) return false; } - protected boolean isRedstoneBlockedOnSide( ComputerSide localSide ) - { - return false; - } - protected ComputerSide remapLocalSide( ComputerSide localSide ) { return localSide; @@ -273,11 +265,10 @@ private void updateSideInput( ServerComputer computer, EnumFacing dir, BlockPos { EnumFacing offsetSide = dir.getOpposite(); ComputerSide localDir = remapLocalSide( DirectionUtil.toLocal( this, dir ) ); - if( !isRedstoneBlockedOnSide( localDir ) ) - { - computer.setRedstoneInput( localDir, getWorld().getRedstonePower( offset, dir ) ); - computer.setBundledRedstoneInput( localDir, BundledRedstone.getOutput( getWorld(), offset, offsetSide ) ); - } + + computer.setRedstoneInput( localDir, getWorld().getRedstonePower( offset, dir ) ); + computer.setBundledRedstoneInput( localDir, BundledRedstone.getOutput( getWorld(), offset, offsetSide ) ); + if( !isPeripheralBlockedOnSide( localDir ) ) { computer.setPeripheral( localDir, Peripherals.getPeripheral( getWorld(), offset, offsetSide ) ); diff --git a/src/main/java/dan200/computercraft/shared/turtle/blocks/TileTurtle.java b/src/main/java/dan200/computercraft/shared/turtle/blocks/TileTurtle.java index e36edfbac5..b96dd68682 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/blocks/TileTurtle.java +++ b/src/main/java/dan200/computercraft/shared/turtle/blocks/TileTurtle.java @@ -317,12 +317,6 @@ protected boolean isPeripheralBlockedOnSide( ComputerSide localSide ) return hasPeripheralUpgradeOnSide( localSide ); } - @Override - protected boolean isRedstoneBlockedOnSide( ComputerSide localSide ) - { - return false; - } - // IDirectionalTile @Override From 7071cc972bb504441dfb583abd1bc1f827f66ea1 Mon Sep 17 00:00:00 2001 From: SquidDev Date: Mon, 22 Apr 2019 11:52:01 +0100 Subject: [PATCH 2/2] Make redstone behaviour consistent with repeaters This uses the same behaviour that repeaters and comparators do for determining their input, meaning that redstone directly connected to the computer is read (as you would expect). It's worth noting that this is a shift from previous behaviour. Therefore, it runs the (small) risk of breaking existing builds. However, I believe it is more consistent with the expected behaviour. --- .../computer/blocks/TileComputerBase.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java index f9d7ae66eb..c6f796ee4b 100644 --- a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java +++ b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java @@ -22,7 +22,10 @@ import dan200.computercraft.shared.util.RedstoneUtil; import joptsimple.internal.Strings; import net.minecraft.block.Block; +import net.minecraft.block.BlockRedstoneWire; +import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -34,6 +37,7 @@ import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.IWorldNameable; +import net.minecraft.world.World; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -266,7 +270,7 @@ private void updateSideInput( ServerComputer computer, EnumFacing dir, BlockPos EnumFacing offsetSide = dir.getOpposite(); ComputerSide localDir = remapLocalSide( DirectionUtil.toLocal( this, dir ) ); - computer.setRedstoneInput( localDir, getWorld().getRedstonePower( offset, dir ) ); + computer.setRedstoneInput( localDir, getRedstoneInput( world, offset, dir ) ); computer.setBundledRedstoneInput( localDir, BundledRedstone.getOutput( getWorld(), offset, offsetSide ) ); if( !isPeripheralBlockedOnSide( localDir ) ) @@ -275,6 +279,26 @@ private void updateSideInput( ServerComputer computer, EnumFacing dir, BlockPos } } + /** + * Gets the redstone input for an adjacent block + * + * @param world The world we exist in + * @param pos The position of the neighbour + * @param side The side we are reading from + * @return The effective redstone power + * @see net.minecraft.block.BlockRedstoneDiode#calculateInputStrength(World, BlockPos, IBlockState) + */ + protected static int getRedstoneInput( World world, BlockPos pos, EnumFacing side ) + { + int power = world.getRedstonePower( pos, side ); + if( power >= 15 ) return power; + + IBlockState neighbour = world.getBlockState( pos ); + return neighbour.getBlock() == Blocks.REDSTONE_WIRE + ? Math.max( power, neighbour.getValue( BlockRedstoneWire.POWER ) ) + : power; + } + public void updateInput() { if( getWorld() == null || getWorld().isRemote ) return;