From 8dcf25a652e62d8fa00ef216fa50a9c5855984dd Mon Sep 17 00:00:00 2001 From: AlgorithmX2 Date: Sun, 8 Jun 2014 18:10:19 -0500 Subject: [PATCH] Fixed a bug where RF and IC2 tunnels could vaporize them selves. Fixed Bug: #0514 - An unknown error occurs frequently --- fmp/CableBusPart.java | 22 ++++++++++++++----- .../BCHelpers/AECableSchematicTile.java | 12 ++++++++++ me/cache/P2PCache.java | 22 +++++++++++++------ parts/CableBusContainer.java | 17 ++++++++++++++ parts/layers/LayerIEnergySink.java | 17 ++++++++++++-- parts/layers/LayerIEnergySource.java | 13 ++++++++++- parts/p2p/PartP2PIC2Power.java | 8 ++++++- parts/p2p/PartP2PItems.java | 12 +++++----- parts/p2p/PartP2PLiquids.java | 4 ++-- parts/p2p/PartP2PRFPower.java | 4 ++-- parts/p2p/PartP2PRedstone.java | 2 +- parts/p2p/PartP2PTunnel.java | 12 ++++++---- parts/p2p/PartP2PTunnelME.java | 4 ++-- tile/networking/TileCableBus.java | 14 +++++++++++- 14 files changed, 128 insertions(+), 35 deletions(-) diff --git a/fmp/CableBusPart.java b/fmp/CableBusPart.java index 3da7c99f6..dba342a24 100644 --- a/fmp/CableBusPart.java +++ b/fmp/CableBusPart.java @@ -80,6 +80,12 @@ public class CableBusPart extends JCuboidPart implements JNormalOcclusion, IReds public static ThreadLocal disableFacadeOcclusion = new ThreadLocal(); public CableBusContainer cb = new CableBusContainer( this ); + @Override + public boolean isInWorld() + { + return cb.isInWorld(); + } + @Override public boolean doesTick() { @@ -467,11 +473,7 @@ public class CableBusPart extends JCuboidPart implements JNormalOcclusion, IReds @Override public void partChanged() { - if ( tile() instanceof TIInventoryTile ) - ((TIInventoryTile) tile()).rebuildSlotMap(); - - if ( world() != null ) - world().notifyBlocksOfNeighborChange( x(), y(), z(), Platform.air ); + notifyNeighbors(); } @Override @@ -543,4 +545,14 @@ public class CableBusPart extends JCuboidPart implements JNormalOcclusion, IReds tile().remPart( this ); } + @Override + public void notifyNeighbors() + { + if ( tile() instanceof TIInventoryTile ) + ((TIInventoryTile) tile()).rebuildSlotMap(); + + if ( world() != null && world().blockExists( x(), y(), z() ) ) + world().notifyBlocksOfNeighborChange( x(), y(), z(), Platform.air ); + } + } diff --git a/integration/modules/BCHelpers/AECableSchematicTile.java b/integration/modules/BCHelpers/AECableSchematicTile.java index c369f1dc5..75ae8ff5b 100644 --- a/integration/modules/BCHelpers/AECableSchematicTile.java +++ b/integration/modules/BCHelpers/AECableSchematicTile.java @@ -140,4 +140,16 @@ public class AECableSchematicTile extends AEGenericSchematicTile implements IPar { } + + @Override + public void notifyNeighbors() + { + + } + + @Override + public boolean isInWorld() + { + return false; + } } diff --git a/me/cache/P2PCache.java b/me/cache/P2PCache.java index d6fc29d89..203344d62 100644 --- a/me/cache/P2PCache.java +++ b/me/cache/P2PCache.java @@ -74,8 +74,8 @@ public class P2PCache implements IGridCache // AELog.info( "update-" + (t.output ? "output: " : "input: ") + t.freq // ); - updateTunnel( t.freq, t.output ); - updateTunnel( t.freq, !t.output ); + updateTunnel( t.freq, t.output, true ); + updateTunnel( t.freq, !t.output, true ); } @Override @@ -98,7 +98,7 @@ public class P2PCache implements IGridCache else inputs.put( t.freq, t ); - updateTunnel( t.freq, !t.output ); + updateTunnel( t.freq, !t.output, false ); } } @@ -122,18 +122,26 @@ public class P2PCache implements IGridCache else inputs.remove( t.freq ); - updateTunnel( t.freq, !t.output ); + updateTunnel( t.freq, !t.output, false ); } } - private void updateTunnel(long freq, boolean updateOutputs) + private void updateTunnel(long freq, boolean updateOutputs, boolean configChange) { for (PartP2PTunnel p : outputs.get( freq )) - p.onChange(); + { + if ( configChange ) + p.onTunnelConfigChange(); + p.onTunnelNetworkChange(); + } PartP2PTunnel in = inputs.get( freq ); if ( in != null ) - in.onChange(); + { + if ( configChange ) + in.onTunnelConfigChange(); + in.onTunnelNetworkChange(); + } } public TunnelCollection getOutputs(long freq, Class c) diff --git a/parts/CableBusContainer.java b/parts/CableBusContainer.java index e1acae0a1..e60d11081 100644 --- a/parts/CableBusContainer.java +++ b/parts/CableBusContainer.java @@ -64,6 +64,12 @@ public class CableBusContainer implements AEMultiTile, ICableBusContainer boolean inWorld = false; public boolean requiresDynamicRender = false; + @Override + public boolean isInWorld() + { + return inWorld; + } + public void setHost(IPartHost host) { tcb.clearContainer(); @@ -364,12 +370,15 @@ public class CableBusContainer implements AEMultiTile, ICableBusContainer } } } + + partChanged(); } public void removeFromWorld() { if ( !inWorld ) return; + inWorld = false; for (ForgeDirection s : ForgeDirection.values()) @@ -378,6 +387,8 @@ public class CableBusContainer implements AEMultiTile, ICableBusContainer if ( part != null ) part.removeFromWorld(); } + + partChanged(); } public boolean canConnectRedstone(EnumSet enumSet) @@ -1014,4 +1025,10 @@ public class CableBusContainer implements AEMultiTile, ICableBusContainer tcb.cleanup(); } + @Override + public void notifyNeighbors() + { + tcb.notifyNeighbors(); + } + } diff --git a/parts/layers/LayerIEnergySink.java b/parts/layers/LayerIEnergySink.java index e10b9e79c..66b8166ff 100644 --- a/parts/layers/LayerIEnergySink.java +++ b/parts/layers/LayerIEnergySink.java @@ -30,10 +30,20 @@ public class LayerIEnergySink extends LayerBase implements IEnergySink { if ( getEnergySinkTile() == null ) return null; - + return getEnergySinkTile().getWorldObj(); } + private boolean isTileValid() + { + TileEntity te = getEnergySinkTile(); + + if ( te == null ) + return false; + + return !te.isInvalid() && te.getWorldObj().blockExists( te.xCoord, te.yCoord, te.zCoord ); + } + final private void addToENet() { if ( getEnergySinkWorld() == null ) @@ -42,7 +52,7 @@ public class LayerIEnergySink extends LayerBase implements IEnergySink // re-add removeFromENet(); - if ( !isInIC2() && Platform.isServer() ) + if ( !isInIC2() && Platform.isServer() && isTileValid() ) { getLayerFlags().add( LayerFlags.IC2_ENET ); MinecraftForge.EVENT_BUS.post( new ic2.api.energy.event.EnergyTileLoadEvent( (IEnergySink) getEnergySinkTile() ) ); @@ -63,6 +73,9 @@ public class LayerIEnergySink extends LayerBase implements IEnergySink final private boolean interestedInIC2() { + if ( !((IPartHost) this).isInWorld() ) + return false; + int interested = 0; for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { diff --git a/parts/layers/LayerIEnergySource.java b/parts/layers/LayerIEnergySource.java index f9a655d47..2bc99d9da 100644 --- a/parts/layers/LayerIEnergySource.java +++ b/parts/layers/LayerIEnergySource.java @@ -35,6 +35,14 @@ public class LayerIEnergySource extends LayerBase implements IEnergySource return getEnergySourceTile().getWorldObj(); } + private boolean isTileValid() + { + TileEntity te = getEnergySourceTile(); + if ( te == null ) + return false; + return !te.isInvalid(); + } + final private void addToENet() { if ( getEnergySourceWorld() == null ) @@ -43,7 +51,7 @@ public class LayerIEnergySource extends LayerBase implements IEnergySource // re-add removeFromENet(); - if ( !isInIC2() && Platform.isServer() ) + if ( !isInIC2() && Platform.isServer() && isTileValid() ) { getLayerFlags().add( LayerFlags.IC2_ENET ); MinecraftForge.EVENT_BUS.post( new ic2.api.energy.event.EnergyTileLoadEvent( (IEnergySink) getEnergySourceTile() ) ); @@ -64,6 +72,9 @@ public class LayerIEnergySource extends LayerBase implements IEnergySource final private boolean interestedInIC2() { + if ( !((IPartHost) this).isInWorld() ) + return false; + int interested = 0; for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { diff --git a/parts/p2p/PartP2PIC2Power.java b/parts/p2p/PartP2PIC2Power.java index 70e744611..ee015d424 100644 --- a/parts/p2p/PartP2PIC2Power.java +++ b/parts/p2p/PartP2PIC2Power.java @@ -103,7 +103,13 @@ public class PartP2PIC2Power extends PartP2PTunnel implements i } @Override - public void onChange() + public void onTunnelNetworkChange() + { + getHost().notifyNeighbors(); + } + + @Override + public void onTunnelConfigChange() { getHost().partChanged(); } diff --git a/parts/p2p/PartP2PItems.java b/parts/p2p/PartP2PItems.java index e5601b76a..a36ae1ee8 100644 --- a/parts/p2p/PartP2PItems.java +++ b/parts/p2p/PartP2PItems.java @@ -116,7 +116,7 @@ public class PartP2PItems extends PartP2PTunnel implements IPipeCo cachedInv = null; PartP2PItems input = getInput(); if ( input != null && output ) - input.onChange(); + input.onTunnelNetworkChange(); } IInventory getDest() @@ -161,8 +161,7 @@ public class PartP2PItems extends PartP2PTunnel implements IPipeCo oldSize = getDest().getSizeInventory(); if ( olderSize != oldSize ) { - getHost().partChanged(); - tile.getWorldObj().notifyBlocksOfNeighborChange( tile.xCoord, tile.yCoord, tile.zCoord, Platform.air ); + getHost().notifyNeighbors(); } } } @@ -177,8 +176,7 @@ public class PartP2PItems extends PartP2PTunnel implements IPipeCo oldSize = getDest().getSizeInventory(); if ( olderSize != oldSize ) { - getHost().partChanged(); - tile.getWorldObj().notifyBlocksOfNeighborChange( tile.xCoord, tile.yCoord, tile.zCoord, Platform.air ); + getHost().notifyNeighbors(); } } } @@ -200,7 +198,7 @@ public class PartP2PItems extends PartP2PTunnel implements IPipeCo } @Override - public void onChange() + public void onTunnelNetworkChange() { if ( !output ) { @@ -217,7 +215,7 @@ public class PartP2PItems extends PartP2PTunnel implements IPipeCo { PartP2PItems input = getInput(); if ( input != null ) - input.onChange(); + input.getHost().notifyNeighbors(); } } diff --git a/parts/p2p/PartP2PLiquids.java b/parts/p2p/PartP2PLiquids.java index b7deb04a0..4583fc0d0 100644 --- a/parts/p2p/PartP2PLiquids.java +++ b/parts/p2p/PartP2PLiquids.java @@ -116,12 +116,12 @@ public class PartP2PLiquids extends PartP2PTunnel implements IFl { PartP2PLiquids in = getInput(); if ( in != null ) - in.onChange(); + in.onTunnelNetworkChange(); } }; @Override - public void onChange() + public void onTunnelNetworkChange() { cachedTank = null; } diff --git a/parts/p2p/PartP2PRFPower.java b/parts/p2p/PartP2PRFPower.java index 23ccbdf8c..9dad10153 100644 --- a/parts/p2p/PartP2PRFPower.java +++ b/parts/p2p/PartP2PRFPower.java @@ -67,9 +67,9 @@ public class PartP2PRFPower extends PartP2PTunnel implements cof } @Override - public void onChange() + public void onTunnelNetworkChange() { - getHost().partChanged(); + getHost().notifyNeighbors(); } public float getPowerDrainPerTick() diff --git a/parts/p2p/PartP2PRedstone.java b/parts/p2p/PartP2PRedstone.java index 3437e6003..12d32227f 100644 --- a/parts/p2p/PartP2PRedstone.java +++ b/parts/p2p/PartP2PRedstone.java @@ -49,7 +49,7 @@ public class PartP2PRedstone extends PartP2PTunnel } @Override - public void onChange() + public void onTunnelNetworkChange() { setNetworkReady(); } diff --git a/parts/p2p/PartP2PTunnel.java b/parts/p2p/PartP2PTunnel.java index b00f56df0..fad470381 100644 --- a/parts/p2p/PartP2PTunnel.java +++ b/parts/p2p/PartP2PTunnel.java @@ -105,7 +105,7 @@ public class PartP2PTunnel extends PartBasicState // :P } - newTunnel.onChange(); + newTunnel.onTunnelNetworkChange(); } mc.notifyUser( player, MemoryCardMessages.SETTINGS_LOADED ); @@ -165,7 +165,7 @@ public class PartP2PTunnel extends PartBasicState { PartP2PTunnel newTunnel = (PartP2PTunnel) newBus; newTunnel.output = oldOutput; - newTunnel.onChange(); + newTunnel.onTunnelNetworkChange(); try { @@ -216,7 +216,7 @@ public class PartP2PTunnel extends PartBasicState } } - onChange(); + onTunnelConfigChange(); ItemStack p2pItem = getItemStack( PartItemStack.Wrench ); String type = p2pItem.getUnlocalizedName(); @@ -231,6 +231,10 @@ public class PartP2PTunnel extends PartBasicState return false; } + public void onTunnelConfigChange() + { + } + public ItemStack getItemStack(PartItemStack type) { if ( type == PartItemStack.World || type == PartItemStack.Network || type == PartItemStack.Wrench || type == PartItemStack.Pick ) @@ -271,7 +275,7 @@ public class PartP2PTunnel extends PartBasicState return new TunnelCollection( new ArrayList(), getClass() ); } - public void onChange() + public void onTunnelNetworkChange() { } diff --git a/parts/p2p/PartP2PTunnelME.java b/parts/p2p/PartP2PTunnelME.java index 05b3aeb30..b1a4d5d4e 100644 --- a/parts/p2p/PartP2PTunnelME.java +++ b/parts/p2p/PartP2PTunnelME.java @@ -92,9 +92,9 @@ public class PartP2PTunnelME extends PartP2PTunnel implements I } @Override - public void onChange() + public void onTunnelNetworkChange() { - super.onChange(); + super.onTunnelNetworkChange(); if ( !output ) { try diff --git a/tile/networking/TileCableBus.java b/tile/networking/TileCableBus.java index bd42a49f9..11acff27a 100644 --- a/tile/networking/TileCableBus.java +++ b/tile/networking/TileCableBus.java @@ -87,6 +87,12 @@ public class TileCableBus extends AEBaseTile implements AEMultiTile, ICustomColl }; + @Override + public boolean isInWorld() + { + return cb.isInWorld(); + } + protected void updateTileSetting() { if ( cb.requiresDynamicRender ) @@ -283,7 +289,13 @@ public class TileCableBus extends AEBaseTile implements AEMultiTile, ICustomColl @Override public void partChanged() { - if ( worldObj != null ) + notifyNeighbors(); + } + + @Override + public void notifyNeighbors() + { + if ( worldObj != null && worldObj.blockExists( xCoord, yCoord, zCoord ) ) worldObj.notifyBlocksOfNeighborChange( xCoord, yCoord, zCoord, Platform.air ); }