diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/grid/CraftingGridBehavior.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/grid/CraftingGridBehavior.java index 8e3689233..c11ed9b9a 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/grid/CraftingGridBehavior.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/grid/CraftingGridBehavior.java @@ -22,6 +22,8 @@ import net.minecraftforge.items.ItemHandlerHelper; import javax.annotation.Nullable; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; import java.util.List; public class CraftingGridBehavior implements ICraftingGridBehavior { @@ -193,6 +195,11 @@ public class CraftingGridBehavior implements ICraftingGridBehavior { if (recipe[i] != null) { ItemStack[] possibilities = recipe[i]; + if (network != null && grid.isGridActive()) { + // sort by the number of items in storage + Arrays.sort(possibilities, Comparator.comparingInt((ItemStack a) -> network.extractItem(a, Integer.MAX_VALUE, IComparer.COMPARE_NBT, Action.SIMULATE).getCount()).reversed()); + } + // If we are a crafting grid if (grid.getGridType() == GridType.CRAFTING) { boolean found = false; diff --git a/src/main/java/com/refinedmods/refinedstorage/integration/jei/GridRecipeTransferHandler.java b/src/main/java/com/refinedmods/refinedstorage/integration/jei/GridRecipeTransferHandler.java index ebab25c6b..e7a71251d 100644 --- a/src/main/java/com/refinedmods/refinedstorage/integration/jei/GridRecipeTransferHandler.java +++ b/src/main/java/com/refinedmods/refinedstorage/integration/jei/GridRecipeTransferHandler.java @@ -72,7 +72,7 @@ public class GridRecipeTransferHandler implements IRecipeTransferHandler inputs = new LinkedList<>(); List outputs = new LinkedList<>(); @@ -165,7 +165,7 @@ public class GridRecipeTransferHandler implements IRecipeTransferHandler fluidOutputs = new LinkedList<>(); for (IGuiIngredient guiIngredient : recipeLayout.getItemStacks().getGuiIngredients().values()) { - handleItemIngredient(inputs, outputs, guiIngredient); + handleItemIngredient(inputs, outputs, guiIngredient, tracker); } for (IGuiIngredient guiIngredient : recipeLayout.getFluidStacks().getGuiIngredients().values()) { @@ -187,9 +187,13 @@ public class GridRecipeTransferHandler implements IRecipeTransferHandler inputs, List outputs, IGuiIngredient guiIngredient) { + private void handleItemIngredient(List inputs, List outputs, IGuiIngredient guiIngredient, IngredientTracker tracker) { if (guiIngredient != null && guiIngredient.getDisplayedIngredient() != null) { - ItemStack ingredient = guiIngredient.getDisplayedIngredient().copy(); + ItemStack ingredient = tracker.findBestMatch(guiIngredient.getAllIngredients()).copy(); + + if (ingredient == ItemStack.EMPTY) { + ingredient = guiIngredient.getDisplayedIngredient().copy(); + } if (guiIngredient.isInput()) { inputs.add(ingredient); diff --git a/src/main/java/com/refinedmods/refinedstorage/integration/jei/IngredientTracker.java b/src/main/java/com/refinedmods/refinedstorage/integration/jei/IngredientTracker.java index 2b3ac8b14..3cec83825 100644 --- a/src/main/java/com/refinedmods/refinedstorage/integration/jei/IngredientTracker.java +++ b/src/main/java/com/refinedmods/refinedstorage/integration/jei/IngredientTracker.java @@ -6,12 +6,14 @@ import com.refinedmods.refinedstorage.screen.grid.stack.IGridStack; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.gui.ingredient.IGuiIngredient; import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; import javax.annotation.Nullable; import java.util.*; public class IngredientTracker { private final List ingredients = new ArrayList<>(); + private final Map storedItems = new HashMap<>(); public IngredientTracker(IRecipeLayout recipeLayout) { for (IGuiIngredient guiIngredient : recipeLayout.getItemStacks().getGuiIngredients().values()) { @@ -27,6 +29,7 @@ public class IngredientTracker { public void addAvailableStack(ItemStack stack, @Nullable IGridStack gridStack) { int available = stack.getCount(); + storedItems.merge(stack.getItem().getRegistryName(), available, Integer::sum); for (Ingredient ingredient : ingredients) { if (available == 0) { @@ -78,4 +81,19 @@ public class IngredientTracker { return toRequest; } + + public ItemStack findBestMatch(List list) { + ItemStack stack = ItemStack.EMPTY; + int count = 0; + + for (ItemStack itemStack : list) { + Integer stored = storedItems.get(itemStack.getItem().getRegistryName()); + if (stored != null && stored > count) { + stack = itemStack; + count = stored; + } + } + + return stack; + } }