fix for recipes requiring the output as an input
some mods are weird like that
This commit is contained in:
@@ -90,7 +90,7 @@ public class CraftingTask implements ICraftingTask {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void calculate(IItemStackList networkList, IFluidStackList networkFluidList, ICraftingPattern pattern, IItemStackList toInsert) {
|
private void calculate(IItemStackList networkList, IFluidStackList networkFluidList, ICraftingPattern pattern, IItemStackList toInsert) {
|
||||||
recurseFound = !usedPatterns.add(pattern);
|
recurseFound |= !usedPatterns.add(pattern);
|
||||||
if (recurseFound) {
|
if (recurseFound) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -133,6 +133,26 @@ public class CraftingTask implements ICraftingTask {
|
|||||||
ItemStack extraStack = toInsert.get(input, compare);
|
ItemStack extraStack = toInsert.get(input, compare);
|
||||||
ItemStack networkStack = networkList.get(input, compare);
|
ItemStack networkStack = networkList.get(input, compare);
|
||||||
|
|
||||||
|
// This handles recipes that use the output as input for the sub recipe
|
||||||
|
final int lambdaCompare = compare;
|
||||||
|
ICraftingPattern inputPattern = null;
|
||||||
|
int available = (extraStack == null ? 0 : extraStack.stackSize) + (networkStack == null ? 0 : networkStack.stackSize);
|
||||||
|
if (available < input.stackSize) {
|
||||||
|
inputPattern = network.getPattern(input, compare);
|
||||||
|
if (inputPattern != null) {
|
||||||
|
if (inputPattern.getInputs().stream().anyMatch(s -> API.instance().getComparer().isEqual(s, input, lambdaCompare))) {
|
||||||
|
int craftQuantity = inputPattern.getQuantityPerRequest(input, compare);
|
||||||
|
// The needed amount is the actual needed amount of extraStacks + the needed input (twice so you can keep repeating it)
|
||||||
|
long needed = (networkStack == null ? 0 : -networkStack.stackSize) + input.stackSize + inputPattern.getInputs().stream().filter(s -> API.instance().getComparer().isEqual(s, input, lambdaCompare)).count() * 2;
|
||||||
|
do {
|
||||||
|
calculate(networkList, networkFluidList, inputPattern, toInsert);
|
||||||
|
toCraft.add(ItemHandlerHelper.copyStackWithSize(input, craftQuantity));
|
||||||
|
extraStack = toInsert.get(input, compare);
|
||||||
|
} while (extraStack != null && extraStack.stackSize < needed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
while (input.stackSize > 0) {
|
while (input.stackSize > 0) {
|
||||||
if (extraStack != null && extraStack.stackSize > 0) {
|
if (extraStack != null && extraStack.stackSize > 0) {
|
||||||
int takeQuantity = Math.min(extraStack.stackSize, input.stackSize);
|
int takeQuantity = Math.min(extraStack.stackSize, input.stackSize);
|
||||||
@@ -151,7 +171,9 @@ public class CraftingTask implements ICraftingTask {
|
|||||||
input.stackSize -= takeQuantity;
|
input.stackSize -= takeQuantity;
|
||||||
networkList.remove(inputStack, true);
|
networkList.remove(inputStack, true);
|
||||||
} else {
|
} else {
|
||||||
ICraftingPattern inputPattern = network.getPattern(input, compare);
|
if (inputPattern == null) {
|
||||||
|
inputPattern = network.getPattern(input, compare);
|
||||||
|
}
|
||||||
|
|
||||||
if (inputPattern != null) {
|
if (inputPattern != null) {
|
||||||
ItemStack actualCraft = inputPattern.getActualOutput(input, compare);
|
ItemStack actualCraft = inputPattern.getActualOutput(input, compare);
|
||||||
@@ -161,10 +183,12 @@ public class CraftingTask implements ICraftingTask {
|
|||||||
actualInputs.add(inputCrafted.copy());
|
actualInputs.add(inputCrafted.copy());
|
||||||
calculate(networkList, networkFluidList, inputPattern, toInsert);
|
calculate(networkList, networkFluidList, inputPattern, toInsert);
|
||||||
input.stackSize -= craftQuantity;
|
input.stackSize -= craftQuantity;
|
||||||
|
if (!recurseFound) {
|
||||||
// Calculate added all the crafted outputs toInsert
|
// Calculate added all the crafted outputs toInsert
|
||||||
// So we remove the ones we use from toInsert
|
// So we remove the ones we use from toInsert
|
||||||
ItemStack inserted = toInsert.get(inputCrafted, compare);
|
ItemStack inserted = toInsert.get(inputCrafted, compare);
|
||||||
toInsert.remove(inserted, craftQuantity, true);
|
toInsert.remove(inserted, craftQuantity, true);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Fluid checks are with a stack size of one
|
// Fluid checks are with a stack size of one
|
||||||
ItemStack fluidCheck = ItemHandlerHelper.copyStackWithSize(input, 1);
|
ItemStack fluidCheck = ItemHandlerHelper.copyStackWithSize(input, 1);
|
||||||
|
Reference in New Issue
Block a user