From ca97a7a5e37e9f810184390be60c243b451c6805 Mon Sep 17 00:00:00 2001 From: yueh Date: Wed, 1 Jul 2015 20:26:04 +0200 Subject: [PATCH] Fixes #1656 Reduces the amount of block updates a controller sends. --- .../tile/networking/TileController.java | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/main/java/appeng/tile/networking/TileController.java b/src/main/java/appeng/tile/networking/TileController.java index 994e0615..03c179c4 100644 --- a/src/main/java/appeng/tile/networking/TileController.java +++ b/src/main/java/appeng/tile/networking/TileController.java @@ -23,6 +23,7 @@ import java.util.EnumSet; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import appeng.api.config.Actionable; import appeng.api.networking.GridFlags; @@ -72,15 +73,15 @@ public class TileController extends AENetworkPowerTile public void onNeighborChange( boolean force ) { - boolean xx = this.worldObj.getTileEntity( pos.offset( EnumFacing.EAST ) ) instanceof TileController && this.worldObj.getTileEntity( pos.offset( EnumFacing.WEST ) ) instanceof TileController; - boolean yy = this.worldObj.getTileEntity( pos.offset( EnumFacing.UP ) ) instanceof TileController && this.worldObj.getTileEntity( pos.offset( EnumFacing.DOWN ) ) instanceof TileController; - boolean zz = this.worldObj.getTileEntity( pos.offset( EnumFacing.NORTH ) ) instanceof TileController && this.worldObj.getTileEntity( pos.offset( EnumFacing.SOUTH ) ) instanceof TileController; + final boolean xx = checkController( pos.offset( EnumFacing.EAST ) ) && checkController( pos.offset( EnumFacing.WEST ) ); + final boolean yy = checkController( pos.offset( EnumFacing.UP ) ) && checkController( pos.offset( EnumFacing.DOWN ) ); + final boolean zz = checkController( pos.offset( EnumFacing.NORTH ) ) && checkController( pos.offset( EnumFacing.SOUTH ) ); // int meta = world.getBlockMetadata( xCoord, yCoord, zCoord ); // boolean hasPower = meta > 0; // boolean isConflict = meta == 2; - boolean oldValid = this.isValid; + final boolean oldValid = this.isValid; this.isValid = ( xx && !yy && !zz ) || ( !xx && yy && !zz ) || ( !xx && !yy && zz ) || ( ( xx ? 1 : 0 ) + ( yy ? 1 : 0 ) + ( zz ? 1 : 0 ) <= 1 ); @@ -94,9 +95,10 @@ public class TileController extends AENetworkPowerTile { this.gridProxy.setValidSides( EnumSet.noneOf( EnumFacing.class ) ); } + + this.updateMeta(); } - this.updateMeta(); } private void updateMeta() @@ -124,8 +126,12 @@ public class TileController extends AENetworkPowerTile { metaState = ControllerBlockState.OFFLINE; } - - this.worldObj.setBlockState( pos, worldObj.getBlockState( pos ).withProperty( BlockController.CONTROLLER_STATE, metaState ) ); + + if( checkController( pos ) && this.worldObj.getBlockState( pos ).getValue( BlockController.CONTROLLER_STATE ) != metaState ) + { + this.worldObj.setBlockState( pos, worldObj.getBlockState( pos ).withProperty( BlockController.CONTROLLER_STATE, metaState ) ); + } + } @Override @@ -201,6 +207,21 @@ public class TileController extends AENetworkPowerTile @Override public int[] getAccessibleSlotsBySide( EnumFacing whichSide ) { - return this.ACCESSIBLE_SLOTS_BY_SIDE; + return ACCESSIBLE_SLOTS_BY_SIDE; + } + + /** + * Check for a controller at this coordinates as well as is it loaded. + * + * @return true if there is a loaded controller + */ + private boolean checkController( BlockPos pos ) + { + if( this.worldObj.getChunkProvider().chunkExists( this.xCoord >> 4, this.zCoord >> 4 ) ) + { + return this.worldObj.getTileEntity( pos ) instanceof TileController; + } + + return false; } }