Refactor. Processing patterns are broken.
This commit is contained in:
		@@ -1,38 +1,37 @@
 | 
			
		||||
package refinedstorage.api.autocrafting;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.nbt.NBTTagCompound;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Represents a crafting pattern.
 | 
			
		||||
 */
 | 
			
		||||
public interface ICraftingPattern {
 | 
			
		||||
    /**
 | 
			
		||||
     * @param world The world
 | 
			
		||||
     * @return The container where the pattern is in
 | 
			
		||||
     */
 | 
			
		||||
    ICraftingPatternContainer getContainer(World world);
 | 
			
		||||
    ICraftingPatternContainer getContainer();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return The crafting pattern stack
 | 
			
		||||
     */
 | 
			
		||||
    ItemStack getStack();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return Whether the crafting pattern is valid
 | 
			
		||||
     */
 | 
			
		||||
    boolean isValid();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return The inputs
 | 
			
		||||
     */
 | 
			
		||||
    ItemStack[] getInputs();
 | 
			
		||||
    List<ItemStack> getInputs();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return The outputs
 | 
			
		||||
     */
 | 
			
		||||
    ItemStack[] getOutputs();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return The byproducts
 | 
			
		||||
     */
 | 
			
		||||
    ItemStack[] getByproducts();
 | 
			
		||||
    List<ItemStack> getOutputs();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return The id of the crafting task, as defined in the registry
 | 
			
		||||
@@ -44,12 +43,4 @@ public interface ICraftingPattern {
 | 
			
		||||
     * @return The quantity returned per request
 | 
			
		||||
     */
 | 
			
		||||
    int getQuantityPerRequest(ItemStack requested);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Writes this pattern to NBT.
 | 
			
		||||
     *
 | 
			
		||||
     * @param tag The NBT tag to write to
 | 
			
		||||
     * @return The written NBT tag
 | 
			
		||||
     */
 | 
			
		||||
    NBTTagCompound writeToNBT(NBTTagCompound tag);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,7 @@
 | 
			
		||||
package refinedstorage.api.autocrafting;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Implement this interface on pattern items.
 | 
			
		||||
@@ -12,18 +11,10 @@ public interface ICraftingPatternProvider {
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a crafting pattern.
 | 
			
		||||
     *
 | 
			
		||||
     * @param world     The world
 | 
			
		||||
     * @param stack     The pattern stack
 | 
			
		||||
     * @param container The container where the pattern is in
 | 
			
		||||
     * @return The crafting pattern
 | 
			
		||||
     */
 | 
			
		||||
    ICraftingPattern create(ItemStack stack, ICraftingPatternContainer container);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a crafting pattern from the pattern item stack.
 | 
			
		||||
     *
 | 
			
		||||
     * @param stack The item stack
 | 
			
		||||
     * @return The crafting pattern, or null if the read failed
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    ICraftingPattern create(ItemStack stack);
 | 
			
		||||
    ICraftingPattern create(World world, ItemStack stack, ICraftingPatternContainer container);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
package refinedstorage.api.autocrafting.registry;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.nbt.NBTTagCompound;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import refinedstorage.api.autocrafting.ICraftingPattern;
 | 
			
		||||
import refinedstorage.api.autocrafting.task.ICraftingTask;
 | 
			
		||||
 | 
			
		||||
@@ -15,9 +16,10 @@ public interface ICraftingTaskFactory {
 | 
			
		||||
     * Returns a crafting task for a given NBT tag and pattern.
 | 
			
		||||
     *
 | 
			
		||||
     * @param tag     The NBT tag. If this is null it isn't reading from disk but is used for making a task on demand
 | 
			
		||||
     * @param world   The world
 | 
			
		||||
     * @param pattern The pattern
 | 
			
		||||
     * @return The crafting task
 | 
			
		||||
     */
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    ICraftingTask create(@Nullable NBTTagCompound tag, ICraftingPattern pattern);
 | 
			
		||||
    ICraftingTask create(@Nullable NBTTagCompound tag, World world, ICraftingPattern pattern);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ import cofh.api.energy.EnergyStorage;
 | 
			
		||||
import net.minecraft.entity.player.EntityPlayerMP;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.fluids.FluidStack;
 | 
			
		||||
import refinedstorage.api.autocrafting.ICraftingPattern;
 | 
			
		||||
import refinedstorage.api.autocrafting.task.ICraftingTask;
 | 
			
		||||
@@ -83,14 +84,6 @@ public interface INetworkMaster {
 | 
			
		||||
     */
 | 
			
		||||
    void addCraftingTask(@Nonnull ICraftingTask task);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a crafting task from a {@link ICraftingPattern}.
 | 
			
		||||
     *
 | 
			
		||||
     * @param pattern The pattern to create a task for
 | 
			
		||||
     * @return A task
 | 
			
		||||
     */
 | 
			
		||||
    ICraftingTask createCraftingTask(@Nonnull ICraftingPattern pattern);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Cancels a crafting task.
 | 
			
		||||
     *
 | 
			
		||||
@@ -209,4 +202,9 @@ public interface INetworkMaster {
 | 
			
		||||
     */
 | 
			
		||||
    @Nullable
 | 
			
		||||
    FluidStack extractFluid(@Nonnull FluidStack stack, int size, int flags);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return The world where this node is in
 | 
			
		||||
     */
 | 
			
		||||
    World getNetworkWorld();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraftforge.fluids.FluidRegistry;
 | 
			
		||||
import net.minecraftforge.fluids.FluidStack;
 | 
			
		||||
import net.minecraftforge.fml.common.network.ByteBufUtils;
 | 
			
		||||
import refinedstorage.api.RefinedStorageAPI;
 | 
			
		||||
import refinedstorage.api.autocrafting.ICraftingPattern;
 | 
			
		||||
import refinedstorage.api.autocrafting.task.ICraftingTask;
 | 
			
		||||
import refinedstorage.api.storage.CompareUtils;
 | 
			
		||||
@@ -26,6 +27,10 @@ public final class NetworkUtils {
 | 
			
		||||
        return network.getPattern(stack, CompareUtils.COMPARE_DAMAGE | CompareUtils.COMPARE_NBT);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ICraftingTask createCraftingTask(INetworkMaster network, ICraftingPattern pattern) {
 | 
			
		||||
        return RefinedStorageAPI.CRAFTING_TASK_REGISTRY.getFactory(pattern.getId()).create(null, network.getNetworkWorld(), pattern);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean hasPattern(INetworkMaster network, ItemStack stack) {
 | 
			
		||||
        return getPattern(network, stack) != null;
 | 
			
		||||
    }
 | 
			
		||||
@@ -57,7 +62,7 @@ public final class NetworkUtils {
 | 
			
		||||
            ICraftingPattern pattern = network.getPattern(stack, compare);
 | 
			
		||||
 | 
			
		||||
            if (pattern != null) {
 | 
			
		||||
                network.addCraftingTask(network.createCraftingTask(pattern));
 | 
			
		||||
                network.addCraftingTask(createCraftingTask(network, pattern));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,47 +1,62 @@
 | 
			
		||||
package refinedstorage.apiimpl.autocrafting;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.entity.player.EntityPlayer;
 | 
			
		||||
import net.minecraft.inventory.Container;
 | 
			
		||||
import net.minecraft.inventory.InventoryCrafting;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.nbt.NBTTagCompound;
 | 
			
		||||
import net.minecraft.nbt.NBTTagList;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.item.crafting.CraftingManager;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.items.ItemHandlerHelper;
 | 
			
		||||
import refinedstorage.api.autocrafting.ICraftingPattern;
 | 
			
		||||
import refinedstorage.api.autocrafting.ICraftingPatternContainer;
 | 
			
		||||
import refinedstorage.api.storage.CompareUtils;
 | 
			
		||||
import refinedstorage.apiimpl.autocrafting.registry.CraftingTaskFactoryNormal;
 | 
			
		||||
import refinedstorage.apiimpl.autocrafting.registry.CraftingTaskFactoryProcessing;
 | 
			
		||||
import refinedstorage.item.ItemPattern;
 | 
			
		||||
import refinedstorage.tile.TileCrafter;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
public class CraftingPattern implements ICraftingPattern {
 | 
			
		||||
    public static final String NBT_CRAFTER_X = "CrafterX";
 | 
			
		||||
    public static final String NBT_CRAFTER_Y = "CrafterY";
 | 
			
		||||
    public static final String NBT_CRAFTER_Z = "CrafterZ";
 | 
			
		||||
 | 
			
		||||
    private ICraftingPatternContainer container;
 | 
			
		||||
    private ItemStack stack;
 | 
			
		||||
    private BlockPos crafterPos;
 | 
			
		||||
    private TileCrafter crafter;
 | 
			
		||||
    private boolean processing;
 | 
			
		||||
    private ItemStack[] inputs;
 | 
			
		||||
    private ItemStack[] outputs;
 | 
			
		||||
    private ItemStack[] byproducts;
 | 
			
		||||
    private List<ItemStack> inputs = new ArrayList<>();
 | 
			
		||||
    private List<ItemStack> outputs = new ArrayList<>();
 | 
			
		||||
    private boolean processing = false;
 | 
			
		||||
 | 
			
		||||
    public CraftingPattern(ItemStack stack, BlockPos crafterPos, boolean processing, ItemStack[] inputs, ItemStack[] outputs, ItemStack[] byproducts) {
 | 
			
		||||
    public CraftingPattern(World world, ICraftingPatternContainer container, ItemStack stack) {
 | 
			
		||||
        this.container = container;
 | 
			
		||||
        this.stack = stack;
 | 
			
		||||
        this.crafterPos = crafterPos;
 | 
			
		||||
        this.processing = processing;
 | 
			
		||||
        this.inputs = inputs;
 | 
			
		||||
        this.outputs = outputs;
 | 
			
		||||
        this.byproducts = byproducts;
 | 
			
		||||
 | 
			
		||||
        InventoryCrafting dummyInventory = new InventoryCrafting(new Container() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public boolean canInteractWith(EntityPlayer player) {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        }, 3, 3);
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < 9; ++i) {
 | 
			
		||||
            ItemStack slot = ItemPattern.getSlot(stack, i);
 | 
			
		||||
 | 
			
		||||
            if (slot != null) {
 | 
			
		||||
                for (int j = 0; j < slot.stackSize; ++j) {
 | 
			
		||||
                    inputs.add(ItemHandlerHelper.copyStackWithSize(slot, 1));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                dummyInventory.setInventorySlotContents(i, slot);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ItemStack output = CraftingManager.getInstance().findMatchingRecipe(dummyInventory, world);
 | 
			
		||||
 | 
			
		||||
        if (output != null) {
 | 
			
		||||
            outputs.add(output);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public ICraftingPatternContainer getContainer(World world) {
 | 
			
		||||
        if (crafter == null) {
 | 
			
		||||
            crafter = (TileCrafter) world.getTileEntity(crafterPos);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return crafter;
 | 
			
		||||
    public ICraftingPatternContainer getContainer() {
 | 
			
		||||
        return container;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -50,20 +65,20 @@ public class CraftingPattern implements ICraftingPattern {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public ItemStack[] getInputs() {
 | 
			
		||||
    public boolean isValid() {
 | 
			
		||||
        return !inputs.isEmpty() && !outputs.isEmpty();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<ItemStack> getInputs() {
 | 
			
		||||
        return inputs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public ItemStack[] getOutputs() {
 | 
			
		||||
    public List<ItemStack> getOutputs() {
 | 
			
		||||
        return outputs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public ItemStack[] getByproducts() {
 | 
			
		||||
        return byproducts;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getId() {
 | 
			
		||||
        return processing ? CraftingTaskFactoryProcessing.ID : CraftingTaskFactoryNormal.ID;
 | 
			
		||||
@@ -85,41 +100,4 @@ public class CraftingPattern implements ICraftingPattern {
 | 
			
		||||
 | 
			
		||||
        return quantity;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public NBTTagCompound writeToNBT(NBTTagCompound tag) {
 | 
			
		||||
        tag.setBoolean(ItemPattern.NBT_PROCESSING, processing);
 | 
			
		||||
 | 
			
		||||
        NBTTagList inputsTag = new NBTTagList();
 | 
			
		||||
 | 
			
		||||
        for (ItemStack input : inputs) {
 | 
			
		||||
            inputsTag.appendTag(input.serializeNBT());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        tag.setTag(ItemPattern.NBT_INPUTS, inputsTag);
 | 
			
		||||
 | 
			
		||||
        NBTTagList outputsTag = new NBTTagList();
 | 
			
		||||
 | 
			
		||||
        for (ItemStack output : outputs) {
 | 
			
		||||
            outputsTag.appendTag(output.serializeNBT());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        tag.setTag(ItemPattern.NBT_OUTPUTS, outputsTag);
 | 
			
		||||
 | 
			
		||||
        if (byproducts != null) {
 | 
			
		||||
            NBTTagList byproductsTag = new NBTTagList();
 | 
			
		||||
 | 
			
		||||
            for (ItemStack byproduct : byproducts) {
 | 
			
		||||
                byproductsTag.appendTag(byproduct.serializeNBT());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            tag.setTag(ItemPattern.NBT_BYPRODUCTS, byproductsTag);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        tag.setInteger(NBT_CRAFTER_X, crafterPos.getX());
 | 
			
		||||
        tag.setInteger(NBT_CRAFTER_Y, crafterPos.getY());
 | 
			
		||||
        tag.setInteger(NBT_CRAFTER_Z, crafterPos.getZ());
 | 
			
		||||
 | 
			
		||||
        return tag;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,7 @@ package refinedstorage.apiimpl.autocrafting.registry;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.nbt.NBTTagCompound;
 | 
			
		||||
import net.minecraft.nbt.NBTTagList;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.util.Constants;
 | 
			
		||||
import refinedstorage.api.autocrafting.ICraftingPattern;
 | 
			
		||||
import refinedstorage.api.autocrafting.registry.ICraftingTaskFactory;
 | 
			
		||||
@@ -20,7 +21,7 @@ public class CraftingTaskFactoryNormal implements ICraftingTaskFactory {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public ICraftingTask create(@Nullable NBTTagCompound tag, ICraftingPattern pattern) {
 | 
			
		||||
    public ICraftingTask create(@Nullable NBTTagCompound tag, World world, ICraftingPattern pattern) {
 | 
			
		||||
        CraftingTaskNormal task = new CraftingTaskNormal(pattern);
 | 
			
		||||
 | 
			
		||||
        if (tag != null) {
 | 
			
		||||
@@ -42,7 +43,7 @@ public class CraftingTaskFactoryNormal implements ICraftingTaskFactory {
 | 
			
		||||
 | 
			
		||||
            task.setTook(took);
 | 
			
		||||
 | 
			
		||||
            task.readChildNBT(tag);
 | 
			
		||||
            task.readChildNBT(world, tag);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return task;
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,7 @@ package refinedstorage.apiimpl.autocrafting.registry;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.nbt.NBTTagCompound;
 | 
			
		||||
import net.minecraft.nbt.NBTTagList;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.util.Constants;
 | 
			
		||||
import refinedstorage.api.autocrafting.ICraftingPattern;
 | 
			
		||||
import refinedstorage.api.autocrafting.registry.ICraftingTaskFactory;
 | 
			
		||||
@@ -20,7 +21,7 @@ public class CraftingTaskFactoryProcessing implements ICraftingTaskFactory {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    @Nonnull
 | 
			
		||||
    public ICraftingTask create(@Nullable NBTTagCompound tag, ICraftingPattern pattern) {
 | 
			
		||||
    public ICraftingTask create(@Nullable NBTTagCompound tag, World world, ICraftingPattern pattern) {
 | 
			
		||||
        CraftingTaskProcessing task = new CraftingTaskProcessing(pattern);
 | 
			
		||||
 | 
			
		||||
        if (tag != null) {
 | 
			
		||||
@@ -43,7 +44,7 @@ public class CraftingTaskFactoryProcessing implements ICraftingTaskFactory {
 | 
			
		||||
 | 
			
		||||
            task.setTook(took);
 | 
			
		||||
 | 
			
		||||
            task.readChildNBT(tag);
 | 
			
		||||
            task.readChildNBT(world, tag);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return task;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.nbt.NBTTagCompound;
 | 
			
		||||
import net.minecraft.nbt.NBTTagIntArray;
 | 
			
		||||
import net.minecraft.nbt.NBTTagList;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import refinedstorage.api.autocrafting.ICraftingPattern;
 | 
			
		||||
import refinedstorage.api.autocrafting.task.ICraftingTask;
 | 
			
		||||
import refinedstorage.api.network.INetworkMaster;
 | 
			
		||||
@@ -27,7 +28,7 @@ public abstract class CraftingTask implements ICraftingTask {
 | 
			
		||||
 | 
			
		||||
    public CraftingTask(ICraftingPattern pattern) {
 | 
			
		||||
        this.pattern = pattern;
 | 
			
		||||
        this.childrenCreated = new boolean[pattern.getInputs().length];
 | 
			
		||||
        this.childrenCreated = new boolean[pattern.getInputs().size()];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -45,10 +46,10 @@ public abstract class CraftingTask implements ICraftingTask {
 | 
			
		||||
 | 
			
		||||
    protected void tryCreateChild(INetworkMaster network, int i) {
 | 
			
		||||
        if (!childrenCreated[i]) {
 | 
			
		||||
            ICraftingPattern pattern = NetworkUtils.getPattern(network, this.pattern.getInputs()[i]);
 | 
			
		||||
            ICraftingPattern pattern = NetworkUtils.getPattern(network, this.pattern.getInputs().get(i));
 | 
			
		||||
 | 
			
		||||
            if (pattern != null) {
 | 
			
		||||
                child = network.createCraftingTask(pattern);
 | 
			
		||||
                child = NetworkUtils.createCraftingTask(network, pattern);
 | 
			
		||||
 | 
			
		||||
                childrenCreated[i] = true;
 | 
			
		||||
 | 
			
		||||
@@ -99,9 +100,9 @@ public abstract class CraftingTask implements ICraftingTask {
 | 
			
		||||
        return tag;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void readChildNBT(NBTTagCompound tag) {
 | 
			
		||||
    public void readChildNBT(World world, NBTTagCompound tag) {
 | 
			
		||||
        if (tag.hasKey(NBT_CHILD)) {
 | 
			
		||||
            child = TileController.readCraftingTask(tag.getCompoundTag(NBT_CHILD));
 | 
			
		||||
            child = TileController.readCraftingTask(world, tag.getCompoundTag(NBT_CHILD));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,8 +17,8 @@ public class CraftingTaskNormal extends CraftingTask {
 | 
			
		||||
    public CraftingTaskNormal(ICraftingPattern pattern) {
 | 
			
		||||
        super(pattern);
 | 
			
		||||
 | 
			
		||||
        this.satisfied = new boolean[pattern.getInputs().length];
 | 
			
		||||
        this.checked = new boolean[pattern.getInputs().length];
 | 
			
		||||
        this.satisfied = new boolean[pattern.getInputs().size()];
 | 
			
		||||
        this.checked = new boolean[pattern.getInputs().size()];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setSatisfied(boolean[] satisfied) {
 | 
			
		||||
@@ -31,10 +31,10 @@ public class CraftingTaskNormal extends CraftingTask {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean update(World world, INetworkMaster network) {
 | 
			
		||||
        for (int i = 0; i < pattern.getInputs().length; ++i) {
 | 
			
		||||
        for (int i = 0; i < pattern.getInputs().size(); ++i) {
 | 
			
		||||
            checked[i] = true;
 | 
			
		||||
 | 
			
		||||
            ItemStack input = pattern.getInputs()[i];
 | 
			
		||||
            ItemStack input = pattern.getInputs().get(i);
 | 
			
		||||
 | 
			
		||||
            if (!satisfied[i]) {
 | 
			
		||||
                ItemStack received = NetworkUtils.extractItem(network, input, input.stackSize);
 | 
			
		||||
@@ -64,13 +64,6 @@ public class CraftingTaskNormal extends CraftingTask {
 | 
			
		||||
            network.insertItem(output, output.stackSize, false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (pattern.getByproducts() != null) {
 | 
			
		||||
            for (ItemStack byproduct : pattern.getByproducts()) {
 | 
			
		||||
                // @TODO: Handle remainder
 | 
			
		||||
                network.insertItem(byproduct, byproduct.stackSize, false);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -90,8 +83,8 @@ public class CraftingTaskNormal extends CraftingTask {
 | 
			
		||||
 | 
			
		||||
        boolean missingItems = false;
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < pattern.getInputs().length; ++i) {
 | 
			
		||||
            ItemStack input = pattern.getInputs()[i];
 | 
			
		||||
        for (int i = 0; i < pattern.getInputs().size(); ++i) {
 | 
			
		||||
            ItemStack input = pattern.getInputs().get(i);
 | 
			
		||||
 | 
			
		||||
            if (!satisfied[i] && !childrenCreated[i] && checked[i]) {
 | 
			
		||||
                if (!missingItems) {
 | 
			
		||||
@@ -106,8 +99,8 @@ public class CraftingTaskNormal extends CraftingTask {
 | 
			
		||||
 | 
			
		||||
        boolean itemsCrafting = false;
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < pattern.getInputs().length; ++i) {
 | 
			
		||||
            ItemStack input = pattern.getInputs()[i];
 | 
			
		||||
        for (int i = 0; i < pattern.getInputs().size(); ++i) {
 | 
			
		||||
            ItemStack input = pattern.getInputs().get(i);
 | 
			
		||||
 | 
			
		||||
            if (!satisfied[i] && childrenCreated[i] && checked[i]) {
 | 
			
		||||
                if (!itemsCrafting) {
 | 
			
		||||
 
 | 
			
		||||
@@ -22,9 +22,9 @@ public class CraftingTaskProcessing extends CraftingTask {
 | 
			
		||||
    public CraftingTaskProcessing(ICraftingPattern pattern) {
 | 
			
		||||
        super(pattern);
 | 
			
		||||
 | 
			
		||||
        this.satisfied = new boolean[pattern.getInputs().length];
 | 
			
		||||
        this.satisfiedInsertion = new boolean[pattern.getInputs().length];
 | 
			
		||||
        this.checked = new boolean[pattern.getInputs().length];
 | 
			
		||||
        this.satisfied = new boolean[pattern.getInputs().size()];
 | 
			
		||||
        this.satisfiedInsertion = new boolean[pattern.getInputs().size()];
 | 
			
		||||
        this.checked = new boolean[pattern.getInputs().size()];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setSatisfied(boolean[] satisfied) {
 | 
			
		||||
@@ -41,10 +41,10 @@ public class CraftingTaskProcessing extends CraftingTask {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean update(World world, INetworkMaster network) {
 | 
			
		||||
        for (int i = 0; i < pattern.getInputs().length; ++i) {
 | 
			
		||||
        for (int i = 0; i < pattern.getInputs().size(); ++i) {
 | 
			
		||||
            checked[i] = true;
 | 
			
		||||
 | 
			
		||||
            ItemStack input = pattern.getInputs()[i];
 | 
			
		||||
            ItemStack input = pattern.getInputs().get(i);
 | 
			
		||||
 | 
			
		||||
            if (!satisfied[i]) {
 | 
			
		||||
                ItemStack received = NetworkUtils.extractItem(network, input, input.stackSize);
 | 
			
		||||
@@ -68,7 +68,7 @@ public class CraftingTaskProcessing extends CraftingTask {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!took.isEmpty()) {
 | 
			
		||||
            ICraftingPatternContainer container = pattern.getContainer(world);
 | 
			
		||||
            ICraftingPatternContainer container = pattern.getContainer();
 | 
			
		||||
 | 
			
		||||
            ItemStack toInsert = took.get(0);
 | 
			
		||||
 | 
			
		||||
@@ -97,8 +97,8 @@ public class CraftingTaskProcessing extends CraftingTask {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < pattern.getOutputs().length; ++i) {
 | 
			
		||||
            ItemStack output = pattern.getOutputs()[i];
 | 
			
		||||
        for (int i = 0; i < pattern.getOutputs().size(); ++i) {
 | 
			
		||||
            ItemStack output = pattern.getOutputs().get(i);
 | 
			
		||||
 | 
			
		||||
            if (!satisfiedInsertion[i]) {
 | 
			
		||||
                if (CompareUtils.compareStackNoQuantity(output, stack)) {
 | 
			
		||||
@@ -139,8 +139,8 @@ public class CraftingTaskProcessing extends CraftingTask {
 | 
			
		||||
 | 
			
		||||
        boolean missingItems = false;
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < pattern.getInputs().length; ++i) {
 | 
			
		||||
            ItemStack input = pattern.getInputs()[i];
 | 
			
		||||
        for (int i = 0; i < pattern.getInputs().size(); ++i) {
 | 
			
		||||
            ItemStack input = pattern.getInputs().get(i);
 | 
			
		||||
 | 
			
		||||
            if (!satisfied[i] && !childrenCreated[i]) {
 | 
			
		||||
                if (!missingItems) {
 | 
			
		||||
@@ -155,8 +155,8 @@ public class CraftingTaskProcessing extends CraftingTask {
 | 
			
		||||
 | 
			
		||||
        boolean itemsCrafting = false;
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < pattern.getInputs().length; ++i) {
 | 
			
		||||
            ItemStack input = pattern.getInputs()[i];
 | 
			
		||||
        for (int i = 0; i < pattern.getInputs().size(); ++i) {
 | 
			
		||||
            ItemStack input = pattern.getInputs().get(i);
 | 
			
		||||
 | 
			
		||||
            if (!satisfied[i] && childrenCreated[i]) {
 | 
			
		||||
                if (!itemsCrafting) {
 | 
			
		||||
@@ -172,8 +172,8 @@ public class CraftingTaskProcessing extends CraftingTask {
 | 
			
		||||
        if (isReadyToInsert()) {
 | 
			
		||||
            builder.append("I=gui.refinedstorage:crafting_monitor.items_processing\n");
 | 
			
		||||
 | 
			
		||||
            for (int i = 0; i < pattern.getInputs().length; ++i) {
 | 
			
		||||
                builder.append("T=").append(pattern.getInputs()[i].getUnlocalizedName()).append(".name\n");
 | 
			
		||||
            for (int i = 0; i < pattern.getInputs().size(); ++i) {
 | 
			
		||||
                builder.append("T=").append(pattern.getInputs().get(i).getUnlocalizedName()).append(".name\n");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -134,7 +134,7 @@ public class ItemGridHandler implements IItemGridHandler {
 | 
			
		||||
            int quantityPerRequest = pattern.getQuantityPerRequest(stack);
 | 
			
		||||
 | 
			
		||||
            while (quantity > 0) {
 | 
			
		||||
                network.addCraftingTask(network.createCraftingTask(pattern));
 | 
			
		||||
                network.addCraftingTask(NetworkUtils.createCraftingTask(network, pattern));
 | 
			
		||||
 | 
			
		||||
                quantity -= quantityPerRequest;
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -53,7 +53,7 @@ public final class FluidUtils {
 | 
			
		||||
                    ICraftingPattern pattern = NetworkUtils.getPattern(network, EMPTY_BUCKET);
 | 
			
		||||
 | 
			
		||||
                    if (pattern != null) {
 | 
			
		||||
                        network.addCraftingTask(network.createCraftingTask(pattern));
 | 
			
		||||
                        network.addCraftingTask(NetworkUtils.createCraftingTask(network, pattern));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +1,13 @@
 | 
			
		||||
package refinedstorage.item;
 | 
			
		||||
 | 
			
		||||
import net.minecraft.client.gui.GuiScreen;
 | 
			
		||||
import net.minecraft.client.resources.I18n;
 | 
			
		||||
import net.minecraft.entity.player.EntityPlayer;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.nbt.NBTTagCompound;
 | 
			
		||||
import net.minecraft.nbt.NBTTagList;
 | 
			
		||||
import net.minecraft.util.ActionResult;
 | 
			
		||||
import net.minecraft.util.EnumActionResult;
 | 
			
		||||
import net.minecraft.util.EnumHand;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.util.text.TextFormatting;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.util.Constants;
 | 
			
		||||
import refinedstorage.RefinedStorageItems;
 | 
			
		||||
import refinedstorage.api.autocrafting.ICraftingPattern;
 | 
			
		||||
import refinedstorage.api.autocrafting.ICraftingPatternContainer;
 | 
			
		||||
@@ -20,16 +15,12 @@ import refinedstorage.api.autocrafting.ICraftingPatternProvider;
 | 
			
		||||
import refinedstorage.api.storage.CompareUtils;
 | 
			
		||||
import refinedstorage.apiimpl.autocrafting.CraftingPattern;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
public class ItemPattern extends ItemBase implements ICraftingPatternProvider {
 | 
			
		||||
    public static final String NBT_INPUTS = "Inputs";
 | 
			
		||||
    public static final String NBT_OUTPUTS = "Outputs";
 | 
			
		||||
    public static final String NBT_BYPRODUCTS = "Byproducts";
 | 
			
		||||
    public static final String NBT_PROCESSING = "Processing";
 | 
			
		||||
    private static final String NBT_SLOT = "Slot_%d";
 | 
			
		||||
 | 
			
		||||
    public ItemPattern() {
 | 
			
		||||
        super("pattern");
 | 
			
		||||
@@ -37,7 +28,7 @@ public class ItemPattern extends ItemBase implements ICraftingPatternProvider {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void addInformation(ItemStack pattern, EntityPlayer player, List<String> tooltip, boolean advanced) {
 | 
			
		||||
        if (isValid(pattern)) {
 | 
			
		||||
       /* @todo CraftingPattern
 | 
			
		||||
            if (GuiScreen.isShiftKeyDown() || isProcessing(pattern)) {
 | 
			
		||||
                tooltip.add(TextFormatting.YELLOW + I18n.format("misc.refinedstorage:pattern.inputs") + TextFormatting.RESET);
 | 
			
		||||
 | 
			
		||||
@@ -47,7 +38,25 @@ public class ItemPattern extends ItemBase implements ICraftingPatternProvider {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            combineItems(tooltip, true, getOutputs(pattern));
 | 
			
		||||
        }*/
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void setSlot(ItemStack pattern, int slot, ItemStack stack) {
 | 
			
		||||
        if (!pattern.hasTagCompound()) {
 | 
			
		||||
            pattern.setTagCompound(new NBTTagCompound());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        pattern.getTagCompound().setTag(String.format(NBT_SLOT, slot), stack.serializeNBT());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ItemStack getSlot(ItemStack pattern, int slot) {
 | 
			
		||||
        String id = String.format(NBT_SLOT, slot);
 | 
			
		||||
 | 
			
		||||
        if (!pattern.hasTagCompound() || !pattern.getTagCompound().hasKey(id)) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return ItemStack.loadItemStackFromNBT(pattern.getTagCompound().getCompoundTag(id));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void combineItems(List<String> tooltip, boolean displayAmount, ItemStack... stacks) {
 | 
			
		||||
@@ -83,157 +92,8 @@ public class ItemPattern extends ItemBase implements ICraftingPatternProvider {
 | 
			
		||||
        return new ActionResult<>(EnumActionResult.PASS, stack);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void addInput(ItemStack pattern, ItemStack stack) {
 | 
			
		||||
        add(pattern, stack, NBT_INPUTS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void addOutput(ItemStack pattern, ItemStack stack) {
 | 
			
		||||
        add(pattern, stack, NBT_OUTPUTS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void addByproduct(ItemStack pattern, ItemStack stack) {
 | 
			
		||||
        add(pattern, stack, NBT_BYPRODUCTS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void add(ItemStack pattern, ItemStack stack, String type) {
 | 
			
		||||
        if (pattern.getTagCompound() == null) {
 | 
			
		||||
            pattern.setTagCompound(new NBTTagCompound());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!pattern.getTagCompound().hasKey(type)) {
 | 
			
		||||
            pattern.getTagCompound().setTag(type, new NBTTagList());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        pattern.getTagCompound().getTagList(type, Constants.NBT.TAG_COMPOUND).appendTag(stack.serializeNBT());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ItemStack[] getInputs(ItemStack pattern) {
 | 
			
		||||
        return get(pattern, NBT_INPUTS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ItemStack[] getOutputs(ItemStack pattern) {
 | 
			
		||||
        return get(pattern, NBT_OUTPUTS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ItemStack[] getByproducts(ItemStack pattern) {
 | 
			
		||||
        return get(pattern, NBT_BYPRODUCTS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static ItemStack[] get(ItemStack pattern, String type) {
 | 
			
		||||
        if (!pattern.hasTagCompound() || !pattern.getTagCompound().hasKey(type)) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        NBTTagList stacksList = pattern.getTagCompound().getTagList(type, Constants.NBT.TAG_COMPOUND);
 | 
			
		||||
 | 
			
		||||
        ItemStack[] stacks = new ItemStack[stacksList.tagCount()];
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < stacksList.tagCount(); ++i) {
 | 
			
		||||
            stacks[i] = ItemStack.loadItemStackFromNBT(stacksList.getCompoundTagAt(i));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return stacks;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean isValid(ItemStack pattern) {
 | 
			
		||||
        if (pattern.getTagCompound() == null || (!pattern.getTagCompound().hasKey(NBT_INPUTS) || !pattern.getTagCompound().hasKey(NBT_OUTPUTS) || !pattern.getTagCompound().hasKey(NBT_PROCESSING))) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (ItemStack input : getInputs(pattern)) {
 | 
			
		||||
            if (input == null) {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (ItemStack output : getOutputs(pattern)) {
 | 
			
		||||
            if (output == null) {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ItemStack[] byproducts = getByproducts(pattern);
 | 
			
		||||
        if (byproducts != null) {
 | 
			
		||||
            for (ItemStack byproduct : byproducts) {
 | 
			
		||||
                if (byproduct == null) {
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void setProcessing(ItemStack pattern, boolean processing) {
 | 
			
		||||
        if (pattern.getTagCompound() == null) {
 | 
			
		||||
            pattern.setTagCompound(new NBTTagCompound());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        pattern.getTagCompound().setBoolean(NBT_PROCESSING, processing);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean isProcessing(ItemStack pattern) {
 | 
			
		||||
        if (!pattern.hasTagCompound() || !pattern.getTagCompound().hasKey(NBT_PROCESSING)) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return pattern.getTagCompound().getBoolean(NBT_PROCESSING);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public ICraftingPattern create(ItemStack stack, ICraftingPatternContainer container) {
 | 
			
		||||
        return new CraftingPattern(stack, container.getPosition(), isProcessing(stack), getInputs(stack), getOutputs(stack), getByproducts(stack));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public ICraftingPattern create(ItemStack stack) {
 | 
			
		||||
        NBTTagCompound tag = stack.getTagCompound();
 | 
			
		||||
 | 
			
		||||
        BlockPos crafterPos = new BlockPos(tag.getInteger(CraftingPattern.NBT_CRAFTER_X), tag.getInteger(CraftingPattern.NBT_CRAFTER_Y), tag.getInteger(CraftingPattern.NBT_CRAFTER_Z));
 | 
			
		||||
 | 
			
		||||
        boolean processing = tag.getBoolean(NBT_PROCESSING);
 | 
			
		||||
 | 
			
		||||
        NBTTagList inputsTag = tag.getTagList(NBT_INPUTS, Constants.NBT.TAG_COMPOUND);
 | 
			
		||||
 | 
			
		||||
        ItemStack inputs[] = new ItemStack[inputsTag.tagCount()];
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < inputsTag.tagCount(); ++i) {
 | 
			
		||||
            inputs[i] = ItemStack.loadItemStackFromNBT(inputsTag.getCompoundTagAt(i));
 | 
			
		||||
 | 
			
		||||
            if (inputs[i] == null) {
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        NBTTagList outputsTag = tag.getTagList(NBT_OUTPUTS, Constants.NBT.TAG_COMPOUND);
 | 
			
		||||
 | 
			
		||||
        ItemStack outputs[] = new ItemStack[outputsTag.tagCount()];
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < outputsTag.tagCount(); ++i) {
 | 
			
		||||
            outputs[i] = ItemStack.loadItemStackFromNBT(outputsTag.getCompoundTagAt(i));
 | 
			
		||||
 | 
			
		||||
            if (outputs[i] == null) {
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ItemStack byproducts[] = new ItemStack[0];
 | 
			
		||||
 | 
			
		||||
        if (tag.hasKey(ItemPattern.NBT_BYPRODUCTS)) {
 | 
			
		||||
            NBTTagList byproductsTag = tag.getTagList(NBT_BYPRODUCTS, Constants.NBT.TAG_COMPOUND);
 | 
			
		||||
 | 
			
		||||
            byproducts = new ItemStack[byproductsTag.tagCount()];
 | 
			
		||||
 | 
			
		||||
            for (int i = 0; i < byproductsTag.tagCount(); ++i) {
 | 
			
		||||
                byproducts[i] = ItemStack.loadItemStackFromNBT(byproductsTag.getCompoundTagAt(i));
 | 
			
		||||
 | 
			
		||||
                if (byproducts[i] == null) {
 | 
			
		||||
                    return null;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return new CraftingPattern(stack, crafterPos, processing, inputs, outputs, byproducts);
 | 
			
		||||
    public ICraftingPattern create(World world, ItemStack stack, ICraftingPatternContainer container) {
 | 
			
		||||
        return new CraftingPattern(world, container, stack);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,8 @@ package refinedstorage.tile;
 | 
			
		||||
import net.minecraft.item.ItemStack;
 | 
			
		||||
import refinedstorage.api.autocrafting.task.ICraftingTask;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
public class ClientCraftingTask {
 | 
			
		||||
    private ItemStack output;
 | 
			
		||||
    private int id;
 | 
			
		||||
@@ -11,7 +13,7 @@ public class ClientCraftingTask {
 | 
			
		||||
    private int progress;
 | 
			
		||||
 | 
			
		||||
    // Used server-side while sending
 | 
			
		||||
    private ItemStack[] outputs;
 | 
			
		||||
    private List<ItemStack> outputs;
 | 
			
		||||
    private ClientCraftingTask child;
 | 
			
		||||
 | 
			
		||||
    public ClientCraftingTask(ItemStack output, int id, String status, int depth, int progress) {
 | 
			
		||||
@@ -22,7 +24,7 @@ public class ClientCraftingTask {
 | 
			
		||||
        this.progress = progress;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ClientCraftingTask(String status, ItemStack[] outputs, int progress, ICraftingTask child) {
 | 
			
		||||
    public ClientCraftingTask(String status, List<ItemStack> outputs, int progress, ICraftingTask child) {
 | 
			
		||||
        this.status = status;
 | 
			
		||||
        this.outputs = outputs;
 | 
			
		||||
        this.progress = progress;
 | 
			
		||||
@@ -33,7 +35,7 @@ public class ClientCraftingTask {
 | 
			
		||||
        return output;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ItemStack[] getOutputs() {
 | 
			
		||||
    public List<ItemStack> getOutputs() {
 | 
			
		||||
        return outputs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -10,8 +10,10 @@ import net.minecraft.item.ItemStack;
 | 
			
		||||
import net.minecraft.nbt.NBTTagCompound;
 | 
			
		||||
import net.minecraft.nbt.NBTTagList;
 | 
			
		||||
import net.minecraft.network.datasync.DataSerializers;
 | 
			
		||||
import net.minecraft.tileentity.TileEntity;
 | 
			
		||||
import net.minecraft.util.EnumFacing;
 | 
			
		||||
import net.minecraft.util.math.BlockPos;
 | 
			
		||||
import net.minecraft.world.World;
 | 
			
		||||
import net.minecraftforge.common.capabilities.Capability;
 | 
			
		||||
import net.minecraftforge.common.util.Constants;
 | 
			
		||||
import net.minecraftforge.fluids.FluidStack;
 | 
			
		||||
@@ -132,6 +134,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
 | 
			
		||||
    private static final String NBT_CRAFTING_TASKS = "CraftingTasks";
 | 
			
		||||
    private static final String NBT_CRAFTING_TASK_PATTERN = "Pattern";
 | 
			
		||||
    private static final String NBT_CRAFTING_TASK_TYPE = "Type";
 | 
			
		||||
    private static final String NBT_CRAFTING_TASK_CONTAINER = "Container";
 | 
			
		||||
 | 
			
		||||
    private static final Comparator<IItemStorage> ITEM_SIZE_COMPARATOR = (left, right) -> {
 | 
			
		||||
        if (left.getStored() == right.getStored()) {
 | 
			
		||||
@@ -181,6 +184,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
 | 
			
		||||
    private List<ICraftingTask> craftingTasksToAdd = new ArrayList<>();
 | 
			
		||||
    private List<ICraftingTask> craftingTasksToCancel = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    private List<NBTTagCompound> craftingTasksToRead = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    private EnergyStorage energy = new EnergyStorage(RefinedStorage.INSTANCE.controllerCapacity);
 | 
			
		||||
    private IControllerEnergyIC2 energyEU;
 | 
			
		||||
    private ControllerEnergyTesla energyTesla;
 | 
			
		||||
@@ -237,6 +242,18 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
 | 
			
		||||
        if (!worldObj.isRemote) {
 | 
			
		||||
            energyEU.update();
 | 
			
		||||
 | 
			
		||||
            if (!craftingTasksToRead.isEmpty()) {
 | 
			
		||||
                for (NBTTagCompound tag : craftingTasksToRead) {
 | 
			
		||||
                    ICraftingTask task = readCraftingTask(worldObj, tag);
 | 
			
		||||
 | 
			
		||||
                    if (task != null) {
 | 
			
		||||
                        addCraftingTask(task);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                craftingTasksToRead.clear();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (canRun()) {
 | 
			
		||||
                Collections.sort(itemStorage.getStorages(), ITEM_SIZE_COMPARATOR);
 | 
			
		||||
                Collections.sort(itemStorage.getStorages(), ITEM_PRIORITY_COMPARATOR);
 | 
			
		||||
@@ -325,7 +342,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean updateCraftingTask(ICraftingTask task) {
 | 
			
		||||
        ICraftingPatternContainer container = task.getPattern().getContainer(worldObj);
 | 
			
		||||
        ICraftingPatternContainer container = task.getPattern().getContainer();
 | 
			
		||||
 | 
			
		||||
        return container != null && ticks % container.getSpeed() == 0 && task.update(worldObj, this);
 | 
			
		||||
    }
 | 
			
		||||
@@ -395,11 +412,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
 | 
			
		||||
        markDirty();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public ICraftingTask createCraftingTask(ICraftingPattern pattern) {
 | 
			
		||||
        return RefinedStorageAPI.CRAFTING_TASK_REGISTRY.getFactory(pattern.getId()).create(null, pattern);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void cancelCraftingTask(ICraftingTask task) {
 | 
			
		||||
        craftingTasksToCancel.add(task);
 | 
			
		||||
@@ -470,7 +482,11 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
 | 
			
		||||
                    ItemStack stack = container.getPatterns().getStackInSlot(i);
 | 
			
		||||
 | 
			
		||||
                    if (stack != null) {
 | 
			
		||||
                        patterns.add(((ICraftingPatternProvider) stack.getItem()).create(stack, container));
 | 
			
		||||
                        ICraftingPattern pattern = ((ICraftingPatternProvider) stack.getItem()).create(worldObj, stack, container);
 | 
			
		||||
 | 
			
		||||
                        if (pattern.isValid()) {
 | 
			
		||||
                            patterns.add(pattern);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -687,6 +703,11 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
 | 
			
		||||
        return newStack;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public World getNetworkWorld() {
 | 
			
		||||
        return worldObj;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void readFromNBT(NBTTagCompound tag) {
 | 
			
		||||
        super.readFromNBT(tag);
 | 
			
		||||
@@ -701,29 +722,29 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
 | 
			
		||||
            NBTTagList taskList = tag.getTagList(NBT_CRAFTING_TASKS, Constants.NBT.TAG_COMPOUND);
 | 
			
		||||
 | 
			
		||||
            for (int i = 0; i < taskList.tagCount(); ++i) {
 | 
			
		||||
                ICraftingTask task = readCraftingTask(taskList.getCompoundTagAt(i));
 | 
			
		||||
 | 
			
		||||
                if (task != null) {
 | 
			
		||||
                    addCraftingTask(task);
 | 
			
		||||
                }
 | 
			
		||||
                craftingTasksToRead.add(taskList.getCompoundTagAt(i));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static ICraftingTask readCraftingTask(NBTTagCompound tag) {
 | 
			
		||||
    public static ICraftingTask readCraftingTask(World world, NBTTagCompound tag) {
 | 
			
		||||
        ItemStack stack = ItemStack.loadItemStackFromNBT(tag.getCompoundTag(NBT_CRAFTING_TASK_PATTERN));
 | 
			
		||||
 | 
			
		||||
        if (stack != null && stack.getItem() instanceof ICraftingPatternProvider) {
 | 
			
		||||
            ICraftingPattern pattern = ((ICraftingPatternProvider) stack.getItem()).create(stack);
 | 
			
		||||
            TileEntity container = world.getTileEntity(BlockPos.fromLong(tag.getLong(NBT_CRAFTING_TASK_CONTAINER)));
 | 
			
		||||
 | 
			
		||||
            if (pattern != null) {
 | 
			
		||||
                ICraftingTaskFactory factory = RefinedStorageAPI.CRAFTING_TASK_REGISTRY.getFactory(tag.getString(NBT_CRAFTING_TASK_TYPE));
 | 
			
		||||
            if (container instanceof ICraftingPatternContainer) {
 | 
			
		||||
                ICraftingPattern pattern = ((ICraftingPatternProvider) stack.getItem()).create(world, stack, (ICraftingPatternContainer) container);
 | 
			
		||||
 | 
			
		||||
                if (factory != null) {
 | 
			
		||||
                    ICraftingTask task = factory.create(tag, pattern);
 | 
			
		||||
                if (pattern != null) {
 | 
			
		||||
                    ICraftingTaskFactory factory = RefinedStorageAPI.CRAFTING_TASK_REGISTRY.getFactory(tag.getString(NBT_CRAFTING_TASK_TYPE));
 | 
			
		||||
 | 
			
		||||
                    if (task != null) {
 | 
			
		||||
                        return task;
 | 
			
		||||
                    if (factory != null) {
 | 
			
		||||
                        ICraftingTask task = factory.create(tag, world, pattern);
 | 
			
		||||
 | 
			
		||||
                        if (task != null) {
 | 
			
		||||
                            return task;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -749,6 +770,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
 | 
			
		||||
 | 
			
		||||
            taskTag.setString(NBT_CRAFTING_TASK_TYPE, task.getPattern().getId());
 | 
			
		||||
            taskTag.setTag(NBT_CRAFTING_TASK_PATTERN, task.getPattern().getStack().serializeNBT());
 | 
			
		||||
            taskTag.setLong(NBT_CRAFTING_TASK_CONTAINER, task.getPattern().getContainer().getPosition().toLong());
 | 
			
		||||
 | 
			
		||||
            list.appendTag(taskTag);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,7 @@ public class TileCrafter extends TileNode implements ICraftingPatternContainer {
 | 
			
		||||
    public void onConnectionChange(INetworkMaster network, boolean state) {
 | 
			
		||||
        if (!state) {
 | 
			
		||||
            network.getCraftingTasks().stream()
 | 
			
		||||
                .filter(task -> task.getPattern().getContainer(worldObj).getPosition().equals(pos))
 | 
			
		||||
                .filter(task -> task.getPattern().getContainer().getPosition().equals(pos))
 | 
			
		||||
                .forEach(network::cancelCraftingTask);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,11 +6,9 @@ import net.minecraft.util.EnumFacing;
 | 
			
		||||
import net.minecraftforge.common.capabilities.Capability;
 | 
			
		||||
import net.minecraftforge.items.CapabilityItemHandler;
 | 
			
		||||
import net.minecraftforge.items.IItemHandler;
 | 
			
		||||
import net.minecraftforge.items.ItemHandlerHelper;
 | 
			
		||||
import refinedstorage.RefinedStorageItems;
 | 
			
		||||
import refinedstorage.inventory.ItemHandlerBasic;
 | 
			
		||||
import refinedstorage.inventory.ItemValidatorBasic;
 | 
			
		||||
import refinedstorage.item.ItemPattern;
 | 
			
		||||
 | 
			
		||||
public class TileProcessingPatternEncoder extends TileBase {
 | 
			
		||||
    private ItemHandlerBasic patterns = new ItemHandlerBasic(2, this, new ItemValidatorBasic(RefinedStorageItems.PATTERN));
 | 
			
		||||
@@ -38,7 +36,8 @@ public class TileProcessingPatternEncoder extends TileBase {
 | 
			
		||||
        if (canCreatePattern()) {
 | 
			
		||||
            ItemStack pattern = new ItemStack(RefinedStorageItems.PATTERN);
 | 
			
		||||
 | 
			
		||||
            ItemPattern.setProcessing(pattern, true);
 | 
			
		||||
            // @todo
 | 
			
		||||
            /*ItemPattern.setProcessing(pattern, true);
 | 
			
		||||
 | 
			
		||||
            for (int i = 0; i < 18; ++i) {
 | 
			
		||||
                if (configuration.getStackInSlot(i) != null) {
 | 
			
		||||
@@ -50,7 +49,7 @@ public class TileProcessingPatternEncoder extends TileBase {
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            }*/
 | 
			
		||||
 | 
			
		||||
            patterns.extractItem(0, 1, false);
 | 
			
		||||
            patterns.setStackInSlot(1, pattern);
 | 
			
		||||
 
 | 
			
		||||
@@ -61,7 +61,7 @@ public final class RefinedStorageSerializers {
 | 
			
		||||
 | 
			
		||||
            buf.writeInt(task.getProgress());
 | 
			
		||||
 | 
			
		||||
            buf.writeInt(task.getOutputs().length);
 | 
			
		||||
            buf.writeInt(task.getOutputs().size());
 | 
			
		||||
 | 
			
		||||
            for (ItemStack output : task.getOutputs()) {
 | 
			
		||||
                ByteBufUtils.writeItemStack(buf, output);
 | 
			
		||||
 
 | 
			
		||||
@@ -308,21 +308,11 @@ public class TileGrid extends TileNode implements IGrid {
 | 
			
		||||
 | 
			
		||||
            ItemStack pattern = new ItemStack(RefinedStorageItems.PATTERN);
 | 
			
		||||
 | 
			
		||||
            for (ItemStack byproduct : CraftingManager.getInstance().getRemainingItems(matrix, worldObj)) {
 | 
			
		||||
                if (byproduct != null) {
 | 
			
		||||
                    ItemPattern.addByproduct(pattern, byproduct);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ItemPattern.addOutput(pattern, result.getStackInSlot(0));
 | 
			
		||||
 | 
			
		||||
            ItemPattern.setProcessing(pattern, false);
 | 
			
		||||
 | 
			
		||||
            for (int i = 0; i < 9; ++i) {
 | 
			
		||||
                ItemStack ingredient = matrix.getStackInSlot(i);
 | 
			
		||||
 | 
			
		||||
                if (ingredient != null) {
 | 
			
		||||
                    ItemPattern.addInput(pattern, ingredient);
 | 
			
		||||
                    ItemPattern.setSlot(pattern, i, ingredient);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user