From fe1a67ffaaedf6344cdb9e39fe8ac8055820f5fa Mon Sep 17 00:00:00 2001 From: yueh Date: Sat, 5 Nov 2016 19:28:09 +0100 Subject: [PATCH] Reduced drive update rate. (#2574) Limits drive updates to modulate. Code cleanup of the TileDrive. --- .../java/appeng/me/storage/DriveWatcher.java | 4 +- .../java/appeng/tile/storage/TileDrive.java | 66 ++++++++----------- 2 files changed, 29 insertions(+), 41 deletions(-) diff --git a/src/main/java/appeng/me/storage/DriveWatcher.java b/src/main/java/appeng/me/storage/DriveWatcher.java index 138c46ef..c827aa25 100644 --- a/src/main/java/appeng/me/storage/DriveWatcher.java +++ b/src/main/java/appeng/me/storage/DriveWatcher.java @@ -52,7 +52,7 @@ public class DriveWatcher> extends MEInventoryHandler final T a = super.injectItems( input, type, src ); - if( a == null || a.getStackSize() != size ) + if( type == Actionable.MODULATE && ( a == null || a.getStackSize() != size ) ) { final int newStatus = this.handler.getStatusForCell( this.is, this.getInternal() ); @@ -71,7 +71,7 @@ public class DriveWatcher> extends MEInventoryHandler { final T a = super.extractItems( request, type, src ); - if( a != null ) + if( type == Actionable.MODULATE && a != null ) { final int newStatus = this.handler.getStatusForCell( this.is, this.getInternal() ); diff --git a/src/main/java/appeng/tile/storage/TileDrive.java b/src/main/java/appeng/tile/storage/TileDrive.java index 5a9f0af8..c64334d9 100644 --- a/src/main/java/appeng/tile/storage/TileDrive.java +++ b/src/main/java/appeng/tile/storage/TileDrive.java @@ -63,6 +63,10 @@ import appeng.util.Platform; public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPriorityHost { + private static final int BIT_POWER_MASK = 0x80000000; + private static final int BIT_BLINK_MASK = 0x24924924; + private static final int BIT_STATE_MASK = 0xDB6DB6DB; + private final int[] sides = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; private final AppEngInternalInventory inv = new AppEngInternalInventory( this, 10 ); private final ICellHandler[] handlersBySlot = new ICellHandler[10]; @@ -71,11 +75,24 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior private boolean isCached = false; private List items = new LinkedList(); private List fluids = new LinkedList(); - private long lastStateChange = 0; - private int state = 0; private int priority = 0; private boolean wasActive = false; + /** + * The state of all cells inside a drive as bitset, using the following format. + * + * Bit 31: power state. 0 = off, 1 = on. + * Bit 30: undefined + * Bit 29-0: 3 bits as state of each cell with the cell in slot 0 located in the 3 least significant bits. + * + * Cell states: + * Bit 2: blink. 0 = off, 1 = on. + * Bit 1-0: cell status + * + * + */ + private int state = 0; + public TileDrive() { this.mySrc = new MachineSource( this ); @@ -85,30 +102,19 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior @TileEvent( TileEventType.NETWORK_WRITE ) public void writeToStream_TileDrive( final ByteBuf data ) { - if( this.worldObj.getTotalWorldTime() - this.lastStateChange > 8 ) - { - this.state = 0; - } - else - { - this.state &= 0x24924924; // just keep the blinks... - } + int newState = 0; if( this.getProxy().isActive() ) { - this.state |= 0x80000000; - } - else - { - this.state &= ~0x80000000; + newState |= BIT_POWER_MASK; } for( int x = 0; x < this.getCellCount(); x++ ) { - this.state |= ( this.getCellStatus( x ) << ( 3 * x ) ); + newState |= ( this.getCellStatus( x ) << ( 3 * x ) ); } - data.writeInt( this.state ); + data.writeInt( newState ); } @Override @@ -158,7 +164,7 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior { if( Platform.isClient() ) { - return ( this.state & 0x80000000 ) == 0x80000000; + return ( this.state & BIT_POWER_MASK ) == BIT_POWER_MASK; } return this.getProxy().isActive(); @@ -167,12 +173,6 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior @Override public boolean isCellBlinking( final int slot ) { - final long now = this.worldObj.getTotalWorldTime(); - if( now - this.lastStateChange > 8 ) - { - return false; - } - return ( ( this.state >> ( slot * 3 + 2 ) ) & 0x01 ) == 0x01; } @@ -181,8 +181,7 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior { final int oldState = this.state; this.state = data.readInt(); - this.lastStateChange = this.worldObj.getTotalWorldTime(); - return ( this.state & 0xDB6DB6DB ) != ( oldState & 0xDB6DB6DB ); + return ( this.state & BIT_STATE_MASK ) != ( oldState & BIT_STATE_MASK ); } @TileEvent( TileEventType.WORLD_NBT_READ ) @@ -207,15 +206,11 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior private void recalculateDisplay() { final boolean currentActive = this.getProxy().isActive(); - int newState = this.state; + int newState = 0; if( currentActive ) { - newState |= 0x80000000; - } - else - { - newState &= ~0x80000000; + newState |= BIT_POWER_MASK; } if( this.wasActive != currentActive ) @@ -404,13 +399,6 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior @Override public void blinkCell( final int slot ) { - final long now = this.worldObj.getTotalWorldTime(); - if( now - this.lastStateChange > 8 ) - { - this.state = 0; - } - this.lastStateChange = now; - this.state |= 1 << ( slot * 3 + 2 ); this.recalculateDisplay();