Crafting Emitter Progress.

This commit is contained in:
AlgorithmX2
2014-08-11 00:08:31 -05:00
parent f5f93dd01e
commit 6b9441f32a
9 changed files with 464 additions and 118 deletions
@@ -130,7 +130,7 @@ public class GuiLevelEmitter extends GuiUpgradeable
NetworkHandler.instance.sendToServer( new PacketValueConfig( "LevelEmitter.Value", Out ) ); NetworkHandler.instance.sendToServer( new PacketValueConfig( "LevelEmitter.Value", Out ) );
} }
catch(NumberFormatException e ) catch (NumberFormatException e)
{ {
// nope.. // nope..
level.setText( "0" ); level.setText( "0" );
@@ -187,6 +187,21 @@ public class GuiLevelEmitter extends GuiUpgradeable
@Override @Override
public void drawFG(int offsetX, int offsetY, int mouseX, int mouseY) 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 ); super.drawFG( offsetX, offsetY, mouseX, mouseY );
if ( levelMode != null ) if ( levelMode != null )
+11 -10
View File
@@ -589,31 +589,32 @@ public class Registration
Api.instance.partHelper.initFMPSupport(); Api.instance.partHelper.initFMPSupport();
((BlockCableBus) AEApi.instance().blocks().blockMultiPart.block()).setupTile(); ((BlockCableBus) AEApi.instance().blocks().blockMultiPart.block()).setupTile();
// interface // Interface
Upgrades.CRAFTING.registerItem( AEApi.instance().parts().partInterface.stack( 1 ), 1 ); Upgrades.CRAFTING.registerItem( AEApi.instance().parts().partInterface.stack( 1 ), 1 );
Upgrades.CRAFTING.registerItem( AEApi.instance().blocks().blockInterface.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.SPEED.registerItem( AEApi.instance().blocks().blockIOPort.stack( 1 ), 3 );
Upgrades.REDSTONE.registerItem( AEApi.instance().blocks().blockIOPort.stack( 1 ), 1 ); Upgrades.REDSTONE.registerItem( AEApi.instance().blocks().blockIOPort.stack( 1 ), 1 );
// partLevelEmitter // Level Emitter!
Upgrades.FUZZY.registerItem( AEApi.instance().parts().partLevelEmitter.stack( 1 ), 1 ); 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.FUZZY.registerItem( AEApi.instance().parts().partImportBus.stack( 1 ), 1 );
Upgrades.REDSTONE.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.CAPACITY.registerItem( AEApi.instance().parts().partImportBus.stack( 1 ), 2 );
Upgrades.SPEED.registerItem( AEApi.instance().parts().partImportBus.stack( 1 ), 4 ); Upgrades.SPEED.registerItem( AEApi.instance().parts().partImportBus.stack( 1 ), 4 );
// partExportBus // Export Bus
Upgrades.FUZZY.registerItem( AEApi.instance().parts().partExportBus.stack( 1 ), 1 ); Upgrades.FUZZY.registerItem( AEApi.instance().parts().partExportBus.stack( 1 ), 1 );
Upgrades.REDSTONE.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.CAPACITY.registerItem( AEApi.instance().parts().partExportBus.stack( 1 ), 2 );
Upgrades.SPEED.registerItem( AEApi.instance().parts().partExportBus.stack( 1 ), 4 ); Upgrades.SPEED.registerItem( AEApi.instance().parts().partExportBus.stack( 1 ), 4 );
Upgrades.CRAFTING.registerItem( AEApi.instance().parts().partExportBus.stack( 1 ), 1 ); Upgrades.CRAFTING.registerItem( AEApi.instance().parts().partExportBus.stack( 1 ), 1 );
// blockCellWorkbench // Storage Cells
Upgrades.FUZZY.registerItem( AEApi.instance().items().itemCell1k.stack( 1 ), 1 ); Upgrades.FUZZY.registerItem( AEApi.instance().items().itemCell1k.stack( 1 ), 1 );
Upgrades.INVERTER.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.FUZZY.registerItem( AEApi.instance().items().itemViewCell.stack( 1 ), 1 );
Upgrades.INVERTER.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.FUZZY.registerItem( AEApi.instance().parts().partStorageBus.stack( 1 ), 1 );
Upgrades.INVERTER.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 ); Upgrades.CAPACITY.registerItem( AEApi.instance().parts().partStorageBus.stack( 1 ), 5 );
// partFormationPlane // Formation Plane
Upgrades.FUZZY.registerItem( AEApi.instance().parts().partFormationPlane.stack( 1 ), 1 ); Upgrades.FUZZY.registerItem( AEApi.instance().parts().partFormationPlane.stack( 1 ), 1 );
Upgrades.INVERTER.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 ); 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.FUZZY.registerItem( AEApi.instance().items().itemMassCannon.stack( 1 ), 1 );
Upgrades.INVERTER.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 ); Upgrades.SPEED.registerItem( AEApi.instance().items().itemMassCannon.stack( 1 ), 4 );
// molecular assembler // Molecular Assembler
Upgrades.SPEED.registerItem( AEApi.instance().blocks().blockMolecularAssembler.stack( 1 ), 5 ); Upgrades.SPEED.registerItem( AEApi.instance().blocks().blockMolecularAssembler.stack( 1 ), 5 );
AEApi.instance().registries().wireless().registerWirelessHandler( (IWirelessTermHandler) AEApi.instance().items().itemWirelessTerminal.item() ); AEApi.instance().registries().wireless().registerWirelessHandler( (IWirelessTermHandler) AEApi.instance().items().itemWirelessTerminal.item() );
+6
View File
@@ -32,6 +32,7 @@ public class CraftingTreeNode
// what are the crafting patterns for this? // what are the crafting patterns for this?
private ArrayList<CraftingTreeProcess> nodes = new ArrayList(); private ArrayList<CraftingTreeProcess> nodes = new ArrayList();
boolean canEmit = false;
boolean cannotUse = false; boolean cannotUse = false;
long missing = 0; long missing = 0;
@@ -49,12 +50,17 @@ public class CraftingTreeNode
this.job = job; this.job = job;
sim = false; 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 for (ICraftingPatternDetails details : cc.getCraftingFor( what, parent == null ? null : parent.details, slot, world ))// in
// order. // order.
{ {
if ( parent == null || parent.notRecurive( details ) ) if ( parent == null || parent.notRecurive( details ) )
nodes.add( new CraftingTreeProcess( cc, job, details, this, depth + 1, world ) ); nodes.add( new CraftingTreeProcess( cc, job, details, this, depth + 1, world ) );
} }
} }
public IAEItemStack getStack(long size) public IAEItemStack getStack(long size)
+171
View File
@@ -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<IAEStack>
{
final CraftingWatcher watcher;
final Iterator<IAEStack> interestIterator;
IAEStack myLast;
public ItemWatcherIterator(CraftingWatcher parent, Iterator<IAEStack> 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<IAEStack> 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<? extends IAEStack> c)
{
boolean didChange = false;
for (IAEStack o : c)
didChange = add( o ) || didChange;
return didChange;
}
@Override
public void clear()
{
Iterator<IAEStack> 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<IAEStack> 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<IAEStack> 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> T[] toArray(T[] a)
{
return myInterests.toArray( a );
}
}
+45
View File
@@ -32,6 +32,8 @@ import appeng.api.networking.crafting.ICraftingPatternDetails;
import appeng.api.networking.crafting.ICraftingProvider; import appeng.api.networking.crafting.ICraftingProvider;
import appeng.api.networking.crafting.ICraftingProviderHelper; import appeng.api.networking.crafting.ICraftingProviderHelper;
import appeng.api.networking.crafting.ICraftingRequester; 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.energy.IEnergyGrid;
import appeng.api.networking.events.MENetworkCraftingCpuChange; import appeng.api.networking.events.MENetworkCraftingCpuChange;
import appeng.api.networking.events.MENetworkCraftingPatternChange; import appeng.api.networking.events.MENetworkCraftingPatternChange;
@@ -48,15 +50,20 @@ import appeng.api.storage.data.IItemList;
import appeng.crafting.CraftingJob; import appeng.crafting.CraftingJob;
import appeng.crafting.CraftingLink; import appeng.crafting.CraftingLink;
import appeng.crafting.CraftingLinkNexus; import appeng.crafting.CraftingLinkNexus;
import appeng.crafting.CraftingWatcher;
import appeng.me.cluster.implementations.CraftingCPUCluster; 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.TileCraftingStorageTile;
import appeng.tile.crafting.TileCraftingTile; import appeng.tile.crafting.TileCraftingTile;
import appeng.util.ItemSorters; import appeng.util.ItemSorters;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.SetMultimap;
public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper, ICellProvider, IMEInventoryHandler public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper, ICellProvider, IMEInventoryHandler
{ {
@@ -64,15 +71,20 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
HashSet<CraftingCPUCluster> cpuClusters = new HashSet(); HashSet<CraftingCPUCluster> cpuClusters = new HashSet();
HashSet<ICraftingProvider> providers = new HashSet(); HashSet<ICraftingProvider> providers = new HashSet();
private HashMap<IGridNode, ICraftingWatcher> watchers = new HashMap<IGridNode, ICraftingWatcher>();
IGrid grid; IGrid grid;
IStorageGrid sg; IStorageGrid sg;
IEnergyGrid eg; IEnergyGrid eg;
HashMap<ICraftingPatternDetails, List<ICraftingMedium>> craftingMethods = new HashMap(); HashMap<ICraftingPatternDetails, List<ICraftingMedium>> craftingMethods = new HashMap();
HashMap<IAEItemStack, ImmutableSet<ICraftingPatternDetails>> craftableItems = new HashMap(); HashMap<IAEItemStack, ImmutableSet<ICraftingPatternDetails>> craftableItems = new HashMap();
HashSet<IAEItemStack> emitableItems = new HashSet();
HashMap<String, CraftingLinkNexus> links = new HashMap(); HashMap<String, CraftingLinkNexus> links = new HashMap();
boolean updateList = false; boolean updateList = false;
final private SetMultimap<IAEStack, ItemWatcher> interests = HashMultimap.create();
final public GenericInterestManager interestManager = new GenericInterestManager( interests );
class ActiveCpuIterator implements Iterator<ICraftingCPU> class ActiveCpuIterator implements Iterator<ICraftingCPU>
{ {
@@ -183,6 +195,16 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
@Override @Override
public void removeNode(IGridNode gridNode, IGridHost machine) 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 ) if ( machine instanceof ICraftingRequester )
{ {
Iterator<CraftingLinkNexus> nex = links.values().iterator(); Iterator<CraftingLinkNexus> nex = links.values().iterator();
@@ -206,6 +228,14 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
@Override @Override
public void addNode(IGridNode gridNode, IGridHost machine) 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 ) if ( machine instanceof ICraftingRequester )
{ {
for (ICraftingLink l : ((ICraftingRequester) machine).getRequestedJobs()) for (ICraftingLink l : ((ICraftingRequester) machine).getRequestedJobs())
@@ -523,4 +553,19 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
return cpuClusters.contains( cpu ); 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 );
}
} }
+2 -2
View File
@@ -27,7 +27,7 @@ import appeng.api.storage.data.IAEFluidStack;
import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IAEStack; import appeng.api.storage.data.IAEStack;
import appeng.api.storage.data.IItemList; 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.ItemWatcher;
import appeng.me.storage.NetworkInventoryHandler; import appeng.me.storage.NetworkInventoryHandler;
@@ -38,7 +38,7 @@ public class GridStorageCache implements IStorageGrid
{ {
final private SetMultimap<IAEStack, ItemWatcher> interests = HashMultimap.create(); final private SetMultimap<IAEStack, ItemWatcher> interests = HashMultimap.create();
final public StorageInterestManager interestManager = new StorageInterestManager( interests ); final public GenericInterestManager interestManager = new GenericInterestManager( interests );
final HashSet<ICellProvider> activeCellProviders = new HashSet(); final HashSet<ICellProvider> activeCellProviders = new HashSet();
final HashSet<ICellProvider> inactiveCellProviders = new HashSet(); final HashSet<ICellProvider> inactiveCellProviders = new HashSet();
@@ -5,6 +5,7 @@ import java.util.Iterator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set;
import net.minecraft.inventory.InventoryCrafting; import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@@ -44,6 +45,7 @@ import appeng.core.AELog;
import appeng.crafting.CraftBranchFailure; import appeng.crafting.CraftBranchFailure;
import appeng.crafting.CraftingJob; import appeng.crafting.CraftingJob;
import appeng.crafting.CraftingLink; import appeng.crafting.CraftingLink;
import appeng.crafting.CraftingWatcher;
import appeng.crafting.MECraftingInventory; import appeng.crafting.MECraftingInventory;
import appeng.me.cache.CraftingGridCache; import appeng.me.cache.CraftingGridCache;
import appeng.me.cluster.IAECluster; import appeng.me.cluster.IAECluster;
@@ -51,6 +53,9 @@ import appeng.tile.crafting.TileCraftingMonitorTile;
import appeng.tile.crafting.TileCraftingTile; import appeng.tile.crafting.TileCraftingTile;
import appeng.util.Platform; import appeng.util.Platform;
import appeng.util.item.AEItemStack; import appeng.util.item.AEItemStack;
import com.google.common.collect.ImmutableSet;
import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.FMLCommonHandler;
public class CraftingCPUCluster implements IAECluster, ICraftingCPU public class CraftingCPUCluster implements IAECluster, ICraftingCPU
@@ -269,6 +274,22 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
return false; return false;
} }
public void postCraftingStatusChange(IAEItemStack diff)
{
CraftingGridCache sg = getGrid().getCache( ICraftingGrid.class );
if ( sg.interestManager.containsKey( diff ) )
{
Set<CraftingWatcher> 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) public IAEStack injectItems(IAEStack input, Actionable type, BaseActionSource src)
{ {
if ( input instanceof IAEItemStack && type == Actionable.SIMULATE )// causes crafting to lock up? 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() ); is.decStackSize( input.getStackSize() );
markDirty(); markDirty();
postCraftingStatusChange( is );
// AELog.info( "Task: " + is.getStackSize() + " remaining : " + getRemainingTasks() +
// " remaining : "
// + (is.getStackSize() + getRemainingTasks()) + " total left : waiting: " + (waiting ? "yes" :
// "no") );
if ( finalOutput.equals( input ) ) if ( finalOutput.equals( input ) )
{ {
@@ -478,8 +495,14 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
isComplete = true; isComplete = true;
myLastLink = null; myLastLink = null;
tasks.clear(); tasks.clear();
ImmutableSet<IAEItemStack> items = ImmutableSet.copyOf( waitingFor );
waitingFor.resetStatus(); waitingFor.resetStatus();
for (IAEItemStack is : items)
postCraftingStatusChange( is );
finalOutput = null; finalOutput = null;
updateCPU(); updateCPU();
@@ -642,6 +665,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
{ {
postChange( out, machineSrc ); postChange( out, machineSrc );
waitingFor.add( out.copy() ); waitingFor.add( out.copy() );
postCraftingStatusChange( out.copy() );
} }
if ( details.isCraftable() ) if ( details.isCraftable() )
@@ -1037,4 +1061,9 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
return getCore().getActionableNode().isActive(); return getCore().getActionableNode().isActive();
} }
public boolean isMaking(IAEItemStack what)
{
return waitingFor.findPrecise( what ) != null;
}
} }
@@ -4,30 +4,31 @@ import java.util.LinkedList;
import java.util.Set; import java.util.Set;
import appeng.api.storage.data.IAEStack; import appeng.api.storage.data.IAEStack;
import appeng.me.storage.ItemWatcher;
import com.google.common.collect.SetMultimap; import com.google.common.collect.SetMultimap;
public class StorageInterestManager { public class GenericInterestManager<T>
{
class SavedTransactions
{
class SavedTransactions {
public final boolean put; public final boolean put;
public final IAEStack stack; public final IAEStack stack;
public final ItemWatcher iw; public final T iw;
public SavedTransactions( boolean putOperation, IAEStack myStack, ItemWatcher watcher ) public SavedTransactions(boolean putOperation, IAEStack myStack, T watcher) {
{
put = putOperation; put = putOperation;
stack = myStack; stack = myStack;
iw = watcher; iw = watcher;
} }
}; };
private final SetMultimap<IAEStack, ItemWatcher> container; private final SetMultimap<IAEStack, T> container;
private LinkedList<SavedTransactions> transactions = null; private LinkedList<SavedTransactions> transactions = null;
private int transDepth=0; private int transDepth = 0;
public StorageInterestManager(SetMultimap<IAEStack, ItemWatcher> interests) { public GenericInterestManager(SetMultimap<IAEStack, T> interests) {
container = interests; container = interests;
} }
@@ -45,10 +46,10 @@ public class StorageInterestManager {
if ( transDepth == 0 ) if ( transDepth == 0 )
{ {
LinkedList<SavedTransactions> myActions = transactions; LinkedList<SavedTransactions> myActions = transactions;
transactions = null; transactions = null;
for ( SavedTransactions t : myActions ) for (SavedTransactions t : myActions)
{ {
if ( t.put ) if ( t.put )
put( t.stack, t.iw ); put( t.stack, t.iw );
@@ -58,17 +59,17 @@ public class StorageInterestManager {
} }
} }
public boolean containsKey( IAEStack stack ) public boolean containsKey(IAEStack stack)
{ {
return container.containsKey( stack ); return container.containsKey( stack );
} }
public Set<ItemWatcher> get( IAEStack stack ) public Set<T> get(IAEStack stack)
{ {
return container.get( stack ); return container.get( stack );
} }
public boolean put( IAEStack stack, ItemWatcher iw ) public boolean put(IAEStack stack, T iw)
{ {
if ( transactions != null ) if ( transactions != null )
{ {
@@ -79,9 +80,9 @@ public class StorageInterestManager {
return container.put( stack, iw ); return container.put( stack, iw );
} }
public boolean remove( IAEStack stack, ItemWatcher iw ) public boolean remove(IAEStack stack, T iw)
{ {
if ( transactions != null ) if ( transactions != null )
{ {
transactions.add( new SavedTransactions( true, stack, iw ) ); transactions.add( new SavedTransactions( true, stack, iw ) );
return true; return true;
+85 -7
View File
@@ -7,6 +7,7 @@ import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.Tessellator;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
@@ -19,6 +20,13 @@ import appeng.api.config.LevelType;
import appeng.api.config.RedstoneMode; import appeng.api.config.RedstoneMode;
import appeng.api.config.Settings; import appeng.api.config.Settings;
import appeng.api.config.Upgrades; 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.IEnergyGrid;
import appeng.api.networking.energy.IEnergyWatcher; import appeng.api.networking.energy.IEnergyWatcher;
import appeng.api.networking.energy.IEnergyWatcherHost; 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.Side;
import cpw.mods.fml.relauncher.SideOnly; import cpw.mods.fml.relauncher.SideOnly;
public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherHost, IStackWatcherHost, IMEMonitorHandlerReceiver<IAEItemStack> public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherHost, IStackWatcherHost, ICraftingWatcherHost,
IMEMonitorHandlerReceiver<IAEItemStack>, ICraftingProvider
{ {
final int FLAG_ON = 4; final int FLAG_ON = 4;
@@ -62,6 +71,7 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH
IStackWatcher myWatcher; IStackWatcher myWatcher;
IEnergyWatcher myEnergyWatcher; IEnergyWatcher myEnergyWatcher;
ICraftingWatcher myCraftingWatcher;
public long getReportingValue() public long getReportingValue()
{ {
@@ -102,13 +112,17 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH
private void updateState() private void updateState()
{ {
if ( prevState != isLevelEmitterOn() && proxy.isActive() ) if ( proxy.isActive() )
{ {
host.markForUpdate(); boolean isOn = isLevelEmitterOn();
TileEntity te = host.getTile(); if ( prevState != isOn )
prevState = isLevelEmitterOn(); {
Platform.notifyBlocksOfNeighbors( te.getWorldObj(), te.xCoord, te.yCoord, te.zCoord ); host.markForUpdate();
Platform.notifyBlocksOfNeighbors( te.getWorldObj(), te.xCoord + side.offsetX, te.yCoord + side.offsetY, te.zCoord + side.offsetZ ); 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); return cf | (prevState ? FLAG_ON : 0);
} }
@Override
public void updateWatcher(ICraftingWatcher newWatcher)
{
myCraftingWatcher = newWatcher;
confgiureWatchers();
}
@Override @Override
public void updateWatcher(IStackWatcher newWatcher) public void updateWatcher(IStackWatcher newWatcher)
{ {
@@ -161,6 +182,17 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH
if ( myEnergyWatcher != null ) if ( myEnergyWatcher != null )
myEnergyWatcher.clear(); 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 ( getConfigManager().getSetting( Settings.LEVEL_TYPE ) == LevelType.ENERGY_LEVEL )
{ {
if ( myEnergyWatcher != null ) if ( myEnergyWatcher != null )
@@ -278,6 +310,12 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH
} }
} }
@Override
public void onRequestChange(ICraftingGrid craftingGrid, IAEItemStack what)
{
updateState();
}
@Override @Override
public void onThreshholdPass(IEnergyGrid energyGrid) 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.REDSTONE_EMITTER, RedstoneMode.HIGH_SIGNAL );
getConfigManager().registerSetting( Settings.FUZZY_MODE, FuzzyMode.IGNORE_ALL ); getConfigManager().registerSetting( Settings.FUZZY_MODE, FuzzyMode.IGNORE_ALL );
getConfigManager().registerSetting( Settings.LEVEL_TYPE, LevelType.ITEM_LEVEL ); getConfigManager().registerSetting( Settings.LEVEL_TYPE, LevelType.ITEM_LEVEL );
getConfigManager().registerSetting( Settings.CRAFT_VIA_REDSTONE, YesNo.NO );
} }
@Override @Override
@@ -499,6 +538,20 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH
if ( Platform.isClient() ) if ( Platform.isClient() )
return (clientFlags & FLAG_ON) == FLAG_ON; 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; boolean flipState = getConfigManager().getSetting( Settings.REDSTONE_EMITTER ) == RedstoneMode.LOW_SIGNAL;
return flipState ? reportingValue >= lastReportedValue + 1 : reportingValue < lastReportedValue + 1; 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 );
}
}
}
} }