Give correct byproducts back
This commit is contained in:
		@@ -3,6 +3,7 @@
 | 
				
			|||||||
### 1.0.5
 | 
					### 1.0.5
 | 
				
			||||||
- Fixed crafting a complex item causes the process to flow off the Crafting Monitor's GUI (raoulvdberge)
 | 
					- 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)
 | 
					- 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
 | 
					### 1.0.4
 | 
				
			||||||
- Fixed lag caused by Crafter (raoulvdberge)
 | 
					- Fixed lag caused by Crafter (raoulvdberge)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,21 +23,27 @@ public interface ICraftingPattern {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    boolean isValid();
 | 
					    boolean isValid();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @return the inputs
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    List<ItemStack> getInputs();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @return true if this crafting pattern cares about the ore dictionary when extracting items, false otherwise
 | 
					     * @return true if this crafting pattern cares about the ore dictionary when extracting items, false otherwise
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    boolean isOredicted();
 | 
					    boolean isOredicted();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return the inputs
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    List<ItemStack> getInputs();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @return the outputs
 | 
					     * @return the outputs
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    List<ItemStack> getOutputs();
 | 
					    List<ItemStack> getOutputs();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param took the items that it already took
 | 
				
			||||||
 | 
					     * @return the outputs
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    List<ItemStack> getOutputsBasedOnTook(ItemStack[] took);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @return the id of the factory that creates a crafting task for this pattern, as defined in the registry
 | 
					     * @return the id of the factory that creates a crafting task for this pattern, as defined in the registry
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,7 @@
 | 
				
			|||||||
package refinedstorage.apiimpl.autocrafting;
 | 
					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.entity.player.EntityPlayer;
 | 
				
			||||||
import net.minecraft.inventory.Container;
 | 
					import net.minecraft.inventory.Container;
 | 
				
			||||||
import net.minecraft.inventory.InventoryCrafting;
 | 
					import net.minecraft.inventory.InventoryCrafting;
 | 
				
			||||||
@@ -18,16 +20,19 @@ import java.util.ArrayList;
 | 
				
			|||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class CraftingPattern implements ICraftingPattern {
 | 
					public class CraftingPattern implements ICraftingPattern {
 | 
				
			||||||
 | 
					    private World world;
 | 
				
			||||||
    private ICraftingPatternContainer container;
 | 
					    private ICraftingPatternContainer container;
 | 
				
			||||||
    private ItemStack stack;
 | 
					    private ItemStack stack;
 | 
				
			||||||
    private List<ItemStack> inputs = new ArrayList<>();
 | 
					    private List<ItemStack> inputs = new ArrayList<>();
 | 
				
			||||||
    private List<ItemStack> outputs = new ArrayList<>();
 | 
					    private List<ItemStack> outputs = new ArrayList<>();
 | 
				
			||||||
 | 
					    private List<ItemStack> byproducts = new ArrayList<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public CraftingPattern(World world, ICraftingPatternContainer container, ItemStack stack) {
 | 
					    public CraftingPattern(World world, ICraftingPatternContainer container, ItemStack stack) {
 | 
				
			||||||
 | 
					        this.world = world;
 | 
				
			||||||
        this.container = container;
 | 
					        this.container = container;
 | 
				
			||||||
        this.stack = stack;
 | 
					        this.stack = stack;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        InventoryCrafting dummyInventory = new InventoryCrafting(new Container() {
 | 
					        InventoryCrafting inv = new InventoryCrafting(new Container() {
 | 
				
			||||||
            @Override
 | 
					            @Override
 | 
				
			||||||
            public boolean canInteractWith(EntityPlayer player) {
 | 
					            public boolean canInteractWith(EntityPlayer player) {
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
@@ -42,19 +47,19 @@ public class CraftingPattern implements ICraftingPattern {
 | 
				
			|||||||
                    inputs.add(ItemHandlerHelper.copyStackWithSize(slot, 1));
 | 
					                    inputs.add(ItemHandlerHelper.copyStackWithSize(slot, 1));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                dummyInventory.setInventorySlotContents(i, slot);
 | 
					                inv.setInventorySlotContents(i, slot);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!ItemPattern.isProcessing(stack)) {
 | 
					        if (!ItemPattern.isProcessing(stack)) {
 | 
				
			||||||
            ItemStack output = CraftingManager.getInstance().findMatchingRecipe(dummyInventory, world);
 | 
					            ItemStack output = CraftingManager.getInstance().findMatchingRecipe(inv, world);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (output != null) {
 | 
					            if (output != null) {
 | 
				
			||||||
                outputs.add(output.copy());
 | 
					                outputs.add(output.copy());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                for (ItemStack remaining : CraftingManager.getInstance().getRemainingItems(dummyInventory, world)) {
 | 
					                for (ItemStack remaining : CraftingManager.getInstance().getRemainingItems(inv, world)) {
 | 
				
			||||||
                    if (remaining != null) {
 | 
					                    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();
 | 
					        return !inputs.isEmpty() && !outputs.isEmpty();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public List<ItemStack> getInputs() {
 | 
					 | 
				
			||||||
        return inputs;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public boolean isOredicted() {
 | 
					    public boolean isOredicted() {
 | 
				
			||||||
        return ItemPattern.isOredicted(stack);
 | 
					        return ItemPattern.isOredicted(stack);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public List<ItemStack> getInputs() {
 | 
				
			||||||
 | 
					        return inputs;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public List<ItemStack> getOutputs() {
 | 
					    public List<ItemStack> getOutputs() {
 | 
				
			||||||
        return outputs;
 | 
					        return outputs;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public List<ItemStack> getOutputsBasedOnTook(ItemStack[] took) {
 | 
				
			||||||
 | 
					        if (ItemPattern.isProcessing(stack) || !ItemPattern.isOredicted(stack)) {
 | 
				
			||||||
 | 
					            return Lists.newArrayList(Iterables.concat(outputs, byproducts));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        List<ItemStack> outputs = new ArrayList<>();
 | 
				
			||||||
 | 
					        List<ItemStack> 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
 | 
					    @Override
 | 
				
			||||||
    public String getId() {
 | 
					    public String getId() {
 | 
				
			||||||
        return ItemPattern.isProcessing(stack) ? CraftingTaskFactoryProcessing.ID : CraftingTaskFactoryNormal.ID;
 | 
					        return ItemPattern.isProcessing(stack) ? CraftingTaskFactoryProcessing.ID : CraftingTaskFactoryNormal.ID;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,6 +43,14 @@ public class CraftingTaskFactoryNormal implements ICraftingTaskFactory {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            task.setTook(took);
 | 
					            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);
 | 
					            task.readChildNBT(world, tag);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package refinedstorage.apiimpl.autocrafting.task;
 | 
					package refinedstorage.apiimpl.autocrafting.task;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import net.minecraft.item.ItemStack;
 | 
					import net.minecraft.item.ItemStack;
 | 
				
			||||||
 | 
					import net.minecraft.nbt.NBTTagCompound;
 | 
				
			||||||
import net.minecraft.world.World;
 | 
					import net.minecraft.world.World;
 | 
				
			||||||
import refinedstorage.api.autocrafting.ICraftingPattern;
 | 
					import refinedstorage.api.autocrafting.ICraftingPattern;
 | 
				
			||||||
import refinedstorage.api.autocrafting.task.CraftingTask;
 | 
					import refinedstorage.api.autocrafting.task.CraftingTask;
 | 
				
			||||||
@@ -8,10 +9,18 @@ import refinedstorage.api.network.INetworkMaster;
 | 
				
			|||||||
import refinedstorage.apiimpl.storage.fluid.FluidUtils;
 | 
					import refinedstorage.apiimpl.storage.fluid.FluidUtils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class CraftingTaskNormal extends CraftingTask {
 | 
					public class CraftingTaskNormal extends CraftingTask {
 | 
				
			||||||
 | 
					    public static final String NBT_TOOK_SLOT = "TookSlot_%d";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private ItemStack[] tookSlots = new ItemStack[9];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public CraftingTaskNormal(ICraftingPattern pattern) {
 | 
					    public CraftingTaskNormal(ICraftingPattern pattern) {
 | 
				
			||||||
        super(pattern);
 | 
					        super(pattern);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public ItemStack[] getTookSlots() {
 | 
				
			||||||
 | 
					        return tookSlots;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public boolean update(World world, INetworkMaster network) {
 | 
					    public boolean update(World world, INetworkMaster network) {
 | 
				
			||||||
        for (int i = 0; i < pattern.getInputs().size(); ++i) {
 | 
					        for (int i = 0; i < pattern.getInputs().size(); ++i) {
 | 
				
			||||||
@@ -26,6 +35,7 @@ public class CraftingTaskNormal extends CraftingTask {
 | 
				
			|||||||
                    satisfied[i] = true;
 | 
					                    satisfied[i] = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    took.add(received);
 | 
					                    took.add(received);
 | 
				
			||||||
 | 
					                    tookSlots[i] = received;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    network.updateCraftingTasks();
 | 
					                    network.updateCraftingTasks();
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
@@ -42,7 +52,7 @@ public class CraftingTaskNormal extends CraftingTask {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (ItemStack output : pattern.getOutputs()) {
 | 
					        for (ItemStack output : pattern.getOutputsBasedOnTook(tookSlots)) {
 | 
				
			||||||
            // @TODO: Handle remainder
 | 
					            // @TODO: Handle remainder
 | 
				
			||||||
            network.insertItem(output, output.stackSize, false);
 | 
					            network.insertItem(output, output.stackSize, false);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -89,6 +99,19 @@ public class CraftingTaskNormal extends CraftingTask {
 | 
				
			|||||||
        return builder.toString();
 | 
					        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
 | 
					    @Override
 | 
				
			||||||
    public int getProgress() {
 | 
					    public int getProgress() {
 | 
				
			||||||
        int satisfiedAmount = 0;
 | 
					        int satisfiedAmount = 0;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user