diff --git a/src/main/java/dan200/computercraft/shared/common/BlockGeneric.java b/src/main/java/dan200/computercraft/shared/common/BlockGeneric.java index 0df9032ca..560c40dea 100644 --- a/src/main/java/dan200/computercraft/shared/common/BlockGeneric.java +++ b/src/main/java/dan200/computercraft/shared/common/BlockGeneric.java @@ -46,7 +46,7 @@ public abstract class BlockGeneric extends Block implements public final void dropBlockAsItemWithChance( World world, BlockPos pos, IBlockState state, float chance, int fortune ) { } - + @Override public final List getDrops( IBlockAccess world, BlockPos pos, IBlockState state, int fortune ) { @@ -107,7 +107,7 @@ public abstract class BlockGeneric extends Block implements { Block.spawnAsEntity( world, pos, stack ); } - + @Override public final void breakBlock( World world, BlockPos pos, IBlockState newState ) { @@ -162,6 +162,17 @@ public abstract class BlockGeneric extends Block implements } } + @Override + public final void onNeighborChange( IBlockAccess world, BlockPos pos, BlockPos neighbour ) + { + TileEntity tile = world.getTileEntity( pos ); + if( tile instanceof TileGeneric ) + { + TileGeneric generic = (TileGeneric)tile; + generic.onNeighbourTileEntityChange( neighbour ); + } + } + @Override public final boolean isSideSolid( IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing side ) { diff --git a/src/main/java/dan200/computercraft/shared/common/TileGeneric.java b/src/main/java/dan200/computercraft/shared/common/TileGeneric.java index 2e86ec148..a8709b73a 100644 --- a/src/main/java/dan200/computercraft/shared/common/TileGeneric.java +++ b/src/main/java/dan200/computercraft/shared/common/TileGeneric.java @@ -95,6 +95,10 @@ public abstract class TileGeneric extends TileEntity { } + public void onNeighbourTileEntityChange( BlockPos neighbour ) + { + } + public boolean isSolidOnSide( int side ) { return true; 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 2da5f2a43..990b09cd9 100644 --- a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java +++ b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java @@ -196,6 +196,12 @@ public abstract class TileComputerBase extends TileGeneric updateInput(); } + @Override + public void onNeighbourTileEntityChange( BlockPos neighbour ) + { + updateInput( neighbour ); + } + @Override public void update() { @@ -307,6 +313,21 @@ public abstract class TileComputerBase extends TileGeneric return localSide; } + private void updateSideInput( ServerComputer computer, EnumFacing dir, BlockPos offset ) + { + EnumFacing offsetSide = dir.getOpposite(); + int localDir = remapLocalSide( DirectionUtil.toLocal( this, dir ) ); + if( !isRedstoneBlockedOnSide( localDir ) ) + { + computer.setRedstoneInput( localDir, RedstoneUtil.getRedstoneOutput( worldObj, offset, offsetSide ) ); + computer.setBundledRedstoneInput( localDir, RedstoneUtil.getBundledRedstoneOutput( worldObj, offset, offsetSide ) ); + } + if( !isPeripheralBlockedOnSide( localDir ) ) + { + computer.setPeripheral( localDir, PeripheralUtil.getPeripheral( worldObj, offset, offsetSide ) ); + } + } + public void updateInput() { if( worldObj == null || worldObj.isRemote ) @@ -315,6 +336,24 @@ public abstract class TileComputerBase extends TileGeneric } // Update redstone and peripherals + ServerComputer computer = getServerComputer(); + if( computer != null ) + { + BlockPos pos = computer.getPosition(); + for( EnumFacing dir : EnumFacing.VALUES ) + { + updateSideInput( computer, dir, pos.offset( dir ) ); + } + } + } + + public void updateInput( BlockPos neighbour ) + { + if( worldObj == null || worldObj.isRemote ) + { + return; + } + ServerComputer computer = getServerComputer(); if( computer != null ) { @@ -322,16 +361,10 @@ public abstract class TileComputerBase extends TileGeneric for( EnumFacing dir : EnumFacing.VALUES ) { BlockPos offset = pos.offset( dir ); - EnumFacing offsetSide = dir.getOpposite(); - int localDir = remapLocalSide( DirectionUtil.toLocal( this, dir ) ); - if( !isRedstoneBlockedOnSide( localDir ) ) + if ( offset.equals( neighbour ) ) { - computer.setRedstoneInput( localDir, RedstoneUtil.getRedstoneOutput( worldObj, offset, offsetSide ) ); - computer.setBundledRedstoneInput( localDir, RedstoneUtil.getBundledRedstoneOutput( worldObj, offset, offsetSide ) ); - } - if( !isPeripheralBlockedOnSide( localDir ) ) - { - computer.setPeripheral( localDir, PeripheralUtil.getPeripheral( worldObj, offset, offsetSide ) ); + updateSideInput( computer, dir, offset ); + break; } } }