diff --git a/container/implementations/ContainerUpgradeable.java b/container/implementations/ContainerUpgradeable.java index 4b57902c..0a579274 100644 --- a/container/implementations/ContainerUpgradeable.java +++ b/container/implementations/ContainerUpgradeable.java @@ -24,6 +24,7 @@ import appeng.container.slot.SlotRestrictedInput; import appeng.container.slot.SlotRestrictedInput.PlaceableItemType; import appeng.items.contents.NetworkToolViewer; import appeng.items.tools.ToolNetworkTool; +import appeng.parts.automation.PartExportBus; import appeng.util.Platform; public class ContainerUpgradeable extends AEBaseContainer implements IOptionalSlotHost @@ -196,8 +197,9 @@ public class ContainerUpgradeable extends AEBaseContainer implements IOptionalSl protected void loadSettingsFromHost(IConfigManager cm) { this.fzMode = (FuzzyMode) cm.getSetting( Settings.FUZZY_MODE ); - this.cMode = (YesNo) cm.getSetting( Settings.CRAFT_ONLY ); this.rsMode = (RedstoneMode) cm.getSetting( Settings.REDSTONE_CONTROLLED ); + if ( myte instanceof PartExportBus ) + this.cMode = (YesNo) cm.getSetting( Settings.CRAFT_ONLY ); } protected void standardDetectAndSendChanges() diff --git a/helpers/DualityInterface.java b/helpers/DualityInterface.java index 9d9fd44d..aa2e27a1 100644 --- a/helpers/DualityInterface.java +++ b/helpers/DualityInterface.java @@ -24,6 +24,7 @@ import appeng.api.implementations.tiles.ICraftingMachine; import appeng.api.implementations.tiles.ISegmentedInventory; import appeng.api.networking.GridFlags; import appeng.api.networking.IGridNode; +import appeng.api.networking.crafting.ICraftingLink; import appeng.api.networking.crafting.ICraftingPatternDetails; import appeng.api.networking.crafting.ICraftingProvider; import appeng.api.networking.crafting.ICraftingProviderHelper; @@ -62,6 +63,9 @@ import appeng.util.Platform; import appeng.util.inv.AdaptorIInventory; import appeng.util.inv.IInventoryDestination; import appeng.util.inv.WrapperInvSlot; +import appeng.util.item.AEItemStack; + +import com.google.common.collect.ImmutableSet; public class DualityInterface implements IGridTickable, ISegmentedInventory, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory, IConfigureableObject, IConfigManagerHost, ICraftingProvider, IUpgradeableHost @@ -69,6 +73,7 @@ public class DualityInterface implements IGridTickable, ISegmentedInventory, ISt final int sides[] = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 }; final IAEItemStack requireWork[] = new IAEItemStack[] { null, null, null, null, null, null, null, null }; + final MultiCraftingTracker craftingTracker; boolean hasConfig = false; AENetworkProxy gridProxy; @@ -186,6 +191,7 @@ public class DualityInterface implements IGridTickable, ISegmentedInventory, ISt cm.registerSetting( Settings.BLOCK, YesNo.NO ); iHost = ih; + craftingTracker = new MultiCraftingTracker( iHost, 9 ); mySrc = fluids.changeSource = items.changeSource = new MachineSource( iHost ); } @@ -240,6 +246,7 @@ public class DualityInterface implements IGridTickable, ISegmentedInventory, ISt config.writeToNBT( data, "config" ); patterns.writeToNBT( data, "patterns" ); storage.writeToNBT( data, "storage" ); + craftingTracker.writeToNBT( data ); NBTTagList waitingToSend = new NBTTagList(); if ( this.waitingToSend != null ) @@ -271,6 +278,7 @@ public class DualityInterface implements IGridTickable, ISegmentedInventory, ISt } } + craftingTracker.readFromNBT( data ); config.readFromNBT( data, "config" ); patterns.readFromNBT( data, "patterns" ); storage.readFromNBT( data, "storage" ); @@ -388,7 +396,9 @@ public class DualityInterface implements IGridTickable, ISegmentedInventory, ISt destination = gridProxy.getStorage().getItemInventory(); IEnergySource src = gridProxy.getEnergy(); - if ( itemStack.getStackSize() > 0 ) + if ( craftingTracker.isBusy( x ) ) + changed = handleCrafting( x, adaptor, itemStack ) || changed; + else if ( itemStack.getStackSize() > 0 ) { // make sure strange things didn't happen... if ( adaptor.simulateAdd( itemStack.getItemStack() ) != null ) @@ -405,6 +415,8 @@ public class DualityInterface implements IGridTickable, ISegmentedInventory, ISt if ( issue != null ) throw new RuntimeException( "bad attempt at managing inventory. ( addItems )" ); } + else + changed = handleCrafting( x, adaptor, itemStack ) || changed; } else if ( itemStack.getStackSize() < 0 ) { @@ -451,6 +463,24 @@ public class DualityInterface implements IGridTickable, ISegmentedInventory, ISt return changed; } + private boolean handleCrafting(int x, InventoryAdaptor d, IAEItemStack itemStack) + { + try + { + if ( getInstalledUpgrades( Upgrades.CRAFTING ) > 0 ) + { + return craftingTracker.handleCrafting( x, itemStack.getStackSize(), itemStack, d, getTile().getWorldObj(), gridProxy.getGrid(), + gridProxy.getCrafting(), mySrc ); + } + } + catch (GridAccessException e) + { + // :P + } + + return false; + } + public IInventory getConfig() { return config; @@ -652,8 +682,7 @@ public class DualityInterface implements IGridTickable, ISegmentedInventory, ISt private void cancelCrafting() { - // TODO Auto-generated method stub - + craftingTracker.cancel(); } public IStorageMonitorable getMonitorable(ForgeDirection side, BaseActionSource src, IStorageMonitorable myInterface) @@ -819,6 +848,10 @@ public class DualityInterface implements IGridTickable, ISegmentedInventory, ISt drops.add( is ); } + for (ItemStack is : upgrades) + if ( is != null ) + drops.add( is ); + for (ItemStack is : storage) if ( is != null ) drops.add( is ); @@ -858,4 +891,35 @@ public class DualityInterface implements IGridTickable, ISegmentedInventory, ISt return null; } + public ImmutableSet getRequestedJobs() + { + return craftingTracker.getRequestedJobs(); + } + + public IAEItemStack injectCratedItems(ICraftingLink link, IAEItemStack aquired, Actionable mode) + { + int x = craftingTracker.getSlot( link ); + + if ( aquired != null && x >= 0 && x <= requireWork.length ) + { + slotInv.setSlot( x ); + + if ( mode == Actionable.SIMULATE ) + return AEItemStack.create( adaptor.simulateAdd( aquired.getItemStack() ) ); + else + { + IAEItemStack is = AEItemStack.create( adaptor.addItems( aquired.getItemStack() ) ); + updatePlan( x ); + return is; + } + } + + return aquired; + } + + public void jobStateChange(ICraftingLink link) + { + craftingTracker.jobStateChange( link ); + } + } diff --git a/helpers/IInterfaceHost.java b/helpers/IInterfaceHost.java index f262ed25..5ad3c4f5 100644 --- a/helpers/IInterfaceHost.java +++ b/helpers/IInterfaceHost.java @@ -6,9 +6,10 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import appeng.api.implementations.IUpgradeableHost; import appeng.api.networking.crafting.ICraftingProvider; +import appeng.api.networking.crafting.ICraftingRequester; import appeng.api.networking.security.IActionHost; -public interface IInterfaceHost extends IActionHost, ICraftingProvider, IUpgradeableHost +public interface IInterfaceHost extends IActionHost, ICraftingProvider, IUpgradeableHost, ICraftingRequester { DualityInterface getInterfaceDuality(); diff --git a/helpers/MultiCraftingTracker.java b/helpers/MultiCraftingTracker.java index ce03980b..f0128fda 100644 --- a/helpers/MultiCraftingTracker.java +++ b/helpers/MultiCraftingTracker.java @@ -184,4 +184,48 @@ public class MultiCraftingTracker } } } + + public int getSlot(ICraftingLink link) + { + if ( links != null ) + { + for (int x = 0; x < links.length; x++) + { + if ( links[x] == link ) + return x; + } + } + + return -1; + } + + public void cancel() + { + if ( links != null ) + { + for (ICraftingLink l : links) + { + if ( l != null ) + l.cancel(); + } + + links = null; + } + + if ( jobs != null ) + { + for (Future l : jobs) + { + if ( l != null ) + l.cancel( true ); + } + + jobs = null; + } + } + + public boolean isBusy(int slot) + { + return getLink( slot ) != null || getJob( slot ) != null; + } } diff --git a/me/cluster/implementations/CraftingCPUCluster.java b/me/cluster/implementations/CraftingCPUCluster.java index cf7dd0d2..82b1b39a 100644 --- a/me/cluster/implementations/CraftingCPUCluster.java +++ b/me/cluster/implementations/CraftingCPUCluster.java @@ -727,7 +727,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU { tasks.clear(); inventory.getItemList().resetStatus(); - AELog.error( e ); + // AELog.error( e ); } return null; diff --git a/parts/automation/PartExportBus.java b/parts/automation/PartExportBus.java index cf519087..736129c9 100644 --- a/parts/automation/PartExportBus.java +++ b/parts/automation/PartExportBus.java @@ -46,8 +46,8 @@ import cpw.mods.fml.relauncher.SideOnly; public class PartExportBus extends PartSharedItemBus implements IGridTickable, ICraftingRequester { - MultiCraftingTracker cratingTracker = new MultiCraftingTracker( this, 9 ); - BaseActionSource mySrc; + final MultiCraftingTracker cratingTracker = new MultiCraftingTracker( this, 9 ); + final BaseActionSource mySrc; public PartExportBus(ItemStack is) { super( PartExportBus.class, is ); diff --git a/parts/misc/PartInterface.java b/parts/misc/PartInterface.java index a05a6c3e..06920814 100644 --- a/parts/misc/PartInterface.java +++ b/parts/misc/PartInterface.java @@ -14,10 +14,12 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.util.Vec3; import net.minecraftforge.common.util.ForgeDirection; +import appeng.api.config.Actionable; import appeng.api.config.Upgrades; import appeng.api.implementations.tiles.ISegmentedInventory; import appeng.api.implementations.tiles.ITileStorageMonitorable; import appeng.api.networking.IGridNode; +import appeng.api.networking.crafting.ICraftingLink; import appeng.api.networking.crafting.ICraftingPatternDetails; import appeng.api.networking.crafting.ICraftingProviderHelper; import appeng.api.networking.events.MENetworkChannelsChanged; @@ -43,6 +45,9 @@ import appeng.tile.inventory.IAEAppEngInventory; import appeng.tile.inventory.InvOperation; import appeng.util.Platform; import appeng.util.inv.IInventoryDestination; + +import com.google.common.collect.ImmutableSet; + import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -361,4 +366,22 @@ public class PartInterface extends PartBasicState implements IGridTickable, ISeg return duality.getInstalledUpgrades( u ); } + @Override + public ImmutableSet getRequestedJobs() + { + return duality.getRequestedJobs(); + } + + @Override + public IAEItemStack injectCratedItems(ICraftingLink link, IAEItemStack items, Actionable mode) + { + return duality.injectCratedItems( link, items, mode ); + } + + @Override + public void jobStateChange(ICraftingLink link) + { + duality.jobStateChange( link ); + } + } diff --git a/tile/misc/TileInterface.java b/tile/misc/TileInterface.java index 712686ed..f9731da6 100644 --- a/tile/misc/TileInterface.java +++ b/tile/misc/TileInterface.java @@ -10,10 +10,12 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import appeng.api.config.Actionable; import appeng.api.config.Upgrades; import appeng.api.implementations.tiles.ISegmentedInventory; import appeng.api.implementations.tiles.ITileStorageMonitorable; import appeng.api.networking.IGridNode; +import appeng.api.networking.crafting.ICraftingLink; import appeng.api.networking.crafting.ICraftingPatternDetails; import appeng.api.networking.crafting.ICraftingProviderHelper; import appeng.api.networking.events.MENetworkChannelsChanged; @@ -40,6 +42,8 @@ import appeng.tile.inventory.InvOperation; import appeng.util.Platform; import appeng.util.inv.IInventoryDestination; +import com.google.common.collect.ImmutableSet; + public class TileInterface extends AENetworkInvTile implements IGridTickable, ISegmentedInventory, ITileStorageMonitorable, IStorageMonitorable, IInventoryDestination, IInterfaceHost, IConfigureableObject { @@ -262,4 +266,21 @@ public class TileInterface extends AENetworkInvTile implements IGridTickable, IS return duality.getInstalledUpgrades( u ); } + @Override + public ImmutableSet getRequestedJobs() + { + return duality.getRequestedJobs(); + } + + @Override + public IAEItemStack injectCratedItems(ICraftingLink link, IAEItemStack items, Actionable mode) + { + return duality.injectCratedItems( link, items, mode ); + } + + @Override + public void jobStateChange(ICraftingLink link) + { + duality.jobStateChange( link ); + } }