Added custom method for updating block state from TileEntity state changes.
This commit is contained in:
@@ -327,4 +327,28 @@ public abstract class AEBaseTileBlock<T extends AEBaseTile> extends AEBaseBlock
|
|||||||
return this.getTileEntity( w, pos );
|
return this.getTileEntity( w, pos );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the BlockState based on the given BlockState while considering the state of the given TileEntity.
|
||||||
|
*
|
||||||
|
* If the given TileEntity is not of the right type for this block, the state is returned unchanged,
|
||||||
|
* this is also the case if the given block state does not belong to this block.
|
||||||
|
*/
|
||||||
|
public final BlockState getTileEntityBlockState(BlockState current, TileEntity te) {
|
||||||
|
if (current.getBlock() != this || !tileEntityClass.isInstance(te)) {
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
return updateBlockStateFromTileEntity(current, tileEntityClass.cast(te));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reimplement this in subclasses to allow tile-entities to update the state of their block when their own
|
||||||
|
* state changes.
|
||||||
|
*
|
||||||
|
* It is guaranteed that te is not-null and the block of the given block state is this exact block instance.
|
||||||
|
*/
|
||||||
|
protected BlockState updateBlockStateFromTileEntity(BlockState currentState, T te) {
|
||||||
|
return currentState;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,27 +62,20 @@ public class BlockChest extends AEBaseTileBlock<TileChest>
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockState updatePostPlacement(BlockState state, Direction facing, BlockState facingState, IWorld worldIn, BlockPos pos, BlockPos facingPos) {
|
protected BlockState updateBlockStateFromTileEntity(BlockState currentState, TileChest te) {
|
||||||
// FIXME Check tile-entity updated prop
|
|
||||||
|
|
||||||
DriveSlotState slotState = DriveSlotState.EMPTY;
|
DriveSlotState slotState = DriveSlotState.EMPTY;
|
||||||
|
|
||||||
TileChest te = this.getTileEntity( worldIn, pos );
|
if( te.getCellCount() >= 1 )
|
||||||
|
|
||||||
if( te != null )
|
|
||||||
{
|
{
|
||||||
if( te.getCellCount() >= 1 )
|
slotState = DriveSlotState.fromCellStatus( te.getCellStatus( 0 ) );
|
||||||
{
|
}
|
||||||
slotState = DriveSlotState.fromCellStatus( te.getCellStatus( 0 ) );
|
// Power-state has to be checked separately
|
||||||
}
|
if( !te.isPowered() && slotState != DriveSlotState.EMPTY )
|
||||||
// Power-state has to be checked separately
|
{
|
||||||
if( !te.isPowered() && slotState != DriveSlotState.EMPTY )
|
slotState = DriveSlotState.OFFLINE;
|
||||||
{
|
|
||||||
slotState = DriveSlotState.OFFLINE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return state.with( SLOT_STATE, slotState );
|
return currentState.with( SLOT_STATE, slotState );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ import appeng.api.util.IConfigManager;
|
|||||||
import appeng.api.util.IConfigurableObject;
|
import appeng.api.util.IConfigurableObject;
|
||||||
import appeng.api.util.IOrientable;
|
import appeng.api.util.IOrientable;
|
||||||
import appeng.block.AEBaseTileBlock;
|
import appeng.block.AEBaseTileBlock;
|
||||||
import appeng.client.render.FacingToRotation;
|
|
||||||
import appeng.core.AELog;
|
import appeng.core.AELog;
|
||||||
import appeng.core.features.IStackSrc;
|
import appeng.core.features.IStackSrc;
|
||||||
import appeng.helpers.ICustomNameObject;
|
import appeng.helpers.ICustomNameObject;
|
||||||
@@ -298,14 +297,17 @@ public class AEBaseTile extends TileEntity implements IOrientable, ICommonTile,
|
|||||||
// TODO: Optimize Network Load
|
// TODO: Optimize Network Load
|
||||||
if( this.world != null )
|
if( this.world != null )
|
||||||
{
|
{
|
||||||
// Let the block update
|
// Let the block update it's own state with our internal state changes
|
||||||
BlockState currentState = getBlockState();
|
BlockState currentState = getBlockState();
|
||||||
BlockState newState = currentState.updatePostPlacement(Direction.EAST, currentState, world, pos, pos);
|
if (currentState.getBlock() instanceof AEBaseTileBlock) {
|
||||||
|
AEBaseTileBlock<?> tileBlock = (AEBaseTileBlock<?>) currentState.getBlock();
|
||||||
AELog.blockUpdate( this.pos, currentState, newState, this );
|
BlockState newState = tileBlock.getTileEntityBlockState(currentState, this);
|
||||||
if (currentState != newState) {
|
if (currentState != newState) {
|
||||||
this.world.setBlockState(pos, newState);
|
AELog.blockUpdate(this.pos, currentState, newState, this);
|
||||||
|
this.world.setBlockState(pos, newState);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.requestModelDataUpdate();
|
this.requestModelDataUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user