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(); items.undo();
fluids.undo(); fluids.undo();
return insertSimulation(inventory, toInsert); return insert(inventory, toInsert, true);
} }
return false; return false;
} }
@@ -67,17 +67,17 @@ public class CraftingStepProcess extends CraftingStep {
@Override @Override
public boolean canStartProcessing() { public boolean canStartProcessing() {
IItemHandler inventory = getPattern().getContainer().getFacingInventory(); IItemHandler inventory = getPattern().getContainer().getFacingInventory();
return inventory != null && insertSimulation(inventory, new LinkedList<>(getToInsert())); return inventory != null && insert(inventory, new LinkedList<>(getToInsert()), true);
} }
@Override @Override
public void execute(Deque<ItemStack> toInsertItems, Deque<FluidStack> toInsertFluids) { 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); int compare = CraftingTask.DEFAULT_COMPARE | (getPattern().isOredict() ? IComparer.COMPARE_OREDICT : 0);
if (extractItems(actualInputs, compare, toInsertItems)) { if (extractItems(actualInputs, compare, toInsertItems)) {
IItemHandler inventory = getPattern().getContainer().getFacingInventory(); IItemHandler inventory = getPattern().getContainer().getFacingInventory();
if (insertSimulation(inventory, new ArrayDeque<>(actualInputs))) { if (insert(inventory, new ArrayDeque<>(actualInputs), true)) {
actualInputs.forEach(stack -> ItemHandlerHelper.insertItem(inventory, stack, false)); 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 dest target {@link IItemHandler}
* @param stacks a {@link Deque} of {@link ItemStack}s * @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 * @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(); ItemStack current = stacks.poll();
List<Integer> availableSlots = IntStream.range(0, dest.getSlots()).boxed().collect(Collectors.toList()); List<Integer> availableSlots = IntStream.range(0, dest.getSlots()).boxed().collect(Collectors.toList());
while (current != null && !availableSlots.isEmpty()) { while (current != null && !availableSlots.isEmpty()) {
ItemStack remainder = null; ItemStack remainder = null;
for (Integer slot : availableSlots) { for (Integer slot : availableSlots) {
remainder = dest.insertItem(slot, current, true); remainder = dest.insertItem(slot, current, simulate);
if (remainder == null || current.getCount() != remainder.getCount()) { if (remainder.isEmpty() || current.getCount() != remainder.getCount()) {
availableSlots.remove(slot); availableSlots.remove(slot);
break; break;
} }
} }
if (remainder == null || remainder.getCount() <= 0) { if (remainder == null || remainder.isEmpty()) {
current = stacks.poll(); current = stacks.poll();
} else if (current.getCount() == remainder.getCount()) { } else if (current.getCount() == remainder.getCount()) {
break; // Can't be inserted break; // Can't be inserted

View File

@@ -1,7 +1,6 @@
package com.raoulvdberge.refinedstorage.integration.jei; package com.raoulvdberge.refinedstorage.integration.jei;
import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.container.ContainerProcessingPatternEncoder; import com.raoulvdberge.refinedstorage.container.ContainerProcessingPatternEncoder;
import com.raoulvdberge.refinedstorage.network.MessageProcessingPatternEncoderTransfer; import com.raoulvdberge.refinedstorage.network.MessageProcessingPatternEncoderTransfer;
import mezz.jei.api.gui.IGuiIngredient; import mezz.jei.api.gui.IGuiIngredient;
@@ -12,8 +11,8 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.LinkedHashMap; import java.util.LinkedList;
import java.util.Map; import java.util.List;
public class RecipeTransferHandlerPattern implements IRecipeTransferHandler<ContainerProcessingPatternEncoder> { public class RecipeTransferHandlerPattern implements IRecipeTransferHandler<ContainerProcessingPatternEncoder> {
@Override @Override
@@ -25,32 +24,21 @@ public class RecipeTransferHandlerPattern implements IRecipeTransferHandler<Cont
@Override @Override
public IRecipeTransferError transferRecipe(ContainerProcessingPatternEncoder container, IRecipeLayout recipeLayout, EntityPlayer player, boolean maxTransfer, boolean doTransfer) { public IRecipeTransferError transferRecipe(ContainerProcessingPatternEncoder container, IRecipeLayout recipeLayout, EntityPlayer player, boolean maxTransfer, boolean doTransfer) {
if (doTransfer) { if (doTransfer) {
Map<Integer, ItemStack> inputs = new LinkedHashMap<>(); List<ItemStack> inputs = new LinkedList<>();
Map<Integer, ItemStack> outputs = new LinkedHashMap<>(); List<ItemStack> outputs = new LinkedList<>();
for (IGuiIngredient<ItemStack> guiIngredient : recipeLayout.getItemStacks().getGuiIngredients().values()) { for (IGuiIngredient<ItemStack> guiIngredient : recipeLayout.getItemStacks().getGuiIngredients().values()) {
if (guiIngredient != null && guiIngredient.getDisplayedIngredient() != null) { if (guiIngredient != null && guiIngredient.getDisplayedIngredient() != null) {
ItemStack ingredient = guiIngredient.getDisplayedIngredient().copy(); ItemStack ingredient = guiIngredient.getDisplayedIngredient().copy();
int hash = API.instance().getItemStackHashCode(ingredient);
if (guiIngredient.isInput()) { if (guiIngredient.isInput()) {
if (inputs.containsKey(hash)) { inputs.add(ingredient);
inputs.get(hash).grow(1);
} else {
inputs.put(hash, ingredient);
}
} else { } else {
if (outputs.containsKey(hash)) { outputs.add(ingredient);
outputs.get(hash).grow(1);
} else {
outputs.put(hash, ingredient);
}
} }
} }
} }
RS.INSTANCE.network.sendToServer(new MessageProcessingPatternEncoderTransfer(inputs.values(), outputs.values())); RS.INSTANCE.network.sendToServer(new MessageProcessingPatternEncoderTransfer(inputs, outputs));
} }
return null; return null;

View File

@@ -366,7 +366,7 @@ public class TileDiskManipulator extends TileNode implements IComparable, IFilte
FluidStack extracted = null; FluidStack extracted = null;
int i = 0; int i = 0;
do { while (extracted == null && storage.getStacks().size() > i) {
FluidStack stack = storage.getStacks().get(i); FluidStack stack = storage.getStacks().get(i);
while (stack == null && storage.getStacks().size() > i) { while (stack == null && storage.getStacks().size() > i) {
@@ -376,7 +376,7 @@ public class TileDiskManipulator extends TileNode implements IComparable, IFilte
if (stack != null) { if (stack != null) {
extracted = storage.extract(stack, upgrades.getItemInteractCount(), compare, false); extracted = storage.extract(stack, upgrades.getItemInteractCount(), compare, false);
} }
} while (extracted == null && storage.getStacks().size() > i); }
if (extracted == null) { if (extracted == null) {
moveDriveToOutput(slot); moveDriveToOutput(slot);