diff --git a/CHANGELOG.md b/CHANGELOG.md index ff863c5ac..a3a87090a 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### 1.0.5 - Fixed crafting a complex item causes the process to flow off the Crafting Monitor's GUI (raoulvdberge) - Fixed shift clicking from Grid when player inventory is full throwing items in the world (raoulvdberge) +- Added support for ore dictionary substitutions in Crafting Patterns (raoulvdberge) ### 1.0.4 - Fixed lag caused by Crafter (raoulvdberge) diff --git a/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java b/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java index 26809efe1..8ee3f35ea 100755 --- a/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java +++ b/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java @@ -23,21 +23,27 @@ public interface ICraftingPattern { */ boolean isValid(); - /** - * @return the inputs - */ - List getInputs(); - /** * @return true if this crafting pattern cares about the ore dictionary when extracting items, false otherwise */ boolean isOredicted(); + /** + * @return the inputs + */ + List getInputs(); + /** * @return the outputs */ List getOutputs(); + /** + * @param took the items that it already took + * @return the outputs + */ + List getOutputsBasedOnTook(ItemStack[] took); + /** * @return the id of the factory that creates a crafting task for this pattern, as defined in the registry */ diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java b/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java index 7e4371eb7..27f064905 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java @@ -1,5 +1,7 @@ package refinedstorage.apiimpl.autocrafting; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryCrafting; @@ -18,16 +20,19 @@ import java.util.ArrayList; import java.util.List; public class CraftingPattern implements ICraftingPattern { + private World world; private ICraftingPatternContainer container; private ItemStack stack; private List inputs = new ArrayList<>(); private List outputs = new ArrayList<>(); + private List byproducts = new ArrayList<>(); public CraftingPattern(World world, ICraftingPatternContainer container, ItemStack stack) { + this.world = world; this.container = container; this.stack = stack; - InventoryCrafting dummyInventory = new InventoryCrafting(new Container() { + InventoryCrafting inv = new InventoryCrafting(new Container() { @Override public boolean canInteractWith(EntityPlayer player) { return false; @@ -42,19 +47,19 @@ public class CraftingPattern implements ICraftingPattern { inputs.add(ItemHandlerHelper.copyStackWithSize(slot, 1)); } - dummyInventory.setInventorySlotContents(i, slot); + inv.setInventorySlotContents(i, slot); } } if (!ItemPattern.isProcessing(stack)) { - ItemStack output = CraftingManager.getInstance().findMatchingRecipe(dummyInventory, world); + ItemStack output = CraftingManager.getInstance().findMatchingRecipe(inv, world); if (output != null) { outputs.add(output.copy()); - for (ItemStack remaining : CraftingManager.getInstance().getRemainingItems(dummyInventory, world)) { + for (ItemStack remaining : CraftingManager.getInstance().getRemainingItems(inv, world)) { if (remaining != null) { - outputs.add(remaining.copy()); + byproducts.add(remaining.copy()); } } } @@ -78,21 +83,58 @@ public class CraftingPattern implements ICraftingPattern { return !inputs.isEmpty() && !outputs.isEmpty(); } - @Override - public List getInputs() { - return inputs; - } - @Override public boolean isOredicted() { return ItemPattern.isOredicted(stack); } + @Override + public List getInputs() { + return inputs; + } + @Override public List getOutputs() { return outputs; } + @Override + public List getOutputsBasedOnTook(ItemStack[] took) { + if (ItemPattern.isProcessing(stack) || !ItemPattern.isOredicted(stack)) { + return Lists.newArrayList(Iterables.concat(outputs, byproducts)); + } + + List outputs = new ArrayList<>(); + List byproducts = new ArrayList<>(); + + InventoryCrafting inv = new InventoryCrafting(new Container() { + @Override + public boolean canInteractWith(EntityPlayer player) { + return false; + } + }, 3, 3); + + for (int i = 0; i < 9; ++i) { + if (took[i] != null) { + inv.setInventorySlotContents(i, took[i]); + } + } + + ItemStack output = CraftingManager.getInstance().findMatchingRecipe(inv, world); + + if (output != null) { + outputs.add(output.copy()); + + for (ItemStack remaining : CraftingManager.getInstance().getRemainingItems(inv, world)) { + if (remaining != null) { + byproducts.add(remaining.copy()); + } + } + } + + return Lists.newArrayList(Iterables.concat(outputs, byproducts)); + } + @Override public String getId() { return ItemPattern.isProcessing(stack) ? CraftingTaskFactoryProcessing.ID : CraftingTaskFactoryNormal.ID; diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryNormal.java b/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryNormal.java index b352ae452..736ffb447 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryNormal.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryNormal.java @@ -43,6 +43,14 @@ public class CraftingTaskFactoryNormal implements ICraftingTaskFactory { task.setTook(took); + for (int i = 0; i < 9; ++i) { + String id = String.format(CraftingTaskNormal.NBT_TOOK_SLOT, i); + + if (tag.hasKey(id)) { + task.getTookSlots()[i] = ItemStack.loadItemStackFromNBT(tag.getCompoundTag(id)); + } + } + task.readChildNBT(world, tag); } diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java index aff5f67e6..e3aacb804 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java @@ -1,6 +1,7 @@ package refinedstorage.apiimpl.autocrafting.task; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.task.CraftingTask; @@ -8,10 +9,18 @@ import refinedstorage.api.network.INetworkMaster; import refinedstorage.apiimpl.storage.fluid.FluidUtils; public class CraftingTaskNormal extends CraftingTask { + public static final String NBT_TOOK_SLOT = "TookSlot_%d"; + + private ItemStack[] tookSlots = new ItemStack[9]; + public CraftingTaskNormal(ICraftingPattern pattern) { super(pattern); } + public ItemStack[] getTookSlots() { + return tookSlots; + } + @Override public boolean update(World world, INetworkMaster network) { for (int i = 0; i < pattern.getInputs().size(); ++i) { @@ -26,6 +35,7 @@ public class CraftingTaskNormal extends CraftingTask { satisfied[i] = true; took.add(received); + tookSlots[i] = received; network.updateCraftingTasks(); } else { @@ -42,7 +52,7 @@ public class CraftingTaskNormal extends CraftingTask { } } - for (ItemStack output : pattern.getOutputs()) { + for (ItemStack output : pattern.getOutputsBasedOnTook(tookSlots)) { // @TODO: Handle remainder network.insertItem(output, output.stackSize, false); } @@ -89,6 +99,19 @@ public class CraftingTaskNormal extends CraftingTask { return builder.toString(); } + @Override + public NBTTagCompound writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + + for (int i = 0; i < 9; ++i) { + if (tookSlots[i] != null) { + tag.setTag(String.format(NBT_TOOK_SLOT, i), tookSlots[i].serializeNBT()); + } + } + + return tag; + } + @Override public int getProgress() { int satisfiedAmount = 0;