port fixes applied in mc1.10

own insert implementation and #718
This commit is contained in:
way2muchnoise
2016-12-09 22:38:18 +01:00
parent 86ba74302e
commit 61c7831a8c
3 changed files with 20 additions and 31 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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);