@@ -59,7 +59,7 @@ public class CraftingStepProcess extends CraftingStep {
|
||||
|
||||
items.undo();
|
||||
fluids.undo();
|
||||
return insertSimulation(inventory, toInsert);
|
||||
return insert(inventory, toInsert, true);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -67,17 +67,17 @@ public class CraftingStepProcess extends CraftingStep {
|
||||
@Override
|
||||
public boolean canStartProcessing() {
|
||||
IItemHandler inventory = getPattern().getContainer().getFacingInventory();
|
||||
return inventory != null && insertSimulation(inventory, new LinkedList<>(getToInsert()));
|
||||
return inventory != null && insert(inventory, new LinkedList<>(getToInsert()), true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Deque<ItemStack> toInsertItems, Deque<FluidStack> toInsertFluids) {
|
||||
List<ItemStack> actualInputs = new LinkedList<>();
|
||||
LinkedList<ItemStack> actualInputs = new LinkedList<>();
|
||||
int compare = CraftingTask.DEFAULT_COMPARE | (getPattern().isOredict() ? IComparer.COMPARE_OREDICT : 0);
|
||||
if (extractItems(actualInputs, compare, toInsertItems)) {
|
||||
IItemHandler inventory = getPattern().getContainer().getFacingInventory();
|
||||
if (insertSimulation(inventory, new ArrayDeque<>(actualInputs))) {
|
||||
actualInputs.forEach(stack -> ItemHandlerHelper.insertItem(inventory, stack, false));
|
||||
if (insert(inventory, new ArrayDeque<>(actualInputs), true)) {
|
||||
insert(inventory, actualInputs, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -90,25 +90,26 @@ public class CraftingStepProcess extends CraftingStep {
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether all stacks can be inserted or not
|
||||
* Insert or simulate insertion of {@link ItemStack}s into an {@link IItemHandler}
|
||||
*
|
||||
* @param dest target {@link IItemHandler}
|
||||
* @param stacks a {@link Deque} of {@link ItemStack}s
|
||||
* @param simulate simulate or actually insert the {@link ItemStack}s
|
||||
* @return true when all can be inserted, false otherwise
|
||||
*/
|
||||
private static boolean insertSimulation(IItemHandler dest, Deque<ItemStack> stacks) {
|
||||
private static boolean insert(IItemHandler dest, Deque<ItemStack> stacks, boolean simulate) {
|
||||
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.getCount() != remainder.getCount()) {
|
||||
remainder = dest.insertItem(slot, current, simulate);
|
||||
if (remainder.isEmpty() || current.getCount() != remainder.getCount()) {
|
||||
availableSlots.remove(slot);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (remainder == null || remainder.getCount() <= 0) {
|
||||
if (remainder == null || remainder.isEmpty()) {
|
||||
current = stacks.poll();
|
||||
} else if (current.getCount() == remainder.getCount()) {
|
||||
break; // Can't be inserted
|
||||
|
@@ -1,7 +1,6 @@
|
||||
package com.raoulvdberge.refinedstorage.integration.jei;
|
||||
|
||||
import com.raoulvdberge.refinedstorage.RS;
|
||||
import com.raoulvdberge.refinedstorage.apiimpl.API;
|
||||
import com.raoulvdberge.refinedstorage.container.ContainerProcessingPatternEncoder;
|
||||
import com.raoulvdberge.refinedstorage.network.MessageProcessingPatternEncoderTransfer;
|
||||
import mezz.jei.api.gui.IGuiIngredient;
|
||||
@@ -12,8 +11,8 @@ import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
public class RecipeTransferHandlerPattern implements IRecipeTransferHandler<ContainerProcessingPatternEncoder> {
|
||||
@Override
|
||||
@@ -25,32 +24,21 @@ public class RecipeTransferHandlerPattern implements IRecipeTransferHandler<Cont
|
||||
@Override
|
||||
public IRecipeTransferError transferRecipe(ContainerProcessingPatternEncoder container, IRecipeLayout recipeLayout, EntityPlayer player, boolean maxTransfer, boolean doTransfer) {
|
||||
if (doTransfer) {
|
||||
Map<Integer, ItemStack> inputs = new LinkedHashMap<>();
|
||||
Map<Integer, ItemStack> outputs = new LinkedHashMap<>();
|
||||
List<ItemStack> inputs = new LinkedList<>();
|
||||
List<ItemStack> outputs = new LinkedList<>();
|
||||
|
||||
for (IGuiIngredient<ItemStack> guiIngredient : recipeLayout.getItemStacks().getGuiIngredients().values()) {
|
||||
if (guiIngredient != null && guiIngredient.getDisplayedIngredient() != null) {
|
||||
ItemStack ingredient = guiIngredient.getDisplayedIngredient().copy();
|
||||
|
||||
int hash = API.instance().getItemStackHashCode(ingredient);
|
||||
|
||||
if (guiIngredient.isInput()) {
|
||||
if (inputs.containsKey(hash)) {
|
||||
inputs.get(hash).grow(1);
|
||||
} else {
|
||||
inputs.put(hash, ingredient);
|
||||
}
|
||||
inputs.add(ingredient);
|
||||
} else {
|
||||
if (outputs.containsKey(hash)) {
|
||||
outputs.get(hash).grow(1);
|
||||
} else {
|
||||
outputs.put(hash, ingredient);
|
||||
}
|
||||
outputs.add(ingredient);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RS.INSTANCE.network.sendToServer(new MessageProcessingPatternEncoderTransfer(inputs.values(), outputs.values()));
|
||||
RS.INSTANCE.network.sendToServer(new MessageProcessingPatternEncoderTransfer(inputs, outputs));
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@@ -366,7 +366,7 @@ public class TileDiskManipulator extends TileNode implements IComparable, IFilte
|
||||
FluidStack extracted = null;
|
||||
int i = 0;
|
||||
|
||||
do {
|
||||
while (extracted == null && storage.getStacks().size() > i) {
|
||||
FluidStack stack = storage.getStacks().get(i);
|
||||
|
||||
while (stack == null && storage.getStacks().size() > i) {
|
||||
@@ -376,7 +376,7 @@ public class TileDiskManipulator extends TileNode implements IComparable, IFilte
|
||||
if (stack != null) {
|
||||
extracted = storage.extract(stack, upgrades.getItemInteractCount(), compare, false);
|
||||
}
|
||||
} while (extracted == null && storage.getStacks().size() > i);
|
||||
}
|
||||
|
||||
if (extracted == null) {
|
||||
moveDriveToOutput(slot);
|
||||
|
Reference in New Issue
Block a user