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 c9d7e27fc..987bab002 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 @@ -10,9 +10,11 @@ import com.refinedmods.refinedstorage.api.util.IComparer; import com.refinedmods.refinedstorage.api.util.IStackList; import com.refinedmods.refinedstorage.apiimpl.API; import com.refinedmods.refinedstorage.apiimpl.network.node.GridNetworkNode; +import com.refinedmods.refinedstorage.item.PatternItem; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.CraftingInventory; import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.ICraftingRecipe; import net.minecraft.util.NonNullList; @@ -21,10 +23,9 @@ import net.minecraftforge.fml.hooks.BasicEventHooks; 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; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; public class CraftingGridBehavior implements ICraftingGridBehavior { @Override @@ -190,17 +191,16 @@ public class CraftingGridBehavior implements ICraftingGridBehavior { } } + AtomicReference> playerItems = new AtomicReference<>(); // Now let's fill the matrix for (int i = 0; i < grid.getCraftingMatrix().getSizeInventory(); ++i) { if (recipe[i] != null) { ItemStack[] possibilities = recipe[i]; if (network != null && grid.isGridActive() && network.getItemStorageCache() != null) { - // sort by the number of items in storage - Arrays.sort(possibilities, Comparator.comparingInt((ItemStack a) -> { - ItemStack stack = network.getItemStorageCache().getList().get(a); - return stack == null ? 0 : stack.getCount(); - }).reversed()); + + // sort by the number of items in storage, craftables and inventory + Arrays.sort(possibilities, compareByItemStackCounts(player, network, playerItems)); } // If we are a crafting grid @@ -256,4 +256,52 @@ public class CraftingGridBehavior implements ICraftingGridBehavior { ((GridNetworkNode) grid).markDirty(); } } + + private Comparator compareByItemStackCounts(PlayerEntity player, INetwork network, AtomicReference> playerItems) { + AtomicInteger s = new AtomicInteger(); + return Comparator.comparingInt((ItemStack itemStack) -> { + + ItemStack stack = network.getItemStorageCache().getList().get(itemStack); + if (stack != null) { + return stack.getCount(); + } + + if (network.getCraftingManager().getPattern(itemStack) != null) { + return 1; + } + + if (playerItems.get() == null) { + playerItems.set(makePlayerInventoryMap(player, network)); + } else { + System.out.println(s.incrementAndGet()); + } + + ItemStack onPlayer = playerItems.get().get(itemStack.getItem()); + if (onPlayer != null) { + return onPlayer.getCount(); + } + return 0; + }).reversed(); + } + + private Map makePlayerInventoryMap(PlayerEntity player, INetwork network) { + Map playerItems = new HashMap<>(); + for (int j = 0; j < player.inventory.getSizeInventory(); j++) { + ItemStack inventoryStack = player.inventory.getStackInSlot(j); + + if (inventoryStack.getItem() instanceof PatternItem) { + NonNullList patternOutput = PatternItem.fromCache(network.getWorld(), inventoryStack).getOutputs(); + for (ItemStack stack : patternOutput) { + if (!stack.isEmpty()) { + playerItems.put(stack.getItem(), stack); + } + } + } else { + playerItems.put(inventoryStack.getItem(), inventoryStack); + } + } + + return playerItems; + } + } 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 3cec83825..11082a483 100644 --- a/src/main/java/com/refinedmods/refinedstorage/integration/jei/IngredientTracker.java +++ b/src/main/java/com/refinedmods/refinedstorage/integration/jei/IngredientTracker.java @@ -2,6 +2,7 @@ package com.refinedmods.refinedstorage.integration.jei; import com.refinedmods.refinedstorage.api.util.IComparer; import com.refinedmods.refinedstorage.apiimpl.API; +import com.refinedmods.refinedstorage.item.PatternItem; import com.refinedmods.refinedstorage.screen.grid.stack.IGridStack; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.gui.ingredient.IGuiIngredient; @@ -29,7 +30,12 @@ public class IngredientTracker { public void addAvailableStack(ItemStack stack, @Nullable IGridStack gridStack) { int available = stack.getCount(); - storedItems.merge(stack.getItem().getRegistryName(), available, Integer::sum); + if (stack.getItem() instanceof PatternItem) { + ItemStack outputStack = PatternItem.getOutputSlot(stack, 0); + storedItems.merge(outputStack.getItem().getRegistryName(), available, Integer::sum); + } else { + storedItems.merge(stack.getItem().getRegistryName(), available, Integer::sum); + } for (Ingredient ingredient : ingredients) { if (available == 0) {