fixes #530
now it checks if all stacks can be inserted together and not just inserted
This commit is contained in:
@@ -12,6 +12,10 @@ import net.minecraftforge.items.IItemHandler;
|
|||||||
import net.minecraftforge.items.ItemHandlerHelper;
|
import net.minecraftforge.items.ItemHandlerHelper;
|
||||||
|
|
||||||
import java.util.Deque;
|
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 class CraftingStepProcess extends CraftingStep {
|
||||||
public static final String ID = "process";
|
public static final String ID = "process";
|
||||||
@@ -28,17 +32,18 @@ public class CraftingStepProcess extends CraftingStep {
|
|||||||
public boolean canStartProcessing(IItemStackList items, IFluidStackList fluids) {
|
public boolean canStartProcessing(IItemStackList items, IFluidStackList fluids) {
|
||||||
IItemHandler inventory = getPattern().getContainer().getFacingInventory();
|
IItemHandler inventory = getPattern().getContainer().getFacingInventory();
|
||||||
if (inventory != null) {
|
if (inventory != null) {
|
||||||
|
Deque<ItemStack> toInsert = new LinkedList<>();
|
||||||
for (ItemStack stack : getToInsert()) {
|
for (ItemStack stack : getToInsert()) {
|
||||||
ItemStack actualStack = items.get(stack, IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT | (pattern.isOredict() ? IComparer.COMPARE_OREDICT : 0));
|
ItemStack actualStack = items.get(stack, IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT | (pattern.isOredict() ? IComparer.COMPARE_OREDICT : 0));
|
||||||
|
ItemStack removeStack = ItemHandlerHelper.copyStackWithSize(actualStack, stack.stackSize);
|
||||||
boolean canInsert = ItemHandlerHelper.insertItem(inventory, ItemHandlerHelper.copyStackWithSize(actualStack, stack.stackSize), true) == null;
|
if (actualStack == null || actualStack.stackSize == 0 || !items.trackedRemove(removeStack, true) ) {
|
||||||
if (actualStack == null || actualStack.stackSize == 0 || !items.trackedRemove(actualStack, stack.stackSize, true) || !canInsert) {
|
|
||||||
items.undo();
|
items.undo();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
toInsert.add(removeStack.copy());
|
||||||
}
|
}
|
||||||
items.undo();
|
items.undo();
|
||||||
return true;
|
return insertSimulation(inventory, toInsert);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -71,4 +76,34 @@ public class CraftingStepProcess extends CraftingStep {
|
|||||||
|
|
||||||
return super.writeToNBT(tag);
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user