diff --git a/expansion/src/main/java/mrtjp/projectred/expansion/CraftingHelper.java b/expansion/src/main/java/mrtjp/projectred/expansion/CraftingHelper.java index a5d6510d9..bb7dcc5c3 100644 --- a/expansion/src/main/java/mrtjp/projectred/expansion/CraftingHelper.java +++ b/expansion/src/main/java/mrtjp/projectred/expansion/CraftingHelper.java @@ -83,7 +83,7 @@ public void loadRecipe() { public void loadOutput() { - result = craftFromStorage(true); + result = craftFromStorageOrMatrix(true); } public boolean hasRecipe() { @@ -109,7 +109,7 @@ public int getMissingIngredientMask() { public boolean onCraftedByPlayer(Player player, boolean leaveRemainingInGrid) { if (recipe == null) return false; - CraftingResult result = craftFromStorage(false); + CraftingResult result = craftFromStorageOrMatrix(false); if (!result.isCraftable()) { return false; @@ -117,7 +117,6 @@ public boolean onCraftedByPlayer(Player player, boolean leaveRemainingInGrid) { // Re-obtain remaining items in case "setCraftingPlayer" changes remaining items ForgeHooks.setCraftingPlayer(player); -// NonNullList remainingStacks = player.level.getRecipeManager().getRemainingItemsFor(IRecipeType.CRAFTING, craftingInventory, player.level); NonNullList remainingStacks = recipe.getRemainingItems(craftingInventory); // Skip re-searching for recipe, should be ok ForgeHooks.setCraftingPlayer(null); @@ -155,7 +154,21 @@ public boolean onCraftedIntoStorage() { return true; } + private CraftingResult craftFromStorageOrMatrix(boolean simulate) { + CraftingResult result = craftFromStorage(simulate); + if (!result.isCraftable() && inputSource.canConsumeFromCraftingMatrix()) { + // TODO maybe merge the missingIngredientMasks of these two results? + result = craftFromSource(inputSource.getCraftingMatrix(), simulate); + } + // TODO Hybrid craft that consumes from both sources instead of one or the other? + return result; + } + private CraftingResult craftFromStorage(boolean simulate) { + return craftFromSource(inputSource.getStorage(), simulate); + } + + private CraftingResult craftFromSource(Container source, boolean simulate) { if (recipe == null) return CraftingResult.EMPTY; @@ -164,9 +177,8 @@ private CraftingResult craftFromStorage(boolean simulate) { ItemStack result = recipe.assemble(craftingInventory); if (result.isEmpty()) return CraftingResult.EMPTY; - Container storage = inputSource.getStorage(); if (simulate) { - storage = copyInventory(storage); + source = copyInventory(source); } // Try to consume all ingredients @@ -176,7 +188,7 @@ private CraftingResult craftFromStorage(boolean simulate) { ItemStack previousInput = craftingInventory.getItem(slot); if (previousInput.isEmpty()) continue; - boolean isPresent = consumeIngredient(storage, 0, input -> { + boolean isPresent = consumeIngredient(source, 0, input -> { // Candidate ingredient must be same item if (!input.sameItemStackIgnoreDurability(previousInput)) return false; @@ -199,31 +211,9 @@ private CraftingResult craftFromStorage(boolean simulate) { return CraftingResult.missingIngredients(missingIngredientMask); } - return new CraftingResult(result, recipe.getRemainingItems(craftingInventory), 0, simulate ? storage : copyInventory(storage)); + return new CraftingResult(result, recipe.getRemainingItems(craftingInventory), 0, simulate ? source : copyInventory(source)); } -// private boolean insertResultsIntoInventory(NonNullList inventory, boolean simulate) { -// if (result.outputStack.isEmpty() || result.missingIngredientMask != 0) { -// return false; -// } -// -// IInventory storage = copyInventory(result.remainingStorage); -// -// // Try to insert into remaining storage -// ItemStack output = outputStack.copy(); -// InventoryLib.injectItemStack(storage, output, true); -// if (!output.isEmpty()) return false; -// -// // Try to insert remaining items -// for (ItemStack stack : remainingItems) { -// ItemStack remaining = stack.copy(); -// InventoryLib.injectItemStack(storage, remaining, true); -// if (!remaining.isEmpty()) return false; -// } -// -// return true; -// } - private boolean consumeIngredient(Container storage, int startIndex, Predicate matchFunc) { int i = startIndex; @@ -250,7 +240,7 @@ private static Container copyInventory(Container inventory) { return copy; } - private static class CraftingResult { + private static final class CraftingResult { private static final CraftingResult EMPTY = new CraftingResult(ItemStack.EMPTY, NonNullList.create(), 0, null); @@ -294,10 +284,6 @@ private boolean canFitResultsIntoStorage() { return InventoryLib.injectAllItemStacks(storage, getCopyOfAllResults(), true); } - public static CraftingResult empty() { - return EMPTY; - } - public static CraftingResult missingIngredients(int missingIngredientMask) { return new CraftingResult(ItemStack.EMPTY, NonNullList.create(), missingIngredientMask, null); } @@ -309,6 +295,10 @@ public interface InventorySource { Container getStorage(); + default boolean canConsumeFromCraftingMatrix() { + return false; + } + Level getWorld(); // Required for recipe lookup } } diff --git a/expansion/src/main/java/mrtjp/projectred/expansion/gui/screen/inventory/ProjectBenchScreen.java b/expansion/src/main/java/mrtjp/projectred/expansion/gui/screen/inventory/ProjectBenchScreen.java index 66b7bcc9e..2d43fafb3 100644 --- a/expansion/src/main/java/mrtjp/projectred/expansion/gui/screen/inventory/ProjectBenchScreen.java +++ b/expansion/src/main/java/mrtjp/projectred/expansion/gui/screen/inventory/ProjectBenchScreen.java @@ -13,6 +13,7 @@ import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.Container; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; @@ -77,10 +78,9 @@ public void drawBack(PoseStack stack, Point mouse, float partialFrame) { blit(stack, x, y, 0, 0, getFrame().width(), getFrame().height()); ProjectBenchTile tile = getMenu().getProjectBenchTile(); - ItemStack plan = tile.getPlanInventory().getItem(0); - if (!plan.isEmpty() && tile.isPlanRecipe()) { - ItemStack[] inputs = RecipePlanItem.loadPlanInputs(plan); - int missingMask = getMenu().getProjectBenchTile().getCraftingHelper().getMissingIngredientMask(); + if (tile.isPlanRecipe()) { + int missingMask = tile.getCraftingHelper().getMissingIngredientMask(); + Container inputs = tile.getCraftingHelper().getCraftingInventory(); drawPlanIngredientsOverlay(stack, inputs, missingMask, x + 48, y + 18); } } @@ -93,7 +93,7 @@ public void drawFront(PoseStack stack, Point mouse, float partialFrame) { } } - private void drawPlanIngredientsOverlay(PoseStack mStack, ItemStack[] ingredients, int missingMask, int xPos, int yPos) { + private void drawPlanIngredientsOverlay(PoseStack mStack, Container ingredients, int missingMask, int xPos, int yPos) { for (int y = 0; y < 3; y++) { for (int x = 0; x < 3; x++) { @@ -101,8 +101,8 @@ private void drawPlanIngredientsOverlay(PoseStack mStack, ItemStack[] ingredient int drawPosY = yPos + (y * 18); int index = (y * 3) + x; - ItemStack ingredient = ingredients[index]; - int colour = (missingMask & 1 << index) != 0 ? EnumColour.RED.argb() : EnumColour.GRAY.argb(); + ItemStack ingredient = ingredients.getItem(index); + int colour = (missingMask & 1 << index) != 0 ? EnumColour.RED.argb(0x77) : EnumColour.GRAY.argb(0x77); if (!ingredient.isEmpty()) { fillGradient(mStack, drawPosX, drawPosY, drawPosX + 16, drawPosY + 16, colour, colour); diff --git a/expansion/src/main/java/mrtjp/projectred/expansion/tile/ProjectBenchTile.java b/expansion/src/main/java/mrtjp/projectred/expansion/tile/ProjectBenchTile.java index c5e7d60a4..d1441078c 100644 --- a/expansion/src/main/java/mrtjp/projectred/expansion/tile/ProjectBenchTile.java +++ b/expansion/src/main/java/mrtjp/projectred/expansion/tile/ProjectBenchTile.java @@ -230,6 +230,11 @@ public Container getStorage() { return storageInventory; } + @Override + public boolean canConsumeFromCraftingMatrix() { + return !isPlanRecipe; + } + @Override public Level getWorld() { return getLevel();