now it checks if all stacks can be inserted together and not just inserted
This commit is contained in:
way2muchnoise
2016-10-27 19:10:13 +02:00
parent 411c912387
commit b6413c68ad

View File

@@ -12,6 +12,10 @@ import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class CraftingStepProcess extends CraftingStep {
public static final String ID = "process";
@@ -28,17 +32,18 @@ public class CraftingStepProcess extends CraftingStep {
public boolean canStartProcessing(IItemStackList items, IFluidStackList fluids) {
IItemHandler inventory = getPattern().getContainer().getFacingInventory();
if (inventory != null) {
Deque<ItemStack> toInsert = new LinkedList<>();
for (ItemStack stack : getToInsert()) {
ItemStack actualStack = items.get(stack, IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT | (pattern.isOredict() ? IComparer.COMPARE_OREDICT : 0));
boolean canInsert = ItemHandlerHelper.insertItem(inventory, ItemHandlerHelper.copyStackWithSize(actualStack, stack.stackSize), true) == null;
if (actualStack == null || actualStack.stackSize == 0 || !items.trackedRemove(actualStack, stack.stackSize, true) || !canInsert) {
ItemStack removeStack = ItemHandlerHelper.copyStackWithSize(actualStack, stack.stackSize);
if (actualStack == null || actualStack.stackSize == 0 || !items.trackedRemove(removeStack, true) ) {
items.undo();
return false;
}
toInsert.add(removeStack.copy());
}
items.undo();
return true;
return insertSimulation(inventory, toInsert);
}
return false;
}
@@ -71,4 +76,34 @@ public class CraftingStepProcess extends CraftingStep {
return super.writeToNBT(tag);
}
/**
* Checks whether all stacks can be inserted or not
*
* @param dest target {@link IItemHandler}
* @param stacks a {@link Deque} of {@link ItemStack}s
* @return true when all can be inserted, false otherwise
*/
private static boolean insertSimulation(IItemHandler dest, Deque<ItemStack> stacks) {
ItemStack current = stacks.poll();
List<Integer> availableSlots = IntStream.range(0, dest.getSlots()).boxed().collect(Collectors.toList());
while (current != null && !availableSlots.isEmpty()) {
ItemStack remainder = null;
for (Integer slot : availableSlots) {
remainder = dest.insertItem(slot, current, true);
if (remainder == null || current.stackSize != remainder.stackSize) {
availableSlots.remove(slot);
break;
}
}
if (remainder == null || remainder.stackSize <= 0) {
current = stacks.poll();
} else if (current.stackSize == remainder.stackSize) {
break; // Can't be inserted
} else {
current = remainder;
}
}
return current == null && stacks.isEmpty();
}
}