diff --git a/client/gui/implementations/GuiLevelEmitter.java b/client/gui/implementations/GuiLevelEmitter.java index d3df40c14..d9d777399 100644 --- a/client/gui/implementations/GuiLevelEmitter.java +++ b/client/gui/implementations/GuiLevelEmitter.java @@ -130,7 +130,7 @@ public class GuiLevelEmitter extends GuiUpgradeable NetworkHandler.instance.sendToServer( new PacketValueConfig( "LevelEmitter.Value", Out ) ); } - catch(NumberFormatException e ) + catch (NumberFormatException e) { // nope.. level.setText( "0" ); @@ -187,6 +187,21 @@ public class GuiLevelEmitter extends GuiUpgradeable @Override public void drawFG(int offsetX, int offsetY, int mouseX, int mouseY) { + boolean notCraftingMode = bc.getInstalledUpgrades( Upgrades.CRAFTING ) == 0; + + // configure enabled status... + level.setEnabled( notCraftingMode ); + plus1.enabled = notCraftingMode; + plus10.enabled = notCraftingMode; + plus100.enabled = notCraftingMode; + plus1000.enabled = notCraftingMode; + minus1.enabled = notCraftingMode; + minus10.enabled = notCraftingMode; + minus100.enabled = notCraftingMode; + minus1000.enabled = notCraftingMode; + levelMode.enabled = notCraftingMode; + redstoneMode.enabled = notCraftingMode; + super.drawFG( offsetX, offsetY, mouseX, mouseY ); if ( levelMode != null ) diff --git a/core/Registration.java b/core/Registration.java index 23d602d26..a72e1c86d 100644 --- a/core/Registration.java +++ b/core/Registration.java @@ -589,31 +589,32 @@ public class Registration Api.instance.partHelper.initFMPSupport(); ((BlockCableBus) AEApi.instance().blocks().blockMultiPart.block()).setupTile(); - // interface + // Interface Upgrades.CRAFTING.registerItem( AEApi.instance().parts().partInterface.stack( 1 ), 1 ); Upgrades.CRAFTING.registerItem( AEApi.instance().blocks().blockInterface.stack( 1 ), 1 ); - // IO PORT! + // IO Port! Upgrades.SPEED.registerItem( AEApi.instance().blocks().blockIOPort.stack( 1 ), 3 ); Upgrades.REDSTONE.registerItem( AEApi.instance().blocks().blockIOPort.stack( 1 ), 1 ); - // partLevelEmitter + // Level Emitter! Upgrades.FUZZY.registerItem( AEApi.instance().parts().partLevelEmitter.stack( 1 ), 1 ); + Upgrades.CRAFTING.registerItem( AEApi.instance().parts().partLevelEmitter.stack( 1 ), 1 ); - // partImportBus + // Import Bus Upgrades.FUZZY.registerItem( AEApi.instance().parts().partImportBus.stack( 1 ), 1 ); Upgrades.REDSTONE.registerItem( AEApi.instance().parts().partImportBus.stack( 1 ), 1 ); Upgrades.CAPACITY.registerItem( AEApi.instance().parts().partImportBus.stack( 1 ), 2 ); Upgrades.SPEED.registerItem( AEApi.instance().parts().partImportBus.stack( 1 ), 4 ); - // partExportBus + // Export Bus Upgrades.FUZZY.registerItem( AEApi.instance().parts().partExportBus.stack( 1 ), 1 ); Upgrades.REDSTONE.registerItem( AEApi.instance().parts().partExportBus.stack( 1 ), 1 ); Upgrades.CAPACITY.registerItem( AEApi.instance().parts().partExportBus.stack( 1 ), 2 ); Upgrades.SPEED.registerItem( AEApi.instance().parts().partExportBus.stack( 1 ), 4 ); Upgrades.CRAFTING.registerItem( AEApi.instance().parts().partExportBus.stack( 1 ), 1 ); - // blockCellWorkbench + // Storage Cells Upgrades.FUZZY.registerItem( AEApi.instance().items().itemCell1k.stack( 1 ), 1 ); Upgrades.INVERTER.registerItem( AEApi.instance().items().itemCell1k.stack( 1 ), 1 ); @@ -632,22 +633,22 @@ public class Registration Upgrades.FUZZY.registerItem( AEApi.instance().items().itemViewCell.stack( 1 ), 1 ); Upgrades.INVERTER.registerItem( AEApi.instance().items().itemViewCell.stack( 1 ), 1 ); - // partStorageBus + // Storage Bus Upgrades.FUZZY.registerItem( AEApi.instance().parts().partStorageBus.stack( 1 ), 1 ); Upgrades.INVERTER.registerItem( AEApi.instance().parts().partStorageBus.stack( 1 ), 1 ); Upgrades.CAPACITY.registerItem( AEApi.instance().parts().partStorageBus.stack( 1 ), 5 ); - // partFormationPlane + // Formation Plane Upgrades.FUZZY.registerItem( AEApi.instance().parts().partFormationPlane.stack( 1 ), 1 ); Upgrades.INVERTER.registerItem( AEApi.instance().parts().partFormationPlane.stack( 1 ), 1 ); Upgrades.CAPACITY.registerItem( AEApi.instance().parts().partFormationPlane.stack( 1 ), 5 ); - // matter cannon + // Matter Cannon Upgrades.FUZZY.registerItem( AEApi.instance().items().itemMassCannon.stack( 1 ), 1 ); Upgrades.INVERTER.registerItem( AEApi.instance().items().itemMassCannon.stack( 1 ), 1 ); Upgrades.SPEED.registerItem( AEApi.instance().items().itemMassCannon.stack( 1 ), 4 ); - // molecular assembler + // Molecular Assembler Upgrades.SPEED.registerItem( AEApi.instance().blocks().blockMolecularAssembler.stack( 1 ), 5 ); AEApi.instance().registries().wireless().registerWirelessHandler( (IWirelessTermHandler) AEApi.instance().items().itemWirelessTerminal.item() ); diff --git a/crafting/CraftingTreeNode.java b/crafting/CraftingTreeNode.java index 3cd36becb..bd8fafe75 100644 --- a/crafting/CraftingTreeNode.java +++ b/crafting/CraftingTreeNode.java @@ -32,6 +32,7 @@ public class CraftingTreeNode // what are the crafting patterns for this? private ArrayList nodes = new ArrayList(); + boolean canEmit = false; boolean cannotUse = false; long missing = 0; @@ -49,12 +50,17 @@ public class CraftingTreeNode this.job = job; sim = false; + canEmit = cc.canEmitFor( what ); + if ( canEmit ) + return; // if you can emit for something, you can't make it with patterns. + for (ICraftingPatternDetails details : cc.getCraftingFor( what, parent == null ? null : parent.details, slot, world ))// in // order. { if ( parent == null || parent.notRecurive( details ) ) nodes.add( new CraftingTreeProcess( cc, job, details, this, depth + 1, world ) ); } + } public IAEItemStack getStack(long size) diff --git a/crafting/CraftingWatcher.java b/crafting/CraftingWatcher.java new file mode 100644 index 000000000..1acbb0556 --- /dev/null +++ b/crafting/CraftingWatcher.java @@ -0,0 +1,171 @@ +package appeng.crafting; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; + +import appeng.api.networking.crafting.ICraftingWatcher; +import appeng.api.networking.crafting.ICraftingWatcherHost; +import appeng.api.storage.data.IAEStack; +import appeng.me.cache.CraftingGridCache; + +/** + * Maintain my interests, and a global watch list, they should always be fully synchronized. + */ +public class CraftingWatcher implements ICraftingWatcher +{ + + class ItemWatcherIterator implements Iterator + { + + final CraftingWatcher watcher; + final Iterator interestIterator; + IAEStack myLast; + + public ItemWatcherIterator(CraftingWatcher parent, Iterator i) { + watcher = parent; + interestIterator = i; + } + + @Override + public boolean hasNext() + { + return interestIterator.hasNext(); + } + + @Override + public IAEStack next() + { + return myLast = interestIterator.next(); + } + + @Override + public void remove() + { + gsc.interestManager.remove( myLast, watcher ); + interestIterator.remove(); + } + + }; + + CraftingGridCache gsc; + ICraftingWatcherHost myObject; + HashSet myInterests = new HashSet(); + + public CraftingWatcher(CraftingGridCache cache, ICraftingWatcherHost host) { + gsc = cache; + myObject = host; + } + + public ICraftingWatcherHost getHost() + { + return myObject; + } + + @Override + public boolean add(IAEStack e) + { + if ( myInterests.contains( e ) ) + return false; + + return myInterests.add( e.copy() ) && gsc.interestManager.put( e, this ); + } + + @Override + public boolean addAll(Collection c) + { + boolean didChange = false; + + for (IAEStack o : c) + didChange = add( o ) || didChange; + + return didChange; + } + + @Override + public void clear() + { + Iterator i = myInterests.iterator(); + while (i.hasNext()) + { + gsc.interestManager.remove( i.next(), this ); + i.remove(); + } + } + + @Override + public boolean contains(Object o) + { + return myInterests.contains( o ); + } + + @Override + public boolean containsAll(Collection c) + { + return myInterests.containsAll( c ); + } + + @Override + public boolean isEmpty() + { + return myInterests.isEmpty(); + } + + @Override + public Iterator iterator() + { + return new ItemWatcherIterator( this, myInterests.iterator() ); + } + + @Override + public boolean remove(Object o) + { + return myInterests.remove( o ) && gsc.interestManager.remove( (IAEStack) o, this ); + } + + @Override + public boolean removeAll(Collection c) + { + boolean didSomething = false; + for (Object o : c) + didSomething = remove( o ) || didSomething; + return didSomething; + } + + @Override + public boolean retainAll(Collection c) + { + boolean changed = false; + Iterator i = iterator(); + + while (i.hasNext()) + { + if ( !c.contains( i.next() ) ) + { + i.remove(); + changed = true; + } + } + + return changed; + } + + @Override + public int size() + { + return myInterests.size(); + } + + @Override + public Object[] toArray() + { + return myInterests.toArray(); + } + + @Override + public T[] toArray(T[] a) + { + return myInterests.toArray( a ); + } + +} diff --git a/me/cache/CraftingGridCache.java b/me/cache/CraftingGridCache.java index d51b8df5a..0b23ae153 100644 --- a/me/cache/CraftingGridCache.java +++ b/me/cache/CraftingGridCache.java @@ -32,6 +32,8 @@ import appeng.api.networking.crafting.ICraftingPatternDetails; import appeng.api.networking.crafting.ICraftingProvider; import appeng.api.networking.crafting.ICraftingProviderHelper; import appeng.api.networking.crafting.ICraftingRequester; +import appeng.api.networking.crafting.ICraftingWatcher; +import appeng.api.networking.crafting.ICraftingWatcherHost; import appeng.api.networking.energy.IEnergyGrid; import appeng.api.networking.events.MENetworkCraftingCpuChange; import appeng.api.networking.events.MENetworkCraftingPatternChange; @@ -48,15 +50,20 @@ import appeng.api.storage.data.IItemList; import appeng.crafting.CraftingJob; import appeng.crafting.CraftingLink; import appeng.crafting.CraftingLinkNexus; +import appeng.crafting.CraftingWatcher; import appeng.me.cluster.implementations.CraftingCPUCluster; +import appeng.me.helpers.GenericInterestManager; +import appeng.me.storage.ItemWatcher; import appeng.tile.crafting.TileCraftingStorageTile; import appeng.tile.crafting.TileCraftingTile; import appeng.util.ItemSorters; +import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSortedSet; +import com.google.common.collect.SetMultimap; public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper, ICellProvider, IMEInventoryHandler { @@ -64,15 +71,20 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper HashSet cpuClusters = new HashSet(); HashSet providers = new HashSet(); + private HashMap watchers = new HashMap(); + IGrid grid; IStorageGrid sg; IEnergyGrid eg; HashMap> craftingMethods = new HashMap(); HashMap> craftableItems = new HashMap(); + HashSet emitableItems = new HashSet(); HashMap links = new HashMap(); boolean updateList = false; + final private SetMultimap interests = HashMultimap.create(); + final public GenericInterestManager interestManager = new GenericInterestManager( interests ); class ActiveCpuIterator implements Iterator { @@ -183,6 +195,16 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper @Override public void removeNode(IGridNode gridNode, IGridHost machine) { + if ( machine instanceof ICraftingWatcherHost ) + { + ICraftingWatcher myWatcher = watchers.get( machine ); + if ( myWatcher != null ) + { + myWatcher.clear(); + watchers.remove( machine ); + } + } + if ( machine instanceof ICraftingRequester ) { Iterator nex = links.values().iterator(); @@ -206,6 +228,14 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper @Override public void addNode(IGridNode gridNode, IGridHost machine) { + if ( machine instanceof ICraftingWatcherHost ) + { + ICraftingWatcherHost swh = (ICraftingWatcherHost) machine; + CraftingWatcher iw = new CraftingWatcher( this, (ICraftingWatcherHost) swh ); + watchers.put( gridNode, iw ); + swh.updateWatcher( iw ); + } + if ( machine instanceof ICraftingRequester ) { for (ICraftingLink l : ((ICraftingRequester) machine).getRequestedJobs()) @@ -523,4 +553,19 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper return cpuClusters.contains( cpu ); } + @Override + public boolean isRequesting(IAEItemStack what) + { + for (CraftingCPUCluster c : cpuClusters) + if ( c.isMaking( what ) ) + return true; + return false; + } + + @Override + public boolean canEmitFor(IAEItemStack what) + { + return emitableItems.contains( what ); + } + } diff --git a/me/cache/GridStorageCache.java b/me/cache/GridStorageCache.java index d427ed810..7da2bd5e4 100644 --- a/me/cache/GridStorageCache.java +++ b/me/cache/GridStorageCache.java @@ -27,7 +27,7 @@ import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEStack; import appeng.api.storage.data.IItemList; -import appeng.me.helpers.StorageInterestManager; +import appeng.me.helpers.GenericInterestManager; import appeng.me.storage.ItemWatcher; import appeng.me.storage.NetworkInventoryHandler; @@ -38,7 +38,7 @@ public class GridStorageCache implements IStorageGrid { final private SetMultimap interests = HashMultimap.create(); - final public StorageInterestManager interestManager = new StorageInterestManager( interests ); + final public GenericInterestManager interestManager = new GenericInterestManager( interests ); final HashSet activeCellProviders = new HashSet(); final HashSet inactiveCellProviders = new HashSet(); diff --git a/me/cluster/implementations/CraftingCPUCluster.java b/me/cluster/implementations/CraftingCPUCluster.java index 068386c1e..dfec61168 100644 --- a/me/cluster/implementations/CraftingCPUCluster.java +++ b/me/cluster/implementations/CraftingCPUCluster.java @@ -5,6 +5,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; @@ -44,6 +45,7 @@ import appeng.core.AELog; import appeng.crafting.CraftBranchFailure; import appeng.crafting.CraftingJob; import appeng.crafting.CraftingLink; +import appeng.crafting.CraftingWatcher; import appeng.crafting.MECraftingInventory; import appeng.me.cache.CraftingGridCache; import appeng.me.cluster.IAECluster; @@ -51,6 +53,9 @@ import appeng.tile.crafting.TileCraftingMonitorTile; import appeng.tile.crafting.TileCraftingTile; import appeng.util.Platform; import appeng.util.item.AEItemStack; + +import com.google.common.collect.ImmutableSet; + import cpw.mods.fml.common.FMLCommonHandler; public class CraftingCPUCluster implements IAECluster, ICraftingCPU @@ -269,6 +274,22 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU return false; } + public void postCraftingStatusChange(IAEItemStack diff) + { + CraftingGridCache sg = getGrid().getCache( ICraftingGrid.class ); + + if ( sg.interestManager.containsKey( diff ) ) + { + Set list = sg.interestManager.get( diff ); + if ( !list.isEmpty() ) + { + for (CraftingWatcher iw : list) + iw.getHost().onRequestChange( sg, diff ); + } + } + + } + public IAEStack injectItems(IAEStack input, Actionable type, BaseActionSource src) { if ( input instanceof IAEItemStack && type == Actionable.SIMULATE )// causes crafting to lock up? @@ -325,11 +346,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU { is.decStackSize( input.getStackSize() ); markDirty(); - - // AELog.info( "Task: " + is.getStackSize() + " remaining : " + getRemainingTasks() + - // " remaining : " - // + (is.getStackSize() + getRemainingTasks()) + " total left : waiting: " + (waiting ? "yes" : - // "no") ); + postCraftingStatusChange( is ); if ( finalOutput.equals( input ) ) { @@ -478,8 +495,14 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU isComplete = true; myLastLink = null; tasks.clear(); + + ImmutableSet items = ImmutableSet.copyOf( waitingFor ); + waitingFor.resetStatus(); + for (IAEItemStack is : items) + postCraftingStatusChange( is ); + finalOutput = null; updateCPU(); @@ -642,6 +665,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU { postChange( out, machineSrc ); waitingFor.add( out.copy() ); + postCraftingStatusChange( out.copy() ); } if ( details.isCraftable() ) @@ -1037,4 +1061,9 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU return getCore().getActionableNode().isActive(); } + public boolean isMaking(IAEItemStack what) + { + return waitingFor.findPrecise( what ) != null; + } + } diff --git a/me/helpers/StorageInterestManager.java b/me/helpers/GenericInterestManager.java similarity index 56% rename from me/helpers/StorageInterestManager.java rename to me/helpers/GenericInterestManager.java index 4917e6e1e..3cefd70e8 100644 --- a/me/helpers/StorageInterestManager.java +++ b/me/helpers/GenericInterestManager.java @@ -1,93 +1,94 @@ -package appeng.me.helpers; - -import java.util.LinkedList; -import java.util.Set; - -import appeng.api.storage.data.IAEStack; -import appeng.me.storage.ItemWatcher; - -import com.google.common.collect.SetMultimap; - -public class StorageInterestManager { - - class SavedTransactions { - public final boolean put; - public final IAEStack stack; - public final ItemWatcher iw; - - public SavedTransactions( boolean putOperation, IAEStack myStack, ItemWatcher watcher ) - { - put = putOperation; - stack = myStack; - iw = watcher; - } - }; - - private final SetMultimap container; - private LinkedList transactions = null; - private int transDepth=0; - - public StorageInterestManager(SetMultimap interests) { - container = interests; - } - - public void enableTransactions() - { - if ( transDepth == 0 ) - transactions = new LinkedList(); - - transDepth++; - } - - public void disableTransactions() - { - transDepth--; - - if ( transDepth == 0 ) - { - LinkedList myActions = transactions; - transactions = null; - - for ( SavedTransactions t : myActions ) - { - if ( t.put ) - put( t.stack, t.iw ); - else - remove( t.stack, t.iw ); - } - } - } - - public boolean containsKey( IAEStack stack ) - { - return container.containsKey( stack ); - } - - public Set get( IAEStack stack ) - { - return container.get( stack ); - } - - public boolean put( IAEStack stack, ItemWatcher iw ) - { - if ( transactions != null ) - { - transactions.add( new SavedTransactions( true, stack, iw ) ); - return true; - } - else - return container.put( stack, iw ); - } - - public boolean remove( IAEStack stack, ItemWatcher iw ) - { - if ( transactions != null ) - { - transactions.add( new SavedTransactions( true, stack, iw ) ); - return true; - } - else - return container.remove( stack, iw ); - } - -} +package appeng.me.helpers; + +import java.util.LinkedList; +import java.util.Set; + +import appeng.api.storage.data.IAEStack; + +import com.google.common.collect.SetMultimap; + +public class GenericInterestManager +{ + + class SavedTransactions + { + + public final boolean put; + public final IAEStack stack; + public final T iw; + + public SavedTransactions(boolean putOperation, IAEStack myStack, T watcher) { + put = putOperation; + stack = myStack; + iw = watcher; + } + }; + + private final SetMultimap container; + private LinkedList transactions = null; + private int transDepth = 0; + + public GenericInterestManager(SetMultimap interests) { + container = interests; + } + + public void enableTransactions() + { + if ( transDepth == 0 ) + transactions = new LinkedList(); + + transDepth++; + } + + public void disableTransactions() + { + transDepth--; + + if ( transDepth == 0 ) + { + LinkedList myActions = transactions; + transactions = null; + + for (SavedTransactions t : myActions) + { + if ( t.put ) + put( t.stack, t.iw ); + else + remove( t.stack, t.iw ); + } + } + } + + public boolean containsKey(IAEStack stack) + { + return container.containsKey( stack ); + } + + public Set get(IAEStack stack) + { + return container.get( stack ); + } + + public boolean put(IAEStack stack, T iw) + { + if ( transactions != null ) + { + transactions.add( new SavedTransactions( true, stack, iw ) ); + return true; + } + else + return container.put( stack, iw ); + } + + public boolean remove(IAEStack stack, T iw) + { + if ( transactions != null ) + { + transactions.add( new SavedTransactions( true, stack, iw ) ); + return true; + } + else + return container.remove( stack, iw ); + } + +} diff --git a/parts/automation/PartLevelEmitter.java b/parts/automation/PartLevelEmitter.java index f10b5ed53..17d3801bf 100644 --- a/parts/automation/PartLevelEmitter.java +++ b/parts/automation/PartLevelEmitter.java @@ -7,6 +7,7 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -19,6 +20,13 @@ import appeng.api.config.LevelType; import appeng.api.config.RedstoneMode; import appeng.api.config.Settings; import appeng.api.config.Upgrades; +import appeng.api.config.YesNo; +import appeng.api.networking.crafting.ICraftingGrid; +import appeng.api.networking.crafting.ICraftingPatternDetails; +import appeng.api.networking.crafting.ICraftingProvider; +import appeng.api.networking.crafting.ICraftingProviderHelper; +import appeng.api.networking.crafting.ICraftingWatcher; +import appeng.api.networking.crafting.ICraftingWatcherHost; import appeng.api.networking.energy.IEnergyGrid; import appeng.api.networking.energy.IEnergyWatcher; import appeng.api.networking.energy.IEnergyWatcherHost; @@ -48,7 +56,8 @@ import appeng.util.Platform; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherHost, IStackWatcherHost, IMEMonitorHandlerReceiver +public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherHost, IStackWatcherHost, ICraftingWatcherHost, + IMEMonitorHandlerReceiver, ICraftingProvider { final int FLAG_ON = 4; @@ -62,6 +71,7 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH IStackWatcher myWatcher; IEnergyWatcher myEnergyWatcher; + ICraftingWatcher myCraftingWatcher; public long getReportingValue() { @@ -102,13 +112,17 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH private void updateState() { - if ( prevState != isLevelEmitterOn() && proxy.isActive() ) + if ( proxy.isActive() ) { - host.markForUpdate(); - TileEntity te = host.getTile(); - prevState = isLevelEmitterOn(); - Platform.notifyBlocksOfNeighbors( te.getWorldObj(), te.xCoord, te.yCoord, te.zCoord ); - Platform.notifyBlocksOfNeighbors( te.getWorldObj(), te.xCoord + side.offsetX, te.yCoord + side.offsetY, te.zCoord + side.offsetZ ); + boolean isOn = isLevelEmitterOn(); + if ( prevState != isOn ) + { + host.markForUpdate(); + TileEntity te = host.getTile(); + prevState = isOn; + Platform.notifyBlocksOfNeighbors( te.getWorldObj(), te.xCoord, te.yCoord, te.zCoord ); + Platform.notifyBlocksOfNeighbors( te.getWorldObj(), te.xCoord + side.offsetX, te.yCoord + side.offsetY, te.zCoord + side.offsetZ ); + } } } @@ -136,6 +150,13 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH return cf | (prevState ? FLAG_ON : 0); } + @Override + public void updateWatcher(ICraftingWatcher newWatcher) + { + myCraftingWatcher = newWatcher; + confgiureWatchers(); + } + @Override public void updateWatcher(IStackWatcher newWatcher) { @@ -161,6 +182,17 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH if ( myEnergyWatcher != null ) myEnergyWatcher.clear(); + if ( myCraftingWatcher != null ) + myCraftingWatcher.clear(); + + if ( getInstalledUpgrades( Upgrades.CRAFTING ) > 0 ) + { + if ( myCraftingWatcher != null ) + myCraftingWatcher.add( myStack ); + + return; + } + if ( getConfigManager().getSetting( Settings.LEVEL_TYPE ) == LevelType.ENERGY_LEVEL ) { if ( myEnergyWatcher != null ) @@ -278,6 +310,12 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH } } + @Override + public void onRequestChange(ICraftingGrid craftingGrid, IAEItemStack what) + { + updateState(); + } + @Override public void onThreshholdPass(IEnergyGrid energyGrid) { @@ -300,6 +338,7 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH getConfigManager().registerSetting( Settings.REDSTONE_EMITTER, RedstoneMode.HIGH_SIGNAL ); getConfigManager().registerSetting( Settings.FUZZY_MODE, FuzzyMode.IGNORE_ALL ); getConfigManager().registerSetting( Settings.LEVEL_TYPE, LevelType.ITEM_LEVEL ); + getConfigManager().registerSetting( Settings.CRAFT_VIA_REDSTONE, YesNo.NO ); } @Override @@ -499,6 +538,20 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH if ( Platform.isClient() ) return (clientFlags & FLAG_ON) == FLAG_ON; + if ( getInstalledUpgrades( Upgrades.CRAFTING ) > 0 ) + { + try + { + return proxy.getCrafting().isRequesting( config.getAEStackInSlot( 0 ) ); + } + catch (GridAccessException e) + { + // :P + } + + return prevState; + } + boolean flipState = getConfigManager().getSetting( Settings.REDSTONE_EMITTER ) == RedstoneMode.LOW_SIGNAL; return flipState ? reportingValue >= lastReportedValue + 1 : reportingValue < lastReportedValue + 1; } @@ -596,4 +649,29 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH } } + @Override + public boolean pushPattern(ICraftingPatternDetails patternDetails, InventoryCrafting table) + { + return false; + } + + @Override + public boolean isBusy() + { + return true; + } + + @Override + public void provideCrafting(ICraftingProviderHelper craftingTracker) + { + if ( getInstalledUpgrades( Upgrades.CRAFTING ) > 0 ) + { + if ( settings.getSetting( Settings.CRAFT_VIA_REDSTONE ) == YesNo.YES ) + { + IAEItemStack what = config.getAEStackInSlot( 0 ); + if ( what != null ) + craftingTracker.setEmitable( what ); + } + } + } }