Improve crafting processing code (untested)
This commit is contained in:
@@ -62,7 +62,7 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor
|
||||
private List<ClientSideMachine> clientSideMachines = new ArrayList<ClientSideMachine>();
|
||||
|
||||
private List<CraftingPattern> patterns = new ArrayList<CraftingPattern>();
|
||||
private Stack<ICraftingTask> craftingTasks = new Stack<ICraftingTask>();
|
||||
private List<ICraftingTask> craftingTasks = new ArrayList<ICraftingTask>();
|
||||
|
||||
private Set<String> visited = new HashSet<String>();
|
||||
|
||||
@@ -172,13 +172,15 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor
|
||||
}
|
||||
}
|
||||
|
||||
if (craftingTasks.size() > 0) {
|
||||
ICraftingTask task = craftingTasks.peek();
|
||||
Iterator<ICraftingTask> craftingTaskIterator = craftingTasks.iterator();
|
||||
|
||||
while (craftingTaskIterator.hasNext()) {
|
||||
ICraftingTask task = craftingTaskIterator.next();
|
||||
|
||||
if (ticks % task.getPattern().getCrafter().getSpeed() == 0 && task.update(this)) {
|
||||
task.onDone(this);
|
||||
|
||||
craftingTasks.pop();
|
||||
craftingTaskIterator.remove();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -196,10 +198,10 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor
|
||||
wirelessGridConsumers.removeAll(wirelessGridConsumersMarkedForRemoval);
|
||||
wirelessGridConsumersMarkedForRemoval.clear();
|
||||
|
||||
Iterator<WirelessGridConsumer> it = wirelessGridConsumers.iterator();
|
||||
Iterator<WirelessGridConsumer> gridConsumerIterator = wirelessGridConsumers.iterator();
|
||||
|
||||
while (it.hasNext()) {
|
||||
WirelessGridConsumer consumer = it.next();
|
||||
while (gridConsumerIterator.hasNext()) {
|
||||
WirelessGridConsumer consumer = gridConsumerIterator.next();
|
||||
|
||||
if (!InventoryUtils.compareStack(consumer.getWirelessGrid(), consumer.getPlayer().getHeldItem(consumer.getHand()))) {
|
||||
consumer.getPlayer().closeScreen(); // This will call onContainerClosed on the Container and remove it from the list
|
||||
@@ -251,7 +253,7 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor
|
||||
}
|
||||
|
||||
public void addCraftingTask(ICraftingTask task) {
|
||||
craftingTasks.push(task);
|
||||
craftingTasks.add(task);
|
||||
}
|
||||
|
||||
public List<CraftingPattern> getPatterns() {
|
||||
|
@@ -2,6 +2,7 @@ package refinedstorage.tile.autocrafting.task;
|
||||
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.tileentity.TileEntityHopper;
|
||||
import refinedstorage.tile.TileController;
|
||||
import refinedstorage.tile.autocrafting.CraftingPattern;
|
||||
@@ -10,11 +11,12 @@ import refinedstorage.util.InventoryUtils;
|
||||
|
||||
public class ProcessingCraftingTask implements ICraftingTask {
|
||||
private CraftingPattern pattern;
|
||||
private boolean inserted;
|
||||
private boolean inserted[];
|
||||
private boolean satisfied[];
|
||||
|
||||
public ProcessingCraftingTask(CraftingPattern pattern) {
|
||||
this.pattern = pattern;
|
||||
this.inserted = new boolean[pattern.getInputs().length];
|
||||
this.satisfied = new boolean[pattern.getOutputs().length];
|
||||
}
|
||||
|
||||
@@ -25,18 +27,26 @@ public class ProcessingCraftingTask implements ICraftingTask {
|
||||
|
||||
@Override
|
||||
public boolean update(TileController controller) {
|
||||
if (!inserted) {
|
||||
for (ItemStack input : pattern.getInputs()) {
|
||||
ItemStack take = controller.take(input);
|
||||
for (int i = 0; i < inserted.length; ++i) {
|
||||
if (!inserted[i]) {
|
||||
ItemStack input = pattern.getInputs()[i];
|
||||
ItemStack took = controller.take(input);
|
||||
|
||||
if (take != null) {
|
||||
if (took != null) {
|
||||
TileCrafter crafter = pattern.getCrafter();
|
||||
TileEntity crafterFacing = crafter.getWorld().getTileEntity(crafter.getPos().offset(crafter.getDirection()));
|
||||
|
||||
TileEntityHopper.putStackInInventoryAllSlots((IInventory) crafter.getWorld().getTileEntity(crafter.getPos().offset(crafter.getDirection())), take, crafter.getDirection().getOpposite());
|
||||
if (crafterFacing instanceof IInventory) {
|
||||
ItemStack remaining = TileEntityHopper.putStackInInventoryAllSlots((IInventory) crafterFacing, took, crafter.getDirection().getOpposite());
|
||||
|
||||
if (remaining == null) {
|
||||
inserted[i] = true;
|
||||
} else {
|
||||
controller.push(input);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inserted = true;
|
||||
}
|
||||
|
||||
for (int i = 0; i < satisfied.length; ++i) {
|
||||
@@ -48,9 +58,9 @@ public class ProcessingCraftingTask implements ICraftingTask {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void onInserted(ItemStack in) {
|
||||
public void onInserted(ItemStack inserted) {
|
||||
for (int i = 0; i < pattern.getOutputs().length; ++i) {
|
||||
if (!satisfied[i] && InventoryUtils.compareStack(in, pattern.getOutputs()[i])) {
|
||||
if (!satisfied[i] && InventoryUtils.compareStack(inserted, pattern.getOutputs()[i])) {
|
||||
satisfied[i] = true;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user