Fix all Channel Behavior and its mis-behaving.

This commit is contained in:
AlgorithmX2 2014-02-02 20:30:52 -06:00
parent 93ac258ee7
commit 26202745ad
10 changed files with 112 additions and 16 deletions

View file

@ -5,7 +5,7 @@ import appeng.core.AELog;
public enum PlayerMessages public enum PlayerMessages
{ {
ChestCannotReadStorageCell, InvalidMachine, LoadedSettings, SavedSettings, MachineNotPowered, isNowLocked, isNowUnlocked, AmmoDepleted; ChestCannotReadStorageCell, InvalidMachine, LoadedSettings, SavedSettings, MachineNotPowered, isNowLocked, isNowUnlocked, AmmoDepleted, CommunicationError;
private PlayerMessages() { private PlayerMessages() {
AELog.localization( "chat", getName() ); AELog.localization( "chat", getName() );

View file

@ -330,6 +330,18 @@ public class AENetworkProxy implements IGridBlock
return node.isActive(); return node.isActive();
} }
public boolean isPowered()
{
try
{
return getEnergy().isNetworkPowered();
}
catch (GridAccessException e)
{
return false;
}
}
@Override @Override
public void gridChanged() public void gridChanged()
{ {

View file

@ -117,6 +117,9 @@ public class PartExportBus extends PartSharedItemBus implements IGridTickable
@Override @Override
TickRateModulation doBusWork() TickRateModulation doBusWork()
{ {
if ( !proxy.isActive() )
return TickRateModulation.IDLE;
itemToSend = 1; itemToSend = 1;
didSomething = false; didSomething = false;

View file

@ -142,6 +142,9 @@ public class PartImportBus extends PartSharedItemBus implements IGridTickable, I
TickRateModulation doBusWork() TickRateModulation doBusWork()
{ {
if ( !proxy.isActive() )
return TickRateModulation.IDLE;
worked = false; worked = false;
InventoryAdaptor myAdaptor = getHandler(); InventoryAdaptor myAdaptor = getHandler();

View file

@ -19,6 +19,8 @@ import appeng.api.config.Settings;
import appeng.api.config.Upgrades; import appeng.api.config.Upgrades;
import appeng.api.networking.IGridNode; import appeng.api.networking.IGridNode;
import appeng.api.networking.events.MENetworkCellArrayUpdate; import appeng.api.networking.events.MENetworkCellArrayUpdate;
import appeng.api.networking.events.MENetworkChannelsChanged;
import appeng.api.networking.events.MENetworkEventSubscribe;
import appeng.api.networking.security.BaseActionSource; import appeng.api.networking.security.BaseActionSource;
import appeng.api.networking.security.MachineSource; import appeng.api.networking.security.MachineSource;
import appeng.api.networking.ticking.IGridTickable; import appeng.api.networking.ticking.IGridTickable;
@ -76,6 +78,25 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
MEInventoryHandler handler = null; MEInventoryHandler handler = null;
int handlerHash = 0; int handlerHash = 0;
boolean wasActive = false;
@MENetworkEventSubscribe
public void updateChannels(MENetworkChannelsChanged chann)
{
boolean currentActive = proxy.isActive();
if ( wasActive != currentActive )
{
wasActive = currentActive;
try
{
proxy.getGrid().postEvent( new MENetworkCellArrayUpdate() );
}
catch (GridAccessException e)
{
// :P
}
}
}
@Override @Override
public boolean onActivate(EntityPlayer player, Vec3 pos) public boolean onActivate(EntityPlayer player, Vec3 pos)
@ -332,7 +353,7 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
@Override @Override
public List<IMEInventoryHandler> getCellArray(StorageChannel channel) public List<IMEInventoryHandler> getCellArray(StorageChannel channel)
{ {
IMEInventoryHandler out = getHandler(); IMEInventoryHandler out = proxy.isActive() ? getHandler() : null;
if ( out == null ) if ( out == null )
return Arrays.asList( new IMEInventoryHandler[] {} ); return Arrays.asList( new IMEInventoryHandler[] {} );
return Arrays.asList( new IMEInventoryHandler[] { out } ); return Arrays.asList( new IMEInventoryHandler[] { out } );
@ -354,7 +375,8 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
{ {
try try
{ {
proxy.getStorage().postAlterationOfStoredItems( StorageChannel.ITEMS, change, mySrc ); if ( proxy.isActive() )
proxy.getStorage().postAlterationOfStoredItems( StorageChannel.ITEMS, change, mySrc );
} }
catch (GridAccessException e) catch (GridAccessException e)
{ {

View file

@ -35,6 +35,9 @@ public class PartConversionMonitor extends PartStorageMonitor
if ( Platform.isClient() ) if ( Platform.isClient() )
return true; return true;
if ( !proxy.isActive() )
return false;
boolean ModeB = false; boolean ModeB = false;
ItemStack item = player.getCurrentEquippedItem(); ItemStack item = player.getCurrentEquippedItem();

View file

@ -123,6 +123,9 @@ public class PartStorageMonitor extends PartMonitor implements IPartStorageMonit
if ( Platform.isClient() ) if ( Platform.isClient() )
return true; return true;
if ( !proxy.isActive() )
return false;
TileEntity te = this.tile; TileEntity te = this.tile;
ItemStack eq = player.getCurrentEquippedItem(); ItemStack eq = player.getCurrentEquippedItem();
if ( Platform.isWrench( player, eq, te.xCoord, te.yCoord, te.zCoord ) ) if ( Platform.isWrench( player, eq, te.xCoord, te.yCoord, te.zCoord ) )

View file

@ -6,6 +6,7 @@ import net.minecraft.util.Vec3;
import appeng.api.storage.IMEMonitor; import appeng.api.storage.IMEMonitor;
import appeng.api.storage.IStorageMonitorable; import appeng.api.storage.IStorageMonitorable;
import appeng.client.texture.CableBusTextures; import appeng.client.texture.CableBusTextures;
import appeng.core.localization.PlayerMessages;
import appeng.core.sync.GuiBridge; import appeng.core.sync.GuiBridge;
import appeng.me.GridAccessException; import appeng.me.GridAccessException;
import appeng.util.Platform; import appeng.util.Platform;
@ -29,7 +30,16 @@ public class PartTerminal extends PartMonitor implements IStorageMonitorable
if ( Platform.isClient() ) if ( Platform.isClient() )
return true; return true;
Platform.openGUI( player, getHost().getTile(), side, GuiBridge.GUI_ME ); if ( proxy.isActive() )
Platform.openGUI( player, getHost().getTile(), side, GuiBridge.GUI_ME );
else
{
if ( proxy.isPowered() )
player.sendChatToPlayer( PlayerMessages.CommunicationError.get() );
else
player.sendChatToPlayer( PlayerMessages.MachineNotPowered.get() );
}
return true; return true;
} }

View file

@ -70,6 +70,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
long lastStateChange = 0; long lastStateChange = 0;
int priority = 0; int priority = 0;
int state = 0; int state = 0;
boolean wasActive = false;
private void recalculateDisplay() private void recalculateDisplay()
{ {
@ -78,11 +79,25 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
for (int x = 0; x < getCellCount(); x++) for (int x = 0; x < getCellCount(); x++)
state |= (getCellStatus( x ) << (3 * x)); state |= (getCellStatus( x ) << (3 * x));
if ( getAECurrentPower() > 64 || gridProxy.isActive() ) if ( isPowered() )
state |= 0x40; state |= 0x40;
else else
state &= ~0x40; state &= ~0x40;
boolean currentActive = gridProxy.isActive();
if ( wasActive != currentActive )
{
wasActive = currentActive;
try
{
gridProxy.getGrid().postEvent( new MENetworkCellArrayUpdate() );
}
catch (GridAccessException e)
{
// :P
}
}
if ( oldState != state ) if ( oldState != state )
markForUpdate(); markForUpdate();
} }
@ -153,7 +168,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
for (int x = 0; x < getCellCount(); x++) for (int x = 0; x < getCellCount(); x++)
state |= (getCellStatus( x ) << (3 * x)); state |= (getCellStatus( x ) << (3 * x));
if ( getAECurrentPower() > 64 || gridProxy.isActive() ) if ( isPowered() )
state |= 0x40; state |= 0x40;
else else
state &= ~0x40; state &= ~0x40;
@ -259,7 +274,8 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
{ {
try try
{ {
gridProxy.getStorage().postAlterationOfStoredItems( chan, change, mySrc ); if ( gridProxy.isActive() )
gridProxy.getStorage().postAlterationOfStoredItems( chan, change, mySrc );
} }
catch (GridAccessException e) catch (GridAccessException e)
{ {
@ -453,14 +469,18 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
@Override @Override
public List<IMEInventoryHandler> getCellArray(StorageChannel channel) public List<IMEInventoryHandler> getCellArray(StorageChannel channel)
{ {
try if ( gridProxy.isActive() )
{ {
return Arrays.asList( new IMEInventoryHandler[] { getHandler( channel ) } ); try
} {
catch (AENoHandler e) return Arrays.asList( new IMEInventoryHandler[] { getHandler( channel ) } );
{ }
return new ArrayList(); catch (AENoHandler e)
{
// :P
}
} }
return new ArrayList();
} }
@Override @Override

View file

@ -3,6 +3,7 @@ package appeng.tile.storage;
import java.io.DataInputStream; import java.io.DataInputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
@ -53,16 +54,31 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior
long lastStateChange = 0; long lastStateChange = 0;
int state = 0; int state = 0;
int priority = 0; int priority = 0;
boolean wasActive = false;
private void recalculateDisplay() private void recalculateDisplay()
{ {
int oldState = 0; int oldState = 0;
if ( gridProxy.isActive() ) boolean currentActive;
if ( currentActive = gridProxy.isActive() )
state |= 0x80000000; state |= 0x80000000;
else else
state &= ~0x80000000; state &= ~0x80000000;
if ( wasActive != currentActive )
{
wasActive = currentActive;
try
{
gridProxy.getGrid().postEvent( new MENetworkCellArrayUpdate() );
}
catch (GridAccessException e)
{
// :P
}
}
for (int x = 0; x < getCellCount(); x++) for (int x = 0; x < getCellCount(); x++)
state |= (getCellStatus( x ) << (3 * x)); state |= (getCellStatus( x ) << (3 * x));
@ -240,8 +256,12 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior
@Override @Override
public List<IMEInventoryHandler> getCellArray(StorageChannel channel) public List<IMEInventoryHandler> getCellArray(StorageChannel channel)
{ {
updateState(); if ( gridProxy.isActive() )
return (List) (channel == StorageChannel.ITEMS ? items : fluids); {
updateState();
return (List) (channel == StorageChannel.ITEMS ? items : fluids);
}
return new ArrayList();
} }
@Override @Override