Handle tile entity changes

This commit is contained in:
Bartek Bok 2017-05-03 11:14:39 +02:00
parent 58e6e9ea46
commit 5284b145f8
No known key found for this signature in database
GPG Key ID: D4AB7344B821F0B5
3 changed files with 59 additions and 11 deletions

View File

@ -46,7 +46,7 @@ protected BlockGeneric( Material material )
public final void dropBlockAsItemWithChance( World world, BlockPos pos, IBlockState state, float chance, int fortune )
{
}
@Override
public final List<ItemStack> getDrops( IBlockAccess world, BlockPos pos, IBlockState state, int fortune )
{
@ -107,7 +107,7 @@ public final void dropItem( World world, BlockPos pos, ItemStack stack )
{
Block.spawnAsEntity( world, pos, stack );
}
@Override
public final void breakBlock( World world, BlockPos pos, IBlockState newState )
{
@ -162,6 +162,17 @@ public final void neighborChanged( IBlockState state, World world, BlockPos pos,
}
}
@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 )
{

View File

@ -95,6 +95,10 @@ public void onNeighbourChange()
{
}
public void onNeighbourTileEntityChange( BlockPos neighbour )
{
}
public boolean isSolidOnSide( int side )
{
return true;

View File

@ -196,6 +196,12 @@ public void onNeighbourChange()
updateInput();
}
@Override
public void onNeighbourTileEntityChange( BlockPos neighbour )
{
updateInput( neighbour );
}
@Override
public void update()
{
@ -307,6 +313,21 @@ protected int remapLocalSide( int localSide )
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 void updateInput()
}
// 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 void updateInput()
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;
}
}
}