diff --git a/src/main/java/refinedstorage/tile/TileController.java b/src/main/java/refinedstorage/tile/TileController.java index ff897ed9c..de70b8d2b 100755 --- a/src/main/java/refinedstorage/tile/TileController.java +++ b/src/main/java/refinedstorage/tile/TileController.java @@ -9,10 +9,12 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; +import net.minecraftforge.common.util.Constants; import net.minecraftforge.fml.common.network.ByteBufUtils; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; @@ -52,6 +54,8 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor public static final int ENERGY_CAPACITY = 32000; + public static final String NBT_CRAFTING_TASKS = "CraftingTasks"; + private List itemGroups = new ArrayList(); private List storages = new ArrayList(); private List wirelessGridConsumers = new ArrayList(); @@ -502,6 +506,23 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor if (nbt.hasKey(RedstoneMode.NBT)) { redstoneMode = RedstoneMode.getById(nbt.getInteger(RedstoneMode.NBT)); } + + if (nbt.hasKey(NBT_CRAFTING_TASKS)) { + NBTTagList taskList = nbt.getTagList(NBT_CRAFTING_TASKS, Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < taskList.tagCount(); ++i) { + NBTTagCompound taskTag = taskList.getCompoundTagAt(i); + + switch (taskTag.getInteger("Type")) { + case 0: + addCraftingTask(new BasicCraftingTask(worldObj, taskTag)); + break; + case 1: + addCraftingTask(new ProcessingCraftingTask(worldObj, taskTag)); + break; + } + } + } } @Override @@ -509,6 +530,16 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor super.writeToNBT(nbt); nbt.setInteger(RedstoneMode.NBT, redstoneMode.id); + + NBTTagList list = new NBTTagList(); + + for (ICraftingTask task : craftingTasks) { + NBTTagCompound taskTag = new NBTTagCompound(); + task.writeToNBT(taskTag); + list.appendTag(taskTag); + } + + nbt.setTag(NBT_CRAFTING_TASKS, list); } @Override diff --git a/src/main/java/refinedstorage/tile/autocrafting/CraftingPattern.java b/src/main/java/refinedstorage/tile/autocrafting/CraftingPattern.java index aa7f9c109..ea32b165c 100755 --- a/src/main/java/refinedstorage/tile/autocrafting/CraftingPattern.java +++ b/src/main/java/refinedstorage/tile/autocrafting/CraftingPattern.java @@ -1,9 +1,21 @@ package refinedstorage.tile.autocrafting; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; +import refinedstorage.item.ItemPattern; import refinedstorage.util.InventoryUtils; public class CraftingPattern { + public static final String NBT = "Pattern"; + 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 TileCrafter crafter; private boolean processing; private ItemStack[] inputs; @@ -58,4 +70,52 @@ public class CraftingPattern { return true; } + + public void 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); + + tag.setInteger(NBT_CRAFTER_X, crafter.getPos().getX()); + tag.setInteger(NBT_CRAFTER_Y, crafter.getPos().getY()); + tag.setInteger(NBT_CRAFTER_Z, crafter.getPos().getZ()); + } + + public static CraftingPattern readFromNBT(World world, NBTTagCompound tag) { + int cx = tag.getInteger(NBT_CRAFTER_X); + int cy = tag.getInteger(NBT_CRAFTER_Y); + int cz = tag.getInteger(NBT_CRAFTER_Z); + + TileEntity crafter = world.getTileEntity(new BlockPos(cx, cy, cz)); + + if (crafter instanceof TileCrafter) { + boolean processing = tag.getBoolean(ItemPattern.NBT_PROCESSING); + + NBTTagList inputsTag = tag.getTagList(ItemPattern.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)); + } + + NBTTagList outputsTag = tag.getTagList(ItemPattern.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)); + } + + return new CraftingPattern((TileCrafter) crafter, processing, inputs, outputs); + } + + return null; + } } diff --git a/src/main/java/refinedstorage/tile/autocrafting/task/BasicCraftingTask.java b/src/main/java/refinedstorage/tile/autocrafting/task/BasicCraftingTask.java index f848bdc52..8f1e6c1c5 100755 --- a/src/main/java/refinedstorage/tile/autocrafting/task/BasicCraftingTask.java +++ b/src/main/java/refinedstorage/tile/autocrafting/task/BasicCraftingTask.java @@ -1,14 +1,25 @@ package refinedstorage.tile.autocrafting.task; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.util.text.TextFormatting; +import net.minecraft.world.World; import refinedstorage.tile.TileController; import refinedstorage.tile.autocrafting.CraftingPattern; +import refinedstorage.util.NBTUtils; import java.util.ArrayList; import java.util.List; public class BasicCraftingTask implements ICraftingTask { + public static final int ID = 0; + + public static final String NBT_SATISFIED = "Satisfied"; + public static final String NBT_CHECKED = "Checked"; + public static final String NBT_CHILD_TASKS = "ChildTasks"; + public static final String NBT_TOOK = "Took"; + private CraftingPattern pattern; private boolean satisfied[]; private boolean checked[]; @@ -22,6 +33,13 @@ public class BasicCraftingTask implements ICraftingTask { this.childTasks = new boolean[pattern.getInputs().length]; } + public BasicCraftingTask(World world, NBTTagCompound tag) { + this.pattern = CraftingPattern.readFromNBT(world, tag.getCompoundTag(CraftingPattern.NBT)); + this.satisfied = NBTUtils.readBoolArray(tag, NBT_SATISFIED); + this.checked = NBTUtils.readBoolArray(tag, NBT_CHECKED); + this.childTasks = NBTUtils.readBoolArray(tag, NBT_CHILD_TASKS); + } + public CraftingPattern getPattern() { return pattern; } @@ -76,6 +94,27 @@ public class BasicCraftingTask implements ICraftingTask { } } + @Override + public void writeToNBT(NBTTagCompound tag) { + NBTTagCompound patternTag = new NBTTagCompound(); + pattern.writeToNBT(patternTag); + tag.setTag(CraftingPattern.NBT, patternTag); + + NBTUtils.writeBoolArray(tag, NBT_SATISFIED, satisfied); + NBTUtils.writeBoolArray(tag, NBT_CHECKED, checked); + NBTUtils.writeBoolArray(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() { StringBuilder builder = new StringBuilder(); diff --git a/src/main/java/refinedstorage/tile/autocrafting/task/ICraftingTask.java b/src/main/java/refinedstorage/tile/autocrafting/task/ICraftingTask.java index eb1bf5f5c..73f000fd6 100755 --- a/src/main/java/refinedstorage/tile/autocrafting/task/ICraftingTask.java +++ b/src/main/java/refinedstorage/tile/autocrafting/task/ICraftingTask.java @@ -1,5 +1,6 @@ package refinedstorage.tile.autocrafting.task; +import net.minecraft.nbt.NBTTagCompound; import refinedstorage.tile.TileController; import refinedstorage.tile.autocrafting.CraftingPattern; @@ -12,5 +13,7 @@ public interface ICraftingTask { void onCancelled(TileController controller); + void writeToNBT(NBTTagCompound tag); + String getInfo(); } diff --git a/src/main/java/refinedstorage/tile/autocrafting/task/ProcessingCraftingTask.java b/src/main/java/refinedstorage/tile/autocrafting/task/ProcessingCraftingTask.java index 063c2ffd7..67130eb8d 100755 --- a/src/main/java/refinedstorage/tile/autocrafting/task/ProcessingCraftingTask.java +++ b/src/main/java/refinedstorage/tile/autocrafting/task/ProcessingCraftingTask.java @@ -2,15 +2,24 @@ package refinedstorage.tile.autocrafting.task; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityHopper; import net.minecraft.util.text.TextFormatting; +import net.minecraft.world.World; import refinedstorage.tile.TileController; import refinedstorage.tile.autocrafting.CraftingPattern; import refinedstorage.tile.autocrafting.TileCrafter; import refinedstorage.util.InventoryUtils; +import refinedstorage.util.NBTUtils; public class ProcessingCraftingTask implements ICraftingTask { + public static final int ID = 1; + + public static final String NBT_INSERTED = "Inserted"; + public static final String NBT_MISSING = "Missing"; + public static final String NBT_SATISFIED = "Satisfied"; + private CraftingPattern pattern; private boolean inserted[]; private boolean missing[]; @@ -23,6 +32,13 @@ public class ProcessingCraftingTask implements ICraftingTask { this.satisfied = new boolean[pattern.getOutputs().length]; } + public ProcessingCraftingTask(World world, NBTTagCompound tag) { + this.pattern = CraftingPattern.readFromNBT(world, tag.getCompoundTag(CraftingPattern.NBT)); + this.inserted = NBTUtils.readBoolArray(tag, NBT_INSERTED); + this.missing = NBTUtils.readBoolArray(tag, NBT_MISSING); + this.satisfied = NBTUtils.readBoolArray(tag, NBT_SATISFIED); + } + @Override public CraftingPattern getPattern() { return pattern; @@ -89,6 +105,19 @@ public class ProcessingCraftingTask implements ICraftingTask { // NO OP } + @Override + public void writeToNBT(NBTTagCompound tag) { + NBTTagCompound patternTag = new NBTTagCompound(); + pattern.writeToNBT(patternTag); + tag.setTag(CraftingPattern.NBT, patternTag); + + NBTUtils.writeBoolArray(tag, NBT_INSERTED, satisfied); + NBTUtils.writeBoolArray(tag, NBT_MISSING, missing); + NBTUtils.writeBoolArray(tag, NBT_SATISFIED, satisfied); + + tag.setInteger("Type", ID); + } + @Override public String getInfo() { StringBuilder builder = new StringBuilder(); diff --git a/src/main/java/refinedstorage/util/NBTUtils.java b/src/main/java/refinedstorage/util/NBTUtils.java new file mode 100755 index 000000000..7f1d05457 --- /dev/null +++ b/src/main/java/refinedstorage/util/NBTUtils.java @@ -0,0 +1,30 @@ +package refinedstorage.util; + +import net.minecraft.nbt.NBTTagByte; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.common.util.Constants; + +public class NBTUtils { + public static void writeBoolArray(NBTTagCompound tag, String name, boolean[] arr) { + NBTTagList list = new NBTTagList(); + + for (int i = 0; i < arr.length; ++i) { + list.appendTag(new NBTTagByte(arr[i] ? (byte) 1 : (byte) 0)); + } + + tag.setTag(name, list); + } + + public static boolean[] readBoolArray(NBTTagCompound tag, String name) { + NBTTagList list = tag.getTagList(name, Constants.NBT.TAG_COMPOUND); + + boolean[] arr = new boolean[list.tagCount()]; + + for (int i = 0; i < arr.length; ++i) { + arr[i] = ((NBTTagByte) list.get(i)).getByte() == 1 ? true : false; + } + + return arr; + } +}