From 654078eef4558d7ce3fd90ae42be8d8d476ac4bc Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Fri, 2 Sep 2016 22:37:53 +0200 Subject: [PATCH] Refactor. Processing patterns are broken. --- .../api/autocrafting/ICraftingPattern.java | 29 +-- .../ICraftingPatternProvider.java | 15 +- .../registry/ICraftingTaskFactory.java | 4 +- .../api/network/INetworkMaster.java | 14 +- .../api/network/NetworkUtils.java | 7 +- .../apiimpl/autocrafting/CraftingPattern.java | 118 +++++------ .../registry/CraftingTaskFactoryNormal.java | 5 +- .../CraftingTaskFactoryProcessing.java | 5 +- .../autocrafting/task/CraftingTask.java | 11 +- .../autocrafting/task/CraftingTaskNormal.java | 23 +-- .../task/CraftingTaskProcessing.java | 28 +-- .../apiimpl/network/grid/ItemGridHandler.java | 2 +- .../apiimpl/storage/fluid/FluidUtils.java | 2 +- .../java/refinedstorage/item/ItemPattern.java | 184 +++--------------- .../tile/ClientCraftingTask.java | 8 +- .../refinedstorage/tile/TileController.java | 62 ++++-- .../java/refinedstorage/tile/TileCrafter.java | 2 +- .../tile/TileProcessingPatternEncoder.java | 7 +- .../tile/data/RefinedStorageSerializers.java | 2 +- .../refinedstorage/tile/grid/TileGrid.java | 12 +- 20 files changed, 187 insertions(+), 353 deletions(-) diff --git a/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java b/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java index 48c9e90e5..567fe1987 100755 --- a/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java +++ b/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java @@ -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 getInputs(); /** * @return The outputs */ - ItemStack[] getOutputs(); - - /** - * @return The byproducts - */ - ItemStack[] getByproducts(); + List 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); } diff --git a/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternProvider.java b/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternProvider.java index 8e63fbe37..e7b7392c3 100755 --- a/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternProvider.java +++ b/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternProvider.java @@ -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); } diff --git a/src/main/java/refinedstorage/api/autocrafting/registry/ICraftingTaskFactory.java b/src/main/java/refinedstorage/api/autocrafting/registry/ICraftingTaskFactory.java index 001cd7449..481a6d283 100755 --- a/src/main/java/refinedstorage/api/autocrafting/registry/ICraftingTaskFactory.java +++ b/src/main/java/refinedstorage/api/autocrafting/registry/ICraftingTaskFactory.java @@ -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); } diff --git a/src/main/java/refinedstorage/api/network/INetworkMaster.java b/src/main/java/refinedstorage/api/network/INetworkMaster.java index 1e49a90b4..8a9ee26b7 100755 --- a/src/main/java/refinedstorage/api/network/INetworkMaster.java +++ b/src/main/java/refinedstorage/api/network/INetworkMaster.java @@ -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(); } diff --git a/src/main/java/refinedstorage/api/network/NetworkUtils.java b/src/main/java/refinedstorage/api/network/NetworkUtils.java index 24007eb08..caf2702ad 100755 --- a/src/main/java/refinedstorage/api/network/NetworkUtils.java +++ b/src/main/java/refinedstorage/api/network/NetworkUtils.java @@ -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)); } } } diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java b/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java index a17a14104..5cca9a7f7 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java @@ -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 inputs = new ArrayList<>(); + private List 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 getInputs() { return inputs; } @Override - public ItemStack[] getOutputs() { + public List 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; - } } diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryNormal.java b/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryNormal.java index 59e64a831..f36f8597f 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryNormal.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryNormal.java @@ -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; diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryProcessing.java b/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryProcessing.java index 61a60b1a5..59779ce07 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryProcessing.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryProcessing.java @@ -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; diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java index af410e46a..91653300a 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java @@ -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)); } } diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java index 84b9abb15..44eeee355 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java @@ -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) { diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskProcessing.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskProcessing.java index b2e98a6d2..738865084 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskProcessing.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskProcessing.java @@ -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"); } } diff --git a/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java b/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java index 8f87b4d4c..2d473e886 100755 --- a/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java +++ b/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java @@ -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; } diff --git a/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java b/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java index 512b0016f..0fe84dde9 100755 --- a/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java +++ b/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java @@ -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)); } } } diff --git a/src/main/java/refinedstorage/item/ItemPattern.java b/src/main/java/refinedstorage/item/ItemPattern.java index 221029d0f..fbb31c918 100755 --- a/src/main/java/refinedstorage/item/ItemPattern.java +++ b/src/main/java/refinedstorage/item/ItemPattern.java @@ -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 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 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); } } diff --git a/src/main/java/refinedstorage/tile/ClientCraftingTask.java b/src/main/java/refinedstorage/tile/ClientCraftingTask.java index e9f837d57..23bde8ce6 100755 --- a/src/main/java/refinedstorage/tile/ClientCraftingTask.java +++ b/src/main/java/refinedstorage/tile/ClientCraftingTask.java @@ -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 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 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 getOutputs() { return outputs; } diff --git a/src/main/java/refinedstorage/tile/TileController.java b/src/main/java/refinedstorage/tile/TileController.java index a37878d8f..3113a4564 100755 --- a/src/main/java/refinedstorage/tile/TileController.java +++ b/src/main/java/refinedstorage/tile/TileController.java @@ -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 ITEM_SIZE_COMPARATOR = (left, right) -> { if (left.getStored() == right.getStored()) { @@ -181,6 +184,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR private List craftingTasksToAdd = new ArrayList<>(); private List craftingTasksToCancel = new ArrayList<>(); + private List 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); } diff --git a/src/main/java/refinedstorage/tile/TileCrafter.java b/src/main/java/refinedstorage/tile/TileCrafter.java index aad5a4481..231be5fc2 100755 --- a/src/main/java/refinedstorage/tile/TileCrafter.java +++ b/src/main/java/refinedstorage/tile/TileCrafter.java @@ -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); } diff --git a/src/main/java/refinedstorage/tile/TileProcessingPatternEncoder.java b/src/main/java/refinedstorage/tile/TileProcessingPatternEncoder.java index d915efc8b..0d63e7285 100755 --- a/src/main/java/refinedstorage/tile/TileProcessingPatternEncoder.java +++ b/src/main/java/refinedstorage/tile/TileProcessingPatternEncoder.java @@ -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); diff --git a/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java b/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java index de7c04d69..42e898122 100755 --- a/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java +++ b/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java @@ -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); diff --git a/src/main/java/refinedstorage/tile/grid/TileGrid.java b/src/main/java/refinedstorage/tile/grid/TileGrid.java index 17ef8070b..aba7e3fe4 100755 --- a/src/main/java/refinedstorage/tile/grid/TileGrid.java +++ b/src/main/java/refinedstorage/tile/grid/TileGrid.java @@ -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); } }