diff --git a/container/AEBaseContainer.java b/container/AEBaseContainer.java index 8edf74f70..a37fa2da1 100644 --- a/container/AEBaseContainer.java +++ b/container/AEBaseContainer.java @@ -13,7 +13,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; import appeng.api.AEApi; +import appeng.api.networking.IGridHost; import appeng.api.networking.energy.IEnergySource; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.PlayerSource; import appeng.api.parts.IPart; import appeng.api.storage.IMEInventoryHandler; import appeng.api.storage.data.IAEItemStack; @@ -37,6 +40,8 @@ public abstract class AEBaseContainer extends Container final TileEntity tileEntity; final IPart part; + BaseActionSource mySrc; + protected IMEInventoryHandler cellInv; protected IEnergySource powerSrc; @@ -53,6 +58,7 @@ public abstract class AEBaseContainer extends Container invPlayer = ip; tileEntity = myTile; part = myPart; + mySrc = new PlayerSource( ip.player, (IGridHost) (myTile instanceof IGridHost ? myTile : (myPart instanceof IGridHost ? myPart : null)) ); } public boolean canDragIntoSlot(Slot s) @@ -339,7 +345,7 @@ public abstract class AEBaseContainer extends Container { if ( powerSrc == null || cellInv == null ) return input; - IAEItemStack ais = Platform.poweredInsert( powerSrc, cellInv, AEApi.instance().storage().createItemStack( input ) ); + IAEItemStack ais = Platform.poweredInsert( powerSrc, cellInv, AEApi.instance().storage().createItemStack( input ), mySrc ); if ( ais == null ) return null; return ais.getItemStack(); @@ -422,7 +428,7 @@ public abstract class AEBaseContainer extends Container if ( myItem != null ) ais.setStackSize( ais.getStackSize() - myItem.stackSize ); - ais = Platform.poweredExtraction( powerSrc, cellInv, ais ); + ais = Platform.poweredExtraction( powerSrc, cellInv, ais, mySrc ); if ( ais != null ) adp.addItems( ais.getItemStack() ); } @@ -437,7 +443,7 @@ public abstract class AEBaseContainer extends Container { IAEItemStack ais = slotItem.copy(); ais.setStackSize( ais.getItemStack().getMaxStackSize() ); - ais = Platform.poweredExtraction( powerSrc, cellInv, ais ); + ais = Platform.poweredExtraction( powerSrc, cellInv, ais, mySrc ); if ( ais != null ) player.inventory.setItemStack( ais.getItemStack() ); else @@ -448,7 +454,7 @@ public abstract class AEBaseContainer extends Container else { IAEItemStack ais = AEApi.instance().storage().createItemStack( player.inventory.getItemStack() ); - ais = Platform.poweredInsert( powerSrc, cellInv, ais ); + ais = Platform.poweredInsert( powerSrc, cellInv, ais, mySrc ); if ( ais != null ) player.inventory.setItemStack( ais.getItemStack() ); else @@ -468,7 +474,7 @@ public abstract class AEBaseContainer extends Container IAEItemStack ais = slotItem.copy(); long stackSize = Math.min( ais.getItemStack().getMaxStackSize(), ais.getStackSize() ); ais.setStackSize( (stackSize + 1) >> 1 ); - ais = Platform.poweredExtraction( powerSrc, cellInv, ais ); + ais = Platform.poweredExtraction( powerSrc, cellInv, ais, mySrc ); if ( ais != null ) player.inventory.setItemStack( ais.getItemStack() ); else @@ -480,7 +486,7 @@ public abstract class AEBaseContainer extends Container { IAEItemStack ais = AEApi.instance().storage().createItemStack( player.inventory.getItemStack() ); ais.setStackSize( 1 ); - ais = Platform.poweredInsert( powerSrc, cellInv, ais ); + ais = Platform.poweredInsert( powerSrc, cellInv, ais, mySrc ); if ( ais == null ) { ItemStack is = player.inventory.getItemStack(); diff --git a/container/implementations/ContainerMEMonitorable.java b/container/implementations/ContainerMEMonitorable.java index 2fa4f9a64..991d06470 100644 --- a/container/implementations/ContainerMEMonitorable.java +++ b/container/implementations/ContainerMEMonitorable.java @@ -9,14 +9,15 @@ import net.minecraft.network.packet.Packet; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; import appeng.api.implementations.IMEChest; -import appeng.api.implementations.IStorageMonitorable; import appeng.api.networking.IGrid; import appeng.api.networking.IGridHost; import appeng.api.networking.IGridNode; import appeng.api.networking.energy.IEnergyGrid; +import appeng.api.networking.security.BaseActionSource; import appeng.api.parts.IPart; import appeng.api.storage.IMEMonitor; import appeng.api.storage.IMEMonitorHandlerReciever; +import appeng.api.storage.IStorageMonitorable; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import appeng.container.AEBaseContainer; @@ -153,7 +154,7 @@ public class ContainerMEMonitorable extends AEBaseContainer implements IMEMonito } @Override - public void postChange(IAEItemStack change) + public void postChange(IMEMonitor monitor, IAEItemStack change, BaseActionSource source) { items.add( change ); } diff --git a/core/api/ApiStorage.java b/core/api/ApiStorage.java index 64831897d..3cb947600 100644 --- a/core/api/ApiStorage.java +++ b/core/api/ApiStorage.java @@ -2,10 +2,14 @@ package appeng.core.api; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; +import appeng.api.networking.energy.IEnergySource; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.storage.IMEInventory; import appeng.api.storage.IStorageHelper; import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; +import appeng.util.Platform; import appeng.util.item.AEFluidStack; import appeng.util.item.AEItemStack; import appeng.util.item.ItemList; @@ -31,4 +35,16 @@ public class ApiStorage implements IStorageHelper return new ItemList(); } + @Override + public IAEItemStack poweredExtraction(IEnergySource energy, IMEInventory cell, IAEItemStack request, BaseActionSource src) + { + return Platform.poweredExtraction( energy, cell, request, src ); + } + + @Override + public IAEItemStack poweredInsert(IEnergySource energy, IMEInventory cell, IAEItemStack input, BaseActionSource src) + { + return Platform.poweredInsert( energy, cell, input, src ); + } + } diff --git a/me/cache/NetworkMonitor.java b/me/cache/NetworkMonitor.java index fb5b51c71..0b93e4a00 100644 --- a/me/cache/NetworkMonitor.java +++ b/me/cache/NetworkMonitor.java @@ -1,12 +1,16 @@ package appeng.me.cache; import java.util.LinkedList; +import java.util.Set; import appeng.api.networking.events.MENetworkStorageEvent; +import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IMEInventoryHandler; import appeng.api.storage.MEMonitorHandler; import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEStack; +import appeng.api.storage.data.IItemList; +import appeng.me.storage.ItemWatcher; public class NetworkMonitor> extends MEMonitorHandler { @@ -16,6 +20,11 @@ public class NetworkMonitor> extends MEMonitorHandler boolean sendEvent = false; + public void forceUpdate() + { + hasChanged = true; + } + public NetworkMonitor(GridStorageCache cache, StorageChannel chan) { super( null ); myGridCache = cache; @@ -24,8 +33,21 @@ public class NetworkMonitor> extends MEMonitorHandler final static public LinkedList depth = new LinkedList(); + private BaseActionSource src; + + public void setSource(BaseActionSource src) + { + this.src = src; + } + @Override - protected void postChange(T diff) + protected BaseActionSource getSource() + { + return src; + } + + @Override + protected void postChange(T diff, BaseActionSource src) { if ( depth.contains( this ) ) return; @@ -33,7 +55,26 @@ public class NetworkMonitor> extends MEMonitorHandler depth.push( this ); sendEvent = true; - super.postChange( diff ); + super.postChange( diff, src ); + + if ( myGridCache.interests.containsKey( diff ) ) + { + Set list = myGridCache.interests.get( diff ); + if ( !list.isEmpty() ) + { + IItemList myStorageList = getStorageList(); + + IAEStack fullStack = myStorageList.findPrecise( diff ); + if ( fullStack == null ) + { + fullStack = diff.copy(); + fullStack.setStackSize( 0 ); + } + + for (ItemWatcher iw : list) + iw.getHost().onStackChange( myStorageList, fullStack, diff, src, getChannel() ); + } + } Object last = depth.pop(); if ( last != this ) diff --git a/me/storage/MEMonitorIInventory.java b/me/storage/MEMonitorIInventory.java index ca9ef74ff..87dcfca88 100644 --- a/me/storage/MEMonitorIInventory.java +++ b/me/storage/MEMonitorIInventory.java @@ -11,6 +11,7 @@ import net.minecraftforge.common.ForgeDirection; import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; +import appeng.api.networking.security.BaseActionSource; import appeng.api.networking.ticking.TickRateModulation; import appeng.api.storage.IMEInventory; import appeng.api.storage.IMEMonitor; @@ -56,6 +57,8 @@ public class MEMonitorIInventory implements IMEInventory, IMEMonit final IItemList list = new ItemList(); final HashMap, Object> listeners = new HashMap(); + public BaseActionSource mySource; + @Override public void addListener(IMEMonitorHandlerReciever l, Object verificationToken) { @@ -241,7 +244,7 @@ public class MEMonitorIInventory implements IMEInventory, IMEMonit Entry, Object> l = i.next(); IMEMonitorHandlerReciever key = l.getKey(); if ( key.isValid( l.getValue() ) ) - key.postChange( a ); + key.postChange( this, a, mySource ); else i.remove(); } diff --git a/me/storage/MEMonitorPassthu.java b/me/storage/MEMonitorPassthu.java index 2cf0eef2a..a38804657 100644 --- a/me/storage/MEMonitorPassthu.java +++ b/me/storage/MEMonitorPassthu.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; +import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IMEInventory; import appeng.api.storage.IMEMonitor; import appeng.api.storage.IMEMonitorHandlerReciever; @@ -18,6 +19,8 @@ public class MEMonitorPassthu> extends MEPassthru imple HashMap, Object> listeners = new HashMap(); IMEMonitor monitor; + public BaseActionSource changeSource; + public MEMonitorPassthu(IMEInventory i) { super( i ); if ( i instanceof IMEMonitor ) @@ -42,7 +45,7 @@ public class MEMonitorPassthu> extends MEPassthru imple if ( monitor != null ) monitor.addListener( this, monitor ); - Platform.postListChanges( before, after, this ); + Platform.postListChanges( before, after, this, changeSource ); } @Override @@ -72,7 +75,7 @@ public class MEMonitorPassthu> extends MEPassthru imple } @Override - public void postChange(T change) + public void postChange(IMEMonitor monitor, T change, BaseActionSource source) { Iterator, Object>> i = listeners.entrySet().iterator(); while (i.hasNext()) @@ -80,7 +83,7 @@ public class MEMonitorPassthu> extends MEPassthru imple Entry, Object> e = i.next(); IMEMonitorHandlerReciever recv = e.getKey(); if ( recv.isValid( e.getValue() ) ) - recv.postChange( change ); + recv.postChange( this, change, source ); else i.remove(); } diff --git a/parts/automation/PartExportBus.java b/parts/automation/PartExportBus.java index 1c59a9b43..1d0149ce9 100644 --- a/parts/automation/PartExportBus.java +++ b/parts/automation/PartExportBus.java @@ -11,6 +11,8 @@ import appeng.api.config.Settings; import appeng.api.config.Upgrades; import appeng.api.networking.IGridNode; import appeng.api.networking.energy.IEnergyGrid; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.MachineSource; import appeng.api.networking.ticking.IGridTickable; import appeng.api.networking.ticking.TickRateModulation; import appeng.api.parts.IPartCollsionHelper; @@ -26,10 +28,13 @@ import appeng.util.Platform; public class PartExportBus extends PartSharedItemBus implements IGridTickable { + BaseActionSource mySrc; + public PartExportBus(ItemStack is) { super( PartExportBus.class, is ); - settings.registerSetting( Settings.REDSTONE_OUTPUT, RedstoneMode.IGNORE ); + settings.registerSetting( Settings.REDSTONE_CONTROLLED, RedstoneMode.IGNORE ); settings.registerSetting( Settings.FUZZY_MODE, FuzzyMode.IGNORE_ALL ); + mySrc = new MachineSource( this ); } @Override @@ -155,7 +160,7 @@ public class PartExportBus extends PartSharedItemBus implements IGridTickable { ais = ais.copy(); ais.setStackSize( canFit ); - IAEItemStack itemsToAdd = Platform.poweredExtraction( energy, inv, ais ); + IAEItemStack itemsToAdd = Platform.poweredExtraction( energy, inv, ais, mySrc ); if ( itemsToAdd != null ) { @@ -193,7 +198,7 @@ public class PartExportBus extends PartSharedItemBus implements IGridTickable public RedstoneMode getRSMode() { - return (RedstoneMode) settings.getSetting( Settings.REDSTONE_OUTPUT ); + return (RedstoneMode) settings.getSetting( Settings.REDSTONE_CONTROLLED ); } @Override diff --git a/parts/automation/PartImportBus.java b/parts/automation/PartImportBus.java index a1a72d7db..cfb7c4c9c 100644 --- a/parts/automation/PartImportBus.java +++ b/parts/automation/PartImportBus.java @@ -12,6 +12,10 @@ import appeng.api.config.RedstoneMode; import appeng.api.config.Settings; import appeng.api.config.Upgrades; import appeng.api.networking.IGridNode; +import appeng.api.networking.energy.IEnergyGrid; +import appeng.api.networking.energy.IEnergySource; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.MachineSource; import appeng.api.networking.ticking.IGridTickable; import appeng.api.networking.ticking.TickRateModulation; import appeng.api.networking.ticking.TickingRequest; @@ -30,10 +34,15 @@ import appeng.util.inv.IInventoryDestination; public class PartImportBus extends PartSharedItemBus implements IGridTickable, IInventoryDestination { + BaseActionSource mySrc; + IMEInventory destination = null; + IAEItemStack lastItemChecked = null; + public PartImportBus(ItemStack is) { super( PartImportBus.class, is ); - settings.registerSetting( Settings.REDSTONE_OUTPUT, RedstoneMode.IGNORE ); + settings.registerSetting( Settings.REDSTONE_CONTROLLED, RedstoneMode.IGNORE ); settings.registerSetting( Settings.FUZZY_MODE, FuzzyMode.IGNORE_ALL ); + mySrc = new MachineSource( this ); } @Override @@ -51,9 +60,6 @@ public class PartImportBus extends PartSharedItemBus implements IGridTickable, I return false; } - IMEInventory destination = null; - IAEItemStack lastItemChecked = null; - @Override public boolean canInsert(ItemStack stack) { @@ -165,6 +171,7 @@ public class PartImportBus extends PartSharedItemBus implements IGridTickable, I itemToSend = Math.min( itemToSend, (int) (0.01 + proxy.getEnergy().extractAEPower( itemToSend, Actionable.SIMULATE, PowerMultiplier.CONFIG )) ); IMEMonitor inv = proxy.getStorage().getItemInventory(); + IEnergyGrid energy = proxy.getEnergy(); boolean Configured = false; for (int x = 0; x < availableSlots(); x++) @@ -175,7 +182,7 @@ public class PartImportBus extends PartSharedItemBus implements IGridTickable, I Configured = true; while (itemToSend > 0) { - if ( importStuff( myAdaptor, ais, inv ) ) + if ( importStuff( myAdaptor, ais, inv, energy ) ) break; } } @@ -185,7 +192,7 @@ public class PartImportBus extends PartSharedItemBus implements IGridTickable, I { while (itemToSend > 0) { - if ( importStuff( myAdaptor, null, inv ) ) + if ( importStuff( myAdaptor, null, inv, energy ) ) break; } } @@ -207,7 +214,7 @@ public class PartImportBus extends PartSharedItemBus implements IGridTickable, I return doBusWork(); } - private boolean importStuff(InventoryAdaptor myAdaptor, IAEItemStack whatToImport, IMEMonitor inv) + private boolean importStuff(InventoryAdaptor myAdaptor, IAEItemStack whatToImport, IMEMonitor inv, IEnergySource energy) { if ( itemToSend > 64 ) itemToSend = 64; @@ -215,6 +222,7 @@ public class PartImportBus extends PartSharedItemBus implements IGridTickable, I ItemStack newItems = myAdaptor.removeItems( itemToSend, whatToImport == null ? null : whatToImport.getItemStack(), configDest( inv ) ); if ( newItems != null ) { + newItems.stackSize = (int) (Math.min( newItems.stackSize, energy.extractAEPower( newItems.stackSize, Actionable.SIMULATE, PowerMultiplier.CONFIG ) ) + 0.01); itemToSend -= newItems.stackSize; if ( lastItemChecked == null || !lastItemChecked.isSameType( newItems ) ) @@ -222,7 +230,8 @@ public class PartImportBus extends PartSharedItemBus implements IGridTickable, I else lastItemChecked.setStackSize( newItems.stackSize ); - IAEItemStack failed = destination.injectItems( lastItemChecked, Actionable.MODULATE ); + IAEItemStack failed = Platform.poweredInsert( energy, destination, lastItemChecked, mySrc ); + // destination.injectItems( lastItemChecked, Actionable.MODULATE ); if ( failed != null ) { myAdaptor.addItems( failed.getItemStack() ); @@ -239,7 +248,7 @@ public class PartImportBus extends PartSharedItemBus implements IGridTickable, I public RedstoneMode getRSMode() { - return (RedstoneMode) settings.getSetting( Settings.REDSTONE_OUTPUT ); + return (RedstoneMode) settings.getSetting( Settings.REDSTONE_CONTROLLED ); } @Override diff --git a/parts/misc/PartStorageBus.java b/parts/misc/PartStorageBus.java index c2fa33d51..589917e99 100644 --- a/parts/misc/PartStorageBus.java +++ b/parts/misc/PartStorageBus.java @@ -11,6 +11,8 @@ import net.minecraftforge.common.ForgeDirection; import appeng.api.AEApi; import appeng.api.networking.IGridNode; import appeng.api.networking.events.MENetworkCellArrayUpdate; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.MachineSource; import appeng.api.networking.ticking.IGridTickable; import appeng.api.networking.ticking.ITickManager; import appeng.api.networking.ticking.TickRateModulation; @@ -41,9 +43,11 @@ public class PartStorageBus extends PartBasicState implements IGridTickable, ICe { int priority = 0; + BaseActionSource mySrc; public PartStorageBus(ItemStack is) { super( PartStorageBus.class, is ); + mySrc = new MachineSource( this ); } boolean cached = false; @@ -98,6 +102,9 @@ public class PartStorageBus extends PartBasicState implements IGridTickable, ICe { IMEInventory inv = esh.getInventory( target, side.getOpposite(), StorageChannel.ITEMS ); + if ( inv instanceof MEMonitorIInventory ) + ((MEMonitorIInventory) inv).mySource = new MachineSource( this ); + if ( inv instanceof MEMonitorIInventory ) monitor = (MEMonitorIInventory) inv; @@ -240,11 +247,11 @@ public class PartStorageBus extends PartBasicState implements IGridTickable, ICe } @Override - public void postChange(IAEItemStack change) + public void postChange(IMEMonitor monitor, IAEItemStack change, BaseActionSource source) { try { - proxy.getStorage().postAlterationOfStoredItems( StorageChannel.ITEMS, change ); + proxy.getStorage().postAlterationOfStoredItems( StorageChannel.ITEMS, change, mySrc ); } catch (GridAccessException e) { diff --git a/tile/storage/TileChest.java b/tile/storage/TileChest.java index 3e460d038..7e672e977 100644 --- a/tile/storage/TileChest.java +++ b/tile/storage/TileChest.java @@ -29,6 +29,8 @@ import appeng.api.networking.events.MENetworkEventSubscribe; import appeng.api.networking.events.MENetworkPowerStatusChange; import appeng.api.networking.events.MENetworkPowerStorage; import appeng.api.networking.events.MENetworkPowerStorage.PowerEventType; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.MachineSource; import appeng.api.networking.storage.IStorageGrid; import appeng.api.storage.ICellHandler; import appeng.api.storage.IMEInventory; @@ -61,6 +63,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan static final int front[] = new int[] { 1 }; AppEngInternalInventory inv = new AppEngInternalInventory( this, 2 ); + BaseActionSource mySrc = new MachineSource( this ); ItemStack storageType; long lastStateChange = 0; @@ -250,11 +253,11 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan } @Override - public void postChange(T change) + public void postChange(IMEMonitor monitor, T change, BaseActionSource source) { try { - gridProxy.getStorage().postAlterationOfStoredItems( chan, change ); + gridProxy.getStorage().postAlterationOfStoredItems( chan, change, mySrc ); } catch (GridAccessException e) { @@ -336,7 +339,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan try { IStorageGrid gs = gridProxy.getStorage(); - Platform.postChanges( gs, removed, added ); + Platform.postChanges( gs, removed, added, mySrc ); gridProxy.getGrid().postEvent( new MENetworkCellArrayUpdate() ); } @@ -369,7 +372,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan { IMEInventory cell = getHandler( StorageChannel.ITEMS ); - IAEItemStack returns = Platform.poweredInsert( this, cell, AEApi.instance().storage().createItemStack( inv.getStackInSlot( 0 ) ) ); + IAEItemStack returns = Platform.poweredInsert( this, cell, AEApi.instance().storage().createItemStack( inv.getStackInSlot( 0 ) ), mySrc ); if ( returns == null ) inv.setInventorySlotContents( 0, null ); diff --git a/tile/storage/TileDrive.java b/tile/storage/TileDrive.java index e3d949d55..ddf25e6d1 100644 --- a/tile/storage/TileDrive.java +++ b/tile/storage/TileDrive.java @@ -18,6 +18,8 @@ import appeng.api.networking.events.MENetworkCellArrayUpdate; import appeng.api.networking.events.MENetworkChannelsChanged; import appeng.api.networking.events.MENetworkEventSubscribe; import appeng.api.networking.events.MENetworkPowerStatusChange; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.MachineSource; import appeng.api.networking.storage.IStorageGrid; import appeng.api.storage.ICellHandler; import appeng.api.storage.IMEInventoryHandler; @@ -45,6 +47,7 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive List items = new LinkedList(); List fluids = new LinkedList(); + BaseActionSource mySrc; long lastStateChange = 0; int state = 0; int priority = 0; @@ -127,6 +130,7 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive } public TileDrive() { + mySrc = new MachineSource( this ); gridProxy.setFlags( GridFlags.REQURE_CHANNEL ); addNewHandler( new invManger() ); } @@ -158,7 +162,7 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive try { IStorageGrid gs = gridProxy.getStorage(); - Platform.postChanges( gs, removed, added ); + Platform.postChanges( gs, removed, added, mySrc ); gridProxy.getGrid().postEvent( new MENetworkCellArrayUpdate() ); } diff --git a/util/Platform.java b/util/Platform.java index 103a91b63..c0292c37b 100644 --- a/util/Platform.java +++ b/util/Platform.java @@ -51,6 +51,7 @@ import appeng.api.implementations.IAEItemPowerStorage; import appeng.api.implementations.IAEWrench; import appeng.api.implementations.ITileStorageMonitorable; import appeng.api.networking.energy.IEnergySource; +import appeng.api.networking.security.BaseActionSource; import appeng.api.networking.storage.IStorageGrid; import appeng.api.storage.IMEInventory; import appeng.api.storage.IMEMonitorHandlerReciever; @@ -65,6 +66,7 @@ import appeng.core.AELog; import appeng.core.AppEng; import appeng.core.Configuration; import appeng.core.sync.GuiBridge; +import appeng.me.cache.NetworkMonitor; import appeng.server.AccessType; import appeng.server.Security; import appeng.util.item.AEItemStack; @@ -217,6 +219,20 @@ public class Platform return null; } + public static T rotateEnum(T ce, boolean backwards, EnumSet ValidOptions) + { + do + { + if ( backwards ) + ce = prevEnum( ce ); + else + ce = nextEnum( ce ); + } + while (!ValidOptions.contains( ce )); + + return ce; + } + /* * Simple way to cycle an enum... */ @@ -1128,8 +1144,11 @@ public class Platform return 0; } - public static IAEItemStack poweredExtraction(IEnergySource energy, IMEInventory cell, IAEItemStack request) + public static IAEItemStack poweredExtraction(IEnergySource energy, IMEInventory cell, IAEItemStack request, BaseActionSource src) { + if ( cell instanceof NetworkMonitor ) + ((NetworkMonitor) cell).setSource( src ); + IAEItemStack possible = cell.extractItems( request.copy(), Actionable.SIMULATE ); long retrieved = 0; @@ -1145,14 +1164,22 @@ public class Platform energy.extractAEPower( retrieved, Actionable.MODULATE, PowerMultiplier.CONFIG ); possible.setStackSize( itemToExtract ); - return cell.extractItems( possible, Actionable.MODULATE ); + IAEItemStack ret = cell.extractItems( possible, Actionable.MODULATE ); + + if ( cell instanceof NetworkMonitor ) + ((NetworkMonitor) cell).setSource( null ); + + return ret; } return null; } - public static IAEItemStack poweredInsert(IEnergySource energy, IMEInventory cell, IAEItemStack input) + public static IAEItemStack poweredInsert(IEnergySource energy, IMEInventory cell, IAEItemStack input, BaseActionSource src) { + if ( cell instanceof NetworkMonitor ) + ((NetworkMonitor) cell).setSource( src ); + IAEItemStack possible = cell.injectItems( input.copy(), Actionable.SIMULATE ); long stored = input.getStackSize(); @@ -1175,13 +1202,19 @@ public class Platform split.add( cell.injectItems( input, Actionable.MODULATE ) ); return split; } - return cell.injectItems( input, Actionable.MODULATE ); + + IAEItemStack ret = cell.injectItems( input, Actionable.MODULATE ); + + if ( cell instanceof NetworkMonitor ) + ((NetworkMonitor) cell).setSource( null ); + + return ret; } return input; } - public static void postChanges(IStorageGrid gs, ItemStack removed, ItemStack added) + public static void postChanges(IStorageGrid gs, ItemStack removed, ItemStack added, BaseActionSource src) { if ( removed != null ) { @@ -1192,7 +1225,7 @@ public class Platform for (IAEItemStack is : myItems.getAvailableItems( new ItemList() )) { is.setStackSize( -is.getStackSize() ); - gs.postAlterationOfStoredItems( StorageChannel.ITEMS, is ); + gs.postAlterationOfStoredItems( StorageChannel.ITEMS, is, src ); } } @@ -1203,7 +1236,7 @@ public class Platform for (IAEFluidStack is : myFluids.getAvailableItems( new ItemList() )) { is.setStackSize( -is.getStackSize() ); - gs.postAlterationOfStoredItems( StorageChannel.ITEMS, is ); + gs.postAlterationOfStoredItems( StorageChannel.ITEMS, is, src ); } } } @@ -1216,7 +1249,7 @@ public class Platform { for (IAEItemStack is : myItems.getAvailableItems( new ItemList() )) { - gs.postAlterationOfStoredItems( StorageChannel.ITEMS, is ); + gs.postAlterationOfStoredItems( StorageChannel.ITEMS, is, src ); } } @@ -1226,13 +1259,14 @@ public class Platform { for (IAEFluidStack is : myFluids.getAvailableItems( new ItemList() )) { - gs.postAlterationOfStoredItems( StorageChannel.ITEMS, is ); + gs.postAlterationOfStoredItems( StorageChannel.ITEMS, is, src ); } } } } - static public > void postListChanges(IItemList before, IItemList after, IMEMonitorHandlerReciever meMonitorPassthu) + static public > void postListChanges(IItemList before, IItemList after, IMEMonitorHandlerReciever meMonitorPassthu, + BaseActionSource source) { for (T is : before) is.setStackSize( -is.getStackSize() ); @@ -1244,7 +1278,7 @@ public class Platform { if ( is.getStackSize() != 0 ) { - meMonitorPassthu.postChange( is ); + meMonitorPassthu.postChange( null, is, source ); } } }