Improve crafting processing code (untested)

This commit is contained in:
Raoul Van den Berge
2016-05-04 18:09:23 +02:00
parent 1f9028464d
commit f251f39b98
2 changed files with 30 additions and 18 deletions

View File

@@ -62,7 +62,7 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor
private List<ClientSideMachine> clientSideMachines = new ArrayList<ClientSideMachine>(); private List<ClientSideMachine> clientSideMachines = new ArrayList<ClientSideMachine>();
private List<CraftingPattern> patterns = new ArrayList<CraftingPattern>(); 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>(); private Set<String> visited = new HashSet<String>();
@@ -172,13 +172,15 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor
} }
} }
if (craftingTasks.size() > 0) { Iterator<ICraftingTask> craftingTaskIterator = craftingTasks.iterator();
ICraftingTask task = craftingTasks.peek();
while (craftingTaskIterator.hasNext()) {
ICraftingTask task = craftingTaskIterator.next();
if (ticks % task.getPattern().getCrafter().getSpeed() == 0 && task.update(this)) { if (ticks % task.getPattern().getCrafter().getSpeed() == 0 && task.update(this)) {
task.onDone(this); task.onDone(this);
craftingTasks.pop(); craftingTaskIterator.remove();
} }
} }
@@ -196,10 +198,10 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor
wirelessGridConsumers.removeAll(wirelessGridConsumersMarkedForRemoval); wirelessGridConsumers.removeAll(wirelessGridConsumersMarkedForRemoval);
wirelessGridConsumersMarkedForRemoval.clear(); wirelessGridConsumersMarkedForRemoval.clear();
Iterator<WirelessGridConsumer> it = wirelessGridConsumers.iterator(); Iterator<WirelessGridConsumer> gridConsumerIterator = wirelessGridConsumers.iterator();
while (it.hasNext()) { while (gridConsumerIterator.hasNext()) {
WirelessGridConsumer consumer = it.next(); WirelessGridConsumer consumer = gridConsumerIterator.next();
if (!InventoryUtils.compareStack(consumer.getWirelessGrid(), consumer.getPlayer().getHeldItem(consumer.getHand()))) { 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 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) { public void addCraftingTask(ICraftingTask task) {
craftingTasks.push(task); craftingTasks.add(task);
} }
public List<CraftingPattern> getPatterns() { public List<CraftingPattern> getPatterns() {

View File

@@ -2,6 +2,7 @@ package refinedstorage.tile.autocrafting.task;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityHopper; import net.minecraft.tileentity.TileEntityHopper;
import refinedstorage.tile.TileController; import refinedstorage.tile.TileController;
import refinedstorage.tile.autocrafting.CraftingPattern; import refinedstorage.tile.autocrafting.CraftingPattern;
@@ -10,11 +11,12 @@ import refinedstorage.util.InventoryUtils;
public class ProcessingCraftingTask implements ICraftingTask { public class ProcessingCraftingTask implements ICraftingTask {
private CraftingPattern pattern; private CraftingPattern pattern;
private boolean inserted; private boolean inserted[];
private boolean satisfied[]; private boolean satisfied[];
public ProcessingCraftingTask(CraftingPattern pattern) { public ProcessingCraftingTask(CraftingPattern pattern) {
this.pattern = pattern; this.pattern = pattern;
this.inserted = new boolean[pattern.getInputs().length];
this.satisfied = new boolean[pattern.getOutputs().length]; this.satisfied = new boolean[pattern.getOutputs().length];
} }
@@ -25,18 +27,26 @@ public class ProcessingCraftingTask implements ICraftingTask {
@Override @Override
public boolean update(TileController controller) { public boolean update(TileController controller) {
if (!inserted) { for (int i = 0; i < inserted.length; ++i) {
for (ItemStack input : pattern.getInputs()) { if (!inserted[i]) {
ItemStack take = controller.take(input); ItemStack input = pattern.getInputs()[i];
ItemStack took = controller.take(input);
if (take != null) { if (took != null) {
TileCrafter crafter = pattern.getCrafter(); 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) { for (int i = 0; i < satisfied.length; ++i) {
@@ -48,9 +58,9 @@ public class ProcessingCraftingTask implements ICraftingTask {
return true; return true;
} }
public void onInserted(ItemStack in) { public void onInserted(ItemStack inserted) {
for (int i = 0; i < pattern.getOutputs().length; ++i) { 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; satisfied[i] = true;
} }
} }