diff --git a/client/gui/AEBaseGui.java b/client/gui/AEBaseGui.java index ee2fc94be..66d3391ac 100644 --- a/client/gui/AEBaseGui.java +++ b/client/gui/AEBaseGui.java @@ -325,6 +325,17 @@ public abstract class AEBaseGui extends GuiContainer { if ( p_146983_1_ == this.mc.gameSettings.keyBindsHotbar[j].getKeyCode() ) { + for (Slot s : (List) inventorySlots.inventorySlots) + { + if ( s.getSlotIndex() == j && s.inventory == ((AEBaseContainer) inventorySlots).getPlayerInv() ) + { + if ( !s.canTakeStack( ((AEBaseContainer) inventorySlots).getPlayerInv().player ) ) + { + return false; + } + } + } + if ( theSlot.getSlotStackLimit() == 64 ) { this.handleMouseClick( theSlot, theSlot.slotNumber, j, 2 ); diff --git a/core/localization/GuiText.java b/core/localization/GuiText.java index 6f4a0b7c6..0da253d28 100644 --- a/core/localization/GuiText.java +++ b/core/localization/GuiText.java @@ -28,7 +28,7 @@ public enum GuiText CopyMode, CopyModeDesc, PatternTerminal, CraftingPattern, ProcessingPattern, Crafts, Creates, And, With, MolecularAssembler, - StoredPower, MaxPower, RequiredPower, Efficiency, InWorldCrafting, inWorldFluix, inWorldPurificationCertus, inWorldPurificationNether, inWorldPurificationFluix, inWorldSingularity, + StoredPower, MaxPower, RequiredPower, Efficiency, InWorldCrafting, inWorldFluix, inWorldPurificationCertus, inWorldPurificationNether, inWorldPurificationFluix, inWorldSingularity, ChargedQuartz, OfSecondOutput, NoSecondOutput, RFTunnel, Stores, Next, SelectAmount, Lumen, Empty; diff --git a/core/settings/TickRates.java b/core/settings/TickRates.java index ddad506c7..7e9fa1fed 100644 --- a/core/settings/TickRates.java +++ b/core/settings/TickRates.java @@ -2,41 +2,46 @@ package appeng.core.settings; import appeng.core.AEConfig; -public enum TickRates { +public enum TickRates +{ + + Interface(5, 120), - Interface(5,120), - ImportBus(5, 40), - + ExportBus(5, 60), - + AnnihilationPlane(2, 120), MJTunnel(1, 20), - + METunnel(5, 20), - + Inscriber(1, 1), - + IOPort(1, 5), - + VibrationChamber(10, 40), - - StorageBus(5, 60); - + + StorageBus(5, 60), + + ItemTunnel(5, 60); + public int min; public int max; - - private TickRates( int min, int max ) { + + private TickRates(int min, int max) { this.min = min; this.max = max; } - - public void Load( AEConfig config ) + + public void Load(AEConfig config) { - config.addCustomCategoryComment("TickRates", " Min / Max Tickrates for dynamic ticking, most of these components also use sleeping, to prevent constant ticking, adjust with care, non standard rates are not supported or tested." ); - min = config.get( "TickRates", name()+".min", min ).getInt(min); - max = config.get( "TickRates", name()+".max", max ).getInt(max); + config.addCustomCategoryComment( + "TickRates", + " Min / Max Tickrates for dynamic ticking, most of these components also use sleeping, to prevent constant ticking, adjust with care, non standard rates are not supported or tested." ); + min = config.get( "TickRates", name() + ".min", min ).getInt( min ); + max = config.get( "TickRates", name() + ".max", max ).getInt( max ); } - + } 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/integration/modules/NEIHelpers/NEIWorldCraftingHandler.java b/integration/modules/NEIHelpers/NEIWorldCraftingHandler.java index 1a29aad6b..0a12e3150 100644 --- a/integration/modules/NEIHelpers/NEIWorldCraftingHandler.java +++ b/integration/modules/NEIHelpers/NEIWorldCraftingHandler.java @@ -47,6 +47,8 @@ public class NEIWorldCraftingHandler implements ICraftingHandler, IUsageHandler private void addRecipes() { + addRecipe( AEApi.instance().materials().materialCertusQuartzCrystalCharged, GuiText.ChargedQuartz.getLocal() ); + if ( AEConfig.instance.isFeatureEnabled( AEFeature.inWorldFluix ) ) addRecipe( AEApi.instance().materials().materialFluixCrystal, GuiText.inWorldFluix.getLocal() ); diff --git a/me/Grid.java b/me/Grid.java index 2a6065a7b..8bc2b1f1c 100644 --- a/me/Grid.java +++ b/me/Grid.java @@ -28,6 +28,7 @@ public class Grid implements IGrid HashMap, GridCacheWrapper> caches = new HashMap, GridCacheWrapper>(); GridNode pivot; + int isImportant; // how import is this network? public Grid(GridNode center) { this.pivot = center; @@ -228,4 +229,10 @@ public class Grid implements IGrid } } + public void setImportantFlag(int i, boolean publicHasPower) + { + int flag = 1 << i; + isImportant = (isImportant & ~flag) | (publicHasPower ? flag : 0); + } + } diff --git a/me/GridConnection.java b/me/GridConnection.java index 22aaf77a3..b3f0474c2 100644 --- a/me/GridConnection.java +++ b/me/GridConnection.java @@ -62,7 +62,7 @@ public class GridConnection implements IGridConnection, IPathItem GridPropagator gp = new GridPropagator( a.getInternalGrid() ); b.beginVisition( gp ); } - else if ( a.myGrid.size() > b.myGrid.size() ) + else if ( isNetworkABetter( a, b ) ) { GridPropagator gp = new GridPropagator( a.getInternalGrid() ); b.beginVisition( gp ); @@ -82,6 +82,11 @@ public class GridConnection implements IGridConnection, IPathItem sideB.addConnection( this ); } + private boolean isNetworkABetter(GridNode a, GridNode b) + { + return ((Grid) a.myGrid).isImportant > ((Grid) b.myGrid).isImportant || a.myGrid.size() > b.myGrid.size(); + } + @Override public void destroy() { diff --git a/me/cache/EnergyGridCache.java b/me/cache/EnergyGridCache.java index addb8ea0f..cceddea4d 100644 --- a/me/cache/EnergyGridCache.java +++ b/me/cache/EnergyGridCache.java @@ -27,6 +27,7 @@ import appeng.api.networking.events.MENetworkPowerStatusChange; import appeng.api.networking.events.MENetworkPowerStorage; import appeng.api.networking.pathing.IPathingGrid; import appeng.api.networking.storage.IStackWatcherHost; +import appeng.me.Grid; import appeng.me.GridNode; import appeng.me.energy.EnergyThreshold; import appeng.me.energy.EnergyWatcher; @@ -379,6 +380,7 @@ public class EnergyGridCache implements IEnergyGrid return; publicHasPower = newState; + ((Grid) myGrid).setImportantFlag( 0, publicHasPower ); grid.postEvent( new MENetworkPowerStatusChange() ); } 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/layers/LayerISidedInventory.java b/parts/layers/LayerISidedInventory.java index 2b6494ad8..1812763fa 100644 --- a/parts/layers/LayerISidedInventory.java +++ b/parts/layers/LayerISidedInventory.java @@ -38,7 +38,7 @@ public class LayerISidedInventory extends LayerBase implements ISidedInventory * Recalculate inventory wrapper cache. */ @Override - public void partChanged() + public void notifyNeighbors() { invs = new ArrayList(); int slotCount = 0; @@ -90,7 +90,7 @@ public class LayerISidedInventory extends LayerBase implements ISidedInventory } // make sure inventory is updated before we call FMP. - super.partChanged(); + super.notifyNeighbors(); } /** diff --git a/parts/networking/PartCable.java b/parts/networking/PartCable.java index 9280e0f8b..1c63e96cd 100644 --- a/parts/networking/PartCable.java +++ b/parts/networking/PartCable.java @@ -62,12 +62,6 @@ public class PartCable extends AEBasePart implements IPartCable return BusSupport.CABLE; } - @Override - public int getLightLevel() - { - return 11; - } - public IIcon getGlassTexture(AEColor c) { switch (c) 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..9e95d2917 100644 --- a/parts/p2p/PartP2PItems.java +++ b/parts/p2p/PartP2PItems.java @@ -13,11 +13,16 @@ import net.minecraft.tileentity.TileEntityChest; import net.minecraft.util.IIcon; import net.minecraftforge.common.util.ForgeDirection; import appeng.api.config.TunnelType; +import appeng.api.networking.IGridNode; import appeng.api.networking.events.MENetworkBootingStatusChange; import appeng.api.networking.events.MENetworkChannelsChanged; import appeng.api.networking.events.MENetworkEventSubscribe; import appeng.api.networking.events.MENetworkPowerStatusChange; +import appeng.api.networking.ticking.IGridTickable; +import appeng.api.networking.ticking.TickRateModulation; +import appeng.api.networking.ticking.TickingRequest; import appeng.core.AppEng; +import appeng.core.settings.TickRates; import appeng.integration.abstraction.IBC; import appeng.me.GridAccessException; import appeng.me.cache.helpers.TunnelCollection; @@ -34,7 +39,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @Interface(iface = "buildcraft.api.transport.IPipeConnection", iname = "BC") -public class PartP2PItems extends PartP2PTunnel implements IPipeConnection, IInventory, ISidedInventory +public class PartP2PItems extends PartP2PTunnel implements IPipeConnection, IInventory, ISidedInventory, IGridTickable { public TunnelType getTunnelType() @@ -47,6 +52,7 @@ public class PartP2PItems extends PartP2PTunnel implements IPipeCo } int oldSize = 0; + boolean requsted; IInventory cachedInv; LinkedList which = new LinkedList(); @@ -116,11 +122,31 @@ public class PartP2PItems extends PartP2PTunnel implements IPipeCo cachedInv = null; PartP2PItems input = getInput(); if ( input != null && output ) - input.onChange(); + input.onTunnelNetworkChange(); + } + + @Override + public TickingRequest getTickingRequest(IGridNode node) + { + return new TickingRequest( TickRates.ItemTunnel.min, TickRates.ItemTunnel.max, false, false ); + } + + @Override + public TickRateModulation tickingRequest(IGridNode node, int TicksSinceLastCall) + { + boolean wasReq = requsted; + + if ( requsted && cachedInv != null ) + ((WrapperChainedInventory) cachedInv).cycleOrder(); + + requsted = false; + return wasReq ? TickRateModulation.FASTER : TickRateModulation.SLOWER; } IInventory getDest() { + requsted = true; + if ( cachedInv != null ) return cachedInv; @@ -161,8 +187,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 +202,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(); } } } @@ -193,14 +217,13 @@ 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(); } } } @Override - public void onChange() + public void onTunnelNetworkChange() { if ( !output ) { @@ -209,15 +232,14 @@ 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(); } } else { 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 ); } diff --git a/util/inv/WrapperChainedInventory.java b/util/inv/WrapperChainedInventory.java index a1e71c4f6..66e0adf9b 100644 --- a/util/inv/WrapperChainedInventory.java +++ b/util/inv/WrapperChainedInventory.java @@ -32,6 +32,18 @@ public class WrapperChainedInventory implements IInventory setInventory( ilist ); } + public void cycleOrder() + { + if ( l.size() > 1 ) + { + List newOrder = new ArrayList( l.size() ); + newOrder.add( l.get( l.size() - 1 ) ); + for (int x = 0; x < l.size() - 1; x++) + newOrder.add( l.get( x ) ); + setInventory( newOrder ); + } + } + public void calculateSizes() { offsets = new HashMap(); @@ -195,4 +207,5 @@ public class WrapperChainedInventory implements IInventory } return false; } + }