From 71f7338393e6ba5eb176b65d0916a7d2e1a005d2 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Mon, 29 Aug 2016 02:56:32 +0200 Subject: [PATCH] Reworked autocrafting, still WIP --- .../refinedstorage/api/RefinedStorageAPI.java | 6 + .../api/autocrafting/ICraftingPattern.java | 12 +- .../registry/ICraftingTaskFactory.java | 13 ++ .../registry/ICraftingTaskRegistry.java | 7 + .../{ => task}/ICraftingTask.java | 28 ++- .../api/network/INetworkMaster.java | 9 +- .../autocrafting/BasicCraftingTask.java | 204 ------------------ .../apiimpl/autocrafting/CraftingPattern.java | 35 ++- .../autocrafting/CraftingTaskScheduler.java | 5 +- .../autocrafting/ProcessingCraftingTask.java | 188 ---------------- .../registry/CraftingTaskFactoryNormal.java | 42 ++++ .../registry/CraftingTaskRegistry.java | 21 ++ .../autocrafting/task/CraftingTask.java | 34 +++ .../autocrafting/task/CraftingTaskNormal.java | 183 ++++++++++++++++ .../apiimpl/network/grid/ItemGridHandler.java | 16 +- .../refinedstorage/proxy/CommonProxy.java | 5 + .../refinedstorage/tile/TileController.java | 89 ++++---- .../tile/TileCraftingMonitor.java | 2 +- 18 files changed, 408 insertions(+), 491 deletions(-) create mode 100755 src/main/java/refinedstorage/api/autocrafting/registry/ICraftingTaskFactory.java create mode 100755 src/main/java/refinedstorage/api/autocrafting/registry/ICraftingTaskRegistry.java rename src/main/java/refinedstorage/api/autocrafting/{ => task}/ICraftingTask.java (56%) delete mode 100755 src/main/java/refinedstorage/apiimpl/autocrafting/BasicCraftingTask.java delete mode 100755 src/main/java/refinedstorage/apiimpl/autocrafting/ProcessingCraftingTask.java create mode 100755 src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryNormal.java create mode 100755 src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskRegistry.java create mode 100755 src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java create mode 100755 src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java diff --git a/src/main/java/refinedstorage/api/RefinedStorageAPI.java b/src/main/java/refinedstorage/api/RefinedStorageAPI.java index ebef434ae..f5e0a5267 100755 --- a/src/main/java/refinedstorage/api/RefinedStorageAPI.java +++ b/src/main/java/refinedstorage/api/RefinedStorageAPI.java @@ -1,5 +1,6 @@ package refinedstorage.api; +import refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry; import refinedstorage.api.solderer.ISoldererRegistry; public final class RefinedStorageAPI { @@ -7,4 +8,9 @@ public final class RefinedStorageAPI { * The solderer registry, set in pre-initialization */ public static ISoldererRegistry SOLDERER_REGISTRY; + + /** + * The crafting task registry, set in pre-initialization + */ + public static ICraftingTaskRegistry CRAFTING_TASK_REGISTRY; } diff --git a/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java b/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java index c5effc37b..003807682 100755 --- a/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java +++ b/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java @@ -20,11 +20,6 @@ public interface ICraftingPattern { */ BlockPos getContainerPosition(); - /** - * @return If this pattern is a processing pattern - */ - boolean isProcessing(); - /** * @return The inputs */ @@ -40,6 +35,13 @@ public interface ICraftingPattern { */ ItemStack[] getByproducts(); + /** + * @return The id of the crafting task, as defined in the registry + */ + String getId(); + + int getQuantityPerRequest(ItemStack requested); + /** * Writes this pattern to NBT. * diff --git a/src/main/java/refinedstorage/api/autocrafting/registry/ICraftingTaskFactory.java b/src/main/java/refinedstorage/api/autocrafting/registry/ICraftingTaskFactory.java new file mode 100755 index 000000000..dc1597dc4 --- /dev/null +++ b/src/main/java/refinedstorage/api/autocrafting/registry/ICraftingTaskFactory.java @@ -0,0 +1,13 @@ +package refinedstorage.api.autocrafting.registry; + +import net.minecraft.nbt.NBTTagCompound; +import refinedstorage.api.autocrafting.ICraftingPattern; +import refinedstorage.api.autocrafting.task.ICraftingTask; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public interface ICraftingTaskFactory { + @Nonnull + ICraftingTask create(@Nullable NBTTagCompound tag, ICraftingPattern pattern); +} diff --git a/src/main/java/refinedstorage/api/autocrafting/registry/ICraftingTaskRegistry.java b/src/main/java/refinedstorage/api/autocrafting/registry/ICraftingTaskRegistry.java new file mode 100755 index 000000000..1fd881d37 --- /dev/null +++ b/src/main/java/refinedstorage/api/autocrafting/registry/ICraftingTaskRegistry.java @@ -0,0 +1,7 @@ +package refinedstorage.api.autocrafting.registry; + +public interface ICraftingTaskRegistry { + void addFactory(String id, ICraftingTaskFactory factory); + + ICraftingTaskFactory getFactory(String id); +} diff --git a/src/main/java/refinedstorage/api/autocrafting/ICraftingTask.java b/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java similarity index 56% rename from src/main/java/refinedstorage/api/autocrafting/ICraftingTask.java rename to src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java index 4025ae5d3..67107ec79 100755 --- a/src/main/java/refinedstorage/api/autocrafting/ICraftingTask.java +++ b/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java @@ -1,9 +1,12 @@ -package refinedstorage.api.autocrafting; +package refinedstorage.api.autocrafting.task; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; +import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.network.INetworkMaster; +import java.util.List; + /** * Represents a crafting task. */ @@ -13,6 +16,11 @@ public interface ICraftingTask { */ ICraftingPattern getPattern(); + /** + * @return The child tasks + */ + List getChildren(); + /** * @param world The world * @param network The network @@ -20,13 +28,6 @@ public interface ICraftingTask { */ boolean update(World world, INetworkMaster network); - /** - * Gets called as soon as {@link ICraftingTask#update(World, INetworkMaster)} returns true. - * - * @param network The network - */ - void onDone(INetworkMaster network); - /** * Gets called when this crafting task is cancelled. * @@ -39,15 +40,12 @@ public interface ICraftingTask { * * @param tag The NBT tag to write to */ - void writeToNBT(NBTTagCompound tag); + NBTTagCompound writeToNBT(NBTTagCompound tag); /** - * Returns the info string that the crafting monitor uses. - * Separate every line by the newline character. - * Use T=x where x is the translation key for translating. - * Use I=x where x is the translation key for translating and displaying the line in yellow. + * Returns status info used in the tooltip of the crafting monitor. * - * @return The info string + * @return The status */ - String getInfo(); + String getStatus(); } diff --git a/src/main/java/refinedstorage/api/network/INetworkMaster.java b/src/main/java/refinedstorage/api/network/INetworkMaster.java index bf1288b1b..1d9e5698c 100755 --- a/src/main/java/refinedstorage/api/network/INetworkMaster.java +++ b/src/main/java/refinedstorage/api/network/INetworkMaster.java @@ -6,7 +6,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraftforge.fluids.FluidStack; import refinedstorage.api.autocrafting.ICraftingPattern; -import refinedstorage.api.autocrafting.ICraftingTask; +import refinedstorage.api.autocrafting.task.ICraftingTask; import refinedstorage.api.network.grid.IFluidGridHandler; import refinedstorage.api.network.grid.IItemGridHandler; import refinedstorage.api.storage.CompareUtils; @@ -83,13 +83,6 @@ public interface INetworkMaster { */ void addCraftingTask(@Nonnull ICraftingTask task); - /** - * Adds a crafting task to the bottom of the crafting task stack. - * - * @param task The crafting task to add as last - */ - void addCraftingTaskAsLast(@Nonnull ICraftingTask task); - /** * Creates a crafting task from a {@link ICraftingPattern}. * diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/BasicCraftingTask.java b/src/main/java/refinedstorage/apiimpl/autocrafting/BasicCraftingTask.java deleted file mode 100755 index 9f6dc854f..000000000 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/BasicCraftingTask.java +++ /dev/null @@ -1,204 +0,0 @@ -package refinedstorage.apiimpl.autocrafting; - -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 net.minecraftforge.common.util.Constants; -import refinedstorage.api.autocrafting.ICraftingPattern; -import refinedstorage.api.autocrafting.ICraftingTask; -import refinedstorage.api.network.INetworkMaster; -import refinedstorage.api.network.NetworkUtils; -import refinedstorage.apiimpl.storage.fluid.FluidUtils; - -import java.util.ArrayList; -import java.util.List; - -public class BasicCraftingTask implements ICraftingTask { - public static final int ID = 0; - - private static final String NBT_SATISFIED = "Satisfied"; - private static final String NBT_CHECKED = "Checked"; - private static final String NBT_CHILD_TASKS = "ChildTasks"; - private static final String NBT_TOOK = "Took"; - - private ICraftingPattern pattern; - private boolean satisfied[]; - private boolean checked[]; - private boolean childTasks[]; - private List itemsTook = new ArrayList<>(); - private boolean updatedOnce; - - public BasicCraftingTask(ICraftingPattern pattern) { - this.pattern = pattern; - this.satisfied = new boolean[pattern.getInputs().length]; - this.checked = new boolean[pattern.getInputs().length]; - this.childTasks = new boolean[pattern.getInputs().length]; - } - - public BasicCraftingTask(NBTTagCompound tag, ICraftingPattern pattern) { - this.pattern = pattern; - this.satisfied = readBooleanArray(tag, NBT_SATISFIED); - this.checked = readBooleanArray(tag, NBT_CHECKED); - this.childTasks = readBooleanArray(tag, NBT_CHILD_TASKS); - - NBTTagList tookList = tag.getTagList(NBT_TOOK, Constants.NBT.TAG_COMPOUND); - - for (int i = 0; i < tookList.tagCount(); ++i) { - itemsTook.add(ItemStack.loadItemStackFromNBT(tookList.getCompoundTagAt(i))); - } - } - - @Override - public ICraftingPattern getPattern() { - return pattern; - } - - @Override - public boolean update(World world, INetworkMaster network) { - this.updatedOnce = true; - - boolean done = true; - - for (int i = 0; i < pattern.getInputs().length; ++i) { - checked[i] = true; - - ItemStack input = pattern.getInputs()[i]; - - if (!satisfied[i]) { - done = false; - - ItemStack took = FluidUtils.extractItemOrIfBucketLookInFluids(network, input, 1); - - if (took != null) { - itemsTook.add(took); - - satisfied[i] = true; - } else if (!childTasks[i]) { - ICraftingPattern pattern = NetworkUtils.getPattern(network, input); - - if (pattern != null) { - network.addCraftingTask(network.createCraftingTask(pattern)); - - childTasks[i] = true; - } - - break; - } else { - break; - } - } - } - - return done; - } - - // @TODO: Handle no space - @Override - public void onDone(INetworkMaster network) { - for (ItemStack output : pattern.getOutputs()) { - network.insertItem(output, output.stackSize, false); - } - - if (pattern.getByproducts() != null) { - for (ItemStack byproduct : pattern.getByproducts()) { - network.insertItem(byproduct, byproduct.stackSize, false); - } - } - } - - // @TODO: Handle no space - @Override - public void onCancelled(INetworkMaster network) { - for (ItemStack took : itemsTook) { - network.insertItem(took, took.stackSize, false); - } - } - - @Override - public void writeToNBT(NBTTagCompound tag) { - NBTTagCompound patternTag = new NBTTagCompound(); - pattern.writeToNBT(patternTag); - tag.setTag(CraftingPattern.NBT, patternTag); - - writeBooleanArray(tag, NBT_SATISFIED, satisfied); - writeBooleanArray(tag, NBT_CHECKED, checked); - writeBooleanArray(tag, NBT_CHILD_TASKS, childTasks); - - NBTTagList tookList = new NBTTagList(); - - for (ItemStack took : itemsTook) { - tookList.appendTag(took.serializeNBT()); - } - - tag.setTag(NBT_TOOK, tookList); - - tag.setInteger("Type", ID); - } - - @Override - public String getInfo() { - if (!updatedOnce) { - return "T=gui.refinedstorage:crafting_monitor.not_started_yet"; - } - - StringBuilder builder = new StringBuilder(); - - boolean hasMissingItems = false; - - for (int i = 0; i < pattern.getInputs().length; ++i) { - ItemStack input = pattern.getInputs()[i]; - - if (checked[i] && !satisfied[i] && !childTasks[i]) { - if (!hasMissingItems) { - builder.append("I=gui.refinedstorage:crafting_monitor.missing_items\n"); - - hasMissingItems = true; - } - - builder.append("T=").append(input.getUnlocalizedName()).append(".name\n"); - } - } - - boolean areItemsCrafting = false; - - for (int i = 0; i < pattern.getInputs().length; ++i) { - ItemStack input = pattern.getInputs()[i]; - - if (!satisfied[i] && childTasks[i]) { - if (!areItemsCrafting) { - builder.append("I=gui.refinedstorage:crafting_monitor.items_crafting\n"); - - areItemsCrafting = true; - } - - builder.append("T=").append(input.getUnlocalizedName()).append(".name\n"); - } - } - - return builder.toString(); - } - - public static void writeBooleanArray(NBTTagCompound tag, String name, boolean[] array) { - int[] intArray = new int[array.length]; - - for (int i = 0; i < intArray.length; ++i) { - intArray[i] = array[i] ? 1 : 0; - } - - tag.setTag(name, new NBTTagIntArray(intArray)); - } - - public static boolean[] readBooleanArray(NBTTagCompound tag, String name) { - int[] intArray = tag.getIntArray(name); - - boolean array[] = new boolean[intArray.length]; - - for (int i = 0; i < intArray.length; ++i) { - array[i] = intArray[i] == 1 ? true : false; - } - - return array; - } -} diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java b/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java index 32e2042ba..08824e2db 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java @@ -8,6 +8,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.ICraftingPatternContainer; +import refinedstorage.api.storage.CompareUtils; import refinedstorage.item.ItemPattern; import refinedstorage.tile.TileCrafter; @@ -46,11 +47,6 @@ public class CraftingPattern implements ICraftingPattern { return crafterPos; } - @Override - public boolean isProcessing() { - return processing; - } - @Override public ItemStack[] getInputs() { return inputs; @@ -66,26 +62,55 @@ public class CraftingPattern implements ICraftingPattern { return byproducts; } + @Override + public String getId() { + return processing ? "processing" : "normal"; + } + + @Override + public int getQuantityPerRequest(ItemStack requested) { + int quantity = 0; + + for (ItemStack output : outputs) { + if (CompareUtils.compareStackNoQuantity(requested, output)) { + quantity += output.stackSize; + + if (!processing) { + break; + } + } + } + + 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); } diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingTaskScheduler.java b/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingTaskScheduler.java index ac3d20738..108227882 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingTaskScheduler.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingTaskScheduler.java @@ -7,6 +7,9 @@ import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.storage.CompareUtils; +/** + * @TODO: Rework this! + */ public class CraftingTaskScheduler { private static final String NBT_SCHEDULED = "CraftingTaskScheduled"; @@ -27,7 +30,7 @@ public class CraftingTaskScheduler { if (pattern != null) { scheduledItem = item; - network.addCraftingTaskAsLast(network.createCraftingTask(pattern)); + network.addCraftingTask(network.createCraftingTask(pattern)); tile.markDirty(); } diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/ProcessingCraftingTask.java b/src/main/java/refinedstorage/apiimpl/autocrafting/ProcessingCraftingTask.java deleted file mode 100755 index e22ce9ce4..000000000 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/ProcessingCraftingTask.java +++ /dev/null @@ -1,188 +0,0 @@ -package refinedstorage.apiimpl.autocrafting; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraftforge.items.ItemHandlerHelper; -import refinedstorage.api.autocrafting.ICraftingPattern; -import refinedstorage.api.autocrafting.ICraftingPatternContainer; -import refinedstorage.api.autocrafting.ICraftingTask; -import refinedstorage.api.network.INetworkMaster; -import refinedstorage.api.network.NetworkUtils; -import refinedstorage.api.storage.CompareUtils; -import refinedstorage.apiimpl.storage.fluid.FluidUtils; - -public class ProcessingCraftingTask implements ICraftingTask { - public static final int ID = 1; - - private static final String NBT_INSERTED = "Inserted"; - private static final String NBT_CHILD_TASKS = "ChildTasks"; - private static final String NBT_SATISFIED = "Satisfied"; - - private ICraftingPattern pattern; - private boolean inserted[]; - private boolean childTasks[]; - private boolean satisfied[]; - private boolean updatedOnce; - - public ProcessingCraftingTask(ICraftingPattern pattern) { - this.pattern = pattern; - this.inserted = new boolean[pattern.getInputs().length]; - this.childTasks = new boolean[pattern.getInputs().length]; - this.satisfied = new boolean[pattern.getOutputs().length]; - } - - public ProcessingCraftingTask(NBTTagCompound tag, ICraftingPattern pattern) { - this.pattern = pattern; - this.inserted = BasicCraftingTask.readBooleanArray(tag, NBT_INSERTED); - this.childTasks = BasicCraftingTask.readBooleanArray(tag, NBT_CHILD_TASKS); - this.satisfied = BasicCraftingTask.readBooleanArray(tag, NBT_SATISFIED); - } - - @Override - public ICraftingPattern getPattern() { - return pattern; - } - - @Override - public boolean update(World world, INetworkMaster network) { - this.updatedOnce = true; - - ICraftingPatternContainer container = pattern.getContainer(world); - - if (container.getConnectedItems() != null) { - for (int i = 0; i < inserted.length; ++i) { - if (!inserted[i]) { - ItemStack input = pattern.getInputs()[i]; - ItemStack took = FluidUtils.extractItemOrIfBucketLookInFluids(network, input, 1); - - if (took != null) { - if (ItemHandlerHelper.insertItem(container.getConnectedItems(), took, true) == null) { - ItemHandlerHelper.insertItem(container.getConnectedItems(), took, false); - - inserted[i] = true; - } else { - network.insertItem(took, took.stackSize, false); - } - } else if (!childTasks[i]) { - ICraftingPattern pattern = NetworkUtils.getPattern(network, input); - - if (pattern != null) { - childTasks[i] = true; - - network.addCraftingTask(network.createCraftingTask(pattern)); - - break; - } - } else { - break; - } - } - } - } else { - return true; - } - - for (int i = 0; i < satisfied.length; ++i) { - if (!satisfied[i]) { - return false; - } - } - - return true; - } - - public boolean onInserted(ItemStack stack) { - for (int i = 0; i < pattern.getOutputs().length; ++i) { - if (!satisfied[i] && CompareUtils.compareStackNoQuantity(stack, pattern.getOutputs()[i])) { - satisfied[i] = true; - - return true; - } - } - - return false; - } - - @Override - public void onDone(INetworkMaster network) { - // NO OP - } - - @Override - public void onCancelled(INetworkMaster network) { - // NO OP - } - - @Override - public void writeToNBT(NBTTagCompound tag) { - NBTTagCompound patternTag = new NBTTagCompound(); - pattern.writeToNBT(patternTag); - tag.setTag(CraftingPattern.NBT, patternTag); - - BasicCraftingTask.writeBooleanArray(tag, NBT_INSERTED, inserted); - BasicCraftingTask.writeBooleanArray(tag, NBT_CHILD_TASKS, childTasks); - BasicCraftingTask.writeBooleanArray(tag, NBT_SATISFIED, satisfied); - - tag.setInteger("Type", ID); - } - - @Override - public String getInfo() { - if (!updatedOnce) { - return "T=gui.refinedstorage:crafting_monitor.not_started_yet"; - } - - StringBuilder builder = new StringBuilder(); - - boolean hasMissingItems = false; - - for (int i = 0; i < pattern.getInputs().length; ++i) { - ItemStack input = pattern.getInputs()[i]; - - if (!inserted[i] && !childTasks[i]) { - if (!hasMissingItems) { - builder.append("I=gui.refinedstorage:crafting_monitor.missing_items\n"); - - hasMissingItems = true; - } - - builder.append("T=").append(input.getUnlocalizedName()).append(".name\n"); - } - } - - boolean areItemsCrafting = false; - - for (int i = 0; i < pattern.getInputs().length; ++i) { - ItemStack input = pattern.getInputs()[i]; - - if (!inserted[i] && childTasks[i]) { - if (!areItemsCrafting) { - builder.append("I=gui.refinedstorage:crafting_monitor.items_crafting\n"); - - areItemsCrafting = true; - } - - builder.append("T=").append(input.getUnlocalizedName()).append(".name\n"); - } - } - - boolean areItemsProcessing = false; - - for (int i = 0; i < pattern.getInputs().length; ++i) { - ItemStack input = pattern.getInputs()[i]; - - if (inserted[i]) { - if (!areItemsProcessing) { - builder.append("I=gui.refinedstorage:crafting_monitor.items_processing\n"); - - areItemsProcessing = true; - } - - builder.append("T=").append(input.getUnlocalizedName()).append(".name\n"); - } - } - - return builder.toString(); - } -} diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryNormal.java b/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryNormal.java new file mode 100755 index 000000000..f13ba3cab --- /dev/null +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryNormal.java @@ -0,0 +1,42 @@ +package refinedstorage.apiimpl.autocrafting.registry; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.common.util.Constants; +import refinedstorage.api.autocrafting.ICraftingPattern; +import refinedstorage.api.autocrafting.registry.ICraftingTaskFactory; +import refinedstorage.api.autocrafting.task.ICraftingTask; +import refinedstorage.apiimpl.autocrafting.task.CraftingTaskNormal; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; + +public class CraftingTaskFactoryNormal implements ICraftingTaskFactory { + @Override + @Nonnull + public ICraftingTask create(@Nullable NBTTagCompound tag, ICraftingPattern pattern) { + CraftingTaskNormal task = new CraftingTaskNormal(pattern); + + task.setChildrenCreated(CraftingTaskNormal.readBooleanArray(tag, CraftingTaskNormal.NBT_CHILDREN)); + task.setSatisfied(CraftingTaskNormal.readBooleanArray(tag, CraftingTaskNormal.NBT_SATISFIED)); + + List took = new ArrayList<>(); + + NBTTagList tookTag = tag.getTagList(CraftingTaskNormal.NBT_TOOK, Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < tookTag.tagCount(); ++i) { + ItemStack stack = ItemStack.loadItemStackFromNBT(tookTag.getCompoundTagAt(i)); + + if (stack != null) { + took.add(stack); + } + } + + task.setTook(took); + + return task; + } +} \ No newline at end of file diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskRegistry.java b/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskRegistry.java new file mode 100755 index 000000000..520423c16 --- /dev/null +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskRegistry.java @@ -0,0 +1,21 @@ +package refinedstorage.apiimpl.autocrafting.registry; + +import refinedstorage.api.autocrafting.registry.ICraftingTaskFactory; +import refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry; + +import java.util.HashMap; +import java.util.Map; + +public class CraftingTaskRegistry implements ICraftingTaskRegistry { + private Map registry = new HashMap<>(); + + @Override + public void addFactory(String id, ICraftingTaskFactory factory) { + registry.put(id, factory); + } + + @Override + public ICraftingTaskFactory getFactory(String id) { + return registry.get(id); + } +} diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java new file mode 100755 index 000000000..d1f9c71fc --- /dev/null +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java @@ -0,0 +1,34 @@ +package refinedstorage.apiimpl.autocrafting.task; + +import net.minecraft.world.World; +import refinedstorage.api.autocrafting.task.ICraftingTask; +import refinedstorage.api.network.INetworkMaster; + +import java.util.Iterator; +import java.util.List; + +public abstract class CraftingTask implements ICraftingTask { + protected List children; + + @Override + public List getChildren() { + return children; + } + + public void updateChildren(World world, INetworkMaster network) { + Iterator childrenIterator = children.iterator(); + + while (childrenIterator.hasNext()) { + if (childrenIterator.next().update(world, network)) { + childrenIterator.remove(); + } + } + } + + @Override + public void onCancelled(INetworkMaster network) { + for (ICraftingTask child : children) { + child.onCancelled(network); + } + } +} diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java new file mode 100755 index 000000000..998b2f5a1 --- /dev/null +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java @@ -0,0 +1,183 @@ +package refinedstorage.apiimpl.autocrafting.task; + +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.network.INetworkMaster; +import refinedstorage.api.network.NetworkUtils; + +import java.util.ArrayList; +import java.util.List; + +public class CraftingTaskNormal extends CraftingTask { + public static final String NBT_TOOK = "Took"; + public static final String NBT_SATISFIED = "Satisfied"; + public static final String NBT_CHILDREN = "Children"; + + private ICraftingPattern pattern; + private List took = new ArrayList<>(); + private boolean satisfied[]; + private boolean childrenCreated[]; + + public CraftingTaskNormal(ICraftingPattern pattern) { + this.pattern = pattern; + this.satisfied = new boolean[pattern.getInputs().length]; + this.childrenCreated = new boolean[pattern.getInputs().length]; + } + + public void setTook(List took) { + this.took = took; + } + + public void setSatisfied(boolean[] satisfied) { + this.satisfied = satisfied; + } + + public void setChildrenCreated(boolean[] childrenCreated) { + this.childrenCreated = childrenCreated; + } + + @Override + public ICraftingPattern getPattern() { + return pattern; + } + + @Override + public boolean update(World world, INetworkMaster network) { + updateChildren(world, network); + + for (int i = 0; i < pattern.getInputs().length; ++i) { + ItemStack input = pattern.getInputs()[i]; + + if (!satisfied[i]) { + ItemStack received = NetworkUtils.extractItem(network, input, input.stackSize); + + if (received != null) { + satisfied[i] = true; + + took.add(received); + } else if (!childrenCreated[i]) { + ICraftingPattern pattern = NetworkUtils.getPattern(network, input); + + if (pattern != null) { + children.add(network.createCraftingTask(pattern)); + + childrenCreated[i] = true; + } + } + } + } + + for (boolean item : satisfied) { + if (!item) { + return false; + } + } + + if (children.isEmpty()) { + for (ItemStack output : pattern.getOutputs()) { + // @TODO: Handle remainder + network.insertItem(output, output.stackSize, false); + } + + for (ItemStack byproduct : pattern.getByproducts()) { + // @TODO: Handle remainder + network.insertItem(byproduct, byproduct.stackSize, false); + } + + return true; + } + + return false; + } + + @Override + public void onCancelled(INetworkMaster network) { + super.onCancelled(network); + + for (ItemStack stack : took) { + // @TODO: Handle remainder + network.insertItem(stack, stack.stackSize, false); + } + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound tag) { + writeBooleanArray(tag, NBT_SATISFIED, satisfied); + writeBooleanArray(tag, NBT_CHILDREN, childrenCreated); + + NBTTagList took = new NBTTagList(); + + for (ItemStack stack : this.took) { + took.appendTag(stack.serializeNBT()); + } + + tag.setTag(NBT_TOOK, took); + + return tag; + } + + @Override + public String getStatus() { + StringBuilder builder = new StringBuilder(); + + boolean missingItems = false; + + for (int i = 0; i < pattern.getInputs().length; ++i) { + ItemStack input = pattern.getInputs()[i]; + + if (!satisfied[i] && !childrenCreated[i]) { + if (!missingItems) { + builder.append("I=gui.refinedstorage:crafting_monitor.missing_items\n"); + + missingItems = true; + } + + builder.append("T=").append(input.getUnlocalizedName()).append(".name\n"); + } + } + + boolean itemsCrafting = false; + + for (int i = 0; i < pattern.getInputs().length; ++i) { + ItemStack input = pattern.getInputs()[i]; + + if (!satisfied[i] && childrenCreated[i]) { + if (!itemsCrafting) { + builder.append("I=gui.refinedstorage:crafting_monitor.items_crafting\n"); + + itemsCrafting = true; + } + + builder.append("T=").append(input.getUnlocalizedName()).append(".name\n"); + } + } + + return builder.toString(); + } + + public static void writeBooleanArray(NBTTagCompound tag, String name, boolean[] array) { + int[] intArray = new int[array.length]; + + for (int i = 0; i < intArray.length; ++i) { + intArray[i] = array[i] ? 1 : 0; + } + + tag.setTag(name, new NBTTagIntArray(intArray)); + } + + public static boolean[] readBooleanArray(NBTTagCompound tag, String name) { + int[] intArray = tag.getIntArray(name); + + boolean array[] = new boolean[intArray.length]; + + for (int i = 0; i < intArray.length; ++i) { + array[i] = intArray[i] == 1 ? true : false; + } + + return array; + } +} diff --git a/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java b/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java index 282f7f2a5..3a9834c13 100755 --- a/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java +++ b/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java @@ -5,7 +5,7 @@ import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; import refinedstorage.RefinedStorage; import refinedstorage.api.autocrafting.ICraftingPattern; -import refinedstorage.api.autocrafting.ICraftingTask; +import refinedstorage.api.autocrafting.task.ICraftingTask; import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.NetworkUtils; import refinedstorage.api.network.grid.IItemGridHandler; @@ -128,23 +128,13 @@ public class ItemGridHandler implements IItemGridHandler { return; } - int quantityPerRequest = 0; - ICraftingPattern pattern = NetworkUtils.getPattern(network, stack); if (pattern != null) { - for (ItemStack output : pattern.getOutputs()) { - if (CompareUtils.compareStackNoQuantity(stack, output)) { - quantityPerRequest += output.stackSize; - - if (!pattern.isProcessing()) { - break; - } - } - } + int quantityPerRequest = pattern.getQuantityPerRequest(stack); while (quantity > 0) { - network.addCraftingTaskAsLast(network.createCraftingTask(pattern)); + network.addCraftingTask(network.createCraftingTask(pattern)); quantity -= quantityPerRequest; } diff --git a/src/main/java/refinedstorage/proxy/CommonProxy.java b/src/main/java/refinedstorage/proxy/CommonProxy.java index a7957d803..05643e700 100755 --- a/src/main/java/refinedstorage/proxy/CommonProxy.java +++ b/src/main/java/refinedstorage/proxy/CommonProxy.java @@ -18,6 +18,8 @@ import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; import refinedstorage.RefinedStorageItems; import refinedstorage.api.RefinedStorageAPI; +import refinedstorage.apiimpl.autocrafting.registry.CraftingTaskFactoryNormal; +import refinedstorage.apiimpl.autocrafting.registry.CraftingTaskRegistry; import refinedstorage.apiimpl.solderer.*; import refinedstorage.apiimpl.storage.fluid.FluidStorageNBT; import refinedstorage.apiimpl.storage.item.ItemStorageNBT; @@ -45,6 +47,9 @@ public class CommonProxy { RefinedStorageAPI.SOLDERER_REGISTRY = new SoldererRegistry(); + RefinedStorageAPI.CRAFTING_TASK_REGISTRY = new CraftingTaskRegistry(); + RefinedStorageAPI.CRAFTING_TASK_REGISTRY.addFactory("normal", new CraftingTaskFactoryNormal()); + int id = 0; RefinedStorage.INSTANCE.network.registerMessage(MessageTileDataParameter.class, MessageTileDataParameter.class, id++, Side.CLIENT); diff --git a/src/main/java/refinedstorage/tile/TileController.java b/src/main/java/refinedstorage/tile/TileController.java index 1e418805e..f27cec9dc 100755 --- a/src/main/java/refinedstorage/tile/TileController.java +++ b/src/main/java/refinedstorage/tile/TileController.java @@ -18,9 +18,11 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.items.ItemHandlerHelper; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; +import refinedstorage.api.RefinedStorageAPI; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.ICraftingPatternContainer; -import refinedstorage.api.autocrafting.ICraftingTask; +import refinedstorage.api.autocrafting.registry.ICraftingTaskFactory; +import refinedstorage.api.autocrafting.task.ICraftingTask; import refinedstorage.api.network.*; import refinedstorage.api.network.grid.IFluidGridHandler; import refinedstorage.api.network.grid.IItemGridHandler; @@ -29,9 +31,7 @@ import refinedstorage.api.storage.fluid.IFluidStorage; import refinedstorage.api.storage.fluid.IGroupedFluidStorage; import refinedstorage.api.storage.item.IGroupedItemStorage; import refinedstorage.api.storage.item.IItemStorage; -import refinedstorage.apiimpl.autocrafting.BasicCraftingTask; import refinedstorage.apiimpl.autocrafting.CraftingPattern; -import refinedstorage.apiimpl.autocrafting.ProcessingCraftingTask; import refinedstorage.apiimpl.network.NetworkNodeGraph; import refinedstorage.apiimpl.network.WirelessGridHandler; import refinedstorage.apiimpl.network.grid.FluidGridHandler; @@ -130,6 +130,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR public static final String NBT_ENERGY_CAPACITY = "EnergyCapacity"; private static final String NBT_CRAFTING_TASKS = "CraftingTasks"; + private static final String NBT_CRAFTING_TASK_TYPE = "Type"; private static final Comparator ITEM_SIZE_COMPARATOR = (left, right) -> { if (left.getStored() == right.getStored()) { @@ -175,8 +176,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR private List patterns = new ArrayList<>(); - private Stack craftingTasks = new Stack<>(); - private List craftingTasksToAddAsLast = new ArrayList<>(); + private List craftingTasks = new ArrayList<>(); private List craftingTasksToAdd = new ArrayList<>(); private List craftingTasksToCancel = new ArrayList<>(); @@ -243,7 +243,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR Collections.sort(fluidStorage.getStorages(), FLUID_SIZE_COMPARATOR); Collections.sort(fluidStorage.getStorages(), FLUID_PRIORITY_COMPARATOR); - boolean craftingTasksChanged = !craftingTasksToAdd.isEmpty() || !craftingTasksToAddAsLast.isEmpty() || !craftingTasksToCancel.isEmpty(); + boolean craftingTasksChanged = !craftingTasksToAdd.isEmpty() || !craftingTasksToCancel.isEmpty(); for (ICraftingTask taskToCancel : craftingTasksToCancel) { taskToCancel.onCancelled(this); @@ -253,19 +253,27 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR craftingTasksToCancel.clear(); for (ICraftingTask task : craftingTasksToAdd) { - craftingTasks.push(task); + craftingTasks.add(task); } craftingTasksToAdd.clear(); - for (ICraftingTask task : craftingTasksToAddAsLast) { - craftingTasks.add(0, task); + Iterator craftingTaskIterator = craftingTasks.iterator(); + + while (craftingTaskIterator.hasNext()) { + ICraftingTask task = craftingTaskIterator.next(); + + markDirty(); + + ICraftingPatternContainer container = task.getPattern().getContainer(worldObj); + + if (container != null && ticks % container.getSpeed() == 0 && task.update(worldObj, this)) { + craftingTaskIterator.remove(); + + craftingTasksChanged = true; + } } - craftingTasksToAddAsLast.clear(); - - updateTopCraftingTask(true); - if (craftingTasksChanged) { updateCraftingTasks(); } @@ -315,24 +323,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR } } - private void updateTopCraftingTask(boolean withSpeed) { - if (!craftingTasks.empty()) { - markDirty(); - - ICraftingTask top = craftingTasks.peek(); - - ICraftingPatternContainer container = top.getPattern().getContainer(worldObj); - - if (container != null && (!withSpeed || (ticks % container.getSpeed()) == 0) && top.update(worldObj, this)) { - top.onDone(this); - - craftingTasks.pop(); - - updateCraftingTasks(); - } - } - } - @Override public void invalidate() { super.invalidate(); @@ -387,20 +377,9 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR markDirty(); } - @Override - public void addCraftingTaskAsLast(ICraftingTask task) { - craftingTasksToAddAsLast.add(task); - - markDirty(); - } - @Override public ICraftingTask createCraftingTask(ICraftingPattern pattern) { - if (pattern.isProcessing()) { - return new ProcessingCraftingTask(pattern); - } else { - return new BasicCraftingTask(pattern); - } + return RefinedStorageAPI.CRAFTING_TASK_REGISTRY.getFactory(pattern.getId()).create(null, pattern); } @Override @@ -562,6 +541,9 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR } } + /* + @TODO: Processing crafting tasks + int inserted = remainder != null ? (orginalSize - remainder.stackSize) : orginalSize; if (!simulate && inserted > 0) { @@ -574,7 +556,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR } itemStorage.add(ItemHandlerHelper.copyStackWithSize(stack, inserted), false); - } + }*/ return remainder; } @@ -705,13 +687,14 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR CraftingPattern pattern = CraftingPattern.readFromNBT(taskTag.getCompoundTag(CraftingPattern.NBT)); if (pattern != null) { - switch (taskTag.getInteger("Type")) { - case BasicCraftingTask.ID: - addCraftingTask(new BasicCraftingTask(taskTag, pattern)); - break; - case ProcessingCraftingTask.ID: - addCraftingTask(new ProcessingCraftingTask(taskTag, pattern)); - break; + ICraftingTaskFactory factory = RefinedStorageAPI.CRAFTING_TASK_REGISTRY.getFactory(taskTag.getString(NBT_CRAFTING_TASK_TYPE)); + + if (factory != null) { + ICraftingTask task = factory.create(taskTag, pattern); + + if (task != null) { + addCraftingTask(task); + } } } } @@ -730,7 +713,11 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR for (ICraftingTask task : craftingTasks) { NBTTagCompound taskTag = new NBTTagCompound(); + task.writeToNBT(taskTag); + + taskTag.setString(NBT_CRAFTING_TASK_TYPE, task.getPattern().getId()); + list.appendTag(taskTag); } diff --git a/src/main/java/refinedstorage/tile/TileCraftingMonitor.java b/src/main/java/refinedstorage/tile/TileCraftingMonitor.java index d3e27de7c..286cc76f2 100755 --- a/src/main/java/refinedstorage/tile/TileCraftingMonitor.java +++ b/src/main/java/refinedstorage/tile/TileCraftingMonitor.java @@ -16,7 +16,7 @@ public class TileCraftingMonitor extends TileNode { public List getValue(TileCraftingMonitor tile) { if (tile.connected) { List tasks = tile.network.getCraftingTasks().stream().map(t -> new ClientCraftingTask( - t.getInfo(), + t.getStatus(), t.getPattern().getOutputs() )).collect(Collectors.toList());